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.