# Get the signing key

Source: https://langbot.ai/docs/api/receipts/get-key

`GET /v1/receipts/key`

The Ed25519 public key that signs checkpoints, attestations and reports. Also at `/.well-known/langbot-receipts.json`.

**Auth.** None. Without a token the call is served as Free (the Free delay and request budget, shared per IP); send `Authorization: Bearer lb_…` for your plan's.

**Limits.** Counts against your plan's API requests (60, 600 or 3,000 a minute on Free, Builder and Standard).

## Request

**curl**

```bash
curl "https://api.langbot.ai/v1/receipts/key"
```

**Python**

```python
from langbot import LangbotClient

async with LangbotClient() as lb:
    key = await lb.receipts_key()
    print(key["key_id"], key["public_key"])
```

**TypeScript**

```ts
import { LangbotClient } from "@langbotai/sdk";

const lb = new LangbotClient();
const key = await lb.receiptsKey();
console.log(key.key_id);
```

## Response

`200 OK`

```json
{
  "key_id": "7c2794192d3cf5a0",
  "algorithm": "ed25519",
  "public_key": "aiq2s7AF1azPcXK8COaosb94lxXwnp19EiENhQkeEc4=",
  "hash": "sha256",
  "canonical": "json-sorted-compact-ascii",
  "v": 1,
  "previous": []
}
```

A real response from the API; long lists are cut to their first items.

After a rotation, `previous` lists the earlier keys; old checkpoints keep the `key_id` they were signed with.

## Errors

| Status | `code` | When |
|---|---|---|
| 401 | `token_invalid` | A token was sent and not recognised. Send a valid one, or none to call anonymously. |
| 429 | `rate_limited` | Over your request budget; wait `Retry-After` seconds. |

Every error body is `{"detail": …, "code": "…"}`; branch on `code`. All codes: [Errors](https://langbot.ai/docs/api#errors).
