Documentation menu

API reference

11 operations in time. Raw spec: openapi.json.

GET/api/v1/time-categories

GET /api/time-categories — the org's taxonomy (admin + pickers).

Parameters

NameInTypeRequiredDescription
include_retiredquerybooleanNoInclude retired categories (settings admin reads)

Responses

StatusDescription
200

Security: bearer

POST/api/v1/time-categories

POST /api/time-categories — create a category.

Request body

TimeCategoryCreateRequest

Responses

StatusDescription
200
409duplicate slug or idempotency key reused

Security: bearer

GET/api/v1/time-categories/capture-defaults

GET /api/time-categories/capture-defaults — the picker read for the wrap-up sheet + quick-log: ordered non-retired categories + the kept backfill mapping.

Responses

StatusDescription
200

Security: bearer

POST/api/v1/time-categories/reorder

POST /api/time-categories/reorder — rewrite display order from an ordered id list (settings drag-order).

Request body

ReorderCategoriesRequest

Responses

StatusDescription
200

Security: bearer

GET/api/v1/time-categories/work-type-map

GET /api/time-categories/work-type-map — the kept backfill + manual mapping (settings read).

Responses

StatusDescription
200

Security: bearer

POST/api/v1/time-categories/work-type-map

POST /api/time-categories/work-type-map — add a manual alias.

Request body

UpsertWorkTypeMapRequest

Responses

StatusDescription
200
404category slug not found in this org

Security: bearer

POST/api/v1/time-categories/work-type-map/apply

POST /api/time-categories/work-type-map/apply — recategorize existing entries (explicit alias application).

Request body

ApplyWorkTypeMapRequest

Responses

StatusDescription
200
404category slug not found in this org

Security: bearer

PATCH/api/v1/time-categories/{id}

PATCH /api/time-categories/{id} — content update (slug immutable).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

TimeCategoryUpdateRequest

Responses

StatusDescription
200
404category not visible in scope (rls_sparse)

Security: bearer

DELETE/api/v1/time-categories/{id}

DELETE /api/time-categories/{id} — soft retire (pickers drop it, entries keep the slug reference; nothing is hard-deleted).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404category not visible in scope (rls_sparse)

Security: bearer

GET/api/v1/time-entries/billing-suggestions

GET /api/time-entries/billing-suggestions?ids=a,b,c — the bulk read for approvals rows (≤ 100 ids per call).

Parameters

NameInTypeRequiredDescription
idsquerystringYesComma-separated entry ids (≤ 100 — approvals page batches).

Responses

StatusDescription
200

Security: bearer

GET/api/v1/time-entries/{id}/billing-suggestions

GET /api/time-entries/{id}/billing-suggestions — the `decision_billing_audit` shadow answers for one entry, classified into suggestion chips. Read-only: chips never mutate anything.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Responses

StatusDescription
200
404entry not visible in scope (rls_sparse)

Security: bearer