Verify the calling key
The whoami endpoint - returns the calling key’s own object: scopes, status, and effective rate limits. Never any secret material (masked_key only).
Scope: none required. Self-introspection needs no extra scope - the caller is asking about the very key it authenticated with, so requiring a scope to answer “what am I” would be circular. Works with ANY active key, including one with an empty scopes array.
Use it to:
- Prove a key works before wiring it into a system (CI health checks, onboarding flows)
- Debug a 403 - see exactly which scopes the key holds vs what the endpoint needs
- Let integrations self-configure - an agent or app discovers its own permissions and limits at runtime instead of hardcoding them
A key can describe itself but can never enumerate other keys, mint a new key, or revoke any key - all key management (mint, rotate, revoke, edit scopes) is dashboard-only at Settings → Developers → API Keys. This is deliberate: there is no api_keys:manage scope, so a compromised key cannot mint its own replacement or discover sibling keys.
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Response
Calling key.
Self-introspection view of the CALLING API key. A key can describe itself but can never enumerate other keys, mint a new key, or revoke any key - minting/rotation/revocation are dashboard-only (Settings → Developers → API Keys). This is the safety rail: a compromised key cannot mint a replacement before being revoked.
Key identifier (key_ prefix). Derived from the key material but NOT usable for authentication.
^key_[A-Za-z0-9]+$"key_8h2K9bP4mR7qX1nF3vT6wY5s"
Always "api_key".
"api_key"Prefix-visible-suffix masked form: first 16 chars visible (vendor prefix + first 9 of suffix), last 12 visible, middle replaced with a dotted run. The plaintext secret is shown exactly once at mint time and never again - lost secret means rotate.
"vxn_sk_8h2K............................wY5sA0jL2dG8"
Human-readable label set at mint time (e.g. which system uses this key).
1 - 60"Demo Coffee POS bridge"
Permissions granted to this key, selected at creation time in the dashboard. The v1 scope registry is CLOSED at exactly these NINETEEN scopes; new scopes only ship as part of a versioned API change (see 03-AUTHENTICATION.md). Read does not imply write. Products, custom fields, notification reads and webhook reads each have their own least-privilege scopes. products:read/products:write and custom_fields:read/custom_fields:write replace the earlier cards:read/cards:write borrowing. notifications:read covers the three GET routes (list/retrieve/deliveries); notifications:send still gates the broadcast POST and cancel DELETE. webhooks:read covers read-only webhook surfaces (endpoint list/retrieve/deliveries/event_types, and GET /v1/events); webhooks:manage still gates every mutation, including secret rotation. Self-introspection (GET /v1/api_keys/me) and the shared icon catalog require no scope at all. organization:read was added 2026-07-27 because the invoices list returns real billing data. Keys created earlier were granted the new scopes they need, so no working integration broke.
customers:read, customers:write, cards:read, cards:write, products:read, products:write, custom_fields:read, custom_fields:write, transactions:read, transactions:write, notifications:send, notifications:read, webhooks:manage, webhooks:read, locations:read, locations:write, team_members:read, team_members:write, organization:read Key lifecycle state. Only active keys authenticate. Paused/revoked transitions happen in the dashboard.
active, paused, revoked "active"
Unix seconds at mint time.
1745832000
When true, the key is auto-revoked after 90 days without a request. Default ON.
true
Unix seconds of the most recent authenticated request. Null if never used. Feeds the 90-day inactivity auto-revoke.
1750691200
The effective rate limits for this key, by bucket. Informational - the enforced values.