> ## Documentation Index
> Fetch the complete documentation index at: https://docs.schedkit.net/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

> HTTP status codes and error response format.

## Response format

All errors return JSON with an `error` field:

```json theme={null}
{ "error": "Not found" }
```

Some errors include additional fields:

```json theme={null}
{
  "error": "Upgrade required",
  "upgrade": true,
  "plan_required": "agency"
}
```

## Status codes

| Code  | Meaning                                                  |
| ----- | -------------------------------------------------------- |
| `200` | OK                                                       |
| `201` | Created                                                  |
| `400` | Bad request — missing or invalid fields                  |
| `401` | Unauthenticated — missing or invalid API key/session     |
| `403` | Forbidden — valid auth, insufficient permissions or plan |
| `404` | Not found                                                |
| `409` | Conflict — duplicate resource                            |
| `422` | Unprocessable — validation failed                        |
| `429` | Rate limited                                             |
| `500` | Server error                                             |

## Common errors

### 400 — Validation failed

```json theme={null}
{ "error": "title is required" }
```

### 401 — No session

```json theme={null}
{ "error": "Unauthorized" }
```

### 403 — Plan limit

```json theme={null}
{
  "error": "Free plan allows up to 3 event types",
  "upgrade": true
}
```

### 404 — Resource not found

```json theme={null}
{ "error": "Not found" }
```

### 409 — Slot taken

```json theme={null}
{ "error": "Time slot unavailable" }
```

## Rate limiting

Limits are per API key per minute. If you hit a 429, back off and retry. Headers are not currently exposed but will be added in a future release.
