Skip to main content
Switch on code. It is stable, and message may be reworded.
Quote the request_id when you report a problem. It identifies the request in our logs.

Codes

What to do

Fix the one field named in details.field. Unknown parameters come back as details.unknown_parameters.A filter typo shows up here instead of as a wrong list.
Check the Authorization: Bearer ... header. A revoked key is replaced in Settings, not recovered. The response carries WWW-Authenticate.workspace_required means a valid Clerk token with no organization, or an organization with no Ziplined workspace. Pick a workspace and connect again. It is never guessed for you.
Show the upgrade_url from details. Retrying will not help.limit_exceeded means a usage cap on the plan was reached. Upgrade, or ask for less.
Issue a key with the scope the endpoint needs.A resource in another workspace answers not_found, not forbidden. A missing record and a foreign record are deliberately one answer, so the error is not a proof of existence.
Use a fresh Idempotency-Key for a new request.If the first request is still in flight, wait and read the result. Do not retry.
Only on POST /v1/integrations. Your endpoint gave no 2xx within ten seconds to the signed ping, and no destination was created.Make the endpoint answer 2xx to a POST it does not recognise, then create it again.
Back off for Retry-After seconds.RateLimit-Remaining on every response lets you avoid this.
Retry once. If internal_error persists, report the request_id.bad_gateway happens only on the OAuth discovery paths. Nothing in your request caused it.

Errors from MCP tools

An error inside a tool is a tool error, not a transport error. The result has isError: true and structuredContent carries the same code and message. rate_limited adds retry_after in seconds. Only missing or invalid authentication is an HTTP status, because the client answers it with an OAuth handshake.

Errors on a run

A failed background run carries its own error and error_code, separate from the codes above. nothing_written is a result, not a crash. The detail behind handler_threw stays in our logs.