Rubberduck API (0.1.0)

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.

Capture

Classify and store a capture

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.

Authorizations:
bearerAuth
Request Body schema: application/json
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)

Responses

Request samples

Content type
application/json
{
  • "text": "Buy oat milk",
  • "source": "text",
  • "workspaceId": "ef0efa32-d1c1-43d4-a5e2-fe7b4f00403c"
}

Response samples

Content type
application/json
Example
{
  • "status": "stored",
  • "route": "string",
  • "confidence": 0,
  • "reasoning": "string",
  • "draftedText": "string",
  • "steps": [
    ]
}

Answer a pending interrupt from /classify

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".

Authorizations:
bearerAuth
Request Body schema: application/json
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

Responses

Request samples

Content type
application/json
{
  • "threadId": "string",
  • "decision": "confirm",
  • "route": "string",
  • "answer": "string",
  • "confirm": true
}

Response samples

Content type
application/json
Example
{
  • "status": "stored",
  • "route": "string",
  • "confidence": 0,
  • "reasoning": "string",
  • "draftedText": "string",
  • "steps": [
    ]
}

Transcribe a voice recording to text

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.

Authorizations:
bearerAuth
Request Body schema: multipart/form-data
audio
required
string <binary>

wav/mp3/m4a/webm/ogg

Responses

Response samples

Content type
application/json
{
  • "text": "string"
}