Docs
API reference

List reports

GET
/api/v1/reports

Find reports in your workspace, reconcile stored application IDs, or backfill your local report index.

Before you call

Use createdAfter/createdBefore for exclusive time bounds. External-reference filtering requires both source and ID. include=reference adds the reference to each returned report.

Required scope: reports:read.

What happens next

Read items and pass nextCursor unchanged to the next request with the same filters. null means the current list is exhausted. Reports are newest first.

Recovery

Start from the first page if filters change or a cursor is invalid. Newer reports inserted during pagination appear on a fresh first page. Old unsigned cursors are no longer accepted.

Follow the complete workflow · Errors and retries

Authorization

ApiKey
headerAuthorizationBearer <token>

Query Parameters

limit?integer

Page size, 1–100; defaults to 25.

Range1 <= value <= 100
Default25
externalReferenceSource?string

External source slug. Must be supplied with externalReferenceId.

Match^[a-z0-9]+(?:-[a-z0-9]+)*$
Length1 <= length <= 64
externalReferenceId?string

Case-sensitive application ID. Must be supplied with externalReferenceSource.

Length1 <= length <= 128
include?string

Set to reference to include externalReference in report summaries; omitted by default for compatibility.

cursor?string

Opaque cursor from the previous page. Repeat all filters unchanged. Never decode or construct a cursor yourself.

Length1 <= length <= 2048
createdAfter?string

Exclusive lower creation-time bound, ISO 8601 with timezone.

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Formatdate-time
createdBefore?string

Exclusive upper creation-time bound, ISO 8601 with timezone; must be later than createdAfter.

Match^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$
Formatdate-time

Response Body

Read items and pass nextCursor unchanged to the next request with the same filters. null means the current list is exhausted. Reports are newest first.

application/json
  1. response
data*
# Set PROBB_URL and PROBB_API_KEY. Replace RESOURCE_ID if present.curl --fail-with-body -X GET "$PROBB_URL/api/v1/reports" \  -H "Authorization: Bearer $PROBB_API_KEY"
{  "data": {    "items": [      {        "id": "report_example",        "createdAt": "2026-09-29T12:00:00.000Z",        "reportSystemVersion": "assigned-report-version",        "status": "completed",        "attemptId": "attempt_example",        "code": null,        "jobDescription": {          "id": "job_example",          "title": "Backend Engineer",          "company": "Example Company"        },        "candidate": {          "name": "Alex Example",          "currentRole": "Software Engineer"        },        "result": {          "score": 8,          "summary": "Relevant backend delivery experience; validate incident response depth.",          "scoreReasoning": "Strong API and database evidence, with limited detail on production incidents."        }      }    ],    "nextCursor": null  }}