---
title: "Checks vs thresholds | Grafana Labs"
description: "Checks validate per-request correctness while thresholds enforce whole-test pass/fail"
---

> For a curated documentation index, see [llms.txt](/llms.txt). For the complete documentation index, see [llms-full.txt](/llms-full.txt).

## Two layers of validation

## Checks: per-request correctness

**Checks** are assertions that validate each response. They don’t stop the test on failure.

JavaScript ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```javascript
check(res, {
  'status is 200': (r) => r.status === 200,
  'body is not empty': (r) => r.body.length > 0,
});
```

## Thresholds: whole-test pass/fail

**Thresholds** are pass/fail criteria for the entire test. They evaluate aggregate metrics.

JavaScript ![Copy code to clipboard](/media/images/icons/icon-copy-small-2.svg) Copy

```javascript
thresholds: {
  http_req_duration: ['p(95)<500'],
  http_req_failed: ['rate<0.01'],
  checks: ['rate>0.99'],
}
```

## How they work together

| Layer          | Scope        | On failure                                  |
|----------------|--------------|---------------------------------------------|
| **Checks**     | Each request | Records failure, test continues             |
| **Thresholds** | Entire test  | Test exits with non-zero code (fails CI/CD) |
