# Get a job's result

> Source: https://pixelsystems.com/docs/api/get-job


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

```http
GET /v1/jobs/:jobId
Authorization: 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

```bash
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`](https://pixelsystems.com/docs/api/resources#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>`](https://pixelsystems.com/docs/api/resources#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`](https://pixelsystems.com/docs/api/resources#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](https://en.wikipedia.org/wiki/ISO_8601)). |
| completedAt | `string (date-time)` | When processing finished ([ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)). Absent while the job is `processing`. |

## Example response

```json
{
  "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

```json
{
  "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

```json
{
  "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

```json
{
  "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](https://pixelsystems.com/docs/concepts#expert-review) a file, that file's result carries an `expertReview` field; see [`ResultExpertReview`](https://pixelsystems.com/docs/api/resources#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.
