SteveSteve

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

GET /api/v1/jobs/{sessionId}
Authorization: Bearer aok_<key>

The session must belong to the same API key.

Workflow-session response

{
  "sessionId": "jx7ses789session",
  "submissionId": "jx7sub456submissions",
  "workflow": {
    "slug": "receipt-ocr",
    "version": 3
  },
  "companyId": "jx7abc123company",
  "state": "completed",
  "submissionStatus": "review",
  "result": {
    "extractedData": {
      "merchantName": "Biedronka",
      "totalAmount": 123.45,
      "currency": "PLN"
    },
    "confidence": 0.96,
    "fraudStatus": "flagged"
  },
  "failedReason": null,
  "clientSubmissionId": "order-1711353600000",
  "metadata": {
    "orderId": "12345"
  },
  "processedAt": "2026-03-25T10:05:30.000Z",
  "webhookDeliveryStatus": "delivered"
}

Field meanings

FieldMeaning
stateSession lifecycle status
submissionStatusCurrent public submission status when known
resultWorkflow-specific extraction payload
failedReasonProcessing failure reason when state=failed
processedAtISO completion timestamp when available
webhookDeliveryStatusDelivery state for the configured production webhook

For a newly created or still-running session, result, submissionStatus, and processedAt may be null.

Status values

StatusMeaningTerminal
pendingSession exists but has not been submittedNo
submittedSession has been queued or is actively processingNo
completedProcessing finishedYes
failedProcessing failedYes
expiredSession timed out before submitYes

Submission status values

When Steve has a linked submission, submissionStatus can be:

  • created
  • processing
  • review
  • approved
  • synced
  • rejected
  • cancelled
  • failed

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

ValueMeaning
nullNo webhook URL was configured
pendingDelivery is queued or retrying
deliveredA target returned 2xx
failedDelivery exhausted its retry budget
  • poll every 5 to 10 seconds
  • stop when state is completed, failed, or expired
  • if state=completed and submissionStatus=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

On this page