> ## Documentation Index
> Fetch the complete documentation index at: https://tfstudio.truefan.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get single image status

> Check one image's status by bulk_job_id + your own external_id

Send the `bulk_job_id` from [Generate images](/docs/api-reference/generation/bulk-generate-images) and the `external_id` you set on that row to get that one image's status — the only per-row lookup in this API. Use this while a batch is still processing; once the whole batch is done, the same information (plus every other row's) is in the [CSV export](/docs/api-reference/image-status/export-image-bulk-job-csv) instead.

<ParamField path="bulk_job_id" type="string" required>
  Returned from [Generate images](/docs/api-reference/generation/bulk-generate-images).
</ParamField>

<ParamField path="external_id" type="string" required>
  Whatever you sent for this row's `external_id`.
</ParamField>

<ParamField header="Authorization" type="string" required>
  `Bearer {api_key}`
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl "https://dev-backend-ai.truefans.in/api/external/v1/image-bulk-jobs/{bulk_job_id}/generations/{external_id}/status/" \
    -H "Authorization: Bearer $TRUEFAN_API_KEY"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK — still processing theme={null}
  {
    "generation_id": "f339beb9-305d-4a01-89ef-669b7ec70de3",
    "row_index": 0,
    "external_id": "usr_9182",
    "output_type": "image",
    "status": "processing",
    "result_image_url": null,
    "created": "2026-08-21T10:02:00Z",
    "modified": "2026-08-21T10:02:05Z"
  }
  ```

  ```json 200 OK — done theme={null}
  {
    "generation_id": "f339beb9-305d-4a01-89ef-669b7ec70de3",
    "row_index": 0,
    "external_id": "usr_9182",
    "output_type": "image",
    "status": "success",
    "result_image_url": "https://assets-studio.truefans.in/editor/.../a.png",
    "created": "2026-08-21T10:02:00Z",
    "modified": "2026-08-21T10:02:40Z"
  }
  ```

  ```json 401 Unauthorized theme={null}
  { "error": "API key required" }
  ```

  ```json 404 Not Found — no bulk job theme={null}
  { "error": "Image bulk job not found" }
  ```

  ```json 404 Not Found — no matching row theme={null}
  { "error": "No row with this external_id in this bulk job" }
  ```

  ```json 409 Conflict theme={null}
  { "error": "external_id is not unique within this bulk job — multiple rows match" }
  ```
</ResponseExample>

<Warning>
  `external_id` only needs to be unique **within the batch that defined it** — nothing stops you from reusing the same value across different batches (that's fine, since lookups are always scoped to one `bulk_job_id`), but reusing it for two rows in the **same** batch makes this endpoint ambiguous and returns `409`.
</Warning>

## Response fields

<ResponseField name="output_type" type="string">
  `image` for rows from an image template. Branch on this before reading a result URL.
</ResponseField>

<ResponseField name="status" type="string">
  `pending` → `processing` → `success` or `failed`. Terminal states are `success`/`failed` — stop polling once you reach one.
</ResponseField>

<ResponseField name="row_index" type="integer">
  This row's position in the `rows` list it was submitted with — `0` for a single-image (one-row) request.
</ResponseField>

<ResponseField name="result_image_url" type="string | null">
  Populated only once `status` is `success`. Image rows carry no `result_video_url` — the field is absent, not `null`.
</ResponseField>
