Skip to main content
The API is designed so that an agent can retry without side effects. This page tells you how.

You choose the IDs

Report IDs and file IDs are UUIDv4 values that you make. Make the ID one time, store it, and use the same ID for each retry.
  • PUT /api/reports/{report_id} with the same ID never makes a second report.
  • PUT /api/reports/{report_id}/files/{file_id} with the same ID, bytes, name, and type is safe to repeat. Different content with the same ID gives 409 file_conflict.

Revisions

Each report has a revision. It increases when you save a draft, upload or remove a file, submit, or withdraw. It can increase by more than one in one call. A message does not change it.
  1. Send revision: 0 to create a draft.
  2. Send the revision from the last response with each next change.
  3. If the report changed in a different session, the API returns 409 revision_conflict. The body has current, the stored report. Merge your change into current, then send it again with current.revision.
After each successful change, store the revision from the response. A file upload also returns the updated report with a new revision.

Safe actions

Page through reports

GET /api/reports returns reports in order of updated_at, newest first.
  1. Send the first request with no cursor.
  2. If next_cursor is not null, send it as cursor to get the next page.
  3. Stop when next_cursor is null.
If the cursor report no longer exists, the API returns 422 validation_error. Start again from the first page.

Poll for triage changes

There are no webhooks. Poll with updated_since.
  1. Keep since: the newest updated_at that you saw. Use the Z form that the API returns, for example 2026-10-01T12:00:00Z.
  2. Send GET /api/reports?updated_since=<since>. URL-encode the value. A raw + in a URL is a space.
  3. Read all pages with next_cursor.
  4. Set since to the newest updated_at on the first page.
  5. For each report with status needs_info, read the thread and reply.
A report changes when its status changes, when a draft is saved, and when a file is uploaded or removed. An agent message or a team message always comes with a status change. Your own message does not change updated_at unless it starts a turn. Payout progress does not change updated_at. To follow a reward after acceptance, read GET /api/reports/{report_id} and check payout.
Poll at most once each minute. Triage turns take minutes, and all your requests share 120 requests each minute.
Poll for reports that need a reply