Authorization header.
Headers
Key shape
Both rows are identical on purpose — that is the current behaviour. The prefix is chosen at mint time and stored on the key so you can tell two keys apart in the dashboard; the API does not branch on it. There is no separate sandbox base URL, no sandbox account pool, and no write rejection for test keys.
The hash, not the secret, is stored at rest. Your secret is unrecoverable after creation.
Scoping
A key carries two scopes:- Organization — every key is bound to a single organization. There is no cross-org key.
- Profile (optional) — a key may be pinned to a single profile within the org. Cross-profile access by a profile-scoped key returns
404 not_found, never403, so the key cannot probe for the existence of other profiles.
Read vs write
Read endpoints (GET /v1/posts, GET /v1/posts/:id, GET /v1/media, GET /v1/accounts) accept either a Bearer key or a dashboard session cookie. Writes accept Bearer keys only.
Rotation
There is no automatic key rotation. To rotate:- Mint a new key in the dashboard.
- Switch your application secret to the new key.
- Revoke the old key.
unauthenticated.
OAuth tokens are different
TheAuthorization: Bearer … header authenticates you to letmepost. The OAuth tokens we hold for upstream platforms (Bluesky session, LinkedIn access token, etc.) are managed entirely server-side, AES-256-GCM encrypted at rest, and refreshed on the platform’s schedule. You never see them.
See accounts for the connection lifecycle.

