Developer API
Transform sites from your own code
Two endpoints and signed webhooks. The API is part of the Agency plan and is limited to 60 requests per minute per key.
Your API keys
Sign in to create API keys.
Authentication
Send your key as a bearer token. Keys are shown once when created; only a hash is stored.
Authorization: Bearer neo_your_key_herePOST /v1/migrate
Reads a public page and saves it to your account as a rebuilt site. Requires the ingest scope.
curl -X POST https://neo-theme-five.vercel.app/v1/migrate \
-H "Authorization: Bearer neo_your_key_here" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com", "theme": "jarvis-core"}'201 Created
{
"id": "6f1c…",
"preview": "https://neo-theme-five.vercel.app/view/6f1c…",
"source": "https://example.com/",
"title": "Example Domain",
"theme": "jarvis-core",
"words": 25,
"sections": 1,
"client_rendered": false
}theme is optional. Valid values: jarvis-core, cyber-glass, neural-dark, aurora-soft, quantum-void, solar-flare.
POST /v1/theme
Sets the default theme of a site your account owns. Requires the theme scope.
curl -X POST https://neo-theme-five.vercel.app/v1/theme \
-H "Authorization: Bearer neo_your_key_here" \
-H "Content-Type: application/json" \
-d '{"id": "6f1c…", "theme": "neural-dark"}'200 OK
{ "id": "6f1c…", "theme": "neural-dark", "preview": "https://neo-theme-five.vercel.app/view/6f1c…" }Errors
Errors return JSON with a human-readable error and a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request, invalid_theme, blocked_host | The request body or target address is not acceptable. |
| 401 | missing_key, invalid_key | No key, or a key that is revoked or unknown. |
| 402 | plan_required, site_limit | The account plan does not include this. |
| 403 | missing_scope | The key lacks the scope for this endpoint. |
| 404 | not_found | No such site in this account. |
| 429 | rate_limited | More than 60 requests in a minute. |
| 502 / 504 | fetch_failed, timeout | The target site refused, failed or was too slow. |
Webhooks
Register an https endpoint to receive ingest.completed and theme.updated. Each delivery is signed so you can verify it came from Neo-Theme and is recent.
X-Neo-Event: ingest.completed
X-Neo-Signature: t=1760227200,v1=5f2b…
{"event":"ingest.completed","created":1760227200,"data":{"id":"6f1c…","url":"https://example.com/","title":"Example Domain","preview":"https://neo-theme-five.vercel.app/view/6f1c…"}}// Node.js verification
import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // older than 5 minutes
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
return v1.length === expected.length && crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}