Skip to content

API reference

Build on your time data: read and write projects, sessions, reports, clients and invoices, and receive signed webhooks.

API version 4.0.0

Introduction

The Temporal.ist API gives your scripts and tools the same data as the app: projects, sessions and timers, reports, clients, invoices and webhooks. It is a JSON API over HTTPS at:

https://temporal.ist/api/v2

The API is part of the Pro and Team plans. Everything below is generated from the API's own schema, which you can also download as OpenAPI.

Authentication

Create a personal API key in the app under Settings → Integrations. A key either reads, or reads and writes, and it works with your account in your current organisation. Its secret is shown once; store it like a password, and revoke the key in the same place when you no longer need it.

Send the key as a bearer token on every request:

Authorization: Bearer tk_live_…

A missing, revoked or mistyped key answers 401. A read-only key answers 403 for anything that changes data. Without a plan that includes the API, requests answer 402.

Quickstart

List your projects, then start a timer on one of them:

curl https://temporal.ist/api/v2/projects \
  -H "Authorization: Bearer $TEMPORALIST_KEY"

curl -X POST https://temporal.ist/api/v2/sessions/start \
  -H "Authorization: Bearer $TEMPORALIST_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id": "<project id>"}'

Requests and responses

  • JSON in and out, with snake_case field names.
  • Times are ISO 8601 instants with their offset, such as 2026-10-11T09:30:00+02:00. Day boundaries in reports follow your account's timezone.
  • Lists return {"items": [...], "next_cursor": "..."}. Pass next_cursor back as ?cursor= for the next page; ?limit= takes up to 200 (default 50). The last page has next_cursor: null.
  • Retries are safe. Creating requests accept your own id (a UUID). Sending the same request again returns the record that already exists instead of creating a second one.
  • Records you cannot see answer 404, whether they do not exist or belong to someone else.

Errors

Every error has the same shape:

{
  "error": {
    "code": "validation_error",
    "message": "Some fields need attention.",
    "fields": { "end_at": "End must be after the start." }
  }
}
Status Meaning
400 The request cannot be done as asked; code says why.
401 The key is missing, revoked or wrong.
402 Your plan does not include this.
403 The key or your role is not allowed to do this.
404 The record does not exist, or is not yours.
409 It conflicts with the current state, such as a timer that is already running.
422 A field is invalid; fields names it.
429 Too many requests; wait and try again.

Receiving webhooks

A webhook subscription sends a POST to your HTTPS address for each event you choose: project.created, session.created, session.closed, invoice.created and invoice.paid. Every delivery carries:

X-Temporalist-Event: session.closed
X-Temporalist-Delivery: <delivery id, the same on every retry>
X-Temporalist-Signature: t=<unix time>,v1=<hex HMAC-SHA256>

To check a delivery, compute an HMAC-SHA256 with your subscription's secret as the key over the timestamp, a dot and the raw request body, and compare it with v1:

import hashlib, hmac

def is_genuine(secret: str, header: str, body: bytes) -> bool:
    parts = dict(item.split("=", 1) for item in header.split(","))
    expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

Answer with any 2xx status within 10 seconds. Failed deliveries are retried with growing delays, up to eight attempts, so the same event can arrive more than once: use X-Temporalist-Delivery to skip duplicates. Addresses must be public HTTPS hosts, and redirects are not followed.

Identity

Who the key belongs to: account, timezone, organisation role and plan features.

GET/api/v2/me

Get MeRead key

Bootstrap for web, desktop, CLI and extension. 401 when signed out.

Returns
200 MeOut

Projects

Projects you own or that your team shares with you. Names are labels; use the id to refer to a project.

GET/api/v2/projects

List ProjectsRead key

Parameters of GET /api/v2/projects
NameInTypeDescription
cursorquerystring | null
limitqueryintegerDefault: 50.
statusquery"active" | "archived" | "all"Default: "active".
qquerystring | nullCase-insensitive substring of project or client name.
client_idquerystring (uuid) | null
trackablequerybooleanOnly projects the caller may track on (own or team-assigned, active). Default: false.
include_hiddenquerybooleanDefault: true.
include_statsquerybooleanDefault: false.
sortquery"name" | "recent"`recent` = the caller's latest activity first. Default: "name".
Returns
200 Page_ProjectOut_

POST/api/v2/projects

Create ProjectRead and write key

Returns
200 ProjectOut

GET/api/v2/projects/{project_id}

Get ProjectRead key

Parameters of GET /api/v2/projects/{project_id}
NameInTypeDescription
project_idrequiredpathstring (uuid)
Returns
200 ProjectOut

PATCH/api/v2/projects/{project_id}

Update ProjectRead and write key

Parameters of PATCH /api/v2/projects/{project_id}
NameInTypeDescription
project_idrequiredpathstring (uuid)
Returns
200 ProjectOut

POST/api/v2/projects/{project_id}/archive

Archive ProjectRead and write key

Parameters of POST /api/v2/projects/{project_id}/archive
NameInTypeDescription
project_idrequiredpathstring (uuid)
Returns
200 ProjectOut

POST/api/v2/projects/{project_id}/unarchive

Unarchive ProjectRead and write key

Parameters of POST /api/v2/projects/{project_id}/unarchive
NameInTypeDescription
project_idrequiredpathstring (uuid)
Returns
200 ProjectOut

Sessions and timers

Your own tracked time. Durations are seconds of worked time with pauses taken out; instants carry their UTC offset.

GET/api/v2/sessions

List SessionsRead key

Parameters of GET /api/v2/sessions
NameInTypeDescription
cursorquerystring | null
limitqueryintegerDefault: 50.
from_datequerystring (date) | nullDefault depends on the endpoint.
to_datequerystring (date) | null
project_idquerystring (uuid)[]
client_idquerystring (uuid)[]
team_idquerystring (uuid)[]Projects assigned to these teams.
user_idquerystring (uuid)[]Authors; organisation-wide views only.
tag_idquerystring (uuid)[]Any of these on the session, project or client.
billingquery"any" | "billed" | "unbilled"Default: "any".
scopequery"me" | "org"Default: "me".
invoice_idquerystring (uuid) | nullSessions claimed by this invoice.
statequery"any" | "active" | "closed" | "deleted"Default: "any".
originquery"web" | "desktop_file" | "desktop_manual" | "browser_url" | "browser_manual" | "cli_manual" | "cli_watch" | "api" | "mcp" | "mobile" | "unknown"[]
qquerystring | nullCase-insensitive search in descriptions.
matchquery"overlap" | "start"`overlap`: sessions overlapping the range; `start`: starting in it. Default: "overlap".
changed_sincequerystring (date-time) | nullDelta sync: the caller's own sessions changed after this instant, soft-deleted ones included (`deleted_at` set), oldest change first; the date range is ignored. Use `as_of` as the next value.
Returns
200 SessionPage

POST/api/v2/sessions

Add EntryRead and write key

Returns
200 EntryCreateOut

POST/api/v2/sessions/start

Start TimerRead and write key

Returns
200 TimerStartOut

GET/api/v2/sessions/active

Get ActiveRead key

Returns
200 TimerSnapshot

GET/api/v2/sessions/{session_id}

Get SessionRead key

Parameters of GET /api/v2/sessions/{session_id}
NameInTypeDescription
session_idrequiredpathstring (uuid)
Returns
200 SessionDetailOut

PATCH/api/v2/sessions/{session_id}

Update SessionRead and write key

Parameters of PATCH /api/v2/sessions/{session_id}
NameInTypeDescription
session_idrequiredpathstring (uuid)
Returns
200 SessionOut

DELETE/api/v2/sessions/{session_id}

Delete SessionRead and write key

Parameters of DELETE /api/v2/sessions/{session_id}
NameInTypeDescription
session_idrequiredpathstring (uuid)
Returns
204 Successful Response

POST/api/v2/sessions/{session_id}/stop

Stop SessionRead and write key

Parameters of POST /api/v2/sessions/{session_id}/stop
NameInTypeDescription
session_idrequiredpathstring (uuid)
Returns
200 SessionOut

POST/api/v2/sessions/{session_id}/pause

Pause SessionRead and write key

Parameters of POST /api/v2/sessions/{session_id}/pause
NameInTypeDescription
session_idrequiredpathstring (uuid)
Returns
200 PauseStateOut

POST/api/v2/sessions/{session_id}/resume

Resume SessionRead and write key

Parameters of POST /api/v2/sessions/{session_id}/resume
NameInTypeDescription
session_idrequiredpathstring (uuid)
Returns
200 PauseStateOut

Reports

Totals per project and day in your account timezone, calculated exactly as the dashboard does.

GET/api/v2/reports/summary

Report SummaryRead key

Parameters of GET /api/v2/reports/summary
NameInTypeDescription
from_datequerystring (date) | nullDefault depends on the endpoint.
to_datequerystring (date) | null
project_idquerystring (uuid)[]
client_idquerystring (uuid)[]
team_idquerystring (uuid)[]Projects assigned to these teams.
user_idquerystring (uuid)[]Authors; organisation-wide views only.
tag_idquerystring (uuid)[]Any of these on the session, project or client.
billingquery"any" | "billed" | "unbilled"Default: "any".
scopequery"me" | "org"Default: "me".
modequery"sessions" | "day_span" | nullDefault: the caller's full-day-span setting.
comparequery"none" | "previous"`previous`: the equally long range right before (calendar unit when aligned). Default: "none".
bucketquery"day" | "week" | "month" | nullDefault: day up to 31 days, week up to 26 weeks, else month.
Returns
200 ReportSummaryOut

GET/api/v2/reports/time

Time ReportRead key

Parameters of GET /api/v2/reports/time
NameInTypeDescription
periodquery"today" | "yesterday" | "this_week" | "last_week" | "this_month" | "last_month" | null
from_datequerystring (date) | null
to_datequerystring (date) | null
project_idquerystring (uuid) | null
group_byquery"project" | "day" | "task"[]
Returns
200 TimeReportOut

Clients

Billing clients of your organisation. Needs a plan with invoicing and the owner or admin role.

GET/api/v2/clients

List ClientsRead key

Parameters of GET /api/v2/clients
NameInTypeDescription
cursorquerystring | null
limitqueryintegerDefault: 50.
qquerystring | nullCase-insensitive substring of name or company.
statusquery"active" | "archived" | "all"Default: "active".
Returns
200 Page_ClientOut_

POST/api/v2/clients

Create ClientRead and write key

Returns
200 ClientOut

GET/api/v2/clients/{client_id}

Get ClientRead key

Parameters of GET /api/v2/clients/{client_id}
NameInTypeDescription
client_idrequiredpathstring (uuid)
Returns
200 ClientOut

PATCH/api/v2/clients/{client_id}

Update ClientRead and write key

Parameters of PATCH /api/v2/clients/{client_id}
NameInTypeDescription
client_idrequiredpathstring (uuid)
Returns
200 ClientOut

Invoices

Invoices built from tracked work. Marking an invoice sent records it; it does not email anyone.

GET/api/v2/invoices

List InvoicesRead key

Parameters of GET /api/v2/invoices
NameInTypeDescription
cursorquerystring | null
limitqueryintegerDefault: 50.
statusquery"draft" | "sent" | "overdue" | "paid" | "cancelled"[]
client_idquerystring (uuid) | null
qquerystring | nullNumber or client name, case-insensitive.
Returns
200 InvoicePage

POST/api/v2/invoices

Create InvoiceRead and write key

Returns
200 InvoiceDetailOut

GET/api/v2/invoices/{invoice_id}

Get InvoiceRead key

Parameters of GET /api/v2/invoices/{invoice_id}
NameInTypeDescription
invoice_idrequiredpathstring (uuid)
Returns
200 InvoiceDetailOut

POST/api/v2/invoices/{invoice_id}/mark-sent

Mark SentRead and write key

Parameters of POST /api/v2/invoices/{invoice_id}/mark-sent
NameInTypeDescription
invoice_idrequiredpathstring (uuid)
Returns
200 InvoiceDetailOut

POST/api/v2/invoices/{invoice_id}/mark-paid

Mark PaidRead and write key

Parameters of POST /api/v2/invoices/{invoice_id}/mark-paid
NameInTypeDescription
invoice_idrequiredpathstring (uuid)
Returns
200 InvoiceDetailOut

Webhooks

Subscriptions that POST signed events to your HTTPS endpoint. Delivery is at least once; deduplicate on the delivery id.

GET/api/v2/webhook-subscriptions

List Webhook SubscriptionsRead key

Parameters of GET /api/v2/webhook-subscriptions
NameInTypeDescription
cursorquerystring | null
limitqueryintegerDefault: 50.
api_key_idquerystring (uuid) | nullCookie sessions: one key's only.

POST/api/v2/webhook-subscriptions

Create Webhook SubscriptionRead and write key

422 `unsafe_target` for non-public targets; 403 for `invoice.*` without billing role.

GET/api/v2/webhook-subscriptions/{subscription_id}

Get Webhook SubscriptionRead key

Parameters of GET /api/v2/webhook-subscriptions/{subscription_id}
NameInTypeDescription
subscription_idrequiredpathstring (uuid)

PATCH/api/v2/webhook-subscriptions/{subscription_id}

Update Webhook SubscriptionRead and write key

Parameters of PATCH /api/v2/webhook-subscriptions/{subscription_id}
NameInTypeDescription
subscription_idrequiredpathstring (uuid)

DELETE/api/v2/webhook-subscriptions/{subscription_id}

Delete Webhook SubscriptionRead and write key

Parameters of DELETE /api/v2/webhook-subscriptions/{subscription_id}
NameInTypeDescription
subscription_idrequiredpathstring (uuid)
Returns
204 Successful Response

GET/api/v2/webhook-subscriptions/{subscription_id}/deliveries

List Webhook DeliveriesRead key

Parameters of GET /api/v2/webhook-subscriptions/{subscription_id}/deliveries
NameInTypeDescription
subscription_idrequiredpathstring (uuid)
cursorquerystring | null
limitqueryintegerDefault: 50.
statusquery"pending" | "delivered" | "dead" | "cancelled" | null

POST/api/v2/webhook-subscriptions/{subscription_id}/deliveries/{delivery_id}/retry

Retry Webhook DeliveryRead and write key

409 unless the delivery is dead or cancelled.

Parameters of POST /api/v2/webhook-subscriptions/{subscription_id}/deliveries/{delivery_id}/retry
NameInTypeDescription
subscription_idrequiredpathstring (uuid)
delivery_idrequiredpathstring (uuid)

POST/api/v2/webhook-subscriptions/{subscription_id}/rotate-secret

Rotate Webhook SecretRead and write key

Parameters of POST /api/v2/webhook-subscriptions/{subscription_id}/rotate-secret
NameInTypeDescription
subscription_idrequiredpathstring (uuid)
Returns
200 WebhookSecretOut

Schemas

ActiveSessionOut

Fields of ActiveSessionOut
NameTypeDescription
idrequiredstring (uuid)
user_idrequiredstring (uuid)
organisation_idrequiredstring (uuid)
projectrequiredProjectRef
start_atrequiredstring (date-time)
end_atrequiredstring (date-time) | null
is_activerequiredboolean
is_pausedrequiredboolean
originrequired"web" | "desktop_file" | "desktop_manual" | "browser_url" | "browser_manual" | "cli_manual" | "cli_watch" | "api" | "mcp" | "mobile" | "unknown"
is_manualrequiredboolean
descriptionrequiredstring
worked_secondsrequiredintegerPause-aware; a running session counts up to the response's `as_of`.
tagsrequiredTagRef[]Tags attached to the session itself.
tasksrequiredTaskSummaryOut[]
files_changedrequiredinteger | nullDistinct changed paths; null without file evidence.
billingrequiredSessionBillingOut | null
client_session_idrequiredstring (uuid) | nullLegacy idempotency key of old clients.
device_idrequiredstring (uuid) | null
continued_from_session_idrequiredstring (uuid) | nullSet on the continuation of a live 24 h segment.
deleted_atrequiredstring (date-time) | nullOnly set in change feeds (`changed_since`) and on deletion.
versionrequiredintegerIncrements on every change.
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
pausesrequiredPauseOut[]
last_activity_atrequiredstring (date-time) | null

AddressIn

Fields of AddressIn
NameTypeDescription
line1stringDefault: "".
line2stringDefault: "".
streetstringDefault: "".
house_numberstringDefault: "".
postal_codestringDefault: "".
citystringDefault: "".
regionstringDefault: "".
country_codestring | nullISO 3166-1 alpha-2.

AddressOut

Fields of AddressOut
NameTypeDescription
line1requiredstring
line2requiredstring
streetrequiredstring
house_numberrequiredstring
postal_coderequiredstring
cityrequiredstring
regionrequiredstring
country_coderequiredstring | null
formattedrequiredstringOne line as printed on invoices: `street no, zip city, CC`.

BillableSplitOut

ORG-10: a resolved rate, zero included, makes time billable (DEC-19).

Fields of BillableSplitOut
NameTypeDescription
billable_secondsrequiredinteger
non_billable_secondsrequiredinteger
billed_secondsrequiredintegerClaimed by an invoice.
unbilled_secondsrequiredinteger
by_currencyrequiredCurrencyAmountOut[]Never summed across currencies.

BucketOut

Fields of BucketOut
NameTypeDescription
start_daterequiredstring (date)
end_daterequiredstring (date)
labelrequiredstringE.g. `Mon 6`, `Week 41`, `October`.
secondsrequiredinteger
by_projectrequiredProjectBucketSecondsOut[]

ClientCreate

Fields of ClientCreate
NameTypeDescription
idstring (uuid) | nullClient-generated id; a replay returns the existing client.
namerequiredstring
emailrequiredstringWhere invoices are sent (DEC-16).
companystringDefault: "".
phonestringDefault: "".
addressAddressIn | null
address_linestring | nullFree-text address, geocoded into fields; not with `address`.
tax_idstring | null
hourly_ratenumber | string | null
currencystring | nullRequired with `hourly_rate`.
tagsstring[]

ClientOut

Fields of ClientOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | null
organisation_idrequiredstring (uuid)
namerequiredstring
companyrequiredstring
emailrequiredstring | nullBilling email; migrated contacts may lack one (CLI-01).
phonerequiredstring
addressrequiredAddressOut | null
tax_idrequiredstring | null
hourly_raterequiredstring | nullPer hour, major units; null inherits the organisation default.
currencyrequiredstring | null
tagsrequiredTagRef[]
statusrequired"active" | "archived"
archived_atrequiredstring (date-time) | null
project_countrequiredinteger
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)

ClientRef

Fields of ClientRef
NameTypeDescription
idrequiredstring (uuid)
namerequiredstring
companyrequiredstring
emailrequiredstring | null

ClientSecondsOut

Fields of ClientSecondsOut
NameTypeDescription
clientrequiredNamedRef | nullNull groups projects without a client.
secondsrequiredinteger
sharerequirednumber

ClientUpdate

Only fields present change; null clears `address`, `tax_id`, `hourly_rate`, `currency`.

Fields of ClientUpdate
NameTypeDescription
namestring | null
emailstring | null
companystring | null
phonestring | null
addressAddressIn | null
address_linestring | null
tax_idstring | null
hourly_ratenumber | string | null
currencystring | null
tagsstring[] | nullFull replacement.

ComparisonOut

Fields of ComparisonOut
NameTypeDescription
from_daterequiredstring (date)
to_daterequiredstring (date)
totalsrequiredReportTotalsOut
change_ratiorequirednumber | null(current - previous) ÷ previous worked time; null when previous is 0.

ConnectedClientOut

Fields of ConnectedClientOut
NameTypeDescription
kindrequired"web" | "desktop" | "cli" | "browser" | "mobile"
browserrequired"chrome" | "edge" | "firefox" | "safari" | null
device_idrequiredstring (uuid) | null
client_versionrequiredstring | null
connected_atrequiredstring (date-time)

CredentialOut

Fields of CredentialOut
NameTypeDescription
viarequired"cookie" | "oauth" | "api_key"
scopesrequiredstring[]
session_idrequiredstring (uuid) | null
connection_idrequiredstring (uuid) | null
api_key_idrequiredstring (uuid) | null

CurrencyAmountOut

Fields of CurrencyAmountOut
NameTypeDescription
currencyrequiredstring
billed_minorrequiredintegerFrom the invoice lines billing the range's sessions; cancelled ones excluded.
unbilled_minorrequiredintegerEstimate at current rates (not an invoice).
total_minorrequiredinteger

CurrencyTotalsOut

Fields of CurrencyTotalsOut
NameTypeDescription
currencyrequiredstring
invoice_countrequiredintegerEvery invoice in the selection, cancelled included.
total_minorrequiredintegerDrafts, outstanding and paid; cancelled ones add nothing.
draft_minorrequiredinteger
outstanding_minorrequiredintegerSent and overdue.
paid_minorrequiredinteger

DaySecondsOut

Fields of DaySecondsOut
NameTypeDescription
daterequiredstring (date)
secondsrequiredinteger

EntitlementsOut

What the user may do right now. The one source for plan gates in every client.

Fields of EntitlementsOut
NameTypeDescription
planrequired"solo" | "pro" | "team"
sourcerequired"subscription" | "grant" | "inherited" | "none"
featuresrequired"invoicing" | "calendar" | "api" | "mcp" | "export" | "team" | "full_history"[]
seatsrequiredintegerTeam seats the user owns as an organisation owner; else 0.
expires_atrequiredstring (date-time) | nullEnd of the deciding source (grant expiry or paid-through date).
history_floorrequiredstring (date-time) | nullEarliest visible instant; null means full history.
inherited_from_organisation_idrequiredstring (uuid) | nullSet when Team access comes from the org owner.

EntryCreate

A completed time entry (TIM-04); manual entries span at most 24 h.

Fields of EntryCreate
NameTypeDescription
idstring (uuid) | nullClient-generated id; a replay returns the existing entry.
project_idrequiredstring (uuid)
start_atrequiredstring (date-time)
end_atstring (date-time) | null
duration_secondsinteger | nullAlternative to `end_at`.
descriptionstringDefault: "".
tagsstring[]
origin"web" | "desktop_file" | "desktop_manual" | "browser_url" | "browser_manual" | "cli_manual" | "cli_watch" | "api" | "mcp" | "mobile"Default: "web".
is_manualbooleanFalse for automatic records uploaded after the fact. Default: true.
device_idstring (uuid) | null
client_session_idstring (uuid) | nullLegacy idempotency key (old clients).

EntryCreateOut

Fields of EntryCreateOut
NameTypeDescription
sessionrequiredSessionOut
createdrequiredbooleanFalse on an idempotent replay.
overlappingrequiredSessionOut[]The caller's sessions on the same project that overlap it.

IntervalOut

Fields of IntervalOut
NameTypeDescription
start_atrequiredstring (date-time)
end_atrequiredstring (date-time)

InvoiceCreate

Fields of InvoiceCreate
NameTypeDescription
client_idrequiredstring (uuid)
period_startstring (date) | nullWith `period_end`; both absent: all unbilled work.
period_endstring (date) | null
project_idsstring (uuid)[]
session_idsstring (uuid)[]
scope"me" | "org"`org`: deliberately include members' work. Default: "me".
mode"sessions" | "day_span" | nullDefault: the creator's full-day-span setting.
overlap_strategy"add" | "merge"Default: "add".
rate_overridesRateOverride[]
tax_bpinteger | nullDefault: the organisation's remembered rate.
notesstringDefault: "".
show_tasksbooleanDefault: true.
idstring (uuid) | nullClient-generated id; a replay returns the same draft.

InvoiceDeliveryOut

Fields of InvoiceDeliveryOut
NameTypeDescription
idrequiredstring (uuid)
recipientrequiredstring
subjectrequiredstring
statusrequired"queued" | "sent" | "failed"
errorrequiredstring | null
created_atrequiredstring (date-time)
sent_atrequiredstring (date-time) | null

InvoiceDetailOut

Fields of InvoiceDetailOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | null
numberrequiredstring
statusrequired"draft" | "sent" | "overdue" | "paid" | "cancelled"
clientrequiredClientRef
organisation_idrequiredstring (uuid)
created_by_user_idrequiredstring (uuid) | null
period_startrequiredstring (date)
period_endrequiredstring (date)
issue_daterequiredstring (date) | null
due_daterequiredstring (date) | null
paid_daterequiredstring (date) | null
cancelled_atrequiredstring (date-time) | null
timezonerequiredstringDates and public views use this zone, never the viewer's (INV-24).
currencyrequiredstring
subtotal_minorrequiredinteger
tax_bprequiredinteger
tax_minorrequiredinteger
total_minorrequiredinteger
notesrequiredstring
show_tasksrequiredboolean
moderequired"sessions" | "day_span"
overlap_strategyrequired"add" | "merge"
round_up_minutesrequiredinteger
roundingrequired"half_up" | "legacy_half_even"Migrated invoices keep their old rounding.
line_countrequiredinteger
share_urlrequiredstring | nullPublic link; null after revocation.
last_deliveryrequiredInvoiceDeliveryOut | null
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
linesrequiredInvoiceLineOut[]By project name, then creation.
deliveriesrequiredInvoiceDeliveryOut[]Newest first.

InvoiceLineOut

Fields of InvoiceLineOut
NameTypeDescription
projectrequiredProjectRef | null
descriptionrequiredstring
raw_secondsrequiredintegerWorked seconds of the claimed sessions before overlap and rounding.
billable_secondsrequiredinteger
hoursrequiredstring
raterequiredstring | null
rate_sourcerequired"invoice" | "project" | "client" | "org" | "none" | "manual"
amount_minorrequiredinteger
task_breakdownrequiredTaskHoursOut[]
session_idsrequiredstring (uuid)[]
idrequiredstring (uuid)
positionrequiredinteger
kindrequired"time" | "custom"

InvoiceOut

Fields of InvoiceOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | null
numberrequiredstring
statusrequired"draft" | "sent" | "overdue" | "paid" | "cancelled"
clientrequiredClientRef
organisation_idrequiredstring (uuid)
created_by_user_idrequiredstring (uuid) | null
period_startrequiredstring (date)
period_endrequiredstring (date)
issue_daterequiredstring (date) | null
due_daterequiredstring (date) | null
paid_daterequiredstring (date) | null
cancelled_atrequiredstring (date-time) | null
timezonerequiredstringDates and public views use this zone, never the viewer's (INV-24).
currencyrequiredstring
subtotal_minorrequiredinteger
tax_bprequiredinteger
tax_minorrequiredinteger
total_minorrequiredinteger
notesrequiredstring
show_tasksrequiredboolean
moderequired"sessions" | "day_span"
overlap_strategyrequired"add" | "merge"
round_up_minutesrequiredinteger
roundingrequired"half_up" | "legacy_half_even"Migrated invoices keep their old rounding.
line_countrequiredinteger
share_urlrequiredstring | nullPublic link; null after revocation.
last_deliveryrequiredInvoiceDeliveryOut | null
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)

InvoicePage

Fields of InvoicePage
NameTypeDescription
itemsrequiredInvoiceOut[]
next_cursorrequiredstring | null
totalsrequiredCurrencyTotalsOut[]Whole selection per currency, never converted (INV-01).

MarkPaid

Fields of MarkPaid
NameTypeDescription
paid_datestring (date) | nullDefault today in the invoice timezone.

MarkSent

Fields of MarkSent
NameTypeDescription
issue_datestring (date) | nullDefault today in the invoice timezone.
due_datestring (date) | nullDefault issue date + payment terms (30 days).

MemberRef

Fields of MemberRef
NameTypeDescription
user_idrequiredstring (uuid)
display_namerequiredstring

MemberSecondsOut

Fields of MemberSecondsOut
NameTypeDescription
memberrequiredMemberRef
secondsrequiredinteger
tracked_daysrequiredinteger
session_countrequiredinteger
sharerequirednumber
projectsrequiredProjectSecondsOut[]

MeOrganisationOut

Fields of MeOrganisationOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | null
namerequiredstring
rolerequired"owner" | "admin" | "member"
statusrequired"active" | "archived" | "closed"

MeOut

Bootstrap for every client: one request instead of profile + settings + plan + org.

Fields of MeOut
NameTypeDescription
userrequiredUserOut
settingsrequiredSettingsOut
organisationrequiredMeOrganisationOut
entitlementsrequiredEntitlementsOut
onboardingrequiredOnboardingOut
credentialrequiredCredentialOut
csrf_tokenrequiredstring | nullSend as X-CSRF-Token on cookie-authenticated writes; null for bearer.

NamedRef

Compact reference to a named record; also the shape of resolution candidates.

Fields of NamedRef
NameTypeDescription
idrequiredstring (uuid)
namerequiredstring

OnboardingOut

Fields of OnboardingOut
NameTypeDescription
needs_onboardingrequiredboolean
onboarding_seen_atrequiredstring (date-time) | null
tour_completed_atrequiredstring (date-time) | null

Page_ClientOut_

Fields of Page_ClientOut_
NameTypeDescription
itemsrequiredClientOut[]
next_cursorrequiredstring | null

Page_ProjectOut_

Fields of Page_ProjectOut_
NameTypeDescription
itemsrequiredProjectOut[]
next_cursorrequiredstring | null

Page_WebhookDeliveryOut_

Fields of Page_WebhookDeliveryOut_
NameTypeDescription
itemsrequiredWebhookDeliveryOut[]
next_cursorrequiredstring | null

Page_WebhookSubscriptionOut_

Fields of Page_WebhookSubscriptionOut_
NameTypeDescription
itemsrequiredWebhookSubscriptionOut[]
next_cursorrequiredstring | null

PauseOut

Fields of PauseOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | nullOld integer id (old clients send it back).
session_idrequiredstring (uuid)
kindrequired"manual" | "sleep" | "gap"
start_atrequiredstring (date-time)
end_atrequiredstring (date-time) | null
secondsrequiredintegerLength clipped to the session; an open pause counts up to `as_of`.

PauseStateOut

Fields of PauseStateOut
NameTypeDescription
sessionrequiredSessionOut
pausedrequiredboolean
changedrequiredbooleanFalse when the session already was in the requested state.
paused_sincerequiredstring (date-time) | null

PauseToggle

Fields of PauseToggle
NameTypeDescription
atstring (date-time) | nullDefault now; within [session start, now].

ProjectBillingOut

Billing fields. Present only for callers with billing authority (org owner/admin).

Fields of ProjectBillingOut
NameTypeDescription
hourly_raterequiredstring | nullProject override; null inherits from client/organisation.
currencyrequiredstring | nullCurrency of the project rate; null when no project rate is set.
resolvedrequiredResolvedRate

ProjectBucketSecondsOut

Fields of ProjectBucketSecondsOut
NameTypeDescription
project_idrequiredstring (uuid)
secondsrequiredinteger

ProjectCreate

Fields of ProjectCreate
NameTypeDescription
idstring (uuid) | nullClient-generated id; a replay returns the existing project.
namerequiredstring
client_idstring (uuid) | nullBilling authority; a client of the same organisation.
hourly_ratenumber | string | nullBilling authority; requires `currency`.
currencystring | null
current_taskstringDefault: "".
colorstring | null
tagsstring[]

ProjectOut

Fields of ProjectOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | nullOld integer id (old CLI selects projects by it).
organisation_idrequiredstring (uuid)
owner_user_idrequiredstring (uuid)
namerequiredstring
statusrequired"active" | "archived"
archived_atrequiredstring (date-time) | null
clientrequiredNamedRef | null
tagsrequiredTagRef[]
colorrequiredstringThe caller's effective colour (own choice, else the derived default).
hiddenrequiredbooleanThe caller hid the project from pickers and trackers.
current_taskrequiredstringThe caller's current task, applied to their new sessions.
billingrequiredProjectBillingOut | nullOwners/admins only.
statsrequiredProjectStatsOut | nullOnly when requested (`include_stats`).
client_project_idrequiredstring (uuid) | nullLegacy idempotency key sent by the old desktop app.
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)

ProjectRef

Fields of ProjectRef
NameTypeDescription
idrequiredstring (uuid)
namerequiredstring
colorrequiredstringThe caller's effective colour for the project.

ProjectSecondsOut

Fields of ProjectSecondsOut
NameTypeDescription
projectrequiredProjectRef
clientrequiredNamedRef | null
secondsrequiredinteger
session_countrequiredinteger
sharerequirednumberOf the selection's total, 0 to 1.

ProjectStatsOut

The caller's own time on the project; teammates' sessions never count (ACL-04).

Fields of ProjectStatsOut
NameTypeDescription
tracked_secondsrequiredintegerWorked seconds, running sessions counted up to the response time.
session_countrequiredinteger
last_activity_atrequiredstring (date-time) | null

ProjectUpdate

Only fields present change; `client_id`, `hourly_rate` and `currency` accept null.

Fields of ProjectUpdate
NameTypeDescription
namestring | null
client_idstring (uuid) | null
hourly_ratenumber | string | null
currencystring | null
tagsstring[] | nullFull replacement of the project's tags.

RateOverride

Fields of RateOverride
NameTypeDescription
project_idrequiredstring (uuid)A project in the selection.
raterequirednumber | string
save_to"invoice" | "project" | "client" | "org"Also store it as that level's default (INV-05). Default: "invoice".

ReportSummaryOut

Fields of ReportSummaryOut
NameTypeDescription
scoperequired"me" | "org"
from_daterequiredstring (date)
to_daterequiredstring (date)
timezonerequiredstring
as_ofrequiredstring (date-time)
moderequired"sessions" | "day_span"
bucketrequired"day" | "week" | "month"
totalsrequiredReportTotalsOut
previousrequiredComparisonOut | null
by_projectrequiredProjectSecondsOut[]Most time first, then name.
by_clientrequiredClientSecondsOut[]
by_memberrequiredMemberSecondsOut[] | null`scope=org` only.
by_taskrequiredTaskSecondsOut[]
bucketsrequiredBucketOut[]
timesheetrequiredTimesheetOut
billablerequiredBillableSplitOut | nullBillable and billed time with amounts per currency; owners/admins only.
history_floorrequiredstring (date-time) | nullFree plan: older parts of the range were clipped.

ReportTotalsOut

Fields of ReportTotalsOut
NameTypeDescription
worked_secondsrequiredintegerRunning sessions included up to `as_of`.
active_secondsrequiredintegerThe part of `worked_seconds` contributed by running sessions.
tracked_daysrequiredintegerLocal days with any session, even when fully paused.
session_countrequiredinteger
manual_session_countrequiredinteger
avg_per_tracked_day_secondsrequiredinteger | null(worked - active) ÷ tracked days (WEB-14); null without tracked days.
project_countrequiredinteger
member_countrequiredinteger

ResolvedRate

An hourly rate after resolution: override → project → client → organisation → none.

Fields of ResolvedRate
NameTypeDescription
raterequiredstring | nullPer hour, major units; null when nothing is configured (unpriced).
currencyrequiredstring
sourcerequired"invoice" | "project" | "client" | "org" | "none"

SessionBillingOut

The invoice claiming the session; while set, the session is locked (tags stay editable).

Fields of SessionBillingOut
NameTypeDescription
invoice_idrequiredstring (uuid)
invoice_numberrequiredstring
issuedrequiredbooleanThe invoice left draft: the claim can no longer be released.

SessionDetailOut

Fields of SessionDetailOut
NameTypeDescription
idrequiredstring (uuid)
user_idrequiredstring (uuid)
organisation_idrequiredstring (uuid)
projectrequiredProjectRef
start_atrequiredstring (date-time)
end_atrequiredstring (date-time) | null
is_activerequiredboolean
is_pausedrequiredboolean
originrequired"web" | "desktop_file" | "desktop_manual" | "browser_url" | "browser_manual" | "cli_manual" | "cli_watch" | "api" | "mcp" | "mobile" | "unknown"
is_manualrequiredboolean
descriptionrequiredstring
worked_secondsrequiredintegerPause-aware; a running session counts up to the response's `as_of`.
tagsrequiredTagRef[]Tags attached to the session itself.
tasksrequiredTaskSummaryOut[]
files_changedrequiredinteger | nullDistinct changed paths; null without file evidence.
billingrequiredSessionBillingOut | null
client_session_idrequiredstring (uuid) | nullLegacy idempotency key of old clients.
device_idrequiredstring (uuid) | null
continued_from_session_idrequiredstring (uuid) | nullSet on the continuation of a live 24 h segment.
deleted_atrequiredstring (date-time) | nullOnly set in change feeds (`changed_since`) and on deletion.
versionrequiredintegerIncrements on every change.
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
working_intervalsrequiredIntervalOut[]
pausesrequiredPauseOut[]
task_segmentsrequiredTaskSegmentOut[]
inherited_tagsrequiredTagRef[]Tags of the project and its client: filters match them.
merged_from_session_idsrequiredstring (uuid)[]Sources merged into this session (provenance).
last_activity_atrequiredstring (date-time) | nullLatest file evidence.
review_flagrequiredstring | nullMigration flag such as `over_24h` or `evidence_outside_window`.

SessionOut

Fields of SessionOut
NameTypeDescription
idrequiredstring (uuid)
user_idrequiredstring (uuid)
organisation_idrequiredstring (uuid)
projectrequiredProjectRef
start_atrequiredstring (date-time)
end_atrequiredstring (date-time) | null
is_activerequiredboolean
is_pausedrequiredboolean
originrequired"web" | "desktop_file" | "desktop_manual" | "browser_url" | "browser_manual" | "cli_manual" | "cli_watch" | "api" | "mcp" | "mobile" | "unknown"
is_manualrequiredboolean
descriptionrequiredstring
worked_secondsrequiredintegerPause-aware; a running session counts up to the response's `as_of`.
tagsrequiredTagRef[]Tags attached to the session itself.
tasksrequiredTaskSummaryOut[]
files_changedrequiredinteger | nullDistinct changed paths; null without file evidence.
billingrequiredSessionBillingOut | null
client_session_idrequiredstring (uuid) | nullLegacy idempotency key of old clients.
device_idrequiredstring (uuid) | null
continued_from_session_idrequiredstring (uuid) | nullSet on the continuation of a live 24 h segment.
deleted_atrequiredstring (date-time) | nullOnly set in change feeds (`changed_since`) and on deletion.
versionrequiredintegerIncrements on every change.
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)

SessionPage

Fields of SessionPage
NameTypeDescription
itemsrequiredSessionOut[]
next_cursorrequiredstring | null
as_ofrequiredstring (date-time)The instant running sessions are measured to.
totalsrequiredSessionTotalsOut | nullWhole selection, not just this page; null in delta-sync mode.
history_floorrequiredstring (date-time) | nullFree plan: older parts of the range were clipped.

SessionStop

Fields of SessionStop
NameTypeDescription
end_atstring (date-time) | nullDefault now (clamped for stale file sessions); a set end only moves earlier.

SessionTotalsOut

Fields of SessionTotalsOut
NameTypeDescription
session_countrequiredinteger
active_countrequiredinteger
worked_secondsrequiredinteger

SessionUpdate

Only fields present change; untouched instants round-trip exactly (TIM-05).

Fields of SessionUpdate
NameTypeDescription
project_idstring (uuid) | null
start_atstring (date-time) | null
end_atstring (date-time) | nullSetting it on a running session stops it.
duration_secondsinteger | nullAlternative to `end_at`, from the start.
descriptionstring | nullThis session only; no cascade.
tagsstring[] | nullFull replacement of direct tags.

SettingsOut

Fields of SettingsOut
NameTypeDescription
timezonerequiredstring | nullChosen IANA zone; null until the user (or detection) sets one.
effective_timezonerequiredstringThe zone used for day boundaries: chosen zone or server default.
idle_timeout_secondsrequiredinteger
sleep_resume_secondsrequiredinteger
full_day_spanrequiredboolean
ai_sensitive_data_consentrequiredboolean
uirequiredUiPreferences

TagRef

Fields of TagRef
NameTypeDescription
idrequiredstring (uuid)
namerequiredstring

TaskHoursOut

Fields of TaskHoursOut
NameTypeDescription
labelrequiredstring | nullNull is unlabelled work ("Other work").
hoursrequiredstringSums exactly to the line hours (largest remainder, INV-25).

TaskSecondsOut

Fields of TaskSecondsOut
NameTypeDescription
namerequiredstring | nullNull groups unlabelled time ("Other work").
secondsrequiredinteger

TaskSegmentOut

Fields of TaskSegmentOut
NameTypeDescription
idrequiredstring (uuid)
namerequiredstring
start_atrequiredstring (date-time)
end_atrequiredstring (date-time) | null
secondsrequiredinteger

TaskSummaryOut

Fields of TaskSummaryOut
NameTypeDescription
namerequiredstring
secondsrequiredintegerPause-aware time of all segments with this name.
activerequiredbooleanThe session's open segment carries this name.

TimeReportOut

The caller's own tracked time over a range, the running timer included.

Fields of TimeReportOut
NameTypeDescription
from_daterequiredstring (date)
to_daterequiredstring (date)
timezonerequiredstring
as_ofrequiredstring (date-time)
total_secondsrequiredinteger
running_timer_includedrequiredboolean
by_projectrequiredProjectSecondsOut[] | nullWhen grouped by project; most time first.
by_dayrequiredDaySecondsOut[] | nullWhen grouped by day; days with time, ascending.
by_taskrequiredTaskSecondsOut[] | nullWhen grouped by task.
history_floorrequiredstring (date-time) | nullFree plan: older parts of the range were clipped.

TimerSnapshot

The caller's own running sessions — never widened to teammates, also not for admins.

Fields of TimerSnapshot
NameTypeDescription
as_ofrequiredstring (date-time)
sessionsrequiredActiveSessionOut[]
clientsrequiredConnectedClientOut[]The caller's connected live clients (presence).

TimerStart

Fields of TimerStart
NameTypeDescription
idstring (uuid) | nullClient-generated id; a replay returns the same session.
project_idrequiredstring (uuid)
start_atstring (date-time) | nullDefault now; at most 5 min in the future.
descriptionstring | nullDefault: the caller's current task.
origin"web" | "desktop_file" | "desktop_manual" | "browser_url" | "browser_manual" | "cli_manual" | "cli_watch" | "api" | "mcp" | "mobile"Default: "web".
is_manualbooleanFalse for automatic starts (file activity, URL rules). Default: true.
device_idstring (uuid) | null
client_session_idstring (uuid) | nullLegacy idempotency key (old clients).
replace_othersbooleanStop the caller's other running timers first. Default: false.

TimerStartOut

Fields of TimerStartOut
NameTypeDescription
sessionrequiredSessionOut
createdrequiredbooleanThis call created the session: the caller owns it.
adoptedrequiredbooleanAn open session already ran on the project and is returned instead. The caller did not start it and must not stop it automatically (TIM-10).
stoppedrequiredSessionOut[]Timers stopped because `replace_others` was set.

TimesheetOut

Fields of TimesheetOut
NameTypeDescription
daysrequiredstring (date)[]
by_projectrequiredTimesheetRowOut[]
by_memberrequiredTimesheetRowOut[] | null`scope=org` only.

TimesheetRowOut

Fields of TimesheetRowOut
NameTypeDescription
idrequiredstring (uuid)Project id, or user id in `by_member`.
labelrequiredstring
seconds_by_dayrequiredinteger[]Aligned with `TimesheetOut.days`.
total_secondsrequiredinteger

UiPreferences

Client display preferences, synced across devices; servers never act on them.

Fields of UiPreferences
NameTypeDescription
theme"system" | "light" | "dark"Default: "system".
mobile_shortcuts"today" | "calendar" | "sessions" | "projects" | "clients" | "invoices" | "reports" | "team" | "settings" | "support"[]Ordered phone tab-bar shortcuts.
sidebar_collapsedbooleanDefault: false.
calendar_view"day" | "week" | "month"Default: "week".

UserOut

Fields of UserOut
NameTypeDescription
idrequiredstring (uuid)
legacy_idrequiredinteger | nullOld integer id; installed clients key local data by it.
emailrequiredstring
pending_emailrequiredstring | nullNew address waiting for its confirmation link to be opened.
first_namerequiredstring
last_namerequiredstring
display_namerequiredstring
email_verifiedrequiredboolean
has_deliverable_emailrequiredbooleanFalse for social sign-ups with a placeholder address.
has_passwordrequiredboolean
is_staffrequiredboolean
created_atrequiredstring (date-time)
deletion_scheduled_atrequiredstring (date-time) | nullSet while a requested deletion is in its grace period.

WebhookDeliveryOut

Fields of WebhookDeliveryOut
NameTypeDescription
idrequiredstring (uuid)
event_idrequiredstring (uuid)The business event; shared by all its deliveries.
eventrequired"project.created" | "session.created" | "session.closed" | "invoice.created" | "invoice.paid"
statusrequired"pending" | "delivered" | "dead" | "cancelled"
attemptsrequiredinteger
next_attempt_atrequiredstring (date-time) | null
last_status_coderequiredinteger | null
last_errorrequiredstring | null
created_atrequiredstring (date-time)
delivered_atrequiredstring (date-time) | null

WebhookSecretOut

Fields of WebhookSecretOut
NameTypeDescription
secretrequiredstring

WebhookSubscriptionCreate

Fields of WebhookSubscriptionCreate
NameTypeDescription
idstring (uuid) | null
eventrequired"project.created" | "session.created" | "session.closed" | "invoice.created" | "invoice.paid"
target_urlrequiredstring
api_key_idstring (uuid) | nullRequired with a cookie session; API-key callers subscribe their own key.

WebhookSubscriptionCreatedOut

Fields of WebhookSubscriptionCreatedOut
NameTypeDescription
subscriptionrequiredWebhookSubscriptionOut
secretrequiredstringHMAC-SHA256 key for `X-Temporalist-Signature`. Returned by a create and its replays (so a retried subscribe still learns it), never by reads; rotate to replace it.

WebhookSubscriptionOut

Fields of WebhookSubscriptionOut
NameTypeDescription
idrequiredstring (uuid)
api_key_idrequiredstring (uuid)
eventrequired"project.created" | "session.created" | "session.closed" | "invoice.created" | "invoice.paid"
target_urlrequiredstring
statusrequired"active" | "disabled"
failure_countrequiredintegerConsecutive failed deliveries; reset by a success.
last_delivery_atrequiredstring (date-time) | null
last_status_coderequiredinteger | null
last_errorrequiredstring | null
created_atrequiredstring (date-time)

WebhookSubscriptionUpdate

Fields of WebhookSubscriptionUpdate
NameTypeDescription
statusrequired"active" | "disabled"

OpenAPI

The complete machine-readable description of the API, for code generators and API tools such as Postman or Insomnia.

OpenAPI 3.1 document
https://temporal.ist/api/v2/openapi.json