API · v1 · stabil
CODEMETA OSDeveloper Center
Konsole öffnen
Entity · time_records

Time Record Schema

Schema-ID
time_record
Collection
time_records
Permissions
  • Lesentime_record_view
  • Anlegentime_record_create
  • Änderntime_record_edit
  • Löschentime_record_delete

Felder

Time Record Schema

time_records4 Permissions

Schema for validating time record entities

userIduuidoptional

User ID who recorded this time entry

datedateerforderlich

Date of the time entry (ISO date format)

startTimedatetimeoptional

Start time for exact time tracking (ISO datetime)

nullable
endTimedatetimeoptional

End time for exact time tracking (ISO datetime)

nullable
durationMinutesintegererforderlich

Total duration in minutes

≥ 0
breakMinutesintegeroptional

Break time in minutes

≥ 0Default: 0
breakStartTimedatetimeoptional

When the break started (ISO datetime) — legacy, first break

nullable
breaksobject[]optional

Multiple break entries with start time and duration

Default: []
startTimedatetimeoptional

Break start time (ISO datetime)

nullable
durationMinutesintegererforderlich

Break duration in minutes

≥ 0
descriptionstringerforderlich

Work description

1–5000 Zeichen
internalNotestringoptional

Internal note not visible to customer

max 1000 Zeichennullable
serviceTypeIduuiderforderlich

Service type UUID — primary classification for billing parameters

serviceNaturestringoptional

Snapshot von service_type.serviceNature zum Buchungszeitpunkt (SUPPORT = im Full-Service enthalten, ORDER_BASED = auftragsbezogen). Server-gesetzt (protected), als direktes Feld in der Analytics-Auswertung gruppierbar. Null = nicht klassifiziert.

SUPPORTORDER_BASEDnull
read-onlynullable
entryTypestringoptional

Derived from serviceType.category (legacy compatibility)

WORKTRAVELREMOTEON_SITEPHONEADMINCONSULTINGMAINTENANCESUPPORTCUSTOMnull
nullable
locationstringoptional

Location where work was performed (defaults from serviceType.defaultLocation)

OFFICECUSTOMER_SITEREMOTETRAVELnull
nullable
partyIduuiderforderlich

Company UUID — always required (own company or customer)

partyAddressIduuidoptional

Specific customer site (party.addresses[]._id) the work was performed at

nullable
isInternalbooleanoptional

If true, not visible to customer and not billable

Default: false
referenceTypestringoptional

Type of linked entity (Auftrag)

TICKETPROJECTTASKCONTRACTPHONE_CALLCONTACT_PERSONASSETnull
nullable
referenceIduuidoptional

UUID of linked entity (Auftrag)

nullable
linkedProjectIduuidoptional

Linked project UUID (max. one; primary reference when set)

nullable
linkedTicketIduuidoptional

Linked ticket UUID (max. one; must belong to linkedProjectId when both set)

nullable
linkedTaskIduuidoptional

Linked task UUID (max. one; must belong to linkedTicketId/linkedProjectId when set)

nullable
linkedContactPersonIdsuuid[]optional

Linked contact person (PERSON party) UUIDs — informational, never billing-relevant while a work-item link exists

Default: []nullable
linkedAssetIdsuuid[]optional

Linked asset UUIDs — informational, never billing-relevant while a work-item link exists

Default: []nullable
contractIduuidoptional

Associated contract UUID (can be set alongside referenceType/Id)

nullable
positionIduuidoptional

ADR 0310 / 0552: project_position this booking is billed against. Carries the position for referenceType=PROJECT (direct bookings, e.g. off a project appointment via calendar_event.positionId) AND referenceType=TICKET (bookings on a project sub-ticket, ticket.projectId). TASK bookings ignore this field — they inherit their position from task.positionId. Feeds the position Ist (consumedMinutes/consumedAmount). Mandatory (422) when the effective project bills standalone and has at least one non-CANCELLED position, unless the tenant opted out via settings.timeEntry.requireProjectPosition=false (ADR 0631).

nullable
bookedFromTicketIduuidoptional

ADR 0631: PURELY INFORMATIONAL origin marker — the ticket whose Zeiterfassung tab this booking was made from, when the booking targets a POSITION OF THE TICKET'S PROJECT (referenceType=TASK on a project task). Such a record has no other trace of the ticket: its anchor is the project task, so the ticket time list cannot find it and the user sees their own booking vanish. This field is what the ticket tab filters on to show it back, read-only. It deliberately does NOT participate in derivePrimaryReference, validateLinkHierarchy, billing, coverage or any rollup — linking the ticket via the typed linkedTicketId instead would flip the anchor from TASK to TICKET and move the booking out of the position rollup into the central Leistungserfassung. No backfill: records written before this field simply lack it and stay invisible in that block.

nullable
assetIduuidoptional

Asset the work was performed on (inherited from the linked ticket)

nullable
coverageModestringoptional

How this record is handled financially against a contract

INCLUDEDCONTINGENTCONTRACT_RATEBILLABLEnull
nullable
coverageContractIduuidoptional

Contract that covers this record (resolver result)

nullable
coverageAssignmentIduuidoptional

Contract assignment whose coverage rule applied

nullable
coverageContingentIduuidoptional

Contingent the work was deducted from (CONTINGENT mode)

nullable
coverageContractRatePerHourstringoptional

Frozen contract special rate snapshot (CONTRACT_RATE mode)

Patternnullable
coverageRateSourcestringoptional

Frozen rate-source snapshot for revision safety

CONTRACT_RATECONTINGENTINCLUDEDSTANDARDnull
nullable
coverageResolverVersionnumberoptional

Resolver logic version active when coverage was resolved

nullable
coverageResolvedAtdatetimeoptional

Timestamp the coverage was resolved

nullable
coverageAmbiguousbooleanoptional

Manual clarification needed. Set when the asset could not be determined unambiguously, and (ADR 0948) when the technician forced a mixed booking onto the contract but the covered assets point at more than one contract/contingent — the resolver then picks one (INCLUDED before CONTINGENT before CONTRACT_RATE, then slot order) and flags the record.

nullable
coverageOverridestringoptional

ADR 0948 — the technician's manual decision, overriding the automatic all-or-nothing rule in BOTH directions and surviving a re-resolution. `null` (default) = automatic: the booking goes onto the contract only when EVERY linked asset is covered. `CONTRACT` = put it on the contract anyway, `BILLABLE` = keep it off the contract. Protected on PATCH — the flip goes through POST /time-records/:id/coverage, which re-resolves the coverage and moves the contingent in the same step.

CONTRACTBILLABLEnull
read-onlynullable
coverageMixedAssetsbooleanoptional

ADR 0948 — at the time of resolution, at least one linked asset was covered by the contract and at least one was not. Explains why an otherwise contract-covered booking came out BILLABLE; read-only resolver output.

read-onlynullable
overageBlockedbooleanoptional

Contingent overage was blocked by policy — overhang billed regularly

nullable
overageSurchargeAmountstringoptional

Surcharge amount for the contingent overhang (ALLOW_WITH_SURCHARGE)

Patternnullable
coveragePartialbooleanoptional

This record mixes covered + billable shares. When true, billing invoices only `billableMinutes - coveredMinutes` (ADR 0932 — in every document path, not just the tiles). Two origins: (a) the contingent ran out mid-booking, so the covered part is the remaining balance rounded up to the booking grid and the overhang is billed (ADR 0358/0932) — still produced today; (b) historically, a reference linked several assets and coverage was split across them (ADR 0164) — NO LONGER produced since ADR 0948, which decides per booking all-or-nothing. Existing (b) records keep their value and keep billing net; nothing is backfilled.

nullable
coveredMinutesnumberoptional

Sum of per-asset share minutes resolving to INCLUDED/CONTINGENT coverage. Subtracted from billable minutes for coveragePartial records so covered work is not double-charged (`partialCoveredMinutes()`, ADR 0932).

nullable
coverageAllocationsobject[]optional

Per-asset coverage split snapshot when a reference links multiple assets (ADR 0164). Display/audit only — the actual contingent deduction lives in contingent_ledger / contingent_usages.

nullable
assetIdstringoptional
nullable
contractIdstringoptional
nullable
contingentIdstringoptional
nullable
billingModestringerforderlich
INCLUDEDCONTINGENTCONTRACT_RATEBILLABLE
shareMinutesnumbererforderlich
consumedAmountstringoptional
Patternread-onlynullable
unitstringoptional
nullable
overageBlockedbooleanoptional
nullable
sourceTypestringoptional

Origin entity type this time record was booked from. CALENDAR_EVENT marks records booked off a calendar appointment via "Zeit buchen" — the source event is then hidden in the calendar (the time record renders in its place). MESSAGE (ADR 0779) marks a record booked off a sent mail; the CRUD hook writes `messages.bookedAsTimeRecordId` back, like it does for PHONE_CALL/REMOTE_SESSION.

PHONE_CALLREMOTE_SESSIONCALENDAR_EVENTMESSAGEnull
nullable
sourceIduuidoptional

Origin entity ID this time record was booked from

nullable
sourceOccurrenceDatedateoptional

Local calendar day (YYYY-MM-DD) of the booked OCCURRENCE when `sourceId` points to a recurring calendar_event series (RFC 5545 RECURRENCE-ID, day granularity). A series is one document, so `sourceId` alone cannot tell which occurrence was booked. Readers fall back to `date` when absent (records booked before the field existed) — see ADR 0957.

nullable
billableTypestringoptional

Billability classification

FULLNONEPARTIAL
Default: "FULL"
billablebooleanoptional

Derived: true when billableType !== NONE

Default: true
billableAmountintegeroptional

Billable minutes when billableType is PARTIAL

≥ 0nullable
billablePercentnumberoptional

Billable percentage when billableType is PARTIAL

0 – 100nullable
billableMinutesintegeroptional

Computed billable minutes (after rounding and inclusive deduction)

≥ 0Default: 0
nonBillableMinutesintegeroptional

Non-billable minutes

≥ 0Default: 0
nonBillableReasonstringoptional

Reason why time is not billable

max 500 Zeichennullable
nonBillableReasonIduuidoptional

Id of the picked non_billable_reason — the display text itself stays in nonBillableReason

nullable
ratePerHourstringoptional

Hourly rate in EUR as decimal string

Patternnullable
appliedRatePerHourstringoptional

Snapshot of the hourly rate that was effective when this time record was created. Read-only after insert (ADR 0139 — Snapshot-Pattern analog ADR 0128a). Sourced from serviceType.billing.pricing[] or articlePrices[] depending on priceSource.

Patternread-onlynullable
appliedRateSourcestringoptional

Provenance of the frozen base rate (ADR 0415): contract = contract.conditions.serviceRates / CONTRACT_RATE, party_override / party_discount = customer conditions (party.serviceTypeOverrides), article = article.articlePrices, service_type = tenant-wide mask price. Server-set alongside appliedRatePerHour; billing uses it to decide whether a BILLING_DATE re-resolve may replace the frozen rate (a contract-driven rate never is). Null on legacy records (treated conservatively: frozen rate kept).

contractparty_overrideparty_discountarticleservice_typenull
read-onlynullable
consumedAmountstringoptional

Snapshot of billable amount = durationMinutes/60 * appliedRatePerHour, computed once on insert. Drives task.consumedAmount aggregation for limitMode=amount tasks (ADR 0139).

Patternread-onlynullable
weclappTimeRecordIdstringoptional

Linked weclapp time-record ID after successful push

read-onlynullable
weclappSyncStatestringoptional

Sync state of this time-record against weclapp. `deferred` (ADR 0634) = die Buchung gehört zu einem Projekt im Positionsersatz-Modus; sie wird bewusst NICHT einzeln nach weclapp geschrieben, sondern beim Abrechnungsabschluss gesammelt als Auftragsposition gerendert.

pendingsyncederrordeferrednull
read-onlynullable
weclappLastSyncedAtdatetimeoptional

Last successful weclapp push timestamp

read-onlynullable
weclappLastSyncErrorstringoptional

Last weclapp push error message

max 1000 Zeichenread-onlynullable
weclappBatchTransferredAtdatetimeoptional

ADR 0634 — wann diese Buchung als Teil der gesammelten Buchungspositionen in den weclapp-Auftrag übertragen wurde (Positionsersatz-Modus). Null = noch nicht übertragen (`deferred`). Adresse der Position ist NICHT hier, sondern projektweit in project.weclappBillingItemIds: bei Gruppierung pro Ticket / eine Position speisen mehrere Buchungen dieselbe Auftragsposition, ein Rückzug einzelner Buchungen ist deshalb gar nicht adressierbar.

read-onlynullable
weclappOrderItemIdstringoptional

weclapp salesOrderItem id of the TIME position appended to the sales order for this booking (non-service-position time, ADR 0412). Dedupe key for retries and the removal address when the approval is revoked.

max 200 Zeichenread-onlynullable
weclappTravelOrderItemIdsstring[]optional

weclapp salesOrderItem ids of the TRAVEL positions appended to the sales order for this booking (ADR 0412).

read-onlynullable
isFlatRatebooleanoptional

Whether this is a flat-rate billing entry

Default: false
flatRateAmountstringoptional

Flat rate amount in EUR as decimal string

Patternnullable
assignmentTypestringoptional

Assignment target type

CUSTOMEREMPLOYEEASSETORG_UNITnull
nullable
assignmentIduuidoptional

Assignment target UUID

nullable
orgUnitIduuidoptional

Associated org unit (department/team) UUID

nullable
costCenterIduuidoptional

Associated cost center UUID

nullable
sourcestringoptional

Herkunftsmarker (z. B. TANSS). Entspricht der Wert einem `externalMaster`-Provider, ist der Datensatz ein read-only Spiegel (ADR 0377) und nur vom Sync pflegbar; Bearbeitungsversuche scheitern mit 423. Der Guard wirkt pro Dokument — lokal erfasste Zeitbuchungen tragen kein `source` und bleiben normal bearbeitbar.

max 50 ZeichenDefault: nullnullable
sourceRefobjectoptional

Referenz auf das Quellsystem, aus dem dieser Datensatz importiert wurde

Default: nullnullable
systemstringerforderlich

Quellsystem (z. B. tanss)

idstringerforderlich

ID im Quellsystem

externalOwnershipstringoptional

Übernahme einer TANSS-Buchung in die Codemeta-Abrechnung (ADR 0432, für Zeitbuchungen ADR 0911). `"LOCAL"` hebt den Ausschluss über `NOT_EXTERNALLY_BILLED` auf und lässt den TANSS-Sync die Buchung überspringen; `source`/`sourceRef` bleiben als Herkunft stehen. Fehlt das Feld (Altbestand), gilt die Buchung als fremd abgerechnet — kein Backfill nötig. Nur über POST /time-records/:id/reopen-tanss setzbar (in `protectedFields`).

LOCALnull
Default: nullread-onlynullable
externalOwnershipTakenAtdatetimeoptional

Zeitpunkt der Übernahme (ADR 0432 / ADR 0911).

Default: nullread-onlynullable
externalOwnershipTakenBystringoptional

Interne User-Id, die die Übernahme ausgelöst hat (ADR 0432 / ADR 0911).

Default: nullread-onlynullable
externalOwnershipTagstringoptional

Tag, der bei der Übernahme im Fremdsystem gesetzt wurde. Beim Wiederöffnen einer TANSS-Buchung (ADR 0911) immer `null`: in TANSS ist die Leistung bereits verbucht, dort wird nichts markiert.

Default: nullread-onlynullable
tanssReopenedAtdatetimeoptional

Zeitpunkt, zu dem die aus TANSS als „Fakturiert" importierte Buchung wieder geöffnet wurde (ADR 0911). Nur über POST /time-records/:id/reopen-tanss setzbar.

Default: nullread-onlynullable
tanssReopenedBystringoptional

Interne User-Id, die die Buchung wieder geöffnet hat (ADR 0911).

Default: nullread-onlynullable
tanssReopenReasonstringoptional

Pflicht-Begründung für das Wiederöffnen (ADR 0911). Wird im Bearbeiten-Dialog angezeigt und steht zusätzlich in den Metadaten des History-Eintrags.

max 1000 ZeichenDefault: nullread-onlynullable
statusstringoptional

Unified lifecycle status: DRAFT → SUBMITTED → APPROVED → RECORDED → INVOICED. Branches: REJECTED, CREDITED.

DRAFTSUBMITTEDAPPROVEDREJECTEDRECORDEDINVOICEDCREDITED
Default: "DRAFT"
approvedByIduuidoptional

User who approved this entry

nullable
approvedAtdatetimeoptional

Timestamp when approved (ISO datetime)

nullable
rejectionReasonstringoptional

Reason for rejection if status is REJECTED

max 500 Zeichennullable
budgetHoldbooleanoptional

Parked over-limit draft (ADR 0223): this entry was recorded against a ticket whose budget cap (Obergrenze) is already reached. It stays a permanent DRAFT, is EXCLUDED from budget.consumedMinutes and from billing, and blocks the ticket from being closed until the cap is raised (which auto-converts it back to a normal draft) or it is deleted. Distinct from a regular status:'DRAFT'.

Default: falseread-only
budgetHoldReasonstringoptional

Why more time than the ticket budget allows was needed (ADR 0886). Captured from the technician in the "Trotzdem speichern" dialog and carried into the budget-increase approval request, where it is the only context the approving lead gets. Set on create through the budget branch; never client-writable afterwards.

max 1000 Zeichenread-onlynullable
budgetHoldEstimatedRemainingMinutesnumberoptional

Technician estimate of how much MORE time the ticket still needs beyond this entry (ADR 0886, minutes). Informational only — the approval request asks for the held minutes, not this estimate — but it tells the lead whether a minimal increase will do. Set on create through the budget branch; never client-writable afterwards.

≥ 0read-onlynullable
serviceBlockHoldbooleanoptional

Parked because of a customer service block (Leistungssperre, ADR 0815). Set server-side on create when the booked party is service-blocked and the referenced ticket has no exemption. The entry stays status DRAFT (never billed, still counts as booked for the daily closing) until it is released — by a user holding party_block who is not the booking user, or automatically when the ticket gets an exemption, moves to an unblocked customer, or the manual block is lifted. Never client-writable.

Default: falseread-only
serviceBlockHoldReasonstringoptional

Block reason captured when the entry was parked (ADR 0815). Server-set.

max 1000 Zeichenread-onlynullable
serviceBlockReleasedAtstringoptional

When the service-block hold was released (ISO datetime, ADR 0815). Server-set.

read-onlynullable
serviceBlockReleasedBystringoptional

Internal users._id of whoever released the hold — for an automatic release the user whose change triggered it (ticket exemption, ticket moved, block lifted); the trigger itself is in the history metadata (ADR 0815). Server-set.

read-onlynullable
isUnclearbooleanoptional

Employee flagged this entry as unclear/needing clarification at recording time (e.g. unsure how to bill it, missing context). Surfaced to the team lead in the draft overview so it can be resolved before approval. Client-editable by the recorder.

Default: false
unclearNotestringoptional

Optional note describing what is unclear about this entry (set alongside isUnclear).

max 500 Zeichennullable
consultationTaskIdsuuid[]optional

Task UUIDs of Rücksprache (consultation) tasks raised for this entry. Owned by the request-consultation endpoint — never client-editable.

Default: []read-onlynullable
performanceRecordIduuidoptional

Leistungsnachweis this record was booked onto (set when status becomes RECORDED, cleared when the Leistungsnachweis is deleted)

read-onlynullable
invoiceIduuidoptional

Invoice this record was billed on (set when status becomes INVOICED, cleared when the invoice attempt is rolled back)

read-onlynullable
closedWithoutInvoicebooleanoptional

ADR 0929 — `true` while the Leistungsnachweis this record is booked onto (status RECORDED, `performanceRecordId`) is closed without an invoice. Such a booking is settled, not "nicht fakturiert": the customer draft overview skips it, and its drilldown sends `closedWithoutInvoice__ne=true`. Set only by POST /performance-records/:id/close-without-invoice; removed by …/reopen and by the billing-link revert when the Leistungsnachweis is deleted. Absent otherwise (no backfill). Server-owned (`protectedFields`).

read-only
isOvertimebooleanoptional

Whether this time entry is overtime (outside regular hours)

Default: false
isWeekendbooleanoptional

Whether this time entry was performed on a weekend or public holiday

Default: false
isEmergencyServicebooleanoptional

Whether this time entry was emergency/on-call service

Default: false
overtimeReasonstringoptional

Reason explaining why overtime/weekend/emergency service was necessary

max 500 Zeichennullable
overtimeScopeobjectoptional

Which parts of a booking flagged as overtime/weekend/emergency are requested: `travelBefore` = outbound leg (placed directly before the start), `service` = the service itself, `travelAfter` = return leg (placed directly after the end). The leg minutes come from `travels` (`travelLegMinutes`). Missing/null = service only, the behaviour before travel became requestable — no backfill.

nullable
travelBeforebooleanoptional
Default: false
servicebooleanoptional
Default: true
travelAfterbooleanoptional
Default: false
flatRateServiceIduuidoptional

Reference to a flat rate service (Pauschalleistung)

nullable
appliedSurchargesobject[]optional

Surcharges applied to this time record

Default: []
surchargeIdstringerforderlich

Reference to the surcharge definition ID

namestringerforderlich

Surcharge name at time of application

max 100 Zeichen
percentChangenumbererforderlich

Percentage change applied

autoAppliedbooleanoptional

Whether this surcharge was auto-applied based on time rules

Default: false
appliedMinutesintegeroptional

Minutes of this booking the surcharge actually covers (ADR 0431). Absent on records booked before the minute-accurate split, and on records resolved without clock times (only all-day rules could apply, so there is no minute share to report).

≥ 0nullable
surchargeSegmentationobjectoptional

Minute-accurate surcharge split of this booking (ADR 0431) — the breakdown behind the blended `ratePerHour`.

read-onlynullable
basisstringerforderlich

MINUTE = split from real clock times. DAY = the booking had no start/end, so only all-day rules were evaluated and `segments` is empty.

MINUTEDAY
stackingModestringerforderlich

Stacking mode in force at booking time, frozen — the contract/service-type setting can change later.

ADDITIVEMAX
effectiveFactornumbererforderlich

Minute-weighted multiplier on the base rate. `ratePerHour` = base × this, rounded to 2 decimals.

≥ 0
segmentsobject[]optional
Default: []
datedateerforderlich
fromTimestringerforderlich

Local wall-clock start. "24:00" marks end-of-day.

Pattern
toTimestringerforderlich
Pattern
minutesintegererforderlich
≥ 1
surchargeIdsstring[]optional

Surcharges covering this segment. Empty = base rate.

Default: []
percentTotalnumberoptional

Percent applied after stacking (not necessarily the sum of all hits).

ratePerHourstringerforderlich

This segment's own hourly rate, frozen. Stored rather than recomputed from base × factor: the base rate may change, and an amount already shown to a customer must not move retroactively (same freeze rule as `ratePerHour`, ADR 0139/0163). NOTE: summing minutes × these rates can differ from the invoiced amount by cents — the invoice bills `billableMinutes × ratePerHour` (the blended rate), and these are the breakdown shown alongside it.

Pattern
tripIdsuuid[]optional

References to trip entities linked to this time record

Default: []
travelsobject[]optional

All trips of this booking (supersedes the single `travel`)

Default: []
modestringerforderlich

Mode of transportation

CARPUBLIC_TRANSPORTFLIGHTTAXIBIKEWALK
distanceKmnumbererforderlich

Distance in kilometers

≥ 0
durationMinutesintegererforderlich

Travel duration in minutes

≥ 0
isRoundTripbooleanerforderlich

If true, distanceKm is one-way and will be doubled for billing

Default: false
distanceBillablebooleanerforderlich

Whether distance/mileage is billable

Default: true
timeBillablebooleanerforderlich

Whether travel time is billable

Default: true
ratePerKmstringoptional

Rate per kilometer in EUR as decimal string

Patternnullable
timeBillingModestringoptional

How travel time is billed when timeBillable=true

HOURLYFLAT_RATEnull
nullable
timeRatePerHourstringoptional

Hourly rate for travel time in EUR (when timeBillingMode=HOURLY)

Patternnullable
timeFlatRateAmountstringoptional

Flat-rate amount for travel time in EUR (when timeBillingMode=FLAT_RATE)

Patternnullable
parkingCoststringoptional

Parking costs in EUR as decimal string

Patternnullable
tollCoststringoptional

Toll costs in EUR as decimal string

Patternnullable
startLocationstringoptional

Start location (free text)

max 200 Zeichennullable
endLocationstringoptional

End location (free text)

max 200 Zeichennullable
vehicleInfostringoptional

Vehicle information (license plate, description)

max 100 Zeichennullable
vehicleIduuidoptional

Selected fleet vehicle UUID (source of `vehicleInfo`)

nullable
billingModestringoptional

How the distance is billed: per kilometer or as a flat rate

DISTANCE_BASEDFLAT_RATEnull
nullable
travelAllowanceIduuidoptional

Selected travel-allowance band UUID (when billingMode=FLAT_RATE)

nullable
flatRateAmountstringoptional

Flat-rate travel amount in EUR (when billingMode=FLAT_RATE)

Patternnullable
travelobjectoptional

Legacy single trip — read-only fallback, superseded by `travels`

nullable
modestringerforderlich

Mode of transportation

CARPUBLIC_TRANSPORTFLIGHTTAXIBIKEWALK
distanceKmnumbererforderlich

Distance in kilometers

≥ 0
durationMinutesintegererforderlich

Travel duration in minutes

≥ 0
isRoundTripbooleanerforderlich

If true, distanceKm is one-way and will be doubled for billing

Default: false
distanceBillablebooleanerforderlich

Whether distance/mileage is billable

Default: true
timeBillablebooleanerforderlich

Whether travel time is billable

Default: true
ratePerKmstringoptional

Rate per kilometer in EUR as decimal string

Patternnullable
timeBillingModestringoptional

How travel time is billed when timeBillable=true

HOURLYFLAT_RATEnull
nullable
timeRatePerHourstringoptional

Hourly rate for travel time in EUR (when timeBillingMode=HOURLY)

Patternnullable
timeFlatRateAmountstringoptional

Flat-rate amount for travel time in EUR (when timeBillingMode=FLAT_RATE)

Patternnullable
parkingCoststringoptional

Parking costs in EUR as decimal string

Patternnullable
tollCoststringoptional

Toll costs in EUR as decimal string

Patternnullable
startLocationstringoptional

Start location (free text)

max 200 Zeichennullable
endLocationstringoptional

End location (free text)

max 200 Zeichennullable
vehicleInfostringoptional

Vehicle information (license plate, description)

max 100 Zeichennullable
vehicleIduuidoptional

Selected fleet vehicle UUID (source of `vehicleInfo`)

nullable
billingModestringoptional

How the distance is billed: per kilometer or as a flat rate

DISTANCE_BASEDFLAT_RATEnull
nullable
travelAllowanceIduuidoptional

Selected travel-allowance band UUID (when billingMode=FLAT_RATE)

nullable
flatRateAmountstringoptional

Flat-rate travel amount in EUR (when billingMode=FLAT_RATE)

Patternnullable
tagsstring[]optional

Time entry tags

Default: []

Standard-Endpoints

Diese Resource folgt dem generischen CRUD-Vertrag der Plattform. Lesen Sie die Konventionen für Pagination, Idempotenz, Optimistic Locking und Audit. Die wichtigsten Endpoints:

  • GET /api/v1/time_records — Liste, paginiert + filterbar
  • GET /api/v1/time_records/<id> — Einzelne Entity
  • POST /api/v1/time_records — Anlegen
  • PATCH /api/v1/time_records/<id> — Teil-Update
  • DELETE /api/v1/time_records/<id> — Soft-Delete
  • GET /api/v1/time_records/<id>/timeline — Audit + Aktivitäten

Suche