Zeiterfassung
/api/v1/time-entriesNeueste zuerst. Zeitraum from/to (Kalendertage Europe/Berlin), Filter nach Projekt oder Kunde und Abrechnungsstatus (running, unbilled, invoiced, non_billable).
Berechtigung: time:read
Query-Parameter
fromstring (date)ab Tag (inkl., Europe/Berlin)tostring (date)bis Tag (inkl.)projectIdstringmax. 128 ZeichencontactIdstringnicht zusammen mit projectIdmax. 128 ZeichenbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"limitintegerAnzahl Einträge (1–100)1–100 · Standard: 25cursorstring`nextCursor` der vorherigen Seitemax. 500 Zeichen
Antwort 200
object"list"PflichtdataArray<TimeEntry>PflichtidstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (ISO 8601)
hasMorebooleanPflichtnextCursorstring | nullPflicht
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-entriesEntweder start + end oder date (+ optional startTime) + durationMinutes. Höchstens 24 Stunden je Eintrag. Ohne billable gilt der Standard von Aufgabe bzw. Projekt. Löst time_entry.created aus.
Berechtigung: time:write
Header
Idempotency-KeystringEindeutiger Schlüssel (8–255 Zeichen). Wiederholte Anfragen mit gleichem Schlüssel liefern 24 h lang dieselbe Antwort.max. 255 Zeichen
Body (JSON) · TimeEntryCreate
projectIdstring | nullmax. 128 ZeichentaskIdstring | nullmax. 128 ZeichencontactIdstring | nullohne Projekt: Kunde direkt; mit Projekt: Kunde des Projektsmax. 128 Zeichendescriptionstringmax. 1000 Zeichen · Standard: ""startstring (date-time)Beginn; alternativ `date` + `durationMinutes`endstring (date-time)Zeitpunkt (ISO 8601)datestring (date)Tag (Europe/Berlin), wenn nur eine Dauer erfasst wirdstartTimestringUhrzeit zu `date` (Standard 09:00)durationMinutesinteger1–1440billablebooleanStandard: wie Projekt/Aufgabe, sonst truehourlyRateCentsinteger | nullStundensatz in Cent (netto bzw. brutto je nach Rechnung)0–10000000
Antwort 201 · TimeEntry
idstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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}Berechtigung: time:read
Pfadparameter
idstringPflichtID der Ressourcemax. 128 Zeichen
Antwort 200 · TimeEntry
idstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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}Nur übergebene Felder. durationMinutes setzt das Ende relativ zum Beginn. Abgerechnete Einträge sind gesperrt (409 time_entry_invoiced). Löst time_entry.updated aus.
Berechtigung: time:write
Pfadparameter
idstringPflichtID der Ressourcemax. 128 Zeichen
Body (JSON) · TimeEntryUpdate
projectIdstring | nullmax. 128 ZeichentaskIdstring | nullmax. 128 ZeichencontactIdstring | nullmax. 128 Zeichendescriptionstringmax. 1000 Zeichenstartstring (date-time)Zeitpunkt (ISO 8601)endstring (date-time)Zeitpunkt (ISO 8601)durationMinutesintegersetzt das Ende = Beginn + Dauer1–1440billablebooleanhourlyRateCentsinteger | nullStundensatz in Cent (netto bzw. brutto je nach Rechnung)0–10000000
Antwort 200 · TimeEntry
idstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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}Abgerechnete Einträge sind gesperrt (409 time_entry_invoiced). Löst time_entry.deleted aus.
Berechtigung: time:write
Pfadparameter
idstringPflichtID der Ressourcemax. 128 Zeichen
Antwort 204
Erfolg, keine Antwort
curl -X DELETE 'https://www.debt-flow.io/api/v1/time-entries/ID' \
-H "Authorization: Bearer $DEBTFLOW_API_KEY"/api/v1/time-entries/{id}/stopSetzt das Ende (Standard: jetzt). Mindestens 1 Minute, höchstens 24 Stunden. 409 timer_not_running, wenn der Eintrag nicht läuft.
Berechtigung: time:write
Pfadparameter
idstringPflichtID der Ressourcemax. 128 Zeichen
Header
Idempotency-KeystringEindeutiger Schlüssel (8–255 Zeichen). Wiederholte Anfragen mit gleichem Schlüssel liefern 24 h lang dieselbe Antwort.max. 255 Zeichen
Body (JSON) · TimerStop
endstring (date-time)Endzeit (Standard: jetzt)
Antwort 200 · TimeEntry
idstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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/invoiceRechnet offene, abrechenbare Zeiten eines Projekts (optional Zeitraum) oder ausgewählte Einträge ab. Legt einen Rechnungsentwurf an (ohne Nummer, nicht festgeschrieben) und markiert die Einträge als abgerechnet – in einer Transaktion. Positionen je Projekt, Aufgabe oder Eintrag; Menge = Stunden (2 Nachkommastellen) nach Abrechnungstakt. Fehler: 400 ohne Kunde/Stundensatz, 409 time_entries_not_billable, 422 nothing_to_invoice. Löst invoice.created und time_entry.updated aus. Weiter mit POST /invoices/{id}/finalize.
Berechtigung: time:write, invoices:write
Header
Idempotency-KeystringEindeutiger Schlüssel (8–255 Zeichen). Wiederholte Anfragen mit gleichem Schlüssel liefern 24 h lang dieselbe Antwort.max. 255 Zeichen
Body (JSON) · TimeInvoiceRequest
projectIdstringalle offenen, abrechenbaren Zeiten des Projekts (optional mit from/to)max. 128 ZeichenentryIdsArray<string>oder genau diese Zeiteinträgemax. 128 Zeichenfromstring (date)Datum (YYYY-MM-DD)tostring (date)Datum (YYYY-MM-DD)contactIdstringRechnungsempfänger; Standard: Kunde des Projektsmax. 128 ZeichengroupBy"project" | "task" | "entry"Standard: "task"roundingMinutesintegerAbrechnungstakt je Zeiteintrag in Minuten-9007199254740991–9007199254740991 · Standard: 1roundingMode"up" | "nearest"Standard: "up"taxRatenumberSteuersatz der Positionen (bei Regelbesteuerung)0–100 · Standard: 19hourlyRateCentsintegerSatz für Einträge ohne Stundensatz0–10000000issueDatestring (date)Rechnungsdatum (Standard: heute)subjectstringmax. 200 ZeichenintroTextstringmax. 5000 ZeichenclosingTextstringmax. 5000 Zeichen
Antwort 201 · TimeInvoiceResult
invoiceIdstringPflichtID des Rechnungsentwurfs (GET /invoices/{id})status"draft"PflichtcontactIdstringPflichtentryCountintegerPflicht-9007199254740991–9007199254740991totalMinutesintegerPflicht-9007199254740991–9007199254740991totalsDocumentTotalsPflichtnetCentsintegerPflichtBetrag in Cent-100000000000–100000000000taxCentsintegerPflichtBetrag in Cent-100000000000–100000000000grossCentsintegerPflichtBetrag in Cent-100000000000–100000000000groupsArray<object>PflichttaxRatenumberPflichtcategorystringPflichtnetCentsintegerPflichtBetrag in Cent-100000000000–100000000000taxCentsintegerPflichtBetrag in Cent-100000000000–100000000000grossCentsintegerPflichtBetrag in Cent-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-previewWie POST /time-entries/invoice, legt aber nichts an. Liefert Positionen, Summen und Hinweise (warnings).
Berechtigung: time:read
Body (JSON) · TimeInvoiceRequest
projectIdstringalle offenen, abrechenbaren Zeiten des Projekts (optional mit from/to)max. 128 ZeichenentryIdsArray<string>oder genau diese Zeiteinträgemax. 128 Zeichenfromstring (date)Datum (YYYY-MM-DD)tostring (date)Datum (YYYY-MM-DD)contactIdstringRechnungsempfänger; Standard: Kunde des Projektsmax. 128 ZeichengroupBy"project" | "task" | "entry"Standard: "task"roundingMinutesintegerAbrechnungstakt je Zeiteintrag in Minuten-9007199254740991–9007199254740991 · Standard: 1roundingMode"up" | "nearest"Standard: "up"taxRatenumberSteuersatz der Positionen (bei Regelbesteuerung)0–100 · Standard: 19hourlyRateCentsintegerSatz für Einträge ohne Stundensatz0–10000000issueDatestring (date)Rechnungsdatum (Standard: heute)subjectstringmax. 200 ZeichenintroTextstringmax. 5000 ZeichenclosingTextstringmax. 5000 Zeichen
Antwort 200 · TimeInvoicePreview
contactIdstring | nullPflichtcontactNamestring | nullPflichtprojectIdstring | nullPflichtentryCountintegerPflicht-9007199254740991–9007199254740991entryIdsArray<string>PflichttotalMinutesintegerPflichtMinuten nach Rundung-9007199254740991–9007199254740991servicePeriodobject | nullPflichtfromstring (date)PflichtDatum (YYYY-MM-DD)tostring (date)PflichtDatum (YYYY-MM-DD)
priceMode"net" | "gross"PflichttaxTreatmentstringPflichtlinesArray<DocumentLine>Pflichtidstringstabile Positions-ID (vom Server vergeben, wenn leer)max. 40 Zeichentype"item" | "text" | "subtotal"Position, reine Textzeile oder ZwischensummeStandard: "item"articleIdstringBezug zum Artikelstammmax. 128 ZeichentitlestringPflichtmax. 300 Zeichendescriptionstringmax. 5000 Zeichenquantitynumber-1000000–1000000 · Standard: 1unitstringEinheit, z. B. Stk, Std, pauschal (UN/ECE Rec 20 für E-Rechnung: Modul)max. 20 ZeichenunitPriceCentsintegerBetrag in Cent-100000000000–100000000000 · Standard: 0discountPercentnumber0–100taxRatenumberSteuersatz in Prozent (19, 7, 0 …)0–100 · Standard: 19totalCentsintegerBetrag in Cent-100000000000–100000000000servicePeriodobjectfromstring (date)PflichtDatum (YYYY-MM-DD)tostring (date)PflichtDatum (YYYY-MM-DD)
projectIdstringmax. 128 ZeichentimeEntryIdsArray<string>max. 128 Zeichen
totalsDocumentTotalsPflichtnetCentsintegerPflichtBetrag in Cent-100000000000–100000000000taxCentsintegerPflichtBetrag in Cent-100000000000–100000000000grossCentsintegerPflichtBetrag in Cent-100000000000–100000000000groupsArray<object>PflichttaxRatenumberPflichtcategorystringPflichtnetCentsintegerPflichtBetrag in Cent-100000000000–100000000000taxCentsintegerPflichtBetrag in Cent-100000000000–100000000000grossCentsintegerPflichtBetrag in Cent-100000000000–100000000000
missingRateEntryIdsArray<string>PflichtEinträge ohne Stundensatz – ohne `hourlyRateCents` wird keine Rechnung erstelltwarningsArray<string>Pflicht
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/releaseGibt die Zeiten einer Rechnung zur erneuten Abrechnung frei – nur wenn der Rechnungsentwurf gelöscht oder die Rechnung storniert ist (sonst 409 invoice_active). Löst time_entry.updated je Eintrag aus.
Berechtigung: time:write
Header
Idempotency-KeystringEindeutiger Schlüssel (8–255 Zeichen). Wiederholte Anfragen mit gleichem Schlüssel liefern 24 h lang dieselbe Antwort.max. 255 Zeichen
Body (JSON) · TimeEntriesRelease
invoiceIdstringPflichtgelöschter Entwurf oder stornierte Rechnungmax. 128 Zeichen
Antwort 200 · TimeEntriesReleaseResult
releasedintegerPflicht-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/summarySummen je Projekt, Aufgabe, Kunde, Tag, Woche oder Monat für einen Zeitraum (Standard: laufender Monat). Beträge = exakte Minuten × Stundensatz (Eintrag → Aufgabe → Projekt); Minuten ohne Satz stehen in missingRateMinutes.
Berechtigung: time:read
Query-Parameter
fromstring (date)Standard: erster Tag des laufenden Monatstostring (date)Standard: heuteprojectIdstringmax. 128 ZeichencontactIdstringmax. 128 ZeichengroupBy"project" | "task" | "contact" | "day" | "week" | "month"Standard: "project"
Antwort 200 · TimeSummary
fromstring (date)PflichtDatum (YYYY-MM-DD)tostring (date)PflichtDatum (YYYY-MM-DD)groupBy"project" | "task" | "contact" | "day" | "week" | "month"PflichttotalsobjectPflichtentriesintegerPflicht-9007199254740991–9007199254740991minutesintegerPflicht-9007199254740991–9007199254740991billableMinutesintegerPflicht-9007199254740991–9007199254740991nonBillableMinutesintegerPflicht-9007199254740991–9007199254740991unbilledMinutesintegerPflicht-9007199254740991–9007199254740991invoicedMinutesintegerPflicht-9007199254740991–9007199254740991billableAmountCentsintegerPflichtabrechenbare Zeit × Stundensatz-9007199254740991–9007199254740991unbilledAmountCentsintegerPflichtnoch nicht abgerechnet-9007199254740991–9007199254740991invoicedAmountCentsintegerPflicht-9007199254740991–9007199254740991missingRateMinutesintegerPflichtabrechenbare Minuten ohne Stundensatz (nicht im Betrag enthalten)-9007199254740991–9007199254740991
rowsArray<TimeSummaryRow>PflichtkeystringPflichtlabelstringPflichtentriesintegerPflicht-9007199254740991–9007199254740991minutesintegerPflicht-9007199254740991–9007199254740991billableMinutesintegerPflicht-9007199254740991–9007199254740991nonBillableMinutesintegerPflicht-9007199254740991–9007199254740991unbilledMinutesintegerPflicht-9007199254740991–9007199254740991invoicedMinutesintegerPflicht-9007199254740991–9007199254740991billableAmountCentsintegerPflichtabrechenbare Zeit × Stundensatz-9007199254740991–9007199254740991unbilledAmountCentsintegerPflichtnoch nicht abgerechnet-9007199254740991–9007199254740991invoicedAmountCentsintegerPflicht-9007199254740991–9007199254740991missingRateMinutesintegerPflichtabrechenbare Minuten ohne Stundensatz (nicht im Betrag enthalten)-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/timerHöchstens ein Timer läuft je Konto. entry.durationMinutes = bisher vergangene Zeit.
Berechtigung: time:read
Antwort 200 · Timer
runningbooleanPflichtentryTimeEntry | nullPflichtidstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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/timerLegt einen laufenden Zeiteintrag an. Ein bereits laufender Timer wird zum Startzeitpunkt beendet. Löst time_entry.created (und ggf. time_entry.updated für den beendeten) aus.
Berechtigung: time:write
Header
Idempotency-KeystringEindeutiger Schlüssel (8–255 Zeichen). Wiederholte Anfragen mit gleichem Schlüssel liefern 24 h lang dieselbe Antwort.max. 255 Zeichen
Body (JSON) · TimerStart
projectIdstring | nullmax. 128 ZeichentaskIdstring | nullmax. 128 ZeichencontactIdstring | nullmax. 128 Zeichendescriptionstringmax. 1000 Zeichen · Standard: ""billablebooleanstartstring (date-time)Startzeit (Standard: jetzt); höchstens 24 Std. zurück
Antwort 201 · TimeEntry
idstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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/stopStoppt den laufenden Timer, ohne seine ID zu kennen (z. B. für Zapier/Make). 409 timer_not_running, wenn keiner läuft.
Berechtigung: time:write
Header
Idempotency-KeystringEindeutiger Schlüssel (8–255 Zeichen). Wiederholte Anfragen mit gleichem Schlüssel liefern 24 h lang dieselbe Antwort.max. 255 Zeichen
Body (JSON) · TimerStop
endstring (date-time)Endzeit (Standard: jetzt)
Antwort 200 · TimeEntry
idstringPflichtprojectIdstring | nullPflichttaskIdstring | nullPflichtcontactIdstring | nullPflichtdescriptionstringPflichtstartstring (date-time)PflichtZeitpunkt (ISO 8601)endstring (date-time) | nullPflichtnull, solange der Timer läuftdatestring (date)PflichtKalendertag des Beginns (Europe/Berlin)durationMinutesintegerPflichtDauer in Minuten; bei laufendem Timer die bisher vergangene Zeit0–9007199254740991runningbooleanPflichtbillablebooleanPflichtbillingStatus"running" | "unbilled" | "invoiced" | "non_billable"PflichthourlyRateCentsinteger | nullPflichtabweichender Stundensatz; null = Satz von Aufgabe bzw. Projekt0–10000000invoicedInvoiceIdstring | nullPflichtRechnung, mit der die Zeit abgerechnet wurdeinvoicedAtstring (date-time) | nullPflichtZeitpunkt (ISO 8601)createdAtstring (date-time)PflichtZeitpunkt (ISO 8601)updatedAtstring (date-time)PflichtZeitpunkt (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"
}