Authentication

Every v1 endpoint requires an API key. Send it as a bearer token in the Authorization header.

Key format

Keys are 40 characters with a stable prefix:

av_live_ABC123abc456DEF789def012GHI345ghi678

The _live_ segment is present to leave room for a future av_test_ sandbox key. Today all keys are production keys.

Sending the key

Header format:

Authorization: Bearer av_live_********************************

Bearer is case-sensitive — lowercase or mixed-case variants are rejected. Most mainstream HTTP libraries set this correctly; if you're hand-crafting a request, double-check the capitalization.

Don't send the key in query strings or request bodies. Only headers. Query strings end up in browser history, proxy logs, and third-party analytics.

Scopes

Each key is issued with one of two scopes:

read

GET endpoints only. Safe for reporting, analytics, dashboards. Cannot create, update, or delete anything.

read, write

Everything read can do, plus POST, PUT, PATCH, DELETE on allowed resources. Treat with the same care as an admin dashboard session.

If a write-scope endpoint is called with a read-only key, the response is:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{"error":"insufficient_scope","required":"write"}

Rotating and revoking

All key management happens in the dashboard. There is no API endpoint to generate or revoke keys (that would be a chicken-and-egg problem) — sign in at Settings → API Keys.

Revocation is immediate. There's no "soft" revocation or grace period.

Malformed key responses

All authentication failures return the same 401 with a uniform body — no information about which check failed:

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{"error":"unauthorized"}

Common causes, in rough order of frequency:

Best practices