---
title: "GET /v1/jobs/{jobId}/qc/metrics"
description: "Read a job's plate QC metrics"
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).

Computes QC metrics from the readout rows of a job you can read: the coefficient of variation per plate row and per plate column, an estimated Z' factor and the plate shape.

The Z' factor is a heuristic. The route has no control labels, so it treats the lowest and highest readout values as the negative and positive controls. It is `null` when there are too few values or the two group means are equal. `shape` is the largest row and column seen in the well names, defaulting to a standard plate when none can be parsed. The `X-Metrics-Rows` header gives the number of readout rows used and `X-Metrics-HasZPrime` says whether `zPrime` is set.

## Request

#### Path parameters

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

#### Query parameters

- `minControls` (number) —
Minimum number of values in each of the low and high groups used for Z'

- `tailFraction` (number) —
Fraction of the values taken from each end as the low and high groups

## Responses

### `200` OK

The QC metrics

Response shape:

- `success` (enum (true)) —

- `zPrime` (number) —
Heuristic Z' factor, or `null` when it cannot be computed.

- `cvByRow` (object) —
Coefficient of variation per plate row, keyed by row number.

- `cvByCol` (object) —
Coefficient of variation per plate column, keyed by column number.

- `shape` (object) —

#### shape properties

- `rows` (integer) —

- `cols` (integer) —

### `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. This route answers 403 here, not 404; `code` is `UNAUTHORIZED` and `message` is `Forbidden`.

Response shape: `object`

### `429` Too Many Requests

Rate limit exceeded

Response shape: `object`

### `500` Internal Server Error

Computing the metrics failed

Response shape: `object`

**curl**

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

**JavaScript**

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