Documentation
DocsErrors

Errors

The one error envelope and the error codes the API serves at /docs/errors, with whether to retry.

Every error uses the same JSON envelope. Branch on code, which is stable. The message can change.

json
{
  "error": {
    "code": "insufficient_credits",
    "message": "The brand does not have enough prepaid balance to cover this post.",
    "fix": "Nothing was charged and no slot was used. Ask the brand to add funds, then submit again inside the window.",
    "docs_url": "/docs/errors#insufficient_credits",
    "retryable": false,
    "request_id": "..."
  }
}

When retryable is true, retry with exponential backoff. When it is false, change the request or the state first. A service that cannot be reached answers 503 provider_unavailable, and nothing is charged.

Codes

unauthorized

HTTP 401, not retryable. The API key is missing, malformed, revoked or unknown. Send a valid key in the Authorization header as "Bearer <key>". If the key was revoked, create a new one and retry.

forbidden

HTTP 403, not retryable. This API key is not allowed to make this request. Use a key from an account that has access to this product, or ask the account owner to grant access.

insufficient_credits

HTTP 402, not retryable. The account does not have enough credits for this lookup. Add credits to the account, then retry. Nothing was charged for this request.

rate_limited

HTTP 429, retryable. Too many requests for this API key. Wait the number of seconds in the Retry-After header, then retry. Spread requests out to stay under the X-RateLimit-Limit value.

invalid_input

HTTP 400, not retryable. The request input is invalid. Correct the field named in the message and resend. The fields each route takes are in the API reference. Nothing was charged.

unknown_product

HTTP 404, not retryable. No product exists at this path. Check the path against the routes in the API reference.

method_not_allowed

HTTP 405, not retryable. This endpoint does not accept that HTTP method. Use the method named in the Allow response header (lookup endpoints and /v1/mcp accept POST).

payload_too_large

HTTP 413, not retryable. The request body is too large. Send one lookup input per request and keep the JSON body small. Split large lists into separate requests.

provider_unavailable

HTTP 503, retryable. A service this request depends on, such as X or Stripe, cannot be reached right now. Nothing was charged. Email hello@viewpayout.com if it continues.

internal_error

HTTP 500, retryable. An unexpected error occurred. Retry once after a short wait. If it fails again, report the request_id to support. Nothing was charged.

not_found

HTTP 404, not retryable. Nothing exists at this address. Check the path and any ids in it against the API reference, then retry.

conflict

HTTP 409, not retryable. The request conflicts with the current state of the resource. Fetch the resource again, check its current state, then resend if the change still applies.

signature_invalid

HTTP 400, not retryable. The request signature is missing or does not match. Sign the exact raw request body with the signing secret this server was given and send the signature header.

plan_limit

HTTP 402, not retryable. The current plan does not allow this. Change to a plan that includes it, or reduce usage to stay within the plan, then retry.

subscription_required

HTTP 402, not retryable. This needs an active subscription. Subscribe from the billing page of the dashboard, then retry.

trial_expired

HTTP 402, not retryable. The free trial has ended. Subscribe from the billing page of the dashboard to keep using the service.