{"uid":"cap_oifiWSuEV5GWB2jNWTKO8","slug":"agents-withzero-xyz-withzero-cdn-large-static-site-deploy-manifest-ecc9d833","name":"WithZero CDN Large Static Site Deploy (Manifest-Based)","description":"Deploy a large static site (up to 5,000 files / 500 MiB) by manifest: send every path with its size and MD5, get upload URLs for only the files not already stored, PUT the bytes, then commit. Redeploys upload only what changed.","url":"https://agents.withzero.xyz/api/v1/cdn/deploys?utm_source=zero.xyz","method":"POST","headers":{},"bodySchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["slug","files"],"properties":{"slug":{"type":"string","maxLength":512,"minLength":1,"description":"The site to deploy, served at /<walletId>/<slug>/ — the same slug as a kind:site upload. Redeploying a slug replaces the site."},"files":{"type":"array","items":{"type":"object","required":["path","size","md5"],"properties":{"md5":{"type":"string","description":"MD5 of the bytes as 32 lowercase hex chars (what `md5sum` / `md5 -q` print)."},"path":{"type":"string","maxLength":512,"minLength":1,"description":"Path within the site, e.g. \"index.html\" or \"assets/app.js\". `_redirects` / `_headers` at the root are read as site rules."},"size":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"Size in bytes."}},"additionalProperties":false},"maxItems":5000,"minItems":1,"description":"Every file of the site. Up to 5000 files, 100 MiB each, 500 MiB in total."},"cacheTtlSeconds":{"type":"integer","maximum":9007199254740991,"description":"Edge cache lifetime for the deployed files, as for kind:site uploads. Default 3600, clamped to [60, 86400].","exclusiveMinimum":0}},"additionalProperties":false},"responseSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["deployId","expiresAt","uploads","commit"],"properties":{"commit":{"type":"string","description":"Then POST here to make the deploy live."},"uploads":{"type":"array","items":{"type":"object","required":["md5","size","contentType","paths","url"],"properties":{"md5":{"type":"string"},"url":{"type":"string","description":"PUT the bytes here, e.g. `curl -X PUT --data-binary @<file> -H \"content-type: <contentType>\" \"<url>\"`. Treat as a secret."},"size":{"type":"integer","maximum":9007199254740991,"minimum":-9007199254740991},"paths":{"type":"array","items":{"type":"string"},"description":"Every path in this deploy with these exact bytes — upload once."},"contentType":{"type":"string"}},"additionalProperties":false},"description":"Only the files this wallet has not uploaded before; an empty list means every byte is already stored. GCS rejects bytes that do not match the declared MD5 and size. A 412 on PUT means that content is already stored — skip it."},"deployId":{"type":"string"},"expiresAt":{"type":"string","description":"Commit before this time; afterwards the upload URLs and the deploy lapse."}},"additionalProperties":false},"example":null,"exampleRequest":null,"tags":[],"displayCostAmount":"0.000000","displayCostAsset":"USD","priceDynamic":false,"priceHint":null,"priceStatus":"unknown_unparsed","priceSource":"registry","requiresHandshake":false,"reviewCount":0,"rating":{"score":"0.00","successRate":"0.00","reviews":0,"stars":null,"state":"unrated"},"availabilityStatus":"unknown","priceObserved":null,"sessionDeposit":null,"pricing":{"kind":"unknown","summary":"price unknown","primary":{"kind":"unknown","protocol":"mpp","network":"tempo","amountUsd":null,"per":"call","confidence":"unknown"},"accepted":[{"kind":"unknown","protocol":"mpp","network":"tempo","amountUsd":null,"per":"call","confidence":"unknown"}]},"paymentMethods":[{"uid":"pm_5zRQHkgNutq171ETZiwTM","protocol":"mpp","methodType":"crypto","chain":"tempo","mode":"charge","costAmount":"0.000000","costPer":"request","priority":0,"asset":null,"unit":"request","depositMicros":null,"planRef":null}],"brandName":"agents.withzero.xyz","brandSlug":"agents-withzero-xyz-x402","brandBaseUrl":"https://agents.withzero.xyz","brandDocsUrl":null,"whatItDoes":"Deploys a large static site (up to 5,000 files / 500 MiB) using a manifest-diffing workflow: submit file paths with sizes and MD5 hashes, receive upload URLs only for new/changed files, PUT the bytes, then commit the deploy.","exampleAgentPrompt":"Deploy my static site build to WithZero — I have about 2,000 files totalling 180 MiB; send the manifest of paths, sizes, and MD5s, get upload URLs for anything new or changed, push those files, and commit the deploy under the slug 'my-docs-site'.","exampleUseCases":[{"title":"First-time documentation site launch","prompt":"I want to publish my new documentation site for the first time — it's a static build with around 800 files under 120 MiB. Use the slug 'acme-docs', send the full file manifest, upload everything, and make it live."},{"title":"Incremental redeploy after content update","prompt":"I just rebuilt my marketing site and only about 30 files changed out of 1,200 total. Redeploy it to WithZero under slug 'acme-marketing' — send the full manifest so only the changed files get uploaded, then commit."},{"title":"Large portfolio site with SPA routing","prompt":"Deploy my portfolio site — it's a React SPA export with 3,500 files and about 300 MiB. Push it to WithZero under slug 'portfolio-v2', use the manifest workflow so unchanged assets are skipped, and enable SPA routing so all paths fall back to index.html."}],"resultDescription":"Returns a list of presigned upload URLs for only the files not already stored on the CDN (based on MD5 diffing), a deploy ID to reference during the PUT phase and final commit, and after committing, a confirmation of the live deploy with its CDN URL and deploy status.","failureModes":["Manifest exceeds 5,000 files or 500 MiB limit — request rejected with 400","MD5 mismatch between manifest and uploaded bytes — commit fails with validation error","Upload URL expires before PUT completes — requires re-fetching upload URLs","Missing or malformed file paths in manifest — 400 bad request","Payment not attached or insufficient — 402 response before processing begins","Slug conflict with an existing site owned by another identity — 403 or 409"],"whenToPreferThis":"Choose this endpoint when deploying static sites with a large number of files (hundreds to thousands) where incremental redeploys matter — the manifest-diffing approach ensures only changed files are uploaded, saving bandwidth and time. Prefer this over simpler single-file or small-site upload endpoints when your build output exceeds a few dozen files or when you need efficient CI/CD-style redeployment without re-uploading unchanged assets.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-10-17T17:16:15.001Z","isFirstParty":true,"canonicalSlug":"agents-withzero-xyz-withzero-cdn-large-static-site-deploy-manifest-ecc9d833"}