Read retained 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
ApiKeyAuthorizationBearer <token>limit?integerPage size, 1–100; defaults to 25.
1 <= value <= 10025cursor?stringOpaque cursor from the previous page. Repeat all filters unchanged. Never decode or construct a cursor yourself.
1 <= length <= 2048type?stringEvent type. Subscribe to the events needed for your workflow and process unknown future types safely.
"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?stringReport ID returned by upload preparation, admission, discovery, or an event. It must belong to the API key's workspace.
1 <= length <= 100interviewId?stringLogical interview attempt ID returned by invitation. A reinterview receives a new ID.
1 <= length <= 100Process 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- 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 }}