all112 API

Your ledger is yours. The all112 API covers everything the app can do: timers, entries, categories, budgets, the Hour Audit, and weekly reports — plus signed webhooks and an MCP server for AI tools. An active all112 plan (trial included) is required.

Authentication

Create a personal access token in the app under Settings → API tokens. Tokens start with a112_, carry read or read/write scope, and are shown exactly once. Send them as a bearer:

curl https://all112.bravely.dev/api/v1/status \
  -H "Authorization: Bearer a112_..."

Base URL, errors, limits

Timers

GET/timer
The running entry, or null.
POST/timer/start
Body: { category_id, at?, note? }. Switch semantics: the running timer (if any) stops at the same instant. One timer per account — every hour counted once.
POST/timer/stop
Body: { at? }. Stops the running timer.

Entries

GET/entries?from&to&category&limit
Ledger entries overlapping the window (max 500).
POST/entries
Body: { category_id, started_at, ended_at, source?, note? }. Backfill a past interval. Overlaps are spliced automatically — the new interval owns its minutes.
PATCH/entries/:id
Adjust times, category, or note. Re-splices on move.
POST/entries/:id/split
Body: { at }. Split one entry into two at an instant.
DELETE/entries/:id
Soft-delete an entry.

Categories, audit, reports

GET/categories
Your categories with kinds (committed, yours, sleep, unaccounted) and weekly budgets.
POST/categories
Body: { name, kind?, color?, weekly_budget_half_hours?, position? }.
GET/audit
Your latest Hour Audit (answers + derived numbers).
GET/reports/week?week=2026-W34
The intended-vs-actual week report: per-category budget and actual minutes, virtual sleep, unaccounted, and the receipt line.
GET/reports/range?from&to
Per-category actual minutes over an arbitrary range (max ~6 months).
GET/status
A compact cached snapshot for status bars and widgets: the running timer, Yours progress vs budget, and unaccounted minutes.

Webhooks

Manage under Settings → Webhooks (or /webhooks endpoints). Events: timer.started, timer.stopped, entry.created, entry.updated, entry.deleted, category.*, week.closed — or * for everything. Deliveries retry on a 1m/10m/30m/72h ladder and pause after repeated failures. Every delivery is signed:

X-All112-Signature-256: sha256=<hex HMAC-SHA256 of the raw body, keyed by your webhook secret>

// verify (node)
const expected = "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
const ok = crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));

MCP server

Point any MCP-capable AI tool at https://all112.bravely.dev/api/mcp with your token as a bearer. Tools: current_timer, start_timer, stop_timer, list_categories, log_entry, week_report, status. For Claude Code:

claude mcp add all112 https://all112.bravely.dev/api/mcp \
  --transport http \
  --header "Authorization: Bearer a112_..."

Questions or a use case the API does not cover yet? Email support@bravely.dev.