Base URL
/v1. The OpenAPI document is at GET /v1/openapi.json and needs no key.
Make your first request
Make a key in the app, then ask the API who you are. The values below are examples.Terminal
Response body, read key
401 means the key is missing, wrong or revoked. See Authentication.
Resources
Every path except/v1/me and /v1/agents starts with /v1/agents/{agentId}, so find the agent id first.
Validating a spec is a
POST that stores and spends nothing, so a read key can call it. Scope follows what an operation does, not its HTTP method.
Calibrate tests needs a signed-in session. Every API key is refused with 403 and the code people_only, whatever its scope. It plays each test three times and spends like a run.
For the order to call things in, see Fix an issue and Test a fix.
Conventions
- JSON in and out, with camelCase fields. Ids are UUIDs. Timestamps are ISO 8601 in UTC, such as
2026-10-02T14:03:07.120Z. - Every response has a
Request-Idheader (req_and 24 hex characters), repeated in error bodies. Quote it when you report a problem. - A path under
/v1/agents/{agentId}returns404for an agent that does not exist, belongs to another workspace, or is not the one your key is tied to.
Errors
Every response that is not a success has the same body.Response body, 400
type, which follows from the status: invalid_request_error (400, 415, 422), authentication_error (401), budget_error (402), permission_error (403), not_found_error (404), conflict_error (409), rate_limit_error (429) and api_error (500). code names the reason and is stable within /v1. message is for people, so do not parse it. param names the field at fault, or is null. New codes can appear: treat an unfamiliar code as the general case of its type.
A 402
quota_exceeded is a plan limit, so do not retry it as it is. Limits and quotas shows the full response.
Pagination
Operations that return many items takelimit (1 to 100, default 25) and cursor, and return a list.
Response body
nextCursor back as cursor for the next page, and stop when hasMore is false. Treat the cursor as opaque and send it back unchanged.
Rate limits
Each API key, or signed-in person, can send 600 requests a minute with a burst of 120. A write also draws from a tighter bucket of 60 a minute with a burst of 20. Every response carriesRateLimit-Limit (the bucket size), RateLimit-Remaining and RateLimit-Reset (seconds until full) for the tighter bucket the request drew from. A refused request is a 429 with rate_limited and a Retry-After header in seconds. Wait that long, then retry.
The MCP server draws from the same buckets. The workspace as a whole, the AI-backed routes and failed authentications have limits too. Limits and quotas lists them all.
Runs take time
Start a run, rescore a run and calibrate tests answer at once with202. The simulated calls play afterwards. Poll Get a run until status is complete, refused or failed, then read the result.
A run is checked whole against the plan before it starts. If the plan’s simulated test calls do not cover it, it is refused with quota_exceeded and nothing plays. A run Signal started itself can show awaiting_approval when it is over the agent’s monthly test budget. Started through the API, the same run is refused with a 402. No key can approve a run.
To be told instead of polling, add a webhook endpoint under API keys in the app. When a run ends, Signal posts its result document to every endpoint, and retries a failed delivery 5 more times over about 7 hours.
Retries and idempotency
The API takes no idempotency keys. Retrying a read is safe. Retry a429 after Retry-After, and a 500 or a dropped connection with a growing delay. A write that timed out may have taken effect, so read the resource before you send it again.
Versioning
The version is in the path. Within/v1, changes only add: operations, optional parameters, response fields, error codes, and values in a field with a fixed set of values. Ignore fields you do not recognise, and treat an unknown value as “other”. Removing or renaming a field, a new required parameter, stricter validation, and any change to the error body or pagination need /v2, which would run beside /v1.
Next steps
Authentication
Make a key, choose read or write, and keep it safe.
Limits and quotas
Plan allowances, rate limits and the plan limit error.