---
title: "GET /v1/jobs/{jobId}/snapshots/list"
description: "List a job's snapshots"
full: true
---

**Auth:** required. Send an `ivy_` API key (`Authorization: Bearer ivy_…` or `X-Ivy-Api-Key`), a Clerk session JWT (`Authorization: Bearer …`) or the Clerk `__session` cookie (browser sessions). See [Authentication](/docs/api/authentication).

Lists the snapshot images stored for a job you can read, newest first. Each item pairs a PNG with the JSON file stored beside it, when there is one, and gives their storage locations as `spaces://<bucket>/<key>` URIs. These are storage locations, not download links.

Pass `manifestChecksum` to list only the snapshots stored under that manifest checksum. With `includeContext=1`, each item that has a JSON file also carries that file's parsed contents in `context`, and its `checksum_sha256` when the file records one; a JSON file that cannot be read or parsed is skipped without an error. Results are paged: when `truncated` is true, pass `nextCursor` as `cursor` to continue.

## Request

#### Path parameters

- `jobId` (string (uuid)) —
Job UUID.

#### Query parameters

- `manifestChecksum` (string) —
Only list snapshots stored under this manifest checksum.

- `includeContext` (string) —
Set to `1` to include each snapshot's JSON contents as `context`. Any other value leaves it out.

- `limit` (integer) —
Maximum number of snapshots to return, from 1 to 200. Defaults to 60.

- `cursor` (string) —
The `nextCursor` value from a previous response.

## Responses

### `200` OK

The job's snapshots, with a cursor when more remain

Response shape:

- `items` (object[]) —
Snapshots, newest first

- `nextCursor` (string) —
Pass as `cursor` to get the next page; `null` when there is no more

- `truncated` (boolean) —
True when more snapshots remain beyond this page

### `400` Bad Request

The job id is empty

Response shape: `object`

### `401` Unauthorized

Authentication required

Response shape: `object`

### `404` Not Found

The job does not exist, you cannot read it, or it is outside your API key's project scope. All of these return the same body.

Response shape: `object`

### `429` Too Many Requests

Rate limit exceeded

Response shape: `object`

### `500` Internal Server Error

File storage is not configured, or listing failed

Response shape: `object`

**curl**

```bash
curl -X GET 'https://ivybiosciences.com/api/v1/jobs/{jobId}/snapshots/list' \
  -H "Authorization: Bearer $IVY_API_KEY"
```

**JavaScript**

```js
const res = await fetch('https://ivybiosciences.com/api/v1/jobs/{jobId}/snapshots/list', {
  method: 'GET',
  headers: {
    'Authorization': `Bearer ${process.env.IVY_API_KEY}`,
  },
});
const data = await res.json();
```

**Python**

```python
import os, requests

res = requests.get(
    "https://ivybiosciences.com/api/v1/jobs/{jobId}/snapshots/list",
    headers={"Authorization": f"Bearer {os.environ['IVY_API_KEY']}"},
)
data = res.json()
```
