# Deploy Large Static Site by Manifest (cdn.withzero.xyz)

> Deploy Large Static Site by Manifest (cdn.withzero.xyz) is a free API for AI agents from cdn.withzero.xyz, Free, status unknown (last checked 2026-10-11).

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.

## Facts

- Endpoint: POST https://cdn.withzero.xyz/api/v1/deploys?utm_source=zero.xyz
- Price: Free
- Status: unknown
- Last checked: 2026-10-11
- Activations on Zero: 0
- Provider: cdn.withzero.xyz
- Website: https://cdn.withzero.xyz
- Canonical page: https://www.zero.xyz/c/cdn-withzero-xyz-deploy-large-static-site-by-manifest-cdn-withzero-xyz-b6c78b17
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_TS_n2PWnh7A2fSc1QxoEr

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability cdn-withzero-xyz-deploy-large-static-site-by-manifest-cdn-withzero-xyz-b6c78b17 -d '<json body>'
```

Example prompt: 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.

## When to prefer this

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.

## Known failure modes

- 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

## How this service works

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.

## Output

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.

## Request schema (JSON Schema)

```json
{
 "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
}
```

## Response schema (JSON Schema)

```json
{
 "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
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/cdn-withzero-xyz-deploy-large-static-site-by-manifest-cdn-withzero-xyz-b6c78b17/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from cdn.withzero.xyz](https://www.zero.xyz/host/cdn.withzero.xyz/llms.txt)
