Get a job's result
Retrieve a job's result: the same envelope the assess call returns. Poll until the status leaves processing, or pass wait to long-poll.
GET /v1/jobs/:jobId
Request
GET /v1/jobs/:jobIdAuthorization: Bearer {api_key}Path parameters
| Parameter | Type | Description | Required |
|---|---|---|---|
| jobId | string (uuid) | Identifier of the job to fetch, as returned by POST /v1/assess. | Yes |
Query parameters
| Parameter | Type | Description | Required |
|---|---|---|---|
| wait | boolean | Block until the job completes. true (the default) waits up to 30 s before falling back to the polling response; false returns immediately. Changes response timing and HTTP status only, never the result shape. | No |
Example request
curl -X GET "https://api.pixelsystems.com/v1/jobs/550e8400-e29b-41d4-a716-446655440000?wait=true" \ -H "Authorization: Bearer {api_key}"Response (200)
Result for the job (poll or long-poll)
| Field | Type | Description |
|---|---|---|
| jobId | string (uuid) | Single job identity, shared by every path that references this job. |
| status | JobStatus | Lifecycle status of a job, derived from results[].status: processing while any result is processing, then error if any result errored, otherwise completed. A job with no files is processing. Each result carries its own verdict once completed. rejected is reserved for future use and is not currently produced. |
| results | array<FileResult> | One result per submitted file, in submission order. This is the job's result; read each entry's status, verdict, and expertReview. There is no job-level verdict: two files in one job can reach opposite assessments. |
| error | JobResultError | Why a job or one of its results ended in error (or a job in rejected) status; present only for those statuses. Uses the same code vocabulary as endpoint errors. On the job it is derived from the results: result_unavailable when every errored result carries that code, otherwise internal_error. |
| metadata | object | Caller-supplied metadata, echoed back verbatim. Absent when the submission carried none. |
| createdAt | string (date-time) | When the job was created (ISO 8601). |
| completedAt | string (date-time) | When processing finished (ISO 8601). Absent while the job is processing. |
Example response
{ "jobId": "550e8400-e29b-41d4-a716-446655440000", "status": "completed", "results": [ { "file": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "name": "front.jpg", "size": 1834211, "type": "image/jpeg" }, "status": "completed", "startedAt": "2026-06-01T12:00:01Z", "completedAt": "2026-06-01T12:00:14Z", "verdict": { "assessment": "ai_generated", "confidence": "high" }, "dimensions": [ { "key": "ai_detection", "assessment": "likely_ai", "score": 0.82, "confidence": "high" } ] }, { "file": { "id": "9b2d3f41-6a8e-4c1b-9f0d-2e7a5c8b1d34", "name": "side.jpg", "size": 1650372, "type": "image/jpeg" }, "status": "completed", "startedAt": "2026-06-01T12:00:01Z", "completedAt": "2026-06-01T12:00:12Z", "verdict": { "assessment": "authentic", "confidence": "medium" }, "dimensions": [ { "key": "ai_detection", "assessment": "likely_authentic", "score": 0.12, "confidence": "medium" } ] } ], "metadata": { "customer_case_id": "case-123" }, "createdAt": "2026-06-01T12:00:00Z", "completedAt": "2026-06-01T12:00:14Z"}Still processing
{ "jobId": "550e8400-e29b-41d4-a716-446655440000", "status": "processing", "results": [ { "file": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "name": "photo.jpg", "size": 1834211, "type": "image/jpeg" }, "status": "processing", "startedAt": "2026-06-01T12:00:01Z", "completedAt": null } ], "createdAt": "2026-06-01T12:00:00Z"}Completed, expert review in progress
{ "jobId": "550e8400-e29b-41d4-a716-446655440000", "status": "completed", "results": [ { "file": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "name": "photo.jpg", "size": 1834211, "type": "image/jpeg" }, "status": "completed", "startedAt": "2026-06-01T12:00:01Z", "completedAt": "2026-06-01T12:00:14Z", "verdict": { "assessment": "inconclusive", "confidence": "low" }, "dimensions": [ { "key": "ai_detection", "assessment": "uncertain", "score": 0.51, "confidence": "low" } ], "expertReview": { "status": "in_progress", "requestNotes": "Customer disputes the result; original attached.", "submittedAt": "2026-06-01T14:02:40Z" } } ], "createdAt": "2026-06-01T12:00:00Z", "completedAt": "2026-06-01T12:00:14Z"}Failed
{ "jobId": "550e8400-e29b-41d4-a716-446655440000", "status": "error", "results": [ { "file": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "name": "photo.jpg", "size": 1834211, "type": "image/jpeg" }, "status": "error", "startedAt": "2026-06-01T12:00:01Z", "completedAt": "2026-06-01T12:00:09Z", "error": { "code": "internal_error", "message": "The analysis failed during processing." } } ], "error": { "code": "internal_error", "message": "The job failed during processing." }, "createdAt": "2026-06-01T12:00:00Z", "completedAt": "2026-06-01T12:00:09Z"}Notes
The job's result is results[]: one entry per file, in submission order, each with its own status; a completed entry carries verdict and dimensions, an error entry carries error, and a processing entry carries neither. There is no job-level verdict, because two files in one job can reach opposite assessments. The job's status is derived from the results: processing while any result is processing, then error if any result errored, otherwise completed. When a verification specialist has reviewed a file, that file's result carries an expertReview field; see ResultExpertReview. The result's verdict keeps returning the automated result either way, so integrations that read it are unaffected; read expertReview.result to apply the specialist's correction. During a re-analysis the result reads as processing without it, and the review returns when the new run finishes.