REST API reference

The /api/v1 API creates redesign previews from your own systems: Clay tables, Zapier, a CRM button or a script. It runs exactly the same checks as the dashboard: URL validation, the domain blocklist, rate limits and your credits.

API keys are part of the Agency 1000 plan.

Base URL and authentication

Every endpoint lives under https://uirevamper.com followed by /api/v1. Create a key under Settings › API keys. It is shown once; store it in your secrets manager. Send it on every request:

Authorization: Bearer rvp_live_XXXXXX_YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Keys carry scopes (projects:read, projects:write, exports:read, webhooks:manage, batches:write). Rotate a key by creating a new one and revoking the old one; revocation takes effect on the next request. Each key is limited to 600 requests per minute.

Requests from a signed-in dashboard session also work, which is handy for testing in the browser. If you belong to several workspaces, pick one with the x-workspace-id header.

Create a preview

POST /api/v1/projects
Content-Type: application/json

Body fields:

  • url (string, required): the prospect's website, as pasted. We normalise it.
  • language (string): auto or one of en, de, fr, es, nl, it, ar. Default auto, detected from the site.
  • themeId (string): one of modern_minimal, executive_trust, bold_high_contrast, luxury_editorial, tech_saas, warm_local_service. Omit it to let the AI choose.
  • brief (object): the Revamp Brief, same fields as the dashboard popup. Options above your plan answer 402 BRIEF_LOCKED.
  • pullCatalog (boolean): import shop products when the site is a store. Default true.
  • force (boolean): generate fresh even when a preview for this domain exists from the last 30 days. Default false.
curl -X POST "$APP_URL/api/v1/projects" \
  -H "Authorization: Bearer $REVAMP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"acme-plumbing.com","language":"en"}'

A successful call answers 202 Accepted:

{
  "project_id": "3f0c1d2e-8a5b-4c6d-9e7f-0a1b2c3d4e5f",
  "slug": "acme-plumbing-k7f2",
  "reused": false,
  "status_url": "/api/v1/projects/3f0c1d2e-8a5b-4c6d-9e7f-0a1b2c3d4e5f"
}

reused is true when the same domain was generated in the last 24 hours and no credit was charged.

Duplicates

A preview for the same domain in the last 30 days answers 409 with the existing project, so you can reuse it:

{
  "code": "DUPLICATE_PROJECT",
  "message": "You already have a preview for this domain.",
  "existing_project_id": "3f0c1d2e-8a5b-4c6d-9e7f-0a1b2c3d4e5f",
  "slug": "acme-plumbing-k7f2",
  "status": "ready",
  "created_at": "2026-11-01T09:30:00.000Z"
}

Send the same body with "force": true to generate a new one.

Get a preview's status

GET /api/v1/projects/{project_id}

Poll the status_url every few seconds, or better, subscribe to the preview.ready webhook. The answer includes status, progress_stage, progress_pct, audit_score and, on failure, error_code and error_message. A project of another workspace answers 404, never 403.

Errors

Errors are JSON with a stable code and a human message. Validation errors add issues (field paths), plan errors add minimum_plan, and rate limits add retry_after_ms plus a Retry-After header in seconds.

codeHTTP status
INVALID_URL422
INVALID_SCHEME422
IP_LITERAL_NOT_ALLOWED422
NOT_PUBLIC_HOST422
NON_STANDARD_PORT422
URL_TOO_LONG422
VALIDATION_FAILED400
UNAUTHENTICATED401
FORBIDDEN403
BLOCKED_DOMAIN422
PRIVATE_ADDRESS422
UNRESOLVABLE_HOST422
BRIEF_INVALID422
BRIEF_LOCKED402
INSPIRATION_REJECTED422
DUPLICATE_PROJECT409
RATE_LIMITED429
NO_CREDITS402
PLAN_INACTIVE402
ENQUEUE_FAILED503
SERVICE_UNAVAILABLE503
INTERNAL_ERROR500

Limits

  • Creating previews is limited per user, per workspace and per IP address, and any one domain can be previewed at most 3 times a day across the whole platform.
  • Banking, government, payment and patient-portal sites, and sign-in or checkout pages, are never previewed (BLOCKED_DOMAIN).
  • Every call that creates a preview spends one credit, except a regeneration of the same domain within 24 hours.