API reference
11 operations in time. Raw spec: openapi.json.
GET
/api/v1/time-categoriesGET /api/time-categories — the org's taxonomy (admin + pickers).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
include_retired | query | boolean | No | Include retired categories (settings admin reads) |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
POST
/api/v1/time-categoriesPOST /api/time-categories — create a category.
Request body
TimeCategoryCreateRequest
Responses
| Status | Description |
|---|---|
200 | |
409 | duplicate slug or idempotency key reused |
Security: bearer
GET
/api/v1/time-categories/capture-defaultsGET /api/time-categories/capture-defaults — the picker read for the wrap-up sheet + quick-log: ordered non-retired categories + the kept backfill mapping.
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
POST
/api/v1/time-categories/reorderPOST /api/time-categories/reorder — rewrite display order from an ordered id list (settings drag-order).
Request body
ReorderCategoriesRequest
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
GET
/api/v1/time-categories/work-type-mapGET /api/time-categories/work-type-map — the kept backfill + manual mapping (settings read).
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
POST
/api/v1/time-categories/work-type-mapPOST /api/time-categories/work-type-map — add a manual alias.
Request body
UpsertWorkTypeMapRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | category slug not found in this org |
Security: bearer
POST
/api/v1/time-categories/work-type-map/applyPOST /api/time-categories/work-type-map/apply — recategorize existing entries (explicit alias application).
Request body
ApplyWorkTypeMapRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | category slug not found in this org |
Security: bearer
PATCH
/api/v1/time-categories/{id}PATCH /api/time-categories/{id} — content update (slug immutable).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Request body
TimeCategoryUpdateRequest
Responses
| Status | Description |
|---|---|
200 | |
404 | category 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | category not visible in scope (rls_sparse) |
Security: bearer
GET
/api/v1/time-entries/billing-suggestionsGET /api/time-entries/billing-suggestions?ids=a,b,c — the bulk read for approvals rows (≤ 100 ids per call).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
ids | query | string | Yes | Comma-separated entry ids (≤ 100 — approvals page batches). |
Responses
| Status | Description |
|---|---|
200 |
Security: bearer
GET
/api/v1/time-entries/{id}/billing-suggestionsGET /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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | Yes |
Responses
| Status | Description |
|---|---|
200 | |
404 | entry not visible in scope (rls_sparse) |
Security: bearer