Poll project status

GET /v1/projects/{id} is the only status endpoint. Scope: verify:read.

Use the project UUID from create (id). Do not poll with a numeric id.

curl -s https://api-arbitr.straker.ai/v1/projects/3f2a9c1e-4b7d-4c8a-9f10-2d6e5b7c8a91 \
  -H "X-API-Key: abr_live_…"

This is also the only call that returns assessment (and a populated review when a human stage is in play). Create and list omit those blocks.

What to read

Field Use
status Whether to keep polling, download, or resume
assessment.billable_character_count Billable source characters (basis for intelligence credits)
assessment.due_date Your date, echoed unchanged
assessment.due_date_feasible true / false, or null if you sent no due_date
assessment.credits.intelligence required, available, sufficient — always present
assessment.credits.trust Same shape when the workflow has a human stage; otherwise null
review Human-stage lifecycle; empty until a review is requested

There is no server-computed delivery date on this response.

When to stop polling

status What to do
completed Download deliverables
failed / cancelled Stop. Do not download
awaiting_payment Top up credits, then resume (see Workflows & credits)
anything else Keep polling

Honor rate limits. Sleep a few seconds between calls. Tight loops will hit 429.

import time

while True:
    body = client.get(f"/v1/projects/{project_id}").json()
    status = body["status"]
    if status == "completed":
        break
    if status in ("failed", "cancelled"):
        raise RuntimeError(status)
    if status == "awaiting_payment":
        raise RuntimeError("top up credits and resume")
    time.sleep(5)

Common failures

Status Typical cause
401 / 403 Missing key, or key lacks verify:read
404 not_found Unknown UUID, or not in your org

Next

Download deliverables when status is completed.