Errors and limits
Status codes, error messages, rate limits and plan limits.
Errors
Errors answer with an HTTP status and a message in plain words you can show to a person:
{ "error": "That name is taken. Try another." }| Status | When |
|---|---|
400 | Bad input, such as an invalid link name or linkName on an update. |
401 | Missing, revoked or unknown key. |
403 | Email not verified, or you're at your plan's site limit. |
404 | No such site or upload on your account. |
409 | The link name is taken. |
413 | The file is bigger than your plan allows, or over 25 MB for a direct publish (use the two-step upload). |
415 | The body isn't HTML, a zip, a PDF or JSON. |
422 | The upload was rejected: a zip without index.html, unsafe paths, a zip bomb, or the virus scanner flagged it. |
429 | A rate limit. Retry-After says when to try again. |
5xx | Our side. Retry after a short wait. |
Rate limits
- 200 calls a day per API key, and per connected MCP app, reset at midnight UTC. Each MCP tool call counts as one call.
- Your plan's uploads per day apply to the API like the dashboard.
Plan limits
| Free | Starter | Plus | |
|---|---|---|---|
| Sites | 1 | 5 | 10 |
| HTML page or zip | 10 MB | 100 MB | 500 MB |
| 25 MB | 100 MB | 500 MB | |
| Uploads per day | 3 | 50 | 200 |
GET /v1/me shows your plan and what you've used today. See pricing for everything else each plan includes.
Safety checks
Every upload is checked like a dashboard upload: virus scan, phishing checks and the acceptable use policy. Some uploads are held for review before they go live; the site's status is held_for_review until then.