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