Troubleshooting
What the common Rezolve Ai errors mean and how to fix them.
Common issues when using Rezolve Ai, what they mean, and how to fix them.
401 Unauthorized
What it means: the API did not accept your key. It is missing, malformed, inactive, or expired.
- Send it correctly. Either
Authorization: Bearer <your-api-key>orX-API-Key: <your-api-key>. Watch for stray whitespace. Keys begin withace_live_orace_test_. - Check it in the dashboard. Under Settings, Developer console, Keys, confirm the key exists and has not been revoked or expired. A key you rotated stops working when its grace period ends. If you no longer have the full value, create a new key: the plain text is shown only at creation.
- Check the base URL. Calling a v1 path on the wrong host fails auth before anything else runs.
The MCP endpoint (https://ace.authoritas.com/api/mcp) uses the same key in the same Authorization: Bearer <key> header.
403 Forbidden
What it means: the key is valid but is not allowed to do what you asked. The error code says which case you are in.
FORBIDDENmeans the key lacks the scope the endpoint checks. The API Reference lists the scope for each endpoint. On the MCP server the message names the scopes the tool accepts and the ones your key has.PROJECT_SCOPE_MISMATCHmeans the key is pinned to one project and the request named another. Use a key for that project, or an account-wide key.- Use a key with the right scopes. The console creates keys but does not edit them, so create a new key under Settings, Developer console, Keys with what you need. New keys get
enrichment:read,enrichment:write, andutils:read. Webhooks, ratings, and feeds each need their own scope. See API Keys. - For an MCP tool that reports being disabled, enable it under Settings, Developer console, MCP. Discovery always lists the full catalogue, so a tool can appear in
tools/listand still be off for your project.
See API Keys for the full scope table.
402 Payment required
Three different causes share this status; the error code tells you which.
INSUFFICIENT_CREDITS means a live key has run the balance out.
- Check with
GET /api/v1/usageor the dashboard. - Ask your Rezolve Ai contact to add credits, or send a smaller batch.
- Budget beforehand: cost follows the number of products and the content types you ask for. See Credits and usage for planning figures.
TEST_QUOTA_EXCEEDED means a test key has used its free monthly allowance. The testQuota block in GET /api/v1/usage shows what is left. Switch to a live key, or wait for the month to roll over.
SUBSCRIPTION_REQUIRED means the project bills through Shopify and cannot run AI work yet. The message says why: the plan has not been approved, the store's setup is incomplete, or the store has reached its monthly budget. Open the Rezolve Ai app in your Shopify admin to approve the plan or finish setup, or raise the budget in the app's Settings. See Credits and usage.
429 Rate limit exceeded
What it means: too many requests in a short window. Each key has a requests per minute limit.
- Honour
Retry-After. It is the number of seconds until the current one-minute window ends. - Know your limit. A live key allows 120 requests a minute unless it was created with a different limit, and a test key allows 20.
X-RateLimit-Remainingon each response shows what is left. See Rate limits for how to set a different limit. - Send fewer, larger requests. One
/enrichment/pipelinecall with 200 products costs one request; 200 single-product calls cost 200. Batch first.
400 PROJECT_ID_REQUIRED
What it means: you called an endpoint that returns one project's rows, such as GET /api/v1/feeds, with an account-wide key and did not say which project.
Add ?projectId=<id> to the request (ids come from GET /api/v1/projects), or use a key pinned to a project. See Project scope.
409 RUN_ALREADY_ACTIVE
What it means: a request that would start an enrichment run was refused because another run is already in progress for the project, started from the API, the app, a connected store or an assistant. Only one runs at a time, so the same products are never enriched and charged twice.
It applies to everything that starts a run:
POST /api/v1/enrichment/pipeline, always.POST /api/v1/enrichment/content, when the request becomes a job (a202). A small request that is answered inline is not a run and is not refused.- The
run_enrichment_pipelineandenrich_contentMCP tools, which return the same message as the tool's error.
The message says where the run in progress was started, and details.runId and details.source name it. Wait for it to finish, then send the request again. The refusal costs nothing, and a test key's monthly allowance is not drawn.
A retry is never refused this way. Send the same Idempotency-Key as the request that started the run and you get that run's job back, even while it is still in progress.
A job is stuck or returned partial results
Pipeline requests always become durable jobs, and so do large rules, content, and lookup requests, so a 202 is normal rather than a failure.
- Check its status:
GET /api/v1/jobs/{id}, orrezolve jobs get <id>. partialis a real outcome. Some products succeeded and some did not.GET /api/v1/jobs/{id}/resultsshows both, withsucceededCountandfailedCount. Retry only the failures.- Cancel a run you no longer want:
POST /api/v1/jobs/{id}/cancel. Work already done is kept and still billed. - Do not double-pay for retries. Resend with the same
Idempotency-Keyand you get the original job back.
MCP: a tool is missing or fails
-
Confirm the server is reachable. An unauthenticated handshake should succeed:
curl -X POST https://ace.authoritas.com/api/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1.0"}}}' -
Listing is public; calling is not.
initialize,ping, andtools/listwork without a key. Anytools/callwithout a valid bearer returns 401. -
Tool disabled means it is off for your project. Enable it under Settings, Developer console, MCP.
-
Insufficient scope means the key cannot call that tool. See 403 above.
-
"An enrichment run is already in progress" from
run_enrichment_pipelineorenrich_contentmeans the project already has a run going. See 409 RUN_ALREADY_ACTIVE above. -
Merchant Center tools need a connected Google Merchant Center account, and catalog search needs an ingested catalog. Both are opt-in for that reason.
See MCP Server.
Connection errors or timeouts
- Use the right base URL:
https://ace.authoritas.com, no trailing slash. Sanity check withGET /api/v1/health, which needs no key. - Check the network path. Proxies and corporate firewalls sometimes block or rewrite requests.
- Retry with backoff. If a synchronous call keeps timing out, send
"mode": "async"and poll the job instead.
Output is empty or not what you expected
- Check the request shape. Enrichment endpoints take a
source({ "type": "inline", "products": [...] }or{ "type": "store", ... }), not a bareproductsarray. - Send more signal. A product with only
idandtitlegives the engine little to work with. Pass description, category, brand, price, images, and attributes where you have them. - Ground it in rules. Inconsistent tone across products usually means content was generated without shared rules. Derive them once with
POST /api/v1/enrichment/rulesand pass them into each content call. See Contextual Enrichment Engine and Generating content at scale. - Check readiness.
POST /api/v1/utils/agentic-readinessis free and reports exactly which fields each product is missing.
Quick reference
| Issue | Likely cause | Action |
|---|---|---|
| 401 | Missing, malformed, or expired key | Send Authorization: Bearer <key>; check the key is active. |
| 403 | Missing scope, a key pinned to another project, or tool disabled | Use a key with the right scope and project, or enable the tool under Settings, Developer console, MCP. |
| 402 | Out of credits, test quota spent, or plan unapproved | Check GET /api/v1/usage; ask for more credits, switch key, or approve the Shopify plan. |
| 429 | Too many requests | Honour Retry-After, batch into fewer calls. |
| 409 | Another enrichment run is active for the project | Wait for it to finish, then retry. |
| 202 then silence | Work became a durable job | Poll GET /api/v1/jobs/{id} or subscribe to webhooks. |
| partial | Some products failed | Read /jobs/{id}/results and retry only the failures. |
| Connection or timeout | Wrong URL or network path | Check GET /api/v1/health; retry with backoff; use async mode. |
For error shapes and rate limit headers, see the API Reference.