WorkMonitor.

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 20261 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

TypeArea

September 2026

1 change
  1. 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
  1. 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.

  2. 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
  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

  7. 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.

  8. 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.

  9. 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
Scoped keys, never master keys
KEYSCOPESSOURCE IPSLAST USED
  • 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
New keyPick its scopes, its allowed ranges and an expiry. The secret is shown once and never again.
A key can never do more than the scopes it was granted — there is no master key5 active · 1 revoked

API keys · Scoped keys, never master keys

From here

The rest of the developer surface

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.