Items

Items

An item is a note or a todo, owned by a project. The capture endpoint is the path you'll use 90% of the time — it accepts free-form text and, only if you ask, runs the AI organizer.

Capture

POST/api/v1/capture

Free-form text → an item. AI is off by default; opt in with organize:true.

Body fields: text (required, ≤20k chars), project_id (uuid, optional — defaults to your inbox), type (note | todo, defaults to todo), organize (boolean, defaults to false — Pro only when set to true), client_id (uuid for idempotent retries).

Bringing your own agent? Leave organize off. Your agent already classified the input, picked the project, and parsed the due date — running the server organizer on top is a double tax (latency + your daily AI quota). Pass type and project_id explicitly instead.

# Default — no AI, no Pro requirement, no quota hit.
curl https://quik.md/api/v1/capture \
  -H "Authorization: Bearer qk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "text":"Call the dentist tomorrow at 4pm",
    "type":"todo",
    "project_id":"<your-project-uuid>"
  }'

Update with parsed fields

If your agent extracted a due date, a tag, or a status, write it straight to the item via PATCH — don’t round-trip through the AI organizer.

curl -X PATCH https://quik.md/api/v1/items/<id> \
  -H "Authorization: Bearer qk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "title":"Call dentist",
    "due_at":"2026-04-25T16:00:00Z",
    "status":"todo"
  }'

List recent / since

GET/api/v1/items?since=&limit=&cursor=

Cursor-paginated. Use ?since=ISO for incremental sync.

curl "https://quik.md/api/v1/items?limit=50" \
  -H "Authorization: Bearer qk_..."

Read one

GET/api/v1/items/:id

Update

PATCH/api/v1/items/:id

Partial update. Send only the fields you want to change.

curl -X PATCH https://quik.md/api/v1/items/<id> \
  -H "Authorization: Bearer qk_..." \
  -H "Content-Type: application/json" \
  -d '{"title":"Call dentist","due_at":"2026-04-25T16:00:00Z"}'

Toggle complete

POST/api/v1/items/:id/toggle

Body: { is_completed: true|false }. Subtasks cascade automatically.

curl -X POST https://quik.md/api/v1/items/<id>/toggle \
  -H "Authorization: Bearer qk_..." \
  -H "Content-Type: application/json" \
  -d '{"is_completed":true}'

Archive / unarchive / delete

POST/api/v1/items/:id/archive
POST/api/v1/items/:id/unarchive
DELETE/api/v1/items/:id

Soft delete (archives the row).

Subtasks

GET/api/v1/items/:id/children

Direct children, ordered by position.

Toggling a parent cascades to all descendants in both directions — you don’t need to walk the tree client-side.

Rate limits

Per-user limits apply to every authenticated call. Free: 60/min, 1000/day. Pro: 300/min, 10000/day. On 429, back off using the Retry-After header. See Authentication for the full table.