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):autoor one ofen,de,fr,es,nl,it,ar. Defaultauto, detected from the site.themeId(string): one ofmodern_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 answer402 BRIEF_LOCKED.pullCatalog(boolean): import shop products when the site is a store. Defaulttrue.force(boolean): generate fresh even when a preview for this domain exists from the last 30 days. Defaultfalse.
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.
| code | HTTP status |
|---|---|
INVALID_URL | 422 |
INVALID_SCHEME | 422 |
IP_LITERAL_NOT_ALLOWED | 422 |
NOT_PUBLIC_HOST | 422 |
NON_STANDARD_PORT | 422 |
URL_TOO_LONG | 422 |
VALIDATION_FAILED | 400 |
UNAUTHENTICATED | 401 |
FORBIDDEN | 403 |
BLOCKED_DOMAIN | 422 |
PRIVATE_ADDRESS | 422 |
UNRESOLVABLE_HOST | 422 |
BRIEF_INVALID | 422 |
BRIEF_LOCKED | 402 |
INSPIRATION_REJECTED | 422 |
DUPLICATE_PROJECT | 409 |
RATE_LIMITED | 429 |
NO_CREDITS | 402 |
PLAN_INACTIVE | 402 |
ENQUEUE_FAILED | 503 |
SERVICE_UNAVAILABLE | 503 |
INTERNAL_ERROR | 500 |
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.