Bleno REST-API

Binden Sie Website-Formulare, Anfrageportale, Stempeluhren oder Ihre eigene Software an Bleno an: Kunden, Projekte und Leads anlegen, Angebote und Rechnungen abrufen, Zeiteinträge übertragen.

Version 1.0.0

Authentifizierung

REST-API für Kunden, Projekte, Leads, Angebote/Rechnungen und Zeiteinträge eines Bleno-Betriebs.

Authentifizierung per API-Schlüssel (Authorization: Bearer bleno_…). Jeder Schlüssel trägt Scopes je Ressource (read/write); ein fehlender Scope ergibt 403.

Rate-Limit: 60 Aufrufe je Schlüssel und 60 Sekunden, darüber 429 mit Retry-After.

Einen Schlüssel legen Administratoren unter Einstellungen → API-Schlüssel an und wählen dort die Scopes. Der Schlüssel wird nur einmal angezeigt. Daten anderer Betriebe sind nie erreichbar: IDs eines anderen Betriebs ergeben 404 wie unbekannte, als Filter eine leere Liste.

Die maschinenlesbare Beschreibung für Code-Generatoren und API-Werkzeuge: OpenAPI-Spezifikation (JSON)

curl https://bleno.de/api/v1/customers \
  -H "Authorization: Bearer bleno_…"
Scopes
BereichLesenSchreiben
Kundencustomers:readcustomers:write
Projekteprojects:readprojects:write
Leadsleads:readleads:write
Dokumentedocuments:readdocuments:write
Zeiteinträgetime_entries:readtime_entries:write

Kunden

Kunden des Betriebs lesen, anlegen und ändern.

GET/api/v1/customers

Kunden auflisten

Seitenweise, archivierte Kunden nur mit include_archived=true.

Benötigter Scope: customers:read.

Scope: customers:read

Parameter
FeldTypPflichtHinweise
limit(Query)integerneinStandard: 50 · min. 1 · max. 100
offset(Query)integerneinStandard: 0 · min. 0
include_archived(Query)"true" | "false"neinStandard: "false"

Antworten

  • 200 Kundenliste.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
dataobject[]ja
data[].idstring (uuid)ja
data[].customer_numberstring | nullja
data[].customer_type"company" | "private"ja
data[].salutation"herr" | "frau" | nullja
data[].company_namestring | nullja
data[].first_namestring | nullja
data[].last_namestring | nullja
data[].display_namestringja
data[].emailstring | nullja
data[].phonestring | nullja
data[].mobile_phonestring | nullja
data[].faxstring | nullja
data[].address_streetstring | nullja
data[].address_zipstring | nullja
data[].address_citystring | nullja
data[].tax_idstring | nullja
data[].notesstring | nullja
data[].is_archivedbooleanja
data[].created_atstringja
data[].updated_atstring | nullja
paginationobjectja
pagination.limitintegerja
pagination.offsetintegerja
pagination.totalintegerja
POST/api/v1/customers

Kunden anlegen

Ohne customer_type gilt: mit Firmenname eine Firma, sonst eine Privatperson. Pflichtfelder wie im Kundenformular.

Benötigter Scope: customers:write.

Scope: customers:write

Anfrage (JSON)
FeldTypPflichtHinweise
customer_type"company" | "private"nein
salutation"herr" | "frau" | nullnein
company_namestring | nullneinhöchstens 200 Zeichen
first_namestring | nullneinhöchstens 100 Zeichen
last_namestring | nullneinhöchstens 100 Zeichen
emailstring (email) | "" | beliebig | nullnein
customer_numberstring | nullneinhöchstens 50 Zeichen
phonestring | nullneinhöchstens 50 Zeichen
mobile_phonestring | nullneinhöchstens 50 Zeichen
faxstring | nullneinhöchstens 50 Zeichen
address_streetstring | nullneinhöchstens 200 Zeichen
address_zipstring | nullneinhöchstens 20 Zeichen
address_citystring | nullneinhöchstens 100 Zeichen
tax_idstring | nullneinhöchstens 50 Zeichen
notesstring | nullneinhöchstens 5000 Zeichen

Antworten

  • 201 Kunde angelegt.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 409 Konflikt, z. B. doppelte Kunden- oder Projektnummer oder ein bereits abgerechneter Zeiteintrag.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 201
FeldTypPflichtHinweise
dataobjectja
data.idstring (uuid)ja
data.customer_numberstring | nullja
data.customer_type"company" | "private"ja
data.salutation"herr" | "frau" | nullja
data.company_namestring | nullja
data.first_namestring | nullja
data.last_namestring | nullja
data.display_namestringja
data.emailstring | nullja
data.phonestring | nullja
data.mobile_phonestring | nullja
data.faxstring | nullja
data.address_streetstring | nullja
data.address_zipstring | nullja
data.address_citystring | nullja
data.tax_idstring | nullja
data.notesstring | nullja
data.is_archivedbooleanja
data.created_atstringja
data.updated_atstring | nullja
GET/api/v1/customers/{id}

Kunden abrufen

Benötigter Scope: customers:read.

Scope: customers:read

Parameter
FeldTypPflichtHinweise
id(Pfad)string (uuid)ja

Antworten

  • 200 Kunde.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 404 Nicht gefunden — auch bei IDs eines anderen Betriebs.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
dataobjectja
data.idstring (uuid)ja
data.customer_numberstring | nullja
data.customer_type"company" | "private"ja
data.salutation"herr" | "frau" | nullja
data.company_namestring | nullja
data.first_namestring | nullja
data.last_namestring | nullja
data.display_namestringja
data.emailstring | nullja
data.phonestring | nullja
data.mobile_phonestring | nullja
data.faxstring | nullja
data.address_streetstring | nullja
data.address_zipstring | nullja
data.address_citystring | nullja
data.tax_idstring | nullja
data.notesstring | nullja
data.is_archivedbooleanja
data.created_atstringja
data.updated_atstring | nullja
PATCH/api/v1/customers/{id}

Kunden ändern

Nur übergebene Felder ändern sich; null leert ein Feld.

Benötigter Scope: customers:write.

Scope: customers:write

Parameter
FeldTypPflichtHinweise
id(Pfad)string (uuid)ja
Anfrage (JSON)
FeldTypPflichtHinweise
customer_type"company" | "private"nein
salutation"herr" | "frau" | nullnein
company_namestring | nullneinhöchstens 200 Zeichen
first_namestring | nullneinhöchstens 100 Zeichen
last_namestring | nullneinhöchstens 100 Zeichen
emailstring (email) | "" | beliebig | nullnein
customer_numberstring | nullneinhöchstens 50 Zeichen
phonestring | nullneinhöchstens 50 Zeichen
mobile_phonestring | nullneinhöchstens 50 Zeichen
faxstring | nullneinhöchstens 50 Zeichen
address_streetstring | nullneinhöchstens 200 Zeichen
address_zipstring | nullneinhöchstens 20 Zeichen
address_citystring | nullneinhöchstens 100 Zeichen
tax_idstring | nullneinhöchstens 50 Zeichen
notesstring | nullneinhöchstens 5000 Zeichen

Antworten

  • 200 Geänderter Kunde.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 404 Nicht gefunden — auch bei IDs eines anderen Betriebs.
  • 409 Konflikt, z. B. doppelte Kunden- oder Projektnummer oder ein bereits abgerechneter Zeiteintrag.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
dataobjectja
data.idstring (uuid)ja
data.customer_numberstring | nullja
data.customer_type"company" | "private"ja
data.salutation"herr" | "frau" | nullja
data.company_namestring | nullja
data.first_namestring | nullja
data.last_namestring | nullja
data.display_namestringja
data.emailstring | nullja
data.phonestring | nullja
data.mobile_phonestring | nullja
data.faxstring | nullja
data.address_streetstring | nullja
data.address_zipstring | nullja
data.address_citystring | nullja
data.tax_idstring | nullja
data.notesstring | nullja
data.is_archivedbooleanja
data.created_atstringja
data.updated_atstring | nullja

Projekte

Projekte lesen und anlegen.

GET/api/v1/projects

Projekte auflisten

Alle nicht archivierten Projekte mit Kunde und Status, nach Name sortiert.

Benötigter Scope: projects:read.

Scope: projects:read

Antworten

  • 200 Projektliste.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
projectsobject[]ja
projects[].idstring (uuid)ja
projects[].namestringja
projects[].status"planned" | "ready_for_work" | "in_progress" | "completed" | "cancelled" | "on_hold"ja
projects[].customerobject | nullja
projects[].customer.idstring (uuid)ja
projects[].customer.namestringja
POST/api/v1/projects

Projekt anlegen

Nutzt der Betrieb automatische Projektnummern, vergibt Bleno die nächste Nummer, wenn keine übergeben wird.

Benötigter Scope: projects:write.

Scope: projects:write

Anfrage (JSON)
FeldTypPflichtHinweise
namestringjamind. 1 Zeichen · höchstens 200 Zeichen
customer_idstring (uuid)ja
descriptionstring | nullneinhöchstens 5000 Zeichen
status"planned" | "ready_for_work" | "in_progress" | "completed" | "cancelled" | "on_hold"nein
project_type"fixed_fee" | "time_and_materials" | "non_billable"nein
project_numberstring | nullneinhöchstens 60 Zeichen
start_datestring | nullneinMuster ^\d{4}-\d{2}-\d{2}$
end_datestring | nullneinMuster ^\d{4}-\d{2}-\d{2}$
address_streetstring | nullneinhöchstens 200 Zeichen
address_zipstring | nullneinhöchstens 20 Zeichen
address_citystring | nullneinhöchstens 100 Zeichen

Antworten

  • 201 Projekt angelegt.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 404 Nicht gefunden — auch bei IDs eines anderen Betriebs.
  • 409 Konflikt, z. B. doppelte Kunden- oder Projektnummer oder ein bereits abgerechneter Zeiteintrag.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 201
FeldTypPflichtHinweise
dataobjectja
data.idstring (uuid)ja
data.namestringja
data.project_numberstring | nullja
data.status"planned" | "ready_for_work" | "in_progress" | "completed" | "cancelled" | "on_hold"ja
data.project_type"fixed_fee" | "time_and_materials" | "non_billable" | nullja
data.customer_idstring (uuid)ja
data.descriptionstring | nullja
data.start_datestring | nullja
data.end_datestring | nullja
data.address_streetstring | nullja
data.address_zipstring | nullja
data.address_citystring | nullja
data.created_atstringja

Leads

Anfragen aus Website-Formularen und Portalen anlegen.

POST/api/v1/leads

Anfrage anlegen

Für Website-Formulare und Anfrageportale. Neue Anfragen starten mit Status new und Herkunft website.

Benötigter Scope: leads:write.

Scope: leads:write

Anfrage (JSON)
FeldTypPflichtHinweise
namestringjamind. 1 Zeichen · höchstens 200 Zeichen
emailstring (email) | "" | beliebig | nullnein
phonestring | nullneinhöchstens 50 Zeichen
notesstring | nullneinhöchstens 5000 Zeichen
customer_idstring (uuid) | nullnein
external_referencestring | nullneinhöchstens 200 Zeichen

Antworten

  • 201 Anfrage angelegt.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 404 Nicht gefunden — auch bei IDs eines anderen Betriebs.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 201
FeldTypPflichtHinweise
dataobjectja
data.idstring (uuid)ja
data.namestringja
data.emailstring | nullja
data.phonestring | nullja
data.notesstring | nullja
data.status"new" | "contacted" | "quote_sent" | "won" | "lost"ja
data.source"whatsapp" | "voice" | "test" | "website" | nullja
data.customer_idstring (uuid) | nullja
data.project_idstring (uuid) | nullja
data.external_referencestring | nullja
data.created_atstringja

Dokumente

Angebote und Rechnungen mit Status, Beträgen und PDF-Link lesen.

GET/api/v1/documents

Angebote und Rechnungen auflisten

Filterbar nach Typ, Status, Kunde und Projekt. Die Liste enthält keine PDF-Links.

Benötigter Scope: documents:read.

Scope: documents:read

Parameter
FeldTypPflichtHinweise
limit(Query)integerneinStandard: 50 · min. 1 · max. 100
offset(Query)integerneinStandard: 0 · min. 0
type(Query)"quote" | "invoice"nein
status(Query)"draft" | "published" | "sent" | "accepted" | "rejected" | "lost" | "partially_paid" | "paid" | "cancelled"nein
customer_id(Query)string (uuid)nein
project_id(Query)string (uuid)nein

Antworten

  • 200 Belegliste.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
dataobject[]ja
data[].idstring (uuid)ja
data[].numberstring | nullja
data[].type"quote" | "invoice"ja
data[].invoice_kind"partial" | "final" | nullja
data[].status"draft" | "published" | "sent" | "accepted" | "rejected" | "lost" | "partially_paid" | "paid" | "cancelled"ja
data[].datestring | nullja
data[].due_datestring | nullja
data[].currencystringja
data[].net_amountnumber | nullja
data[].tax_ratenumber | nullja
data[].tax_amountnumber | nullja
data[].gross_amountnumber | nullja
data[].customer_idstring (uuid) | nullja
data[].project_idstring (uuid) | nullja
data[].has_pdfbooleanja
data[].created_atstringja
data[].updated_atstring | nullja
paginationobjectja
pagination.limitintegerja
pagination.offsetintegerja
pagination.totalintegerja
GET/api/v1/documents/{id}

Angebot oder Rechnung abrufen

Mit PDF-Link: befristet, und beim Öffnen fragt Bleno die Postleitzahl des Kunden ab.

Benötigter Scope: documents:read.

Scope: documents:read

Parameter
FeldTypPflichtHinweise
id(Pfad)string (uuid)ja

Antworten

  • 200 Beleg.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 404 Nicht gefunden — auch bei IDs eines anderen Betriebs.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
dataobjectja
data.idstring (uuid)ja
data.numberstring | nullja
data.type"quote" | "invoice"ja
data.invoice_kind"partial" | "final" | nullja
data.status"draft" | "published" | "sent" | "accepted" | "rejected" | "lost" | "partially_paid" | "paid" | "cancelled"ja
data.datestring | nullja
data.due_datestring | nullja
data.currencystringja
data.net_amountnumber | nullja
data.tax_ratenumber | nullja
data.tax_amountnumber | nullja
data.gross_amountnumber | nullja
data.customer_idstring (uuid) | nullja
data.project_idstring (uuid) | nullja
data.has_pdfbooleanja
data.created_atstringja
data.updated_atstring | nullja
data.pdfobject | nullja
data.pdf.urlstring (uri)ja
data.pdf.expires_atstringja
data.pdf.requires_postal_codetrueja

Zeiteinträge

Zeiteinträge lesen und aus Terminals oder Fremdsystemen übertragen.

GET/api/v1/time-entries

Zeiteinträge auflisten

Einträge im Zeitraum from bis to, optional für einen Mitarbeitenden.

Benötigter Scope: time_entries:read.

Scope: time_entries:read

Parameter
FeldTypPflichtHinweise
from(Query)stringjaMuster ^\d{4}-\d{2}-\d{2}$
to(Query)stringjaMuster ^\d{4}-\d{2}-\d{2}$
user_id(Query)string (uuid)nein
limit(Query)integerneinWerte über 500 werden auf 500 gekappt. · Standard: 200 · min. 1 · max. 500
offset(Query)integerneinStandard: 0 · min. 0

Antworten

  • 200 Zeiteinträge.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
entriesobject[]ja
entries[].idstring (uuid)ja
entries[].user_idstring (uuid)ja
entries[].project_idstring (uuid)ja
entries[].datestringja
entries[].start_timestring | nullja
entries[].end_timestring | nullja
entries[].break_minutesintegerja
entries[].duration_minutesintegerja
entries[].work_type"arbeiten" | "laden" | "fahren" | "pause"ja
entries[].descriptionstring | nullja
entries[].is_billableboolean | nullja
entries[].status"pending" | "approved" | "rejected" | "invoiced"ja
entries[].external_sourcestring | nullja
entries[].external_idstring | nullja
entries[].projectobject | nullja
entries[].project.idstring (uuid)ja
entries[].project.namestringja
has_morebooleanja
POST/api/v1/time-entries

Zeiteintrag übertragen

Entweder duration_minutes oder start_time und end_time. Mit external_source und external_id aktualisiert ein erneuter Aufruf denselben Eintrag, statt einen zweiten anzulegen. Die Freigabe regelt der Betrieb.

Benötigter Scope: time_entries:write.

Scope: time_entries:write

Anfrage (JSON)
FeldTypPflichtHinweise
user_idstring (uuid)ja
project_idstring (uuid)ja
datestringjaMuster ^\d{4}-\d{2}-\d{2}$
work_type"arbeiten" | "laden" | "fahren" | "pause"neinStandard: "arbeiten"
start_timestringneinMuster ^\d{1,2}:\d{2}$
end_timestringneinMuster ^\d{1,2}:\d{2}$
break_minutesnumberneinmin. 0
duration_minutesnumberneinmin. 0 · max. 1440
descriptionstringnein
is_billablebooleannein
external_sourcestringnein
external_idstringnein

Antworten

  • 200 Bestehender Eintrag derselben Herkunft aktualisiert.
  • 201 Zeiteintrag angelegt (`created`); bei bekannter Herkunft 200 mit `updated`.
  • 400 Ungültige Eingabe.
  • 401 API-Schlüssel fehlt, ist unbekannt oder widerrufen. Leerer Rumpf.
  • 403 Dem Schlüssel fehlt der benötigte Scope.
  • 404 Nicht gefunden — auch bei IDs eines anderen Betriebs.
  • 409 Konflikt, z. B. doppelte Kunden- oder Projektnummer oder ein bereits abgerechneter Zeiteintrag.
  • 429 Zu viele Anfragen für diesen Schlüssel.
  • 500 Interner Fehler.
Antwort 200
FeldTypPflichtHinweise
action"created" | "updated"ja
idstring (uuid)ja
Antwort 201
FeldTypPflichtHinweise
action"created" | "updated"ja
idstring (uuid)ja

Datenmodelle

Error

Felder
FeldTypPflichtHinweise
errorstringja

ValidationError

Felder
FeldTypPflichtHinweise
errorstringja
fieldsobjectja

Customer

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
customer_numberstring | nullja
customer_type"company" | "private"ja
salutation"herr" | "frau" | nullja
company_namestring | nullja
first_namestring | nullja
last_namestring | nullja
display_namestringja
emailstring | nullja
phonestring | nullja
mobile_phonestring | nullja
faxstring | nullja
address_streetstring | nullja
address_zipstring | nullja
address_citystring | nullja
tax_idstring | nullja
notesstring | nullja
is_archivedbooleanja
created_atstringja
updated_atstring | nullja

Project

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
namestringja
project_numberstring | nullja
status"planned" | "ready_for_work" | "in_progress" | "completed" | "cancelled" | "on_hold"ja
project_type"fixed_fee" | "time_and_materials" | "non_billable" | nullja
customer_idstring (uuid)ja
descriptionstring | nullja
start_datestring | nullja
end_datestring | nullja
address_streetstring | nullja
address_zipstring | nullja
address_citystring | nullja
created_atstringja

ProjectListItem

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
namestringja
status"planned" | "ready_for_work" | "in_progress" | "completed" | "cancelled" | "on_hold"ja
customerobject | nullja
customer.idstring (uuid)ja
customer.namestringja

Lead

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
namestringja
emailstring | nullja
phonestring | nullja
notesstring | nullja
status"new" | "contacted" | "quote_sent" | "won" | "lost"ja
source"whatsapp" | "voice" | "test" | "website" | nullja
customer_idstring (uuid) | nullja
project_idstring (uuid) | nullja
external_referencestring | nullja
created_atstringja

Document

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
numberstring | nullja
type"quote" | "invoice"ja
invoice_kind"partial" | "final" | nullja
status"draft" | "published" | "sent" | "accepted" | "rejected" | "lost" | "partially_paid" | "paid" | "cancelled"ja
datestring | nullja
due_datestring | nullja
currencystringja
net_amountnumber | nullja
tax_ratenumber | nullja
tax_amountnumber | nullja
gross_amountnumber | nullja
customer_idstring (uuid) | nullja
project_idstring (uuid) | nullja
has_pdfbooleanja
created_atstringja
updated_atstring | nullja

DocumentDetail

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
numberstring | nullja
type"quote" | "invoice"ja
invoice_kind"partial" | "final" | nullja
status"draft" | "published" | "sent" | "accepted" | "rejected" | "lost" | "partially_paid" | "paid" | "cancelled"ja
datestring | nullja
due_datestring | nullja
currencystringja
net_amountnumber | nullja
tax_ratenumber | nullja
tax_amountnumber | nullja
gross_amountnumber | nullja
customer_idstring (uuid) | nullja
project_idstring (uuid) | nullja
has_pdfbooleanja
created_atstringja
updated_atstring | nullja
pdfobject | nullja
pdf.urlstring (uri)ja
pdf.expires_atstringja
pdf.requires_postal_codetrueja

TimeEntry

Felder
FeldTypPflichtHinweise
idstring (uuid)ja
user_idstring (uuid)ja
project_idstring (uuid)ja
datestringja
start_timestring | nullja
end_timestring | nullja
break_minutesintegerja
duration_minutesintegerja
work_type"arbeiten" | "laden" | "fahren" | "pause"ja
descriptionstring | nullja
is_billableboolean | nullja
status"pending" | "approved" | "rejected" | "invoiced"ja
external_sourcestring | nullja
external_idstring | nullja
projectobject | nullja
project.idstring (uuid)ja
project.namestringja