---
title: "Page through a job's finished items (JSONL)"
method: GET
path: "/v1/batch/{batchID}/results"
tags: ["Batch"]
---

# Page through a job's finished items (JSONL)

`GET /v1/batch/{batchID}/results`

## Request

- Base URL: `https://api.spicrawl.com`
- URL: `https://api.spicrawl.com/v1/batch/{batchID}/results`
- Auth: HTTP bearer

Streams one page of FINISHED items (status succeeded, failed, cancelled or skipped) in `seq` order as JSON Lines:
one `BatchResultLine` object per line, each terminated by `\n`, no array, no trailing pagination object.
Works while the job is still running (returns what has finished so far). Unfinished items are never listed.

Pagination is in headers: if `X-Next-Cursor` is present, request again with `cursor=<that value>` (the `Link`
header already contains that URL with your `limit` and `status` preserved). No `X-Next-Cursor` means this page
is the last one right now; on a running job, later calls may return more items after the last `seq` you saw.
A stream that ends early without the header you expected on a full page indicates a dropped connection — retry
the same cursor.

Bodies: `result.content` is inlined from the job's stitched result file, which exists only after the job is
terminal, so `result` is absent on a running job. Caps: 524,288 bytes (512 KiB) per item and 2,097,152 bytes
(2 MiB) per page; see `BatchResultBody` for `truncated` / `omitted` / `unavailable`.

Retention: results are readable until `results_expire_at` (72 h after submission by default). After that this
endpoint answers 410 `ERR::REQUEST::BEYOND_RETENTION` even if rows still exist; the job object itself stays
readable via GET /v1/batch/{batchID}.

## Query parameters

- `limit` integer
- `cursor` string
- `status` 'succeeded' | 'failed' | 'cancelled' | 'skipped'

## Response `200`

One page of result lines.

## Other responses

- `400`: The request is invalid. Not retryable; fix the request using `code` and `diagnostics.hint`.
- `401`: Missing, invalid, revoked or expired key. Not retryable with the same key.
- `403`: The key lacks the scope this route requires (`ERR::AUTH::INSUFFICIENT_SCOPE`), or the action is not permitted.
- `404`: No such resource for this key's organization.
- `410`: The resource existed but is past its retention window or was purged. Not retryable.
- `500`: Internal error. Retryable when `retryable` is true.

---

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