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