Download OpenAPI specification:
Capture, classify, and store notes. Every request needs a Supabase Auth bearer token — the API enforces access per-user (and per-workspace) via Postgres row-level security, not application code.
Classifies a raw note, routes it, and stores it. May return status: "pending" one or more times (low-confidence route needing confirmation, a drafting clarifying question, or a candidate link to an existing capture) before settling on status: "stored" — call POST /resume with the returned threadId for each pending response until you get stored back.
| text required | string non-empty |
| source | string Default: "text" Enum: "text" "voice" |
| workspaceId required | string <uuid> BLOB workspace the capture belongs to (personal workspaces included) |
{- "text": "Buy oat milk",
- "source": "text",
- "workspaceId": "ef0efa32-d1c1-43d4-a5e2-fe7b4f00403c"
}{- "status": "stored",
- "route": "string",
- "confidence": 0,
- "reasoning": "string",
- "draftedText": "string",
- "steps": [
- {
- "node": "string",
- "summary": "string",
- "durationMs": 0
}
]
}Takes whichever field answers the pending interrupt named in the prior response's type (decision+route for confirm_route, answer for clarification, confirm for confirm_link) and continues that capture's run. May itself return another status: "pending" response — keep calling /resume until status: "stored".
| threadId required | string threadId from a pending response |
| decision | string Enum: "confirm" "edit" Answers a confirm_route interrupt |
| route | string Required when decision is confirm or edit |
| answer | string Answers a clarification interrupt |
| confirm | boolean Answers a confirm_link interrupt |
{- "threadId": "string",
- "decision": "confirm",
- "route": "string",
- "answer": "string",
- "confirm": true
}{- "status": "stored",
- "route": "string",
- "confidence": 0,
- "reasoning": "string",
- "draftedText": "string",
- "steps": [
- {
- "node": "string",
- "summary": "string",
- "durationMs": 0
}
]
}Accepts a short audio recording (multipart/form-data, field name audio) and returns its transcript via OpenRouter's Whisper. Transcribes only — feed the returned text into POST /classify with source: "voice" yourself; nothing here is classified or stored.
| audio required | string <binary> wav/mp3/m4a/webm/ogg |
{- "text": "string"
}