---
title: "GET /v1/jobs/{jobId}/readouts"
description: "Read a job's readouts"
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 readout rows saved for a job you can read. Rows from the job's legacy readouts table are returned when there are any, ordered by row and then column. Otherwise the route returns rows from the newer readouts table, ordered by well, with `channel` set to `primary`, `meta` set to `null` and the row and column derived from the well name. A job with no readouts returns an empty `rows` array.

## Request

#### Path parameters

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

## Responses

### `200` OK

The job's readout rows

Response shape:

- `success` (enum (true)) —

- `rows` (object[]) —

### `400` Bad Request

The job id is missing

Response shape: `object`

### `401` Unauthorized

Authentication required

Response shape: `object`

### `403` Forbidden

You cannot read the job, or it is outside your API key's project scope; `code` is `FORBIDDEN`

Response shape: `object`

### `429` Too Many Requests

Rate limit exceeded

Response shape: `object`

### `500` Internal Server Error

Reading readouts failed

Response shape: `object`

**curl**

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

**JavaScript**

```js
const res = await fetch('https://ivybiosciences.com/api/v1/jobs/{jobId}/readouts', {
  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}/readouts",
    headers={"Authorization": f"Bearer {os.environ['IVY_API_KEY']}"},
)
data = res.json()
```
