Time tracking
/api/v1/time-entriesNewest first. Period from/to (calendar days, Europe/Berlin), filter by project or customer and by billing status (running, unbilled, invoiced, non_billable).
Permission: time:read
Query parameters
fromstring (date)from day (inclusive, Europe/Berlin)tostring (date)to day (inclusive)projectIdstringmax. 128 characterscontactIdstringnot together with projectIdmax. 128 charactersbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"limitintegerNumber of entries (1–100)1–100 · Default: 25cursorstring`nextCursor` of the previous pagemax. 500 characters
Response 200
object"list"requireddataArray<TimeEntry>requiredidstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
hasMorebooleanrequirednextCursorstring | nullrequired
curl 'https://www.debt-flow.io/api/v1/time-entries' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"object": "list",
"data": [
{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}
],
"hasMore": false,
"nextCursor": "string"
}/api/v1/time-entriesEither start + end or date (+ optionally startTime) + durationMinutes. At most 24 hours per entry. Without billable, the default of the task or project applies. Triggers time_entry.created.
Permission: time:write
Headers
Idempotency-KeystringUnique key (8–255 characters). Repeated requests with the same key return the same response for 24 h.max. 255 characters
Body (JSON) · TimeEntryCreate
projectIdstring | nullmax. 128 characterstaskIdstring | nullmax. 128 characterscontactIdstring | nullwithout project: customer directly; with project: the project's customermax. 128 charactersdescriptionstringmax. 1000 characters · Default: ""startstring (date-time)Start; alternatively `date` + `durationMinutes`endstring (date-time)Timestamp (ISO 8601)datestring (date)Day (Europe/Berlin) when only a duration is recordedstartTimestringTime for `date` (default 09:00)durationMinutesinteger1–1440billablebooleanDefault: as project/task, otherwise truehourlyRateCentsinteger | nullHourly rate in cents (net or gross depending on the invoice)0–10000000
Response 201 · TimeEntry
idstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"startTime": "string",
"durationMinutes": 1,
"billable": false,
"hourlyRateCents": 0
}'{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/time-entries/{id}Permission: time:read
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 200 · TimeEntry
idstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl 'https://www.debt-flow.io/api/v1/time-entries/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/time-entries/{id}Only the fields you pass. durationMinutes sets the end relative to the start. Invoiced entries are locked (409 time_entry_invoiced). Triggers time_entry.updated.
Permission: time:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Body (JSON) · TimeEntryUpdate
projectIdstring | nullmax. 128 characterstaskIdstring | nullmax. 128 characterscontactIdstring | nullmax. 128 charactersdescriptionstringmax. 1000 charactersstartstring (date-time)Timestamp (ISO 8601)endstring (date-time)Timestamp (ISO 8601)durationMinutesintegersets end = start + duration1–1440billablebooleanhourlyRateCentsinteger | nullHourly rate in cents (net or gross depending on the invoice)0–10000000
Response 200 · TimeEntry
idstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X PATCH 'https://www.debt-flow.io/api/v1/time-entries/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"durationMinutes": 1,
"billable": false,
"hourlyRateCents": 0
}'{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/time-entries/{id}Invoiced entries are locked (409 time_entry_invoiced). Triggers time_entry.deleted.
Permission: time:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Response 204
Success, no content
curl -X DELETE 'https://www.debt-flow.io/api/v1/time-entries/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"/api/v1/time-entries/{id}/stopSets the end (default: now). At least 1 minute, at most 24 hours. 409 timer_not_running if the entry is not running.
Permission: time:write
Path parameters
idstringrequiredResource IDmax. 128 characters
Headers
Idempotency-KeystringUnique key (8–255 characters). Repeated requests with the same key return the same response for 24 h.max. 255 characters
Body (JSON) · TimerStop
endstring (date-time)End time (default: now)
Response 200 · TimeEntry
idstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries/ID/stop' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"end": "2026-11-01T09:30:00.000Z"
}'{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/time-entries/invoiceInvoices open, billable time of a project (optionally for a period) or selected entries. Creates a draft invoice (without a number, not finalised) and marks the entries as invoiced – in a single transaction. Line items per project, task or entry; quantity = hours (2 decimal places) according to the billing increment. Errors: 400 without customer/hourly rate, 409 time_entries_not_billable, 422 nothing_to_invoice. Triggers invoice.created and time_entry.updated. Continue with POST /invoices/{id}/finalize.
Permission: time:write, invoices:write
Headers
Idempotency-KeystringUnique key (8–255 characters). Repeated requests with the same key return the same response for 24 h.max. 255 characters
Body (JSON) · TimeInvoiceRequest
projectIdstringall open, billable time of the project (optionally with from/to)max. 128 charactersentryIdsArray<string>or exactly these time entriesmax. 128 charactersfromstring (date)Date (YYYY-MM-DD)tostring (date)Date (YYYY-MM-DD)contactIdstringInvoice recipient; default: the project's customermax. 128 charactersgroupBy"project" | "task" | "entry"Default: "task"roundingMinutesintegerBilling increment per time entry in minutes-9007199254740991–9007199254740991 · Default: 1roundingMode"up" | "nearest"Default: "up"taxRatenumberTax rate of the line items (for standard taxation)0–100 · Default: 19hourlyRateCentsintegerRate for entries without an hourly rate0–10000000issueDatestring (date)Invoice date (default: today)subjectstringmax. 200 charactersintroTextstringmax. 5000 charactersclosingTextstringmax. 5000 characters
Response 201 · TimeInvoiceResult
invoiceIdstringrequiredID of the draft invoice (GET /invoices/{id})status"draft"requiredcontactIdstringrequiredentryCountintegerrequired-9007199254740991–9007199254740991totalMinutesintegerrequired-9007199254740991–9007199254740991totalsDocumentTotalsrequirednetCentsintegerrequiredAmount in cents-100000000000–100000000000taxCentsintegerrequiredAmount in cents-100000000000–100000000000grossCentsintegerrequiredAmount in cents-100000000000–100000000000groupsArray<object>requiredtaxRatenumberrequiredcategorystringrequirednetCentsintegerrequiredAmount in cents-100000000000–100000000000taxCentsintegerrequiredAmount in cents-100000000000–100000000000grossCentsintegerrequiredAmount in cents-100000000000–100000000000
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries/invoice' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"projectId": "string",
"entryIds": [
"string"
],
"from": "2026-11-01",
"to": "2026-11-01",
"contactId": "string",
"groupBy": "task",
"roundingMinutes": 1,
"roundingMode": "up",
"taxRate": 19,
"hourlyRateCents": 0,
"issueDate": "2026-11-01",
"subject": "string",
"introText": "string",
"closingText": "string"
}'{
"invoiceId": "string",
"status": "draft",
"contactId": "string",
"entryCount": 0,
"totalMinutes": 0,
"totals": {
"netCents": 0,
"taxCents": 0,
"grossCents": 0,
"groups": [
{
"taxRate": 0,
"category": "string",
"netCents": 0,
"taxCents": 0,
"grossCents": 0
}
]
}
}/api/v1/time-entries/invoice-previewLike POST /time-entries/invoice, but creates nothing. Returns line items, totals and notices (warnings).
Permission: time:read
Body (JSON) · TimeInvoiceRequest
projectIdstringall open, billable time of the project (optionally with from/to)max. 128 charactersentryIdsArray<string>or exactly these time entriesmax. 128 charactersfromstring (date)Date (YYYY-MM-DD)tostring (date)Date (YYYY-MM-DD)contactIdstringInvoice recipient; default: the project's customermax. 128 charactersgroupBy"project" | "task" | "entry"Default: "task"roundingMinutesintegerBilling increment per time entry in minutes-9007199254740991–9007199254740991 · Default: 1roundingMode"up" | "nearest"Default: "up"taxRatenumberTax rate of the line items (for standard taxation)0–100 · Default: 19hourlyRateCentsintegerRate for entries without an hourly rate0–10000000issueDatestring (date)Invoice date (default: today)subjectstringmax. 200 charactersintroTextstringmax. 5000 charactersclosingTextstringmax. 5000 characters
Response 200 · TimeInvoicePreview
contactIdstring | nullrequiredcontactNamestring | nullrequiredprojectIdstring | nullrequiredentryCountintegerrequired-9007199254740991–9007199254740991entryIdsArray<string>requiredtotalMinutesintegerrequiredMinutes after rounding-9007199254740991–9007199254740991servicePeriodobject | nullrequiredfromstring (date)requiredDate (YYYY-MM-DD)tostring (date)requiredDate (YYYY-MM-DD)
priceMode"net" | "gross"requiredtaxTreatmentstringrequiredlinesArray<DocumentLine>requiredidstringstable line item ID (assigned by the server if empty)max. 40 characterstype"item" | "text" | "subtotal"Line item, plain text line or subtotalDefault: "item"articleIdstringReference to the article master datamax. 128 characterstitlestringrequiredmax. 300 charactersdescriptionstringmax. 5000 charactersquantitynumber-1000000–1000000 · Default: 1unitstringUnit, e.g. Stk, Std, pauschal (piece, hour, flat rate); UN/ECE Rec 20 for e-invoicing: modulemax. 20 charactersunitPriceCentsintegerAmount in cents-100000000000–100000000000 · Default: 0discountPercentnumber0–100taxRatenumberTax rate in per cent (19, 7, 0 …)0–100 · Default: 19totalCentsintegerAmount in cents-100000000000–100000000000servicePeriodobjectfromstring (date)requiredDate (YYYY-MM-DD)tostring (date)requiredDate (YYYY-MM-DD)
projectIdstringmax. 128 characterstimeEntryIdsArray<string>max. 128 characters
totalsDocumentTotalsrequirednetCentsintegerrequiredAmount in cents-100000000000–100000000000taxCentsintegerrequiredAmount in cents-100000000000–100000000000grossCentsintegerrequiredAmount in cents-100000000000–100000000000groupsArray<object>requiredtaxRatenumberrequiredcategorystringrequirednetCentsintegerrequiredAmount in cents-100000000000–100000000000taxCentsintegerrequiredAmount in cents-100000000000–100000000000grossCentsintegerrequiredAmount in cents-100000000000–100000000000
missingRateEntryIdsArray<string>requiredEntries without an hourly rate – without `hourlyRateCents` no invoice is createdwarningsArray<string>required
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries/invoice-preview' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"projectId": "string",
"entryIds": [
"string"
],
"from": "2026-11-01",
"to": "2026-11-01",
"contactId": "string",
"groupBy": "task",
"roundingMinutes": 1,
"roundingMode": "up",
"taxRate": 19,
"hourlyRateCents": 0,
"issueDate": "2026-11-01",
"subject": "string",
"introText": "string",
"closingText": "string"
}'{
"contactId": "string",
"contactName": "string",
"projectId": "string",
"entryCount": 0,
"entryIds": [
"string"
],
"totalMinutes": 0,
"servicePeriod": {
"from": "2026-11-01",
"to": "2026-11-01"
},
"priceMode": "net",
"taxTreatment": "string",
"lines": [
{
"id": "string",
"type": "item",
"articleId": "string",
"title": "string",
"description": "string",
"quantity": 1,
"unit": "string",
"unitPriceCents": 0,
"discountPercent": 0,
"taxRate": 19,
"totalCents": 0,
"servicePeriod": {
"from": "2026-11-01",
"to": "2026-11-01"
},
"projectId": "string",
"timeEntryIds": [
"string"
]
}
],
"totals": {
"netCents": 0,
"taxCents": 0,
"grossCents": 0,
"groups": [
{
"taxRate": 0,
"category": "string",
"netCents": 0,
"taxCents": 0,
"grossCents": 0
}
]
},
"missingRateEntryIds": [
"string"
],
"warnings": [
"string"
]
}/api/v1/time-entries/releaseReleases the time entries of an invoice so they can be invoiced again – only if the draft invoice has been deleted or the invoice has been cancelled (otherwise 409 invoice_active). Triggers time_entry.updated for each entry.
Permission: time:write
Headers
Idempotency-KeystringUnique key (8–255 characters). Repeated requests with the same key return the same response for 24 h.max. 255 characters
Body (JSON) · TimeEntriesRelease
invoiceIdstringrequireddeleted draft or cancelled invoicemax. 128 characters
Response 200 · TimeEntriesReleaseResult
releasedintegerrequired-9007199254740991–9007199254740991
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries/release' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"invoiceId": "string"
}'{
"released": 0
}/api/v1/time-entries/summaryTotals per project, task, customer, day, week or month for a period (default: current month). Amounts = exact minutes × hourly rate (entry → task → project); minutes without a rate are listed in missingRateMinutes.
Permission: time:read
Query parameters
fromstring (date)Default: first day of the current monthtostring (date)Default: todayprojectIdstringmax. 128 characterscontactIdstringmax. 128 charactersgroupBy"project" | "task" | "contact" | "day" | "week" | "month"Default: "project"
Response 200 · TimeSummary
fromstring (date)requiredDate (YYYY-MM-DD)tostring (date)requiredDate (YYYY-MM-DD)groupBy"project" | "task" | "contact" | "day" | "week" | "month"requiredtotalsobjectrequiredentriesintegerrequired-9007199254740991–9007199254740991minutesintegerrequired-9007199254740991–9007199254740991billableMinutesintegerrequired-9007199254740991–9007199254740991nonBillableMinutesintegerrequired-9007199254740991–9007199254740991unbilledMinutesintegerrequired-9007199254740991–9007199254740991invoicedMinutesintegerrequired-9007199254740991–9007199254740991billableAmountCentsintegerrequiredbillable time × hourly rate-9007199254740991–9007199254740991unbilledAmountCentsintegerrequirednot yet invoiced-9007199254740991–9007199254740991invoicedAmountCentsintegerrequired-9007199254740991–9007199254740991missingRateMinutesintegerrequiredbillable minutes without an hourly rate (not included in the amount)-9007199254740991–9007199254740991
rowsArray<TimeSummaryRow>requiredkeystringrequiredlabelstringrequiredentriesintegerrequired-9007199254740991–9007199254740991minutesintegerrequired-9007199254740991–9007199254740991billableMinutesintegerrequired-9007199254740991–9007199254740991nonBillableMinutesintegerrequired-9007199254740991–9007199254740991unbilledMinutesintegerrequired-9007199254740991–9007199254740991invoicedMinutesintegerrequired-9007199254740991–9007199254740991billableAmountCentsintegerrequiredbillable time × hourly rate-9007199254740991–9007199254740991unbilledAmountCentsintegerrequirednot yet invoiced-9007199254740991–9007199254740991invoicedAmountCentsintegerrequired-9007199254740991–9007199254740991missingRateMinutesintegerrequiredbillable minutes without an hourly rate (not included in the amount)-9007199254740991–9007199254740991
curl 'https://www.debt-flow.io/api/v1/time-entries/summary' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"from": "2026-11-01",
"to": "2026-11-01",
"groupBy": "project",
"totals": {
"entries": 0,
"minutes": 0,
"billableMinutes": 0,
"nonBillableMinutes": 0,
"unbilledMinutes": 0,
"invoicedMinutes": 0,
"billableAmountCents": 0,
"unbilledAmountCents": 0,
"invoicedAmountCents": 0,
"missingRateMinutes": 0
},
"rows": [
{
"key": "string",
"label": "string",
"entries": 0,
"minutes": 0,
"billableMinutes": 0,
"nonBillableMinutes": 0,
"unbilledMinutes": 0,
"invoicedMinutes": 0,
"billableAmountCents": 0,
"unbilledAmountCents": 0,
"invoicedAmountCents": 0,
"missingRateMinutes": 0
}
]
}/api/v1/time-entries/timerAt most one timer runs per account. entry.durationMinutes = time elapsed so far.
Permission: time:read
Response 200 · Timer
runningbooleanrequiredentryTimeEntry | nullrequiredidstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl 'https://www.debt-flow.io/api/v1/time-entries/timer' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"{
"running": false,
"entry": {
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}
}/api/v1/time-entries/timerCreates a running time entry. A timer that is already running is stopped at the start time. Triggers time_entry.created (and, if applicable, time_entry.updated for the stopped one).
Permission: time:write
Headers
Idempotency-KeystringUnique key (8–255 characters). Repeated requests with the same key return the same response for 24 h.max. 255 characters
Body (JSON) · TimerStart
projectIdstring | nullmax. 128 characterstaskIdstring | nullmax. 128 characterscontactIdstring | nullmax. 128 charactersdescriptionstringmax. 1000 characters · Default: ""billablebooleanstartstring (date-time)Start time (default: now); at most 24 h in the past
Response 201 · TimeEntry
idstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries/timer' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "",
"billable": false,
"start": "2026-11-01T09:30:00.000Z"
}'{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}/api/v1/time-entries/timer/stopStops the running timer without knowing its ID (e.g. for Zapier/Make). 409 timer_not_running if none is running.
Permission: time:write
Headers
Idempotency-KeystringUnique key (8–255 characters). Repeated requests with the same key return the same response for 24 h.max. 255 characters
Body (JSON) · TimerStop
endstring (date-time)End time (default: now)
Response 200 · TimeEntry
idstringrequiredprojectIdstring | nullrequiredtaskIdstring | nullrequiredcontactIdstring | nullrequireddescriptionstringrequiredstartstring (date-time)requiredTimestamp (ISO 8601)endstring (date-time) | nullrequirednull while the timer is runningdatestring (date)requiredCalendar day of the start (Europe/Berlin)durationMinutesintegerrequiredDuration in minutes; for a running timer, the time elapsed so far0–9007199254740991runningbooleanrequiredbillablebooleanrequiredbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"requiredhourlyRateCentsinteger | nullrequireddifferent hourly rate; null = rate of the task or project0–10000000invoicedInvoiceIdstring | nullrequiredInvoice with which the time was invoicedinvoicedAtstring (date-time) | nullrequiredTimestamp (ISO 8601)createdAtstring (date-time)requiredTimestamp (ISO 8601)updatedAtstring (date-time)requiredTimestamp (ISO 8601)
curl -X POST 'https://www.debt-flow.io/api/v1/time-entries/timer/stop' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"end": "2026-11-01T09:30:00.000Z"
}'{
"id": "string",
"projectId": "string",
"taskId": "string",
"contactId": "string",
"description": "string",
"start": "2026-11-01T09:30:00.000Z",
"end": "2026-11-01T09:30:00.000Z",
"date": "2026-11-01",
"durationMinutes": 0,
"running": false,
"billable": false,
"billingStatus": "running",
"hourlyRateCents": 0,
"invoicedInvoiceId": "string",
"invoicedAt": "2026-11-01T09:30:00.000Z",
"createdAt": "2026-11-01T09:30:00.000Z",
"updatedAt": "2026-11-01T09:30:00.000Z"
}