Authentication

Bearer keys

Every /api/v1/* call accepts a Bearer token, a Supabase session cookie, or both. Bearer keys live forever (until you revoke them), have no expiry, and never appear in our logs.

Issue a key

Free or Pro — both can mint keys. Visit Settings → Developer and click Generate key. The full secret is shown once. Store it somewhere durable.

Format: qk_<prefix>_<secret> — the prefix is visible in the dashboard so you can identify keys without re-displaying the secret.

Plans & rate limits

Every authenticated request counts against a per-user limit. The response carries Retry-After on 429 plus retry_after in the JSON body.

PlanPer minutePer dayAI / voice / webhooks
free601,000402 pro_required
pro30010,000included

Pro-only routes: POST /capture with organize: true, POST /items/{id}/organize, POST /voice/transcribe, POST /webhooks. Everything else (capture without AI, search, bulk, project create, PATCH, toggle, archive, delete, tags, list) works on free.

Send the key

curl https://quik.md/api/v1/me \
  -H "Authorization: Bearer qk_..."

Connect flow (installed agents)

For desktop or mobile clients you ship to other users, don’t ask them to paste a key. Use the connect flow: open the user’s browser, get them to approve, receive the token via a deep link.

POST/api/v1/connect/start

Unauthed. Body: { state, label }. Returns 204.

POST/api/v1/connect/exchange

Unauthed. Body: { state }. Returns the Bearer key once approved.

Full flow: see the agent prompts.

Revoke

From Settings → Developer. Revocation is immediate.