---
title: "Errors and rate limits"
description: "The error shape, every error code, and the per-key rate limits."
---

> Documentation Index
> Fetch the complete documentation index at: https://developer.unipage.be/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors and rate limits

## Errors

Every error on every route has one shape:

```json
{
  "error": {
    "code": "SLOT_UNAVAILABLE",
    "message": "Human readable",
    "fields": { "customer.email": "Invalid e-mail" }
  }
}
```

`fields` is only present when the error belongs to specific request fields.

| Code | Status | Meaning |
|---|---|---|
| `UNAUTHENTICATED` | 401 | no valid key |
| `FORBIDDEN` | 403 | wrong key kind or unregistered origin |
| `NOT_FOUND` | 404 | unknown route, product or order |
| `METHOD_NOT_ALLOWED` | 405 | |
| `VALIDATION` | 422 | the request is not valid, see `fields` |
| `SLOT_UNAVAILABLE` | 422 | the chosen time slot is full or no longer offered |
| `DELIVERY_UNAVAILABLE` | 422 | no delivery, or not to this zone |
| `PRODUCT_UNAVAILABLE` | 422 | a product is sold out or not orderable now |
| `COUPON_INVALID` | 422 | the coupon is not valid for this order |
| `MINIMUM_NOT_REACHED` | 422 | below the delivery minimum |
| `RATE_LIMITED` | 429 | see `Retry-After` |
| `INTERNAL` | 500 | a fault on our side, never a client mistake |

> **Note**
>
> `COUPON_INVALID` and `MINIMUM_NOT_REACHED` only come from
> [`POST /orders`](/storefront/api/orders/create/): the
> [quote](/storefront/api/cart/quote/) reports both inside its 200 response
> (`coupon.valid`, `minimum`, `canCheckout`).

## Rate limits

Per key, answered with `429 RATE_LIMITED` and a `Retry-After` header (seconds):

| Key | Limit |
|---|---|
| Public key | 1200 requests/min in total, and 120/min per IP address |
| Secret key | 300 requests/min |

Source: https://developer.unipage.be/storefront/errors/index.mdx
