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

# Errors

> HTTP status codes the MeetingKit API returns and what they mean.

The MeetingKit API uses conventional HTTP status codes. Codes in the `2xx` range
indicate success, `4xx` indicates a problem with the request, and `5xx` indicates a
problem on our end.

| Code | Meaning |
| - | - |
| `400` | Bad Request — the body could not be parsed, or a required parameter is missing. |
| `401` | Unauthorized — your API key is missing or wrong, or you can't access that resource. |
| `403` | Forbidden — the resource requested is hidden for administrators only. |
| `404` | Not Found — the specified resource could not be found. |
| `405` | Method Not Allowed — you tried to access a resource with an invalid method. |
| `406` | Not Acceptable — you requested a format that isn't JSON. |
| `409` | Conflict — the resource is in a state that does not allow the requested action. |
| `410` | Gone — the resource requested has been removed from our servers. |
| `422` | Unprocessable Entity — there was an error processing your request. |
| `429` | Too Many Requests — you've hit a [rate limit](/api-reference/rate-limits). |
| `500` | Internal Server Error — we had a problem with our server. Try again later. |
| `503` | Service Unavailable — we're temporarily offline for maintenance. Please try again later. |

## Error body

Every error the API renders, `401` and `429` included, has the same body: an `errors` array. That includes a path that matches no endpoint (`404`) and a known path called with a method it doesn't take (`405`, with an `Allow` header listing the methods it does). One response comes from in front of the API and is plain text: the per-IP flood limit (`429`).

```json theme={null}
{
  "errors": [
    {
      "code": "invalid",
      "field": "recording.methods.bot.mode",
      "message": "must be one of: audio_and_video, audio_only, inherit"
    }
  ]
}
```

| Key | What it is |
| - | - |
| `code` | A stable snake\_case word. Branch on it. |
| `message` | A sentence for humans. It may be reworded; do not parse it. |
| `field` | The dotted path to the request field at fault, such as `settings.language`. Present only when one field is. |

A validation failure (`422`) lists one error per field. A `429` also carries
`retry_in_seconds`, the same number as the `Retry-After` header (see
[Rate limits](/api-reference/rate-limits)).

### Codes

| Status | Codes |
| - | - |
| `400` | `bad_request`, `invalid_json`, `invalid_api_version`, `missing` (with the `field`) |
| `401` | `missing_api_key`, `invalid_api_key`, `unauthorized` (the key is valid but may not do this) |
| `403` | `plan_upgrade_required`, `workspace_access_not_allowed`, `workspace_update_not_allowed`, `workspace_archive_not_allowed`, `workspace_creation_not_allowed` |
| `404` | `not_found` |
| `405` | `method_not_allowed` |
| `409` | `conflict`, `bot_not_editable`, `bot_not_cancellable`, `workspace_owner`, `calendar_already_connected`, `meeting_not_upcoming`, `meeting_live`, `shared_meeting`, `no_calendar_event` |
| `422` | Validation codes such as `missing`, `blank`, `invalid`, `inclusion`, `invalid_type`, `invalid_format`, `too_long`; and `unusable_setting`, `provider_rejected`, `shared_account`, `unavailable`, `seat_billed_plan`, `unknown_field`, `not_supported`, `not_available`, `enforced` |
| `429` | `rate_limited`, `workspace_creation_rate_limited` |
| `500` | `internal_error` |
| `502` | `provider_error` |
| `503` | `provider_unavailable` |

New codes can appear at any time; treat an unknown one by its HTTP status.

## Request mistakes we diagnose

A few mistakes are common enough when wiring up a new client that the API names them
instead of returning a generic failure:

| What happened | Response (status, `code`, `message`) |
| - | - |
| JSON body sent with a missing or wrong `Content-Type` (`text/plain`, form) | Parsed as JSON anyway — no error. |
| Body is the literal string `[object Object]` (a `fetch` call without stringify) | `400` `invalid_json` · `Request body is the string "[object Object]". Pass JSON.stringify(payload) as the body.` |
| Body is malformed JSON | `400` `invalid_json` · `Request body is not valid JSON: <parser message with the position>` |
| Endpoint needs a workspace and `workspace_id` is blank | `400` `bad_request` · `Parameter missing: workspace_id` |
| No `Authorization` header | `401` `missing_api_key` · `Missing API key. Send it as "Authorization: <your key>".` |
| `Authorization` header present but the key matches no account | `401` `invalid_api_key` · `Invalid API key.` |
| A path that matches no endpoint (a typo, a resource that doesn't exist) | `404` `not_found` · `No endpoint matches GET /api/v1/bot`. Answered before the API key is checked. |
| A known path with a method it doesn't take | `405` `method_not_allowed` · `DELETE is not allowed on /api/v1/calendar_events. Allowed: POST` |

Each endpoint's reference page lists the errors it returns.
