API Reference
Quick Capture API

Quick Capture API

Create an idea via a capture token — no login required — plus the two JWT-authenticated routes that manage that token.

For the product-level behavior (what a token is, how it's managed, and known limitations), see Quick Capture. This page is the endpoint-by-endpoint wire contract; the authoritative spec is specs/api/quick-capture.md in the repo.

Route summary

MethodPathAuthDescription
POST/api/quick-captureX-Capture-Token headerCreate an idea via token
POST/api/quick-capture/tokenJWTGenerate a token
DELETE/api/quick-capture/tokenJWTRevoke your active token
⚠️

POST /api/quick-capture is the only route in the entire API that bypasses the JWT authorizer. It's the intentional exception, not a bug — see API-wide conventions and Authorization.

Capture

POST /api/quick-capture
X-Capture-Token: <token>
⚠️

The title field is not stored as the title — same rule as POST /api/ideas. It's treated as free-form content; Bedrock generates the real title from it, and your original text is stored as description. A description field in the body is ignored entirely — only title and tags are read.

Body

{
  "title": "Just shipped dark mode — here's what broke and how we fixed it",
  "tags": ["engineering", "shipping"]
}

tags is optional (defaults to []).

Response 201

{ "idea_id": "3f9e...", "status": "created" }

Unlike POST /api/ideas, this response is intentionally minimal — it does not echo the full idea object.

StatusMeaning
201Idea created
400title missing/blank after trim (error message: "title is required")
401X-Capture-Token header missing
401Token doesn't exist, or is marked revoked
403The token's own user is no longer a member of the token's workspace

Validation order: token header present → token exists & not revoked → token's user is still a workspace member → title non-empty.

No Slack notification is sent and no per-route rate limit applies to this endpoint — both were part of an earlier design that was never implemented. See Known limitations.

Create Token

POST /api/quick-capture/token

Requires a JWT; you must be a member of workspace_id.

Body

{ "workspace_id": "ws-1" }

Response 201

{
  "token": "b6f2c9de-1a2b-4c3d-9e8f-abcdef123456",
  "api_url": "https://api.lkwiz.dev/api/quick-capture"
}
StatusMeaning
201Token generated
400workspace_id missing/blank
401No caller identity
403Caller is not a member of workspace_id
⚠️

Generating a new token does not invalidate any previous one. The old QCTOKEN record is left in the table, still valid — only the "current token" pointers on your user profile and the workspace move to the new value. See Token lifecycle.

Delete Token

DELETE /api/quick-capture/token

Requires a JWT. No body. Revokes your own currently-active token only — there's no workspace or ownership parameter, because it always acts on your active_qc_token.

Response 204 — always, whether or not you had an active token.

StatusMeaning
204No active token (no-op) or the active token was deleted
401No caller identity
⚠️

This is a hard delete of the token record — not a "set revoked flag" soft-revoke. It also only ever removes the one token tracked as your active_qc_token; any older, orphaned token from a prior regeneration keeps working. See Known limitations.

See also

  • Quick Capture — the product-level feature page, including known limitations against an earlier design.
  • Ideas API — the JWT-authenticated idea CRUD that Quick Capture's capture_idea writes into.
  • REST API overview — where this domain sits in the full route list.