{"uid":"cap_TS_n2PWnh7A2fSc1QxoEr","slug":"cdn-withzero-xyz-deploy-large-static-site-by-manifest-cdn-withzero-xyz-b6c78b17","name":"Deploy Large Static Site by Manifest (cdn.withzero.xyz)","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://cdn.withzero.xyz/api/v1/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","displayCostAsset":"USDC","priceDynamic":false,"priceHint":null,"priceStatus":"proven_free","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":"free","summary":"Free","primary":null,"accepted":[]},"paymentMethods":[],"brandName":"cdn.withzero.xyz","brandSlug":"cdn-withzero-xyz-mpp","brandBaseUrl":"https://cdn.withzero.xyz","brandDocsUrl":null,"whatItDoes":"Initiates a manifest-based static site deployment of up to 5,000 files / 500 MiB, returning upload URLs only for files not already stored, enabling incremental redeploys that upload only changed files.","exampleAgentPrompt":"Deploy my static site with slug 'my-portfolio' to cdn.withzero.xyz — here's the full manifest of 3,200 files with their paths, sizes, and MD5 hashes; only upload what's changed since last time and set edge cache to 7200 seconds.","exampleUseCases":[{"title":"Incremental frontend build deployment","prompt":"I just rebuilt my React app and want to push it to cdn.withzero.xyz under the slug 'react-dashboard' — the build has about 800 files, please only upload what changed from the previous deploy and use a 3600-second cache TTL."},{"title":"First-time large documentation site launch","prompt":"Publish my new docs site to cdn.withzero.xyz using the slug 'product-docs' — I have 4,500 files totaling around 450 MiB, here are all the paths, sizes, and MD5s; cache everything for 86400 seconds."},{"title":"Hotfix redeploy with minimal file changes","prompt":"I just fixed a bug in two JS files on my site at slug 'storefront' on cdn.withzero.xyz — redeploy with the updated manifest so only those two changed files get re-uploaded, keeping the cache at 1800 seconds."}],"resultDescription":"Returns a deployId, an expiry timestamp after which the deploy lapses, a list of upload objects (each with a presigned PUT URL, content type, MD5, size, and the file paths sharing those exact bytes — empty list if all bytes are already stored), and a commit URL to POST to once all files are uploaded to make the deploy live.","failureModes":["Missing required fields (slug or files array) returns a 400 validation error","Files array exceeds 5000 items or total size exceeds 500 MiB returns a 400 error","Individual file exceeds 100 MiB limit returns a 400 error","MD5 mismatch or size mismatch on PUT to GCS returns a 412 or 400 error","PUT to upload URL after expiresAt returns a 410 or 403 (expired URLs)","Failing to POST to commit URL before expiresAt causes the deploy to lapse silently","Invalid slug format (empty or over 512 chars) returns a 400 error","Unauthenticated or unauthorized wallet returns a 401 or 403"],"whenToPreferThis":"Choose this endpoint when deploying a site with many files (up to 5,000) or large total size (up to 500 MiB), especially when you want incremental deploys that only upload changed files. It is more efficient than a zip-upload approach for large sites or frequent redeployments because it deduplicates file storage by MD5. Prefer the zip-upload endpoint for small, simple sites where manifest management is unnecessary overhead.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-10-11T09:38:42.751Z","isFirstParty":true,"canonicalSlug":"cdn-withzero-xyz-deploy-large-static-site-by-manifest-cdn-withzero-xyz-b6c78b17"}