/v1 request authenticates with a project API key, sent as a bearer token:
Keys minted against production start with
pk_live_; keys minted in a non-production environment start with pk_test_. They behave identically — the prefix just tells you at a glance which environment a key came from, which is worth checking first when a key 401s.Create a key
Keys live under Settings → API → API Keys.The API section is for owners and admins. If you’re a workspace member without admin access, it doesn’t appear in your Settings sidebar at all.
1
Open Settings → API
Pick the project you want the key to act on. A key belongs to that one project.
2
Click New key
Give it a name you’ll recognise later — “Zapier integration”, “order webhook worker”. The name is for you; it’s never sent anywhere.
3
Tick only the scopes it needs
Grant the minimum. A key that only sends messages should hold
messages:send and nothing else. See Scopes.4
Copy the key immediately
The secret is shown once, in a dialog, with a copy button. Paige stores only a hash of it — nobody, including Paige support, can show it to you again.
Rotate and revoke
Each key row has Rotate and Revoke, plus an option to edit its scopes.- Rotate issues a fresh secret for the same key and shows it once. Update your integration promptly — the old secret stops working.
- Revoke deletes it. Anything still using it starts getting
401 invalid_api_keyimmediately.
The key is also the project
There is no project id in any/v1 path. The key resolves to its project on every request, which is why /v1/messages needs no more context than the message itself.
Confirm which project a key resolves to, and what it may do there, with GET /v1/ping.
Signing in instead of pasting a key
There’s a second way in, for AI agents: Paige’s MCP server supports OAuth, so clients like Claude and ChatGPT let you click Connect, sign in to Paige, and approve on a consent screen. No raw key is ever pasted, and access is revocable from Settings → API → Connected agents. An OAuth connection issues an access token (it starts withmcp_at_) that works as a bearer against the same /v1 endpoints. The differences worth knowing:
- One connection can reach several projects, each with its own scopes. Permissions never pool — a project can’t borrow a scope from a sibling project on the same connection.
- Tokens are revocable and can expire. A revoked or expired one returns
401 invalid_token.
Targeting a project with X-Paige-Project
Because an OAuth connection can cover several projects, requests can name one:
GET /v1/projects, which lists every project the credential may act on along with its per-project scopes and which one is the default. Matching is case-insensitive.
Scopes are always checked against the selected project only.
