Docs
API reference

Read retained events

GET
/api/v1/events

Recover notifications missed by your receiver or poll changes without hosting a webhook endpoint. The feed follows durable publication order within your workspace.

Before you call

Use events:read. Start without a cursor, then retain the returned position. Optional type/reportId/interviewId filters must remain unchanged while following a cursor.

Required scope: events:read.

What happens next

Process items durably before saving nextCursor, even on an empty page. Use hasMore to drain retained pages. Deleted bodies appear as minimal tombstones; a cursor is an opaque credential-like value, not an offset.

Recovery

EVENT_CURSOR_EXPIRED returns 410 after retained history is lost. Reconcile current reports/interviews and establish a fresh position. Polling does not resend webhooks; use catch-up or replay for receiver redelivery.

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
cursor?string

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

Length1 <= length <= 2048
type?string

Event type. Subscribe to the events needed for your workflow and process unknown future types safely.

Value in"batch.completed""report.completed""report.result_ready""report.deleted""report.failed""report.requires_action""webhook.test""interview.invited""interview.started""interview.completed""interview.expired""interview.preparation_failed""interview.result_ready""interview.result_failed""interview.invitation_failed"
reportId?string

Report ID returned by upload preparation, admission, discovery, or an event. It must belong to the API key's workspace.

Length1 <= length <= 100
interviewId?string

Logical interview attempt ID returned by invitation. A reinterview receives a new ID.

Length1 <= length <= 100

Response Body

Process items durably before saving nextCursor, even on an empty page. Use hasMore to drain retained pages. Deleted bodies appear as minimal tombstones; a cursor is an opaque credential-like value, not an offset.

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/events" \  -H "Authorization: Bearer $PROBB_API_KEY"
{  "data": {    "items": [      {        "id": "a1cbb923-8b3c-4d05-b74f-623efc6d5f8d",        "type": "report.completed",        "schemaVersion": 1,        "occurredAt": "2026-09-29T12:00:00.000Z",        "data": {          "reportId": "report_example",          "attemptId": "attempt_example",          "status": "completed",          "code": null        }      }    ],    "nextCursor": "opaque-server-issued-cursor",    "hasMore": false  }}