Last change 1 Sep 2026
Every change to the API, dated.
New endpoints, changed responses and fixed behaviour. Each entry names the operation it touched, the day it landed, and what it means for a call you have already written.
Free for two seats, no card.
11 Jul 2026 — 1 Sep 2026
18changes on 7 dates, across 8 areas of the API
Pick a type to filter the log below.
The log
18 of 18 changes
September 2026
1 change- 1 SepFixed
Errors
/v1/usage
A 402 raised by a plan wall now carries a message naming the plan and the capability it wants, instead of the framework default of "Http Exception". The status and the error envelope are unchanged.
August 2026
3 changes- 25 AugChanged
Keys
/v1/keys/{id}/rotate
Seat count, retention window and the per-key request rate are now enforced from the plan on the organisation rather than from a single shared default, so a limit means what the plan says it means.
- 17 AugChanged
Analytics
/v1/analytics/daily
A worked hour has one definition across analytics, timesheets and billing, and rest is no longer scored as though it were idle work. Existing fields keep their names and types; the numbers behind them are more defensible.
/v1/time-entries
Time entries reconcile against the same definition, so an hour read here and an hour read from analytics agree.
July 2026
14 changes- 15 JulChanged
Keys
/v1/sandbox/keys
The public API and key creation are gated on the public_api entitlement. Organisations on Free receive 402 with the plan named, rather than a key that fails later at the route.
- 13 JulAdded
Deliverables
/v1/deliverables
Shipped work arrives from Jira, Linear, Asana and GitHub over signed webhooks and is readable as the outcome half of a verified record — what moved, beside the hours it cost.
- 13 JulAdded
Tenants
/v1/tenants
Provision an organisation from the API. Write routes are idempotent: repeat a request with the same idempotency key and you get the first response back rather than a second tenant.
/v1/tenants/{id}/suspend
Suspend and resume a tenant you provisioned, for partners running WorkMonitor inside their own product.
/v1/sandbox
A vk_test_ sandbox with its own keys, so an integration can be built and tested before it touches a live organisation.
- 13 JulAdded
Docs
/v1/whoami
The OpenAPI document is generated from the same Zod contracts the routes validate against, so a published shape cannot drift from the wire. Call whoami to see exactly which scopes a key carries.
- 12 JulFixed
Keys
/v1/keys/{id}/rotate
A malformed CIDR prefix in a key IP allowlist now fails closed. It previously widened the allowlist rather than rejecting the entry.
- 12 JulFixed
Projects
/v1/projects
Projects and tasks carry a real updatedAt, so polling with updatedSince re-delivers an edited row instead of silently skipping it.
/v1/projects/{id}/tasks
Same fix on the task collection, which shares the cursor.
- 12 JulFixed
Errors
/v1/members
The per-key rate limit is one shared bucket across every /v1 route rather than a separate allowance per route, which is what the documented rate always described.
- 11 JulAdded
Docs
/v1/members
The first published /v1 surface: cursor-paginated collections, updatedSince polling, scoped keys and one shared error envelope, documented in OpenAPI 3.1.
- 11 JulAdded
Timesheets
/v1/timesheets
Timesheets readable over the API, filtered by member, project and period.
/v1/timesheets/{id}/submit
Submit a timesheet for approval as its own scoped operation, so a key that may read hours cannot also submit them.
/v1/timesheets/{id}/decide
Approve or reject one timesheet, with the approver and the decision recorded on the audit trail.
Start of the log, 11 Jul 2026
What the log lands on
A new endpoint only appears to a key that carries its scope.
Every line above is a change to the WorkMonitor API. What an integration may call is set by the scopes granted to its key, so an addition here widens nothing you already run until you say so — and a key can never do more than the scopes it was created with.
Keys are created in Settings → API keys. The secret is shown once, each key can carry an IP allowlist, collections are cursor-paginated and polled with updatedSince, and every error comes back in the same envelope with a Retry-After header on a 429.
The full, interactive reference lives at /v1/docs.
- API keys
- Widgets
- Webhooks
- Custom domains
- Client portalvk_live_a91c7d2e••••time:readprojects:read2 ranges4m ago
- Warehouse syncvk_live_5f30b8c1••••analytics:readmembers:read1 range1h ago
- Proof widget, stagingSandboxvk_test_2d6af053••••ledger:readcertificates:readAny IP12m ago
- Zapiervk_live_c74e19ab••••time:readoutcomes:readAny IPYesterday
- Invoice exportvk_live_8b12ee74••••projects:readwebhooks:read1 range26 Aug
- Old billing scriptRevokedvk_live_ff4a0d19••••billing:readAny IP14 Jul
API keys · Scoped keys, never master keys
From here
The rest of the developer surface
- API referenceEvery route, its parameters and the shared error envelope, served by the API itself.
- DevelopersThe quickstart, calls in six languages, and how scoped keys and webhooks work.
- IntegrationsThe connectors that move this data for you, with no client to write or run.
- Help centreHow each screen behaves, written for the people who administer a workspace.
If it has an API, it can talk to WorkMonitor.
Create a free workspace, grant one scope, and make the call from your own code. A sandbox key belongs to a tenant of its own, so nothing you build against it can reach live data.