Skip to content
Neo-Theme

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_here

POST /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.

StatusCodeMeaning
400invalid_request, invalid_theme, blocked_hostThe request body or target address is not acceptable.
401missing_key, invalid_keyNo key, or a key that is revoked or unknown.
402plan_required, site_limitThe account plan does not include this.
403missing_scopeThe key lacks the scope for this endpoint.
404not_foundNo such site in this account.
429rate_limitedMore than 60 requests in a minute.
502 / 504fetch_failed, timeoutThe 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));
}