# WithZero CDN Large Static Site Deploy (Manifest-Based)

> WithZero CDN Large Static Site Deploy (Manifest-Based) is a paid API for AI agents from agents.withzero.xyz, paid per call via MPP, price unknown, status unknown (last checked 2026-10-16).

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.

## Facts

- Endpoint: POST https://agents.withzero.xyz/api/v1/cdn/deploys?utm_source=zero.xyz
- Price: price unknown
- Payment: MPP
- Status: unknown
- Last checked: 2026-10-16
- Activations on Zero: 0
- Provider: agents.withzero.xyz
- Website: https://agents.withzero.xyz
- Canonical page: https://www.zero.xyz/c/agents-withzero-xyz-withzero-cdn-large-static-site-deploy-manifest-ecc9d833
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_oifiWSuEV5GWB2jNWTKO8

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 agents-withzero-xyz-withzero-cdn-large-static-site-deploy-manifest-ecc9d833 -d '<json body>'
```

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

## When to prefer this

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.

## Known failure modes

- 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

## 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 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.

## 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/agents-withzero-xyz-withzero-cdn-large-static-site-deploy-manifest-ecc9d833/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from agents.withzero.xyz](https://www.zero.xyz/host/agents.withzero.xyz/llms.txt)
