Authorization header with the Bearer scheme:
401. See Errors for each code.
The Visor CLI can also log in through your browser instead of a personal API token. See Visor CLI login.
Tokens
- Create, list, and revoke tokens in Settings > Connected apps.
- You can hold up to 10 active tokens at a time. Expired and revoked tokens do not count.
- Visor shows the full token only once, right after you create it. Visor stores only a one-way digest of the secret, so nobody, including Visor support, can show it to you again.
- The token list shows a safe prefix such as
visor_pat_abcd2345efgh6789so you can tell tokens apart.
Scopes
Each token has an access level that sets its scopes:
Each operation lists the scope it requires. A valid token without that scope receives
403 INSUFFICIENT_SCOPE. A token never gains new permissions after you create it; when Visor adds a new kind of write access, you create a new token to use it.
Expiry
Choose 30, 90, or 365 days when you create a token, or Never expires. After a token expires, requests receive401 TOKEN_EXPIRED. Create a new token and replace the old value in your scripts.
Revocation
Revoke a token in Settings when you no longer need it or think it leaked. Revocation takes effect on the next request, which receives401 TOKEN_REVOKED.
Visor CLI login
The Visor CLI logs in with OAuth 2.0 (authorization code with PKCE) instead of a personal API token:- The CLI opens the Visor authorization page (
/oauth/authorize) in your browser and listens onhttp://127.0.0.1:<port>/callback. - You log in to Visor and choose an access level: Read only (
pfm:read) or Read and record transactions (pfm:read,pfm:transactions:write). - The CLI exchanges the code at
/oauth/tokenand sends the access token asAuthorization: Bearer <access_token>.
- An access token expires after 24 hours and then receives
401 TOKEN_EXPIRED. The CLI then uses its refresh token, which works for 30 days, to get a new access token. - Each refresh token is single-use. Store the new access and refresh tokens together after a successful refresh. Reusing the previous refresh token returns
invalid_grant. - The scopes, the error codes, the plan check, and the rate limit are the same as for a personal API token. Each access token has its own rate limit.
- The CLI login appears as Visor CLI in Settings > Connected apps. Revoke it there to end the login. The next request receives
401 TOKEN_REVOKED, and the refresh token stops working. - Only the Visor CLI can use this login on the personal API. Tokens that MCP clients such as Claude or Cursor receive do not work on
/v1, and Visor CLI tokens do not work on the MCP server.
End a CLI login
visor auth logout can end its server login with POST /oauth/revoke (RFC 7009). Send the public CLI client_id and either its access token or its refresh token. A client secret, a browser session, and a bearer header are not required.
token_type_hint is optional. Visor checks both token types even if the hint names the wrong type. The response is 200 OK with an empty body, including for unknown or already revoked tokens.
Revocation ends the whole login, including its older and newer tokens from refresh rotation. Its next /v1 request receives 401 TOKEN_REVOKED, and refresh returns invalid_grant. Other CLI logins remain active. This endpoint cannot revoke MCP clients or personal API tokens.
A missing or different client_id returns 401 invalid_client. A missing or malformed token returns 400 invalid_request. The OAuth server metadata advertises revocation_endpoint and revocation_endpoint_auth_methods_supported: ["none"].
Plan and availability
The personal API requires an active Pro or Premium plan, checked on every request.- If your account loses Pro or Premium, requests receive
403 PLAN_REQUIRED. Your tokens stay in place and work again when the plan returns.