API Reference
Overview of the Rezolve Ai v1 API, authentication, scopes, jobs, and errors.
The v1 API covers the Contextual Enrichment Engine, durable jobs, account usage, feed utilities, projects, and webhooks. Each endpoint has its own reference page in this section with parameters, schemas, request samples, and a live request panel. This page covers the parts that apply across all of them.
Base URL
https://ace.authoritas.com/api/v1
All paths below are relative to that base. For a machine readable description, GET /api/v1/openapi returns the full OpenAPI 3.0 spec.
Authentication
Every endpoint that requires auth accepts an API key in either header:
Authorization: Bearer <your-api-key>X-API-Key: <your-api-key>
No key is needed for GET /api/v1/health or GET /api/v1/openapi. Create and manage keys under Settings, Developer console, Keys. See API Keys for details.
Scopes
| Scope | Endpoints unlocked |
|---|---|
enrichment:read | GET /jobs, GET /jobs/{id}, GET /jobs/{id}/results, GET /usage, GET /feeds, GET /projects |
enrichment:write | Everything above, plus POST /enrichment/rules, POST /enrichment/content, POST /enrichment/pipeline, POST /jobs/{id}/cancel |
utils:read | POST /utils/language, POST /utils/agentic-readiness, POST /utils/review-quality |
webhooks:read | GET /webhooks, GET /webhooks/{id}, GET /webhooks/{id}/deliveries |
webhooks:write | Everything above, plus create, update, and delete webhooks |
admin | Every v1 endpoint. Grants all other scopes. |
New keys get enrichment:read, enrichment:write, and utils:read by default.
Endpoints
Contextual Enrichment Engine: Generate contextual rules, Generate rules-grounded content, Run the full pipeline.
Jobs: List jobs, Get a job, Get job results, Cancel a job.
Utilities: Detect language, Agentic readiness, Review quality.
Feeds and projects: List feeds, Get a feed, List projects, Get a project.
Webhooks: List, Create, Get, Update, Delete, Deliveries.
Content types
Use these values in the contentTypes array for POST /enrichment/content and POST /enrichment/pipeline.
| Content type | API value |
|---|---|
| Product description | product-description |
| Meta tags and SEO | meta-tags |
| Enhanced JSON-LD schema | jsonld-schema |
| IRL scenario cards | irl-scenarios |
| Internal linking recommendations | internal-links |
| Product title | product-title |
| Highlights and bullet points | highlights |
| Product Q&A | product-qa |
| Product attributes | product-attributes |
| Image alt text | image-alt |
| Google Shopping feed fields | google-shopping |
| Agentic Commerce feed fields | agentic-commerce |
| Microsoft Shopping feed fields | microsoft-shopping |
| Shopify feed fields | shopify |
| WooCommerce feed fields | woocommerce |
A value that is not in this table is skipped rather than rejected, and is listed in skippedContentTypes (on a synchronous response, or on the job's result) so you can see it was not generated or charged. image-alt needs at least one product image with a public URL.
Synchronous and asynchronous requests
POST /enrichment/rules returns its result inline. POST /enrichment/content and POST /enrichment/pipeline decide based on how much work you asked for: a small inline set runs immediately, and anything larger returns 202 with a job envelope. Send "mode": "async" to force a job, or "mode": "sync" to require an inline result.
Poll a job with GET /jobs/{id}, or subscribe to webhooks and skip polling.
Idempotency
Send an Idempotency-Key header on a write to make a retry safe. A repeat within the retention window returns the original job instead of starting a second one.
Key management
These endpoints manage API keys for the currently logged in user. They use session (cookie) auth, not an API key, so call them from your app or from a script that shares the browser session.
| Method | Path | Purpose |
|---|---|---|
| GET | /api/keys | List the current user's keys (metadata only). |
| POST | /api/keys | Create a key. Body: name (required), optional scopes, rate_limit_per_minute, expires_at. The plain key is returned only on create. |
| GET | /api/keys/[id] | Get one key by ID (metadata only). |
| PATCH | /api/keys/[id] | Update a key (name, scopes, rate limit, expiry, active state). |
| DELETE | /api/keys/[id] | Revoke and delete the key. |
Rate limits
Each key has a configurable requests per minute limit. When exceeded, the API returns 429 with Retry-After and X-RateLimit-* headers. Set the limit when creating or editing the key.
Errors
Errors use the shape { "error": { "code": "...", "message": "...", "details": ... } } with these HTTP statuses:
| Status | Meaning |
|---|---|
| 400 | Invalid request or validation error |
| 401 | Missing or invalid API key |
| 402 | Insufficient credits, test quota exhausted, or subscription required |
| 403 | Forbidden, for example a missing scope |
| 404 | No such resource, or it belongs to another account |
| 429 | Rate limit exceeded |
| 500 | Server error |
Success responses use { "data": ... } or the documented response shape for that endpoint.
Error codes
| Code | Status | When |
|---|---|---|
PROJECT_ID_REQUIRED | 400 | The endpoint returns project-scoped rows and the request named no project. Applies to an account-wide key that omitted projectId. |
PROJECT_SCOPE_MISMATCH | 403 | The key is pinned to one project and the request named a different one. |
INSUFFICIENT_CREDITS | 402 | Not enough credits for the request. |
PROJECT_ID_REQUIRED
{
"error": {
"code": "PROJECT_ID_REQUIRED",
"message": "This endpoint returns project-scoped data. Pass ?projectId=<id>, or use a key pinned to a project."
}
}Why you may be seeing this now. GET /feeds and GET /feeds/{id} used to
answer an account-wide key with no projectId by merging rows from every
project on the account. Nothing in the response said which project each row came
from, so there was no safe way to read it. They now ask you to name one.
Two ways to fix it, both one-time:
- add
?projectId=<id>to the request. Ids come fromGET /projects. - or pin the key to a project in Settings, Developer console, Keys, and leave the parameter off.
PROJECT_SCOPE_MISMATCH
{
"error": {
"code": "PROJECT_SCOPE_MISMATCH",
"message": "This API key is scoped to a different project."
}
}A pinned key may only act on its own project. Use an account-wide key, or a key pinned to the project you are addressing.