Polling & Jobs
How Steve represents asynchronous workflow progress and what to read from the polling endpoint.
GET /api/v1/jobs/{sessionId} is the polling endpoint for asynchronous workflow sessions.
It answers a different question from GET /api/v1/submissions/{submissionId}:
- the job endpoint tells you where the session is in its async lifecycle
- the submission endpoint gives you the canonical review-state read model
Endpoint
The session must belong to the same API key.
Workflow-session response
Field meanings
| Field | Meaning |
|---|---|
state | Session lifecycle status |
submissionStatus | Current public submission status when known |
result | Workflow-specific extraction payload |
failedReason | Processing failure reason when state=failed |
processedAt | ISO completion timestamp when available |
webhookDeliveryStatus | Delivery state for the configured production webhook |
For a newly created or still-running session, result, submissionStatus, and processedAt may be null.
Status values
| Status | Meaning | Terminal |
|---|---|---|
pending | Session exists but has not been submitted | No |
submitted | Session has been queued or is actively processing | No |
completed | Processing finished | Yes |
failed | Processing failed | Yes |
expired | Session timed out before submit | Yes |
Submission status values
When Steve has a linked submission, submissionStatus can be:
createdprocessingreviewapprovedsyncedrejectedcancelledfailed
This is the field to use when you need to know whether a completed session requires manual review.
Expiration model
Sessions are created with a 30-minute TTL. Expiration is finalized by a background sweep, so a stale unsubmitted session can remain pending briefly before it is marked expired.
Webhook delivery status
| Value | Meaning |
|---|---|
null | No webhook URL was configured |
pending | Delivery is queued or retrying |
delivered | A target returned 2xx |
failed | Delivery exhausted its retry budget |
Recommended polling pattern
- poll every 5 to 10 seconds
- stop when
stateiscompleted,failed, orexpired - if
state=completedandsubmissionStatus=review, fetch the submission and enter your review flow - if webhooks are enabled, keep polling as a fallback and recovery path rather than the primary notification channel