Migrating to current v1 shapes

Six routes were withdrawn from this reference and removed on 2026-09-04 (RAY-81437). They no longer appear in /openapi.json or /docs. Hitting any of them returns 410 Gone with a gone error envelope naming the successor (or stating there is no replacement for agent-selection). Nothing breaks silently — stale callers get an explicit diagnosis.

If your integration still calls any of them, move to the successor below. Every replacement takes the same authentication and the same scope as the route it replaces.

Route map

If you call Call this instead
POST /v1/projects/{id}/resume POST /v1/projects/{id}/resumptions
POST /v1/projects/{id}/human-review/resume POST /v1/projects/{id}/review/resumptions
GET /v1/projects/{id}/deliverables/zip GET /v1/projects/{id}/deliverables?format=zip
GET /v1/projects/{id}/deliverables/{deliverable_id}/download GET /v1/projects/{id}/deliverables/{deliverable_id}
GET /v1/projects/{id}/agent-selection no replacement — see below
POST /v1/projects/{id}/agent-selection no replacement — see below

Resuming after a top-up

Rename the path. Nothing else changes — same method, same empty body, same verify:submit scope, same responses.

curl -s -X POST https://api.arbitr.ai/v1/projects/PROJECT_ID/resumptions \
  -H "X-API-Key: abr_live_…"

The same applies to the human-stage hold: …/human-review/resume becomes …/review/resumptions.

Pre-launch: POST …/resumptions now uses the same ErrorEnvelope as …/review/resumptions (payment_required / not_awaiting_payment). The former flat {detail, required, …} body is gone. See Errors.

Downloading all deliverables as a zip

The zip is now a representation of the collection rather than a separate path. Quote the URL so the shell does not eat the ?.

curl -s "https://api.arbitr.ai/v1/projects/PROJECT_ID/deliverables?format=zip" \
  -H "X-API-Key: abr_live_…" \
  -o deliverables.zip

Downloading one deliverable

The /download suffix is gone. The collection member serves either the metadata or the bytes, decided by Accept.

curl -s https://api.arbitr.ai/v1/projects/PROJECT_ID/deliverables/DELIVERABLE_ID \
  -H "X-API-Key: abr_live_…" \
  -H "Accept: application/octet-stream" \
  -OJ

Omit the Accept header to get the JSON metadata instead.

One thing to check while you are here: the response Content-Type is the file's own type — text/plain, the Word MIME type, and so on. It is usually not application/octet-stream, which is only what you asked for. If your client asserts on that, the assertion needs to go.

Agent selection

There is no replacement, and nothing to call.

Agent selection is decided by the workflow array you send to POST /v1/projects. There is no separate step to read it back or submit it, so if your integration polls …/agent-selection or posts to it, delete that code rather than repointing it. Stage progress is reported on the review block of GET /v1/projects/{id}.

See Workflows & credits for what the workflow values mean.

How to tell whether this affects you

A stale call to any withdrawn route returns 410 with "code": "gone" and a message naming the successor (or stating there is no replacement). There are no Deprecation or Sunset headers — the routes are gone, not counting down.

If you are unsure what your integration calls, contact support with your API key prefix and we can tell you what we have seen it use.