Errors

The status codes and error bodies the partner API returns.

The error body

An error response from the partner API is a JSON object with a single detail key. Its value takes one of three shapes.

A string, for most errors:

{"detail": "Engagement not found"}

A list, when the request fails validation (422). Each entry names the failing location in loc, a machine-readable type and a message in msg:

{
  "detail": [
    {
      "type": "missing",
      "loc": ["body", "events"],
      "msg": "Field required",
      "input": {"url": "x"}
    }
  ]
}

An object, in three cases: 409 on engagement submit ({message, blocked[]}), and 422 or 503 on asset verify ({outcome, reason}).

The one exception is an unhandled server error. It is answered 500 with Content-Type: text/plain and the body Internal Server Error, not JSON.

Status codes

Status When the partner API returns it detail Described in
400 Submit of an engagement that is not pending or blocked string Engagements
401 No key, a key that matches no active key, or a key whose organization is gone string Authentication
404 An id that does not exist or belongs to another organization; an engagement with no report; a path that matches no route string Engagements, Reports
405 A method the path does not support, for example DELETE on an engagement string, Method Not Allowed Partner API
409 Registering a duplicate asset, or deleting an asset with verification history string Assets
409 Submit refused by the launch gate object Engagements
422 Request validation: a missing or mistyped field, a malformed id in the path, a body that is not valid JSON, an invalid cadence list Assets, Engagements, Schedules, Webhooks
422 An asset value invalid for its kind, an unknown parent asset, or verify on an asset with no automated method string Assets
422 Verify ended in fail object Assets
500 An organization with no user, on an endpoint that acts as a user string, No user found for organization Authentication
500 An unhandled error: a framework value over 50 characters on an engagement or a schedule, a webhook url over 500 characters, an asset value over 255 characters, a schedule PATCH whose expression and timezone fail together, or a submit whose job cannot be queued none: plain text Assets, Engagements, Schedules, Webhooks
503 Verify ended in error object Assets

A successful DELETE answers 204 with no body. A path sent with a trailing slash, such as /api/v1/engagements/, is answered 307 with a redirect; send paths exactly as the endpoint table lists them.

Timestamps

Timestamps in responses are ISO 8601 strings in UTC. Whether a timestamp carries an offset suffix depends on the endpoint and the database, so parse them as UTC whether or not the suffix is present. Schedule timestamps and preview run times always end in +00:00.

Last updated 2026-09-24