---
title: "Get a job artifact"
method: GET
path: "/v1/documents/jobs/{id}/{path}"
tags: ["Documents"]
---

# Get a job artifact

`GET /v1/documents/jobs/{id}/{path}`

## Request

- Base URL: `https://console.nace.ai`
- URL: `https://console.nace.ai/v1/documents/jobs/{id}/{path}`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/nace/apis/drex-api/docs/v1/documents/jobs/:id/:path/get.ts> (a function with typed inputs; its response is checked against the schema)

A file the job produced (parse images, transcripts, ground crops, converted files), its `request` echo, or its `events` stream, at the path the job body links to. `path` may span several segments.

- **Stored files** (`ground-crops`, `ground-transcript`, `parse-images`, `parse-transcript`, `converted-pdf`, `spreadsheet-cell-maps`) answer `302` with a signed storage link that works for 5 minutes without your API key. With `redirect=false`, they answer `200` with that link as JSON.
- **Everything else** (`request`, `events`, `document-content`, `spreadsheet-content`, `spreadsheet-rows`) is streamed.
- **Rate limits:** file downloads don't count against the per-minute limit; `events` and `request` do.

Parse preview snapshots and events count against the per-minute limit; individual preview part reads do not. See [Parse streaming](/docs/perception/parse#streaming).

## Path parameters

- `id` string, uuid, required
- `path` string, required

## Query parameters

- `redirect` 'true' | 'false' | '0' | '1'

## Response `200`

A streamed artifact, in its own content type; for a stored file with `redirect=false`, its signed link as a `DocumentJobFileLink`.

- union
  - DocumentJobFileLink: A signed link to one stored file a job produced.
    - `url` string, uri, required: Signed storage URL, fetched without your API key. Treat it as a temporary credential.
    - `expires_at` integer, required: When the link stops working, as Unix epoch seconds.
  - unknown

## Other responses

- `202`: The artifact is still being prepared; retry shortly.
- `206`: Part of a streamed artifact, for a `Range` request the artifact supports. The `request` echo ignores `Range` and answers `200` with all of it.
- `302`: A stored file: follow `location` to a signed storage link, valid for 5 minutes. It needs no API key, so don't send yours to it.
- `401`: Missing or invalid API key (`authentication_error`, code `invalid_api_key`).
- `404`: No such job for this account, or no such artifact (`not_found_error`).
- `410`: The artifact has expired (`not_found_error`, code `result_expired`), or the job was created before 2026-10-03 and its results are no longer available (code `job_unavailable`).
- `429`: Over the account's requests per minute for document routes, or the document service is throttling this account (`rate_limit_error`).
- `500`: Something failed on Drex's side (`internal_error`).
- `502`: The document service refused Drex's own request (`upstream_error`, code `ndi_refused_drex`). Retry later.
- `503`: The document service is unavailable (`service_unavailable`).
- `504`: The document service timed out (`upstream_error`).
- `529`: The public API is paused (code `service_disabled`) (`overloaded`).

---

[API](https://skmtc.dev/nace/apis/drex-api.md) - [All operations](https://skmtc.dev/nace/apis/drex-api/llms.txt) - [OpenAPI document](https://skmtc.dev/nace/apis/drex-api/revisions/a0e62d925a61?raw)
