Search documentation

Find a guide by title or topic

Administration

Public API overview

Authenticate with an API key, choose scopes, stay within the rate limit, page through results and export approved hours.

ForOwnerAdmin

TimeLogger ends at approved hours — it never computes pay. The public REST API is how your payroll, billing or BI tools pick those hours up. This page is a public overview; the full, always-current reference with every endpoint, parameter and example lives inside the app.

Who can do this:OwnerAdminOwners and admins create API keys. Auditors can see which keys exist. Anyone can read this overview.

Get started#

  1. Create a key

    In WorkspaceSettings, on the API keys card, choose New key, name it after the integration, and tick only the scopes it needs. The secret is shown once — store it in your secrets manager.

  2. Send it as a Bearer token

    Every request carries Authorization: Bearer tl_live_…. The base URL is your TimeLogger address followed by /api/v1.

  3. Read approved timesheets

    Filter timesheets to status=approved — these are the hours your approvers signed off.

Request
curl -s "https://timelogger.example.com/api/v1/timesheets?status=approved&limit=50" \
  -H "Authorization: Bearer $TIMELOGGER_API_KEY"
Response (shortened)
{
  "results": [
    {
      "id": "51050378-…",
      "member_id": "9f686e4d-…",
      "member_name": "Ananya Iyer",
      "period_start": "2026-09-14",
      "period_end": "2026-09-20",
      "status": "approved",
      "approved_by_name": "Neha Kapoor",
      "approved_at": "2026-09-24T21:06:13Z",
      …
    }
  ],
  "next_cursor": "bz0xMDA"
}

How keys are limited

A key acts as the person who created it, narrowed to the scopes you chose. It can never do more than that person’s role allows, and it stops working if they’re archived. Sign-in, workspace settings, policies, screenshots, live view, devices, the audit log and API keys themselves are never reachable with a key.

Scopes#

Write scopes don’t include read — tick both if an integration needs both.

ScopeWhat it means
timesheets:readRead timesheets and their approval state — the approved-hours hand-off.
time:readRead time entries, the running timer, offline entries and idle blocks.
time:writeCreate, edit, discard and attribute time entries; start, stop and switch timers.
projects:readRead projects and tasks.
projects:writeCreate and edit projects and tasks (archive instead of delete).
members:readRead members, departments, teams and a member’s effective tracking policy.
reports:readRead dashboards, reports, activity summaries and the published formulas.
exports:readDownload approved hours (CSV, XLSX, PDF or JSON) and fetch background export results.

Export approved hours#

GET /exports/approved-hours returns only entries in approved or locked timesheets, with your workspace rounding applied. group_by picks the layout and format the file type (csv, xlsx, pdf, or json for rows inline).

Harvest-ready CSV for September
curl -s -o approved-hours.csv \
  "https://timelogger.example.com/api/v1/exports/approved-hours?from=2026-09-01&to=2026-09-30&group_by=harvest&format=csv" \
  -H "Authorization: Bearer $TIMELOGGER_API_KEY"
group_byWhat it means
member / project / taskTotals per member and period, per project and client, or per project and task.
entriesOne row per approved entry — the most detailed hand-off.
dailyMember × day × project × task. Use for Xero and Deel timesheet imports.
harvestHarvest’s time-import columns: Date, Client, Project, Task, Notes, Hours, First name, Last name.
quickbooks_timeQuickBooks import: Date (MM/DD/YYYY), Employee, Customer, Service Item, Description, Duration (H:MM).

Rate limits#

Each key can make 600 requests a minute. Over that, requests get 429 with a Retry-After header saying how many seconds to wait. Limits are per key, so separate integrations don’t slow each other down.

429 rate_limited
HTTP/1.1 429 Too Many Requests
Retry-After: 12
{ "error": "rate_limited", "message": "Request was throttled. Expected available in 12 seconds." }

Conventions#

Pagination#

Lists return { results, next_cursor }. Pass next_cursor back as cursor until it is null. limit defaults to 50, up to 200.

Formats#

  • Timestamps are ISO 8601 in UTC with a Z suffix, for example 2026-09-21T04:03:00Z.
  • from and to are calendar dates (YYYY-MM-DD) in the key creator’s time zone.
  • Durations are whole seconds. Hours in exports are decimals rounded to 2 places. IDs are UUIDs.
  • POST /time-entries and POST /offline-entries accept an Idempotency-Key header, so a retried request never creates a duplicate.

Errors#

Every error has the same shape: a machine-readable error code, a readable message and optional details.

403 insufficient_scope
HTTP/1.1 403 Forbidden
{
  "error": "insufficient_scope",
  "message": "This API key needs the time:write scope.",
  "details": { "required_scope": "time:write", "key_scopes": ["timesheets:read", "exports:read"] }
}
StatusWhat it means
400 validation_errorA bad parameter or body. details maps field names to messages.
401 not_authenticatedA missing, malformed, revoked or unknown key.
403 insufficient_scopeThe key lacks the scope; details has required_scope and key_scopes.
403 forbidden / out_of_scopeThe key’s creator can’t see or change that member or resource.
404 not_foundNo such resource in your workspace, or outside your scope.
409Conflicts with the current state: timesheet_locked, timer_already_running, overlaps_existing_entry.
422Allowed shape, but a policy rule forbids it: blocked_by_compliance, timer_not_available.
429 rate_limitedToo many requests for this key. Wait Retry-After seconds.

The full reference#

Signed-in owners, admins and auditors can open the complete reference at WorkspacePublic API (/app/developers). It lists every endpoint a key can reach with its scope, parameters, request and response, a curl example, and a Try it button that runs read requests with your own session. It’s generated from the server, so it always matches what the API enforces. The raw OpenAPI schema is at /api/v1/schema, and an interactive explorer at /api/v1/docs.

The in-app API reference.

Questions#

Can a key create API keys or change policies?
No. Keys only reach timesheets, time, projects, members, reports and exports. Everything administrative needs a signed-in person.
Can I change a key’s scopes later?
No — create a new key with the scopes you need and revoke the old one. Revoking takes effect immediately.
How do I get very large exports?
Start them from Reports → Export in the app; they run in the background. Poll GET /exports/{id} until the status is done, then download within 5 minutes. Files expire after 24 hours.
Does the API return screenshots?
No. Screenshots, webcam images and live view are never available to API keys.

Something unclear or out of date? Tell your workspace admin, or write to the TimeLogger team from Settings — we update these guides with every release.