---
title: Rate limits and errors
description: How many requests you can make, and what error responses look like.
icon: triangle-alert
search:
  keywords: [rate limit, "429", errors, status codes, retry-after]
---

## Rate limits

Each API key and each OAuth connection can make **120 requests per minute**. Over the limit, you get `429 Too Many Requests` with a `Retry-After` header saying how many seconds to wait.

## Errors

Errors return JSON with a stable `code`, a `message`, a `hint` on how to fix it, and a link to the API description. `error` repeats the message for older clients:

```json
{
  "error": "Not found",
  "code": "not_found",
  "message": "Not found",
  "hint": "The resource does not exist or belongs to another Workspace. Endpoints live under /api/v1; see the OpenAPI description.",
  "docs": "/api/v1/openapi.json"
}
```

Unknown paths under `/api` return the same shape with status `404`.

| Status | `code` | Meaning |
| --- | --- | --- |
| `400` | `invalid_request` | The request is invalid, for example a bad query parameter or body. |
| `401` | `unauthorized` | The token is missing, invalid or revoked. |
| `403` | `insufficient_scope` | The token doesn't have the scope this endpoint needs. |
| `404` | `not_found` | The form or response doesn't exist, isn't completed, or belongs to another workspace. |
| `429` | `rate_limited` | Rate limited. Wait for `Retry-After` seconds. |

:::tip Treat `404` as "not available to this token". Finerlise doesn't reveal whether something exists in another workspace. :::
