Developer API

Read your organization's time entries, projects, work items and members straight from Hourdeck. Per-org API keys, full & incremental sync, and a rate-limited, read-only surface, built for Power BI, a data warehouse, or your own scripts.

1

Create a key

In the app, open Settings → API keys (admins only). Name your key, set an optional expiry, and copy the secret. It's shown once.

2

Call the API

Send the key as a Bearer token. Every endpoint is read-only and scoped to your organization.

3

Sync smart

Page through everything for a full load, or pass updatedSince for incremental deltas. Store each run's latest updatedAt.

Authenticate

Send your key as a bearer token on every request:

curl -H "Authorization: Bearer hd_your_key_here" \
  "https://hourdeck.com/api/public/v1/time-entries?pageSize=1000"

Incremental sync

Pull only what changed since your last run:

# First run: full load — keep following nextCursor until hasMore is false.
# Next runs: pass updatedSince = the latest updatedAt you saw last time.
# updatedSince is INCLUSIVE (>=): dedupe by id. Deleted entries come back with a
# non-null deletedAt (tombstones) — honor them so removals propagate.
curl -H "Authorization: Bearer hd_your_key_here" \
  "https://hourdeck.com/api/public/v1/time-entries?updatedSince=2026-07-01T00:00:00Z"

Write billable adjustments

Push a corrected billable quantity back with PATCH. Create a key with the write option (grants write:time-entries). Read-only keys can't write. Only billableMinutes changes (never the recorded minutes), and it may exceed the recorded minutes (minimum increments, fixed prices). The API deliberately adjusts billable minutes on an entry in any approval state, including approved, for post-approval billing corrections (the in-app UI still can't edit an approved entry).

# Adjust an entry's billable minutes (needs a key with the write:time-entries scope).
# Optional: If-Match "<etag>" for optimistic concurrency, Idempotency-Key for safe retries.
curl -X PATCH -H "Authorization: Bearer hd_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"billableMinutes": 90}' \
  "https://hourdeck.com/api/public/v1/time-entries/ENTRY_ID"

Endpoints

GET/api/public/v1/time-entriesTime entries, full or incremental; optional from/to day window. Deletions arrive as tombstones (deletedAt).
GET/api/public/v1/time-entries/{id}One time entry by id (with an ETag for conditional writes).
PATCH/api/public/v1/time-entries/{id}Adjust an entry's billable minutes. Needs the write:time-entries scope; If-Match + Idempotency-Key supported.
GET/api/public/v1/projectsCached DevOps projects.
GET/api/public/v1/work-itemsCached DevOps work items (reporting axes).
GET/api/public/v1/membersOrganization members, roles and seats.
GET/api/public/v1/metaToken introspection: org, key, scopes, limits and quota left.

Limits & safety

  • · 120 requests/minute per key
  • · Monthly per-org quota
  • · Up to 10,000 rows per page (default 1,000)
  • · Keyset pagination, no gaps or dupes
  • · Read-only by default; opt in to write:time-entries
  • · Deletions arrive as tombstones (deletedAt)
  • · Revoke a key any time

Every response carries X-RateLimit-* headers; over-limit requests return 429 with Retry-After.

API reference

OpenAPI spec ↗