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.
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.
Call the API
Send the key as a Bearer token. Every endpoint is read-only and scoped to your organization.
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
/api/public/v1/time-entriesTime entries, full or incremental; optional from/to day window. Deletions arrive as tombstones (deletedAt)./api/public/v1/time-entries/{id}One time entry by id (with an ETag for conditional writes)./api/public/v1/time-entries/{id}Adjust an entry's billable minutes. Needs the write:time-entries scope; If-Match + Idempotency-Key supported./api/public/v1/projectsCached DevOps projects./api/public/v1/work-itemsCached DevOps work items (reporting axes)./api/public/v1/membersOrganization members, roles and seats./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.