Skip to content

Get extraction result for a job

GET
/api/v1/extraction/results/{jobId}
curl --request GET \
--url https://dashboard.justcrawl.io/api/v1/extraction/results/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Authorization: Bearer <token>'

Fetches the extraction result for one job, with explicit state codes for the extraction-done → bulk-writer-flush handoff (Phase 1 Lane D). Three terminal shapes:

  • 200 — bulk-writer landed the row; full ExtractionResult returned.
  • 202 — job is in extraction_done, awaiting the next bi-postgres flush. The response sets both the standard Retry-After HTTP header and a body field retryAfterSeconds so polling clients can drive their backoff from either source. Body shape { indexingPending: true, ... } is the discriminator the React polling hook union-narrows on.
  • 500 — job is completed but no extraction_results row landed (bulk-writer ack mismatch). The backend’s stuck_extraction_done_rows system_job cron alerts ops independently; this surface returns 500 so the UI shows “something went wrong” instead of spinning forever.

404 covers every other job status (pending / running / extracting / failed) and missing jobs alike — by design, an org never learns whether a missing UUID was another tenant’s job or never existed.

jobId
required
string format: uuid

Extraction result row has landed.

Media type application/json
object
id
string format: uuid
orgId
string format: uuid
jobId
string format: uuid
domain
string
schemaId
string
nullable
dataType
string
normalized
object
key
additional properties
any
rawBlobKey

Internal storage key for the raw HTML blob.

string
nullable
qualityCompleteness
number
qualityValidation
number
qualityComposite
number
latencyMs
integer
nullable
deliveredAt
string format: date-time
nullable
createdAt
string format: date-time
Example generated
{
"id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"orgId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"jobId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"domain": "example",
"schemaId": "example",
"dataType": "example",
"normalized": {},
"rawBlobKey": "example",
"qualityCompleteness": 1,
"qualityValidation": 1,
"qualityComposite": 1,
"latencyMs": 1,
"deliveredAt": "2026-04-15T12:00:00Z",
"createdAt": "2026-04-15T12:00:00Z"
}

Extraction completed; awaiting bulk-writer flush. Retry after retryAfterSeconds (also sent as the standard Retry-After HTTP header).

Media type application/json
object
indexingPending
boolean
status
string
Allowed values: extraction_done
retryAfterSeconds
integer
message
string
Example
{
"indexingPending": true,
"status": "extraction_done"
}
Retry-After
integer

Suggested delay in seconds before the next poll.

Missing or invalid authentication token

Media type application/json
object
error
string
Example
{
"error": "Missing or invalid authentication token"
}

Insufficient permissions for this operation

Media type application/json
object
error
string
Example
{
"error": "No organization. Complete onboarding first."
}

Resource not found

Media type application/json
object
error
string
Example
{
"error": "Workflow not found"
}

Unexpected server error. Logs and PostHog $exception capture

Media type application/json
object
error
string
Example
{
"error": "Something went wrong"
}