# Check a key

> Whether the key works and its plan is LIVE: {ok, plan, limit_per_minute}. For a plugin's test button.

Source: https://firmtape.com/docs/developers/live/key

Whether the key works and its plan is LIVE: `{ok, plan, limit_per_minute}`. For a plugin's test button.

`GET /api/v1/key`

Plan LIVE · Key scope live · Limit 120 a minute per key; a 304 is free · Version 1.0.0 · Since 2026-09-30

**This endpoint serves:** [LIVE: Integration tokens](https://firmtape.com/docs/live#integration-tokens), [LIVE: Levels API](https://firmtape.com/docs/live#levels-api). **Plan:** [LIVE](https://firmtape.com/features/live). LIVE: today's session every second, alerts, ASK, the levels API and the platform integrations, and 5 LAB credits a month. Every finished session is free in REPLAY.

## Parameters

| Name | What it does | Default | Error |
| --- | --- | --- | --- |
| `errors` query, 200 | `200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status. |  |  |
| `key` query, string | Legacy: the key in the address, for platforms that cannot send headers. Prefer the header. |  |  |

## Response

The key works.

| Field | Meaning | Unit |
| --- | --- | --- |
| `ok` (boolean) | Always true. |  |
| `plan` (string) | `live`. |  |
| `limit_per_minute` (integer) | Requests a minute this key may make. |  |

## Errors

| Status | Code | What to do |
| --- | --- | --- |
| 401 | `no_key`, `bad_key` | No key. Send `Authorization: Bearer <key>` with a key of the product's scope. |
| 403 | `live_required` | No LIVE plan. Start or renew LIVE; `pricing` names the page. |
| 429 | `rate_limited`, `too_many_places` | Over a limit. Wait `Retry-After` seconds; poll with `If-None-Match`, a 304 is free. |

## Caching

Answers carry an `ETag`: send it back as `If-None-Match` and an unchanged reading answers 304 with no body, not counted against the limit.

## Request

```sh
curl \
  -H "Authorization: Bearer $FIRMTAPE_LIVE_KEY" \
  "https://firmtape.com/api/v1/key"
```

```python
import os, requests

H = {"Authorization": f"Bearer {os.environ['FIRMTAPE_LIVE_KEY']}"}
r = requests.get("https://firmtape.com/api/v1/key", headers=H)
print(r.status_code, r.text[:500])
```

```js
const r = await fetch("https://firmtape.com/api/v1/key", {
  method: "GET",
  headers: { Authorization: `Bearer ${process.env.FIRMTAPE_LIVE_KEY}` },
});
console.log(r.status, await r.text());
```

## Example response

```json
{
  "ok": true,
  "plan": "live",
  "limit_per_minute": 120
}
```

## Changes

- 2026-09-30: Added.
