Skip to main content
GET
/
v1
/
jobs
/
{id}
/
stream
Per-job events stream (SSE)
curl --request GET \
  --url https://api.reader.dev/v1/jobs/{id}/stream \
  --header 'x-api-key: <api-key>'
"event: job:progress\ndata: {\"jobId\":\"j_abc\",\"status\":\"processing\",\"completed\":45,\"total\":100}\n\nevent: job:completed\ndata: {\"jobId\":\"j_abc\",\"status\":\"completed\",\"completed\":100,\"total\":100,\"creditsUsed\":100}\n\n"
Stream events for a single job over a long-lived HTTP connection. Events fire as pages complete and the stream closes automatically when the job reaches a terminal state.

Event types

EventPayload
progress{ status, completed, total }: periodic progress snapshots
pageA completed page result (same shape as a sync scrape)
error{ url, error }: a single page failed
done{ status, completed, total }: final event, stream closes
The SDK clients wrap this as client.stream(jobId) returning an async iterator. See SSE streaming. For a workspace-wide stream of every job’s events, use GET /v1/events instead.

Authorizations

x-api-key
string
header
required

Path Parameters

id
string
required

Response

SSE stream that closes when the job terminates

Server-Sent Events stream. Each frame is a line-delimited event with an event: line, a data: line (JSON payload), and a trailing blank line. Keep-alive comments (: ping) are sent every 30 seconds. See Events for the full event catalog.

Example:

"event: job:progress\ndata: {\"jobId\":\"j_abc\",\"status\":\"processing\",\"completed\":45,\"total\":100}\n\nevent: job:completed\ndata: {\"jobId\":\"j_abc\",\"status\":\"completed\",\"completed\":100,\"total\":100,\"creditsUsed\":100}\n\n"