Timebutler API v2

REST-API für die Timebutler HR-SaaS-Plattform. Wird von Integratoren für Abwesenheits-, Zeiterfassungs-, Vertretungs- und Benutzerprofilprozesse verwendet. Alle Endpunkte außer /oauth2/token erfordern ein Bearer-JWT-Zugriffstoken.

Authentifizierung

OAuth-2.0-Token-Endpunkt. Stellt JWT-Zugriffstoken und rotierende Refresh-Token aus. Dieser Endpunkt ist öffentlich — kein Inhaber-Token erforderlich.

Persönliche Zugangstoken

Als Alternative zum OAuth-2.0-Passwort-Flow können einzelne Benutzer persönliche Zugangstoken anlegen. Die Token sind langlebig, benannt, einzeln widerrufbar und auf einen Benutzer beschränkt — kein Passwort-Sharing und kein Refresh-Token-Wechsel nötig.

Token haben das Präfix tb_ gefolgt von einem undurchsichtigen, URL-sicheren Base64-String. Sie werden im Authorization-Header übergeben, genau wie ein normales Bearer-Token:

curl "https://app.timebutler.com/api/v2/timeentry/pendingcount" \
  -H "Authorization: Bearer tb_a1b2c3d4e5f6..."

Persönliches Token erstellen oder widerrufen →

POST/oauth2/token

Token ausstellen oder erneuern

Unterstützt fünf Grant-Typen: **`grant_type=password`** — Authentifizierung mit `username` und `password`. Bei Erfolg wird ein Zugriffstoken und ein Refresh-Token zurückgegeben. Falls das Konto 2FA aktiviert hat, wird stattdessen eine MFA-Anforderung zurückgegeben (`mfa_required=true`, `mfa_token`, `mfa_expires_in`) — den Ablauf mit `grant_type=mfa_totp` abschließen. **`grant_type=refresh_token`** — Tauscht ein gültiges `refresh_token` gegen ein neues Zugriffstoken aus und rotiert das Refresh-Token (jedes Refresh-Token kann nur einmal verwendet werden). **`grant_type=mfa_totp`** — Zweiter Schritt des 2FA-Ablaufs. Den `mfa_token` aus der Passwort-Grant-Anforderung zusammen mit dem aktuellen `totp_code` aus der Authenticator-App des Benutzers übermitteln. Bei Erfolg werden Zugriffstoken und Refresh-Token zurückgegeben. **`grant_type=sso_id_token`** — Single Sign-On mit einem ID-Token, das die mobile App bereits vom SSO-Anbieter erhalten hat. `provider=google` und das vom Anbieter ausgestellte `id_token` (ein JWT) übermitteln. Timebutler prüft Signatur, Aussteller und Zielgruppe des JWT und gibt für das verknüpfte Timebutler-Konto Zugriffs- und Refresh-Token zurück. **`grant_type=sso_code`** — Single Sign-On mit einem Authorization Code, den die mobile App vom Consent-Screen des SSO-Anbieters erhalten hat. `provider=microsoft` oder `provider=slack`, den `code` vom Anbieter sowie die in der Authorize-Anfrage verwendete `redirect_uri` übermitteln. Bei Microsoft-Public-Client-App-Registrierungen zusätzlich den PKCE-`code_verifier` senden, dessen SHA-256-Hash als `code_challenge` im Authorize-Schritt verwendet wurde. Timebutler tauscht den Code beim Anbieter ein, identifiziert den Benutzer und gibt das Token-Paar zurück. Alle Grant-Typen erfordern außerdem `client_id`. Verwende `client_id=public` zur Authentifizierung ohne Secret, oder übergib `client_id` und `client_secret` für einen registrierten vertraulichen Client.

Anfragekörper
Anfragekörper-Schema:
NameTypDescription
grant_typestringOAuth-2.0-Grant-Typ. Unterstützte Werte: `password`, `refresh_token`, `mfa_totp`, `sso_id_token`, `sso_code`.
usernamestringE-Mail-Adresse des Benutzers. Erforderlich für `grant_type=password`.
passwordstringPasswort des Benutzers. Erforderlich für `grant_type=password`.
refresh_tokenstringRefresh-Token aus einer vorherigen Token-Antwort. Erforderlich für `grant_type=refresh_token`.
client_idstringClient-Bezeichner. Verwende `public` für nicht authentifizierte öffentliche Clients.
client_secretstringClient-Secret. Erforderlich für vertrauliche Clients; weglassen bei `client_id=public`.
mfa_tokenstringMFA-Challenge-Token, das bei einem `password`-Grant zurückgegeben wird, wenn 2FA erforderlich ist. Erforderlich für `grant_type=mfa_totp`.
totp_codestringAktueller TOTP-Code aus der Authenticator-App des Benutzers. Erforderlich für `grant_type=mfa_totp`.
providerstringSSO-Anbieter-Bezeichner. Erforderlich für `grant_type=sso_id_token` (`google`) und `grant_type=sso_code` (`microsoft`, `slack`).
id_tokenstringVom Anbieter ausgestelltes SSO-ID-Token (z. B. ein Google-ID-Token-JWT). Erforderlich für `grant_type=sso_id_token`.
codestringVom Authorize-Endpunkt des SSO-Anbieters zurückgegebener Authorization Code. Erforderlich für `grant_type=sso_code`.
redirect_uristringRedirect-URI, die beim Abruf des Authorization Codes verwendet wurde. Muss mit dem beim SSO-Anbieter hinterlegten Wert übereinstimmen. Erforderlich für `grant_type=sso_code`.
code_verifierstringPKCE-Code-Verifier — der Klartextwert, dessen SHA-256-Hash als `code_challenge` in der Authorization-Anfrage gesendet wurde. Erforderlich für `grant_type=sso_code`, wenn die App-Registrierung des SSO-Anbieters ein öffentlicher Client ist.
Antworten
200Token erfolgreich ausgestellt, oder MFA-Anforderung zurückgegeben (Passwort-Grant mit aktivierter 2FA). Die Antwort ist eine `OauthTokenResponse` (Zugriffstoken + Refresh-Token) für `refresh_token`- und `mfa_totp`-Grants, oder eine `MfaChallengeResponse` (MFA-Anforderung) für einen `password`-Grant, wenn das Konto 2FA aktiviert hat.
Antwortbeispiele
{ }
400Ungültige Anfrage, nicht unterstützter Grant-Typ oder ungültige Anmeldedaten.
Antwort-Schema:
NameTypDescription
errorstringOAuth-2.0-Fehlercode (z. B. `invalid_grant`, `invalid_client`).
error_descriptionstringMenschenlesbare Fehlerbeschreibung.
Antwortbeispiele
{
  "error" : "invalid_grant",
  "error_description" : "Invalid username or password"
}
403Zugriff aufgrund einer IP-Adressbeschränkung verweigert.
Antwort-Schema:
NameTypDescription
errorstringOAuth-2.0-Fehlercode (z. B. `invalid_grant`, `invalid_client`).
error_descriptionstringMenschenlesbare Fehlerbeschreibung.
Antwortbeispiele
{
  "error" : "invalid_grant",
  "error_description" : "Invalid username or password"
}
429Zu viele Anfragen von dieser IP-Adresse. Versuche es in 1 Minute erneut.
Antwort-Schema:
NameTypDescription
errorstringOAuth-2.0-Fehlercode (z. B. `invalid_grant`, `invalid_client`).
error_descriptionstringMenschenlesbare Fehlerbeschreibung.
Antwortbeispiele
{
  "error" : "invalid_grant",
  "error_description" : "Invalid username or password"
}
500Unerwarteter Serverfehler.
Antwort-Schema:
NameTypDescription
errorstringOAuth-2.0-Fehlercode (z. B. `invalid_grant`, `invalid_client`).
error_descriptionstringMenschenlesbare Fehlerbeschreibung.
Antwortbeispiele
{
  "error" : "invalid_grant",
  "error_description" : "Invalid username or password"
}
Anforderungsbeispiele
Passwort-Grant
curl -X POST "https://app.timebutler.com/api/v2/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d 'grant_type=password&username=user%40example.com&password=s3cr3t&client_id=public'
Refresh-Token-Grant
curl -X POST "https://app.timebutler.com/api/v2/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d 'grant_type=refresh_token&refresh_token=550e8400-e29b-41d4-a716-446655440000&client_id=public'
MFA-TOTP-Grant (2FA zweiter Schritt)
curl -X POST "https://app.timebutler.com/api/v2/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d 'grant_type=mfa_totp&mfa_token=mfa-a1b2c3d4e5f6&totp_code=123456&client_id=public'

Abwesenheitsanträge

Urlaubs-, Krankheits- und sonstige Abwesenheitsanträge. Mitarbeiter stellen und verwalten ihre eigenen Anträge (`/my`, `POST`, `PUT /{id}`, `DELETE /{id}`); Manager und Administratoren sehen die offenen Anträge ihres Teams (`/team`, `/pending-count`) und können sie genehmigen oder ablehnen (`POST /{id}/approve`, `POST /{id}/reject`). Alle Endpunkte erfordern ein Inhaber-Token.

POST/absence-requests/{id}/approve

Offenen Abwesenheitsantrag genehmigen

Vermerkt die Genehmigung des Aufrufers auf einem Antrag im Zustand `pending`. Hat der Mitarbeiter mehrere Manager, wechselt der Antrag erst dann in `approved`, wenn alle Manager genehmigt haben (oder ein Administrator genehmigt). Der Aufrufer muss Administrator oder direkter Vorgesetzter des Antragstellers sein.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)Interne ID des zu genehmigenden Abwesenheitsantrags.
Antworten
200Antrag nach Vermerk der Genehmigung.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Abwesenheitsantrags.
typestringAbwesenheitstyp-Code (3 Zeichen), z. B. `"URL"` für Urlaub.
startDatestringErster Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringLetzter Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst, berechnet gemäß dem Arbeitszeitplan des Mitarbeiters.
statusstringAktueller Status des Antrags. Einer von `pending` (wartet auf Genehmigung), `approved` oder `rejected`.
Mögliche Werte: pending approved rejected
halfDaystringHalbtags-Indikator. `"morning"` oder `"afternoon"` für Halbtagsanträge; `null` für ganztägige Abwesenheiten.
Mögliche Werte: morning afternoon
substitutePendingbooleanOb die Bestätigung des Vertreters noch aussteht. `null`, wenn kein Vertreter gesetzt wurde.
medicalCertificateProvidedbooleanOb ein Attest für diese Abwesenheit hochgeladen wurde. Nur vorhanden bei Abwesenheitstypen, die ein Attest erfordern; sonst `null`.
employeeNamestringAnzeigename des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
employeeIdstringInterne ID des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
Antwortbeispiele
{
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist weder Manager noch Administrator oder darf diesen konkreten Antrag nicht bearbeiten.
404Für das Unternehmen des Aufrufers existiert kein Antrag mit der angegebenen `id`.
409Der Antrag ist nicht im Zustand `pending` (bereits genehmigt, abgelehnt oder gelöscht).
500Unerwarteter Serverfehler beim Aktualisieren des Antrags.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/absence-requests/{id}/approve" \
  -H "Authorization: Bearer <token>"
GET/absence-requests

Eigene Abwesenheitsanträge des Aufrufers auflisten (Alias)

Alias-Endpunkt, der dasselbe Ergebnis wie `GET /my` liefert. In neuen Integrationen `/my` bevorzugen — dieser Pfad existiert aus Gründen der Abwärtskompatibilität.

Autorisierungen:
bearerAuth
Antworten
200Liste der Anträge des Aufrufers. Leeres Array, wenn keine vorhanden sind.
Antwortbeispiele
[ {
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
403Das Konto des Aufrufers ist inaktiv.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/absence-requests" \
  -H "Authorization: Bearer <token>"
POST/absence-requests

Neuen Abwesenheitsantrag erstellen

Reicht einen neuen Abwesenheits- oder Urlaubsantrag für den Aufrufer ein. Der resultierende Status hängt von der Konfiguration des Abwesenheitstyps ab: Typen, die eine Genehmigung durch den Manager erfordern, starten mit `pending`, andernfalls gehen sie direkt auf `approved`. Datumsangaben sind ISO-8601 (`YYYY-MM-DD`). Bei Halbtagsanträgen `halfDay` auf `morning` oder `afternoon` setzen und denselben Wert für `startDate` und `endDate` verwenden.

Autorisierungen:
bearerAuth
Anfragekörper

Felder des neuen Abwesenheitsantrags.

Anfragekörper-Schema:
NameTypDescription
absenceTypeIderforderlichstringAbwesenheitstyp-Code (3 Zeichen), z. B. `"URL"` für Urlaub. Muss einem aktiven Typ aus `GET /absence-types` entsprechen.
startDateerforderlichstringErster Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDateerforderlichstringLetzter Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`). Muss gleich oder nach `startDate` liegen. Bei Halbtagsanträgen muss es gleich `startDate` sein.
halfDaystringAuf `"morning"` oder `"afternoon"` setzen, um einen einzelnen Halbtag zu beantragen. Wenn gesetzt, müssen `startDate` und `endDate` denselben Tag haben. Weglassen oder `null` senden für eine ganztägige Abwesenheit.
Mögliche Werte: morning afternoon
commentsstringOptionaler Freitextkommentar, der den Managern des Mitarbeiters angezeigt wird.
substituteEmployeeIdstringMitarbeiter-ID des designierten Vertreters. Muss zum selben Unternehmen gehören. Weglassen oder `null` senden, wenn kein Vertreter benötigt wird.
Antworten
200Erstellter Antrag, im vom Server zugewiesenen Zustand.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Abwesenheitsantrags.
typestringAbwesenheitstyp-Code (3 Zeichen), z. B. `"URL"` für Urlaub.
startDatestringErster Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringLetzter Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst, berechnet gemäß dem Arbeitszeitplan des Mitarbeiters.
statusstringAktueller Status des Antrags. Einer von `pending` (wartet auf Genehmigung), `approved` oder `rejected`.
Mögliche Werte: pending approved rejected
halfDaystringHalbtags-Indikator. `"morning"` oder `"afternoon"` für Halbtagsanträge; `null` für ganztägige Abwesenheiten.
Mögliche Werte: morning afternoon
substitutePendingbooleanOb die Bestätigung des Vertreters noch aussteht. `null`, wenn kein Vertreter gesetzt wurde.
medicalCertificateProvidedbooleanOb ein Attest für diese Abwesenheit hochgeladen wurde. Nur vorhanden bei Abwesenheitstypen, die ein Attest erfordern; sonst `null`.
employeeNamestringAnzeigename des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
employeeIdstringInterne ID des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
Antwortbeispiele
{
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
}
400Fehlende, fehlerhafte oder zueinander inkonsistente Felder (ungültige `absenceTypeId`, nicht parsbares Datum, `endDate < startDate`, ungültiger `halfDay`-Wert oder unbekannte `substituteEmployeeId`).
401Das Inhaber-Token fehlt oder ist ungültig.
403Die Rolle des Aufrufers darf diesen Abwesenheitstyp nicht eintragen.
500Unerwarteter Serverfehler beim Speichern des Antrags.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/absence-requests" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"absenceTypeId":"URL","startDate":"2025-08-01","endDate":"2025-08-05","halfDay":"morning","comments":"Holiday trip","substituteEmployeeId":"42"}'
PUT/absence-requests/{id}

Bestehenden Abwesenheitsantrag aktualisieren

Aktualisiert einen Antrag, der sich noch im Zustand `pending` oder `edit` befindet. Nur die im Request-Body übermittelten Felder werden geändert; `null`-Felder bleiben unverändert. Nicht-Administratoren können nur ihre eigenen Anträge aktualisieren. Bereits genehmigte oder abgelehnte Anträge können nicht mehr aktualisiert werden und liefern `409 Conflict`.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)Interne ID des zu aktualisierenden Abwesenheitsantrags. Entspricht dem `id`-Feld aus `GET /my` oder `GET /team`.
Anfragekörper

Zu aktualisierende Felder. Ein Feld weglassen (oder `null` senden), um den bestehenden Wert zu behalten.

Anfragekörper-Schema:
NameTypDescription
absenceTypeIdstringNeuer Abwesenheitstyp-Code (3 Zeichen). `null` senden, um den bestehenden Typ zu behalten.
startDatestringNeues Startdatum im ISO-8601-Format (`YYYY-MM-DD`). `null` senden, um den bestehenden Wert zu behalten.
endDatestringNeues Enddatum im ISO-8601-Format (`YYYY-MM-DD`). Muss gleich oder nach `startDate` liegen. `null` senden, um den bestehenden Wert zu behalten.
halfDaystringNeue Halbtags-Einstellung. `"morning"` oder `"afternoon"` um auf einen Halbtag zu wechseln; leerer String `""` um den Halbtag zu entfernen und auf ganztägig zu stellen; `null` um den bestehenden Wert zu behalten.
Mögliche Werte: morning afternoon
commentsstringNeuer Freitextkommentar. `null` senden, um den bestehenden Kommentar zu behalten; leeren String senden, um ihn zu löschen.
substituteEmployeeIdstringNeue Vertreter-Mitarbeiter-ID. `null` senden, um den bestehenden Vertreter zu behalten; `"0"` oder einen leeren String senden, um den Vertreter zu entfernen.
Antworten
200Aktualisierter Antrag, wie gespeichert.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Abwesenheitsantrags.
typestringAbwesenheitstyp-Code (3 Zeichen), z. B. `"URL"` für Urlaub.
startDatestringErster Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringLetzter Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst, berechnet gemäß dem Arbeitszeitplan des Mitarbeiters.
statusstringAktueller Status des Antrags. Einer von `pending` (wartet auf Genehmigung), `approved` oder `rejected`.
Mögliche Werte: pending approved rejected
halfDaystringHalbtags-Indikator. `"morning"` oder `"afternoon"` für Halbtagsanträge; `null` für ganztägige Abwesenheiten.
Mögliche Werte: morning afternoon
substitutePendingbooleanOb die Bestätigung des Vertreters noch aussteht. `null`, wenn kein Vertreter gesetzt wurde.
medicalCertificateProvidedbooleanOb ein Attest für diese Abwesenheit hochgeladen wurde. Nur vorhanden bei Abwesenheitstypen, die ein Attest erfordern; sonst `null`.
employeeNamestringAnzeigename des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
employeeIdstringInterne ID des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
Antwortbeispiele
{
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
}
400Fehlerhafter Body oder ungültige Feldkombination.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist weder Eigentümer dieses Antrags noch Administrator, oder der Abwesenheitstyp ist für die Rolle des Aufrufers gesperrt.
404Für das Unternehmen des Aufrufers existiert kein Antrag mit der angegebenen `id`.
409Der Antrag befindet sich in einem Zustand, der keine Bearbeitung mehr zulässt (bereits genehmigt, abgelehnt oder gelöscht).
500Unerwarteter Serverfehler beim Speichern der Aktualisierung.
Anforderungsbeispiele
curl -X PUT "https://app.timebutler.com/api/v2/absence-requests/{id}" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"absenceTypeId":"URL","startDate":"2025-08-01","endDate":"2025-08-05","halfDay":"morning","comments":"Rescheduled trip","substituteEmployeeId":"42"}'
DELETE/absence-requests/{id}

Abwesenheitsantrag löschen oder Stornierungsanfrage senden

Das Verhalten hängt vom aktuellen Zustand des Antrags und den Rechten des Aufrufers ab: Darf der Aufrufer den Antrag direkt löschen, wird er entfernt und das Feld `result` der Antwort ist `"deleted"`. Andernfalls wird ein Stornierungsantrag erzeugt, den die Manager des Mitarbeiters dann genehmigen müssen, und die Antwort `result` ist `"cancellation_requested"`. Die Unternehmenskonfiguration kann eine Begründung erforderlich machen, wenn nur eine Stornierung möglich ist.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)Interne ID des zu löschenden oder zu stornierenden Abwesenheitsantrags.
Anfragekörper

Optionaler Body mit einem freien `reason`-Text. Erforderlich für Stornierungsanfragen, wenn die Unternehmenskonfiguration eine Begründung verlangt.

Anfragekörper-Schema:
NameTypDescription
reasonstringOptionaler Freitextgrund für die Stornierung. Erforderlich, wenn die Unternehmenskonfiguration einen Grund für Stornierungsanträge vorschreibt.
Antworten
200Ergebnis des Lösch-/Stornierungsversuchs. Das Feld `result` gibt an, welcher Pfad gewählt wurde.
Antwort-Schema:
NameTypDescription
idstringInterne ID des betroffenen Eintrags.
resultstringErgebnis der Operation. `"deleted"`, wenn der Eintrag direkt gelöscht wurde; `"cancellation_requested"`, wenn stattdessen ein Stornierungsantrag erstellt wurde; `"deletion_requested"`, wenn ein Löschantrag erstellt wurde (für Zeiteinträge, die genehmigt werden müssen).
Mögliche Werte: deleted cancellation_requested deletion_requested
Antwortbeispiele
{
  "id" : "12345",
  "result" : "deleted"
}
400Fehlender Stornierungsgrund, obwohl das Unternehmen einen verlangt.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer darf diesen Antrag weder löschen noch stornieren (falsches Unternehmen, oder die Berechtigungen für den aktuellen Zustand lassen keine Aktion zu).
404Für das Unternehmen des Aufrufers existiert kein Antrag mit der angegebenen `id`.
500Unerwarteter Serverfehler beim Löschen oder Stornieren.
Anforderungsbeispiele
curl -X DELETE "https://app.timebutler.com/api/v2/absence-requests/{id}" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Plans changed"}'
GET/absence-requests/my

Eigene Abwesenheitsanträge des Aufrufers auflisten

Liefert jeden Abwesenheits- und Urlaubsantrag des Aufrufers, in jedem Zustand (pending, approved, rejected, done). Anträge, die der Aufrufer für seine unterstellten Mitarbeiter verwaltet, sind nicht enthalten — dafür siehe `/team`.

Autorisierungen:
bearerAuth
Antworten
200Liste der Anträge des Aufrufers. Leeres Array, wenn keine vorhanden sind.
Antwortbeispiele
[ {
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
403Das Konto des Aufrufers ist inaktiv.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/absence-requests/my" \
  -H "Authorization: Bearer <token>"
GET/absence-requests/pending-count

Offene Antragszahlen für das Team des Aufrufers

Liefert zwei Zähler für die direkt unterstellten Mitarbeiter des Aufrufers: offene Abwesenheitsanträge, die auf seine Genehmigung warten, und offene Stornierungsanträge. Wird verwendet, um Benachrichtigungs-Badges im Manager-Dashboard anzuzeigen. Liefert Nullen, wenn der Aufrufer keine direkt unterstellten Mitarbeiter hat.

Autorisierungen:
bearerAuth
Antworten
200Zähler erfolgreich zurückgegeben.
Antwort-Schema:
NameTypDescription
numberOfAbsenceRequestsinteger(int32)Anzahl der Abwesenheitsanträge im Team des Aufrufers, die auf die Genehmigung des Aufrufers warten.
numberOfAbsenceRequestCancellationsinteger(int32)Anzahl der Stornierungsanträge im Team des Aufrufers, die auf eine Genehmigung warten.
Antwortbeispiele
{
  "numberOfAbsenceRequests" : 3,
  "numberOfAbsenceRequestCancellations" : 1
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist weder Manager noch Administrator.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/absence-requests/pending-count" \
  -H "Authorization: Bearer <token>"
GET/absence-requests/team

Abwesenheitsanträge der unterstellten Mitarbeiter auflisten

Liefert jeden Abwesenheitsantrag von Mitarbeitern, die der Aufrufer verwaltet (Administratoren sehen alle Unternehmensnutzer), über alle Zustände hinweg. Jeder Eintrag enthält den Anzeigenamen und die ID des Mitarbeiters, damit das Ergebnis als Teamkalender oder Prüfliste dargestellt werden kann. Leeres Array, wenn der Aufrufer keine unterstellten Mitarbeiter hat.

Autorisierungen:
bearerAuth
Antworten
200Liste der Teamanträge. Leeres Array, falls keine vorhanden sind.
Antwortbeispiele
[ {
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist weder Manager noch Administrator.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/absence-requests/team" \
  -H "Authorization: Bearer <token>"
POST/absence-requests/{id}/reject

Offenen Abwesenheitsantrag ablehnen

Markiert einen offenen Abwesenheitsantrag als abgelehnt. Ein optionaler Ablehnungsgrund kann im Body übergeben werden — er wird gespeichert und dem antragstellenden Mitarbeiter angezeigt. Der Aufrufer muss Administrator oder direkter Vorgesetzter des Antragstellers sein.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)Interne ID des abzulehnenden Abwesenheitsantrags.
Anfragekörper

Optionaler Body mit einem `reason`-String, der dem Mitarbeiter angezeigt wird.

Anfragekörper-Schema:
NameTypDescription
reasonstringOptionaler Freitextgrund für die Ablehnung. Wird am Antrag gespeichert und dem Mitarbeiter angezeigt.
Antworten
200Antrag nach Vermerk der Ablehnung.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Abwesenheitsantrags.
typestringAbwesenheitstyp-Code (3 Zeichen), z. B. `"URL"` für Urlaub.
startDatestringErster Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringLetzter Tag der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst, berechnet gemäß dem Arbeitszeitplan des Mitarbeiters.
statusstringAktueller Status des Antrags. Einer von `pending` (wartet auf Genehmigung), `approved` oder `rejected`.
Mögliche Werte: pending approved rejected
halfDaystringHalbtags-Indikator. `"morning"` oder `"afternoon"` für Halbtagsanträge; `null` für ganztägige Abwesenheiten.
Mögliche Werte: morning afternoon
substitutePendingbooleanOb die Bestätigung des Vertreters noch aussteht. `null`, wenn kein Vertreter gesetzt wurde.
medicalCertificateProvidedbooleanOb ein Attest für diese Abwesenheit hochgeladen wurde. Nur vorhanden bei Abwesenheitstypen, die ein Attest erfordern; sonst `null`.
employeeNamestringAnzeigename des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
employeeIdstringInterne ID des Mitarbeiters, der den Antrag gestellt hat. Nur in Antworten von `GET /team` vorhanden; `null` in `GET /my`-Antworten.
Antwortbeispiele
{
  "id" : "12345",
  "type" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "halfDay" : "morning",
  "substitutePending" : false,
  "medicalCertificateProvided" : false,
  "employeeName" : "Maria Müller",
  "employeeId" : "42"
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist weder Manager noch Administrator oder darf diesen konkreten Antrag nicht bearbeiten.
404Für das Unternehmen des Aufrufers existiert kein Antrag mit der angegebenen `id`.
409Der Antrag ist nicht im Zustand `pending`.
500Unerwarteter Serverfehler beim Aktualisieren des Antrags.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/absence-requests/{id}/reject" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Insufficient staffing during that period"}'

Abwesenheitsarten

Referenzliste der im Unternehmen konfigurierten Abwesenheitsarten (Urlaub, Krankheit usw.). Wird zur Befüllung von Auswahlfeldern beim Erstellen eines Abwesenheitsantrags verwendet.

GET/absence-types

Abwesenheitsarten auflisten

Gibt alle aktiven Abwesenheitsarten zurück, die der authentifizierte Benutzer einreichen darf.

Autorisierungen:
bearerAuth
Antworten
200Liste der Abwesenheitsarten.
Antwortbeispiele
[ {
  "id" : "URL",
  "name" : "Urlaub",
  "needsApproval" : true,
  "requiresMedicalCertificate" : false
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/absence-types" \
  -H "Authorization: Bearer <token>"

Benutzerprofil

Grundlegende Profilinformationen des authentifizierten Benutzers: Name, E-Mail, Rolle, Abteilung und Avatar-URL.

GET/user/profile

Profil abrufen

Gibt Anzeigename, E-Mail-Adresse, Rolle (`USER`, `MANAGER`, `ADMIN`), Abteilung, Niederlassung und Avatar-URL des authentifizierten Benutzers zurück.

Autorisierungen:
bearerAuth
Antworten
200Profildaten.
Antwort-Schema:
NameTypDescription
idstringInterne ID des authentifizierten Benutzers.
namestringVollständiger Anzeigename des Benutzers.
emailstringE-Mail-Adresse des Benutzers.
rolestringRolle des Benutzers im Unternehmen. Einer von `USER`, `MANAGER` oder `ADMIN`.
Mögliche Werte: USER MANAGER ADMIN
departmentstringName der Abteilung, der der Benutzer angehört. `null`, wenn das Unternehmen keine Abteilungen verwendet.
branchOfficestringName der Niederlassung, der der Benutzer zugeordnet ist. `null`, wenn das Unternehmen keine Niederlassungen verwendet.
countryobjectLand des Benutzers, wie in seinem Profil konfiguriert. Die Struktur hängt von der Unternehmenskonfiguration ab.
avatarstringURL des Profilbilds des Benutzers. `null`, wenn kein Profilbild hochgeladen wurde.
isBusinessTripEnabledbooleanOb die Dienstreisefunktion für diesen Benutzer aktiviert ist. `null`, wenn die Funktion im Unternehmensplan nicht verfügbar ist.
isTimeTrackingEnabledbooleanOb die Zeiterfassung für das Unternehmen des Benutzers aktiv ist.
Antwortbeispiele
{
  "id" : "42",
  "name" : "Maria Müller",
  "email" : "maria.mueller@example.com",
  "role" : "MANAGER",
  "department" : "Engineering",
  "branchOffice" : "Berlin",
  "country" : { },
  "avatar" : "/images/avatar/42/abc123.jpg?v=5",
  "isBusinessTripEnabled" : true,
  "isTimeTrackingEnabled" : true
}
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/user/profile" \
  -H "Authorization: Bearer <token>"

Kategorien

Referenzliste der Zeiterfassungskategorien des Unternehmens. Wird beim Erstellen oder Beenden eines Zeiteintrags verwendet.

GET/categories

Kategorien auflisten

Gibt alle aktiven Kategorien sowie die Standardkategorie des Benutzers und die Information zurück, ob eine Kategorie beim Speichern eines Zeiteintrags erforderlich ist.

Autorisierungen:
bearerAuth
Antworten
200Kategorieliste mit Standardwert und Pflichtfeld-Kennzeichnung.
Antwort-Schema:
NameTypDescription
categoriesCategoryDto[]Liste der Kostenstellen/Kategorien, die für das Unternehmen des authentifizierten Benutzers verfügbar sind.
idstringInterne ID der Kategorie, die beim Einreichen eines Zeiteintrags verwendet wird.
namestringLesbarer Name der Kategorie.
defaultCategoryIdstringID der Kategorie, die beim Erstellen eines Zeiteintrags standardmäßig vorausgewählt ist. `null`, wenn kein Standard konfiguriert ist.
isCategoryMandatorybooleanOb der Mitarbeiter beim Erstellen eines Zeiteintrags eine Kategorie auswählen muss.
Antwortbeispiele
{
  "categories" : [ {
    "id" : "7",
    "name" : "Internal project"
  } ],
  "defaultCategoryId" : "7",
  "isCategoryMandatory" : false
}
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/categories" \
  -H "Authorization: Bearer <token>"

Projekte

Referenzliste der Zeiterfassungsprojekte des Unternehmens. Favoriten werden zuerst aufgeführt. Wird beim Erstellen eines Zeiteintrags verwendet.

GET/projects

Projekte auflisten

Gibt alle aktiven Projekte zurück. Die Favoriten des Benutzers erscheinen zuerst, gefolgt von allen weiteren aktiven Projekten. Enthält außerdem das Standardprojekt des Benutzers und die Information, ob ein Projekt Pflichtfeld ist.

Autorisierungen:
bearerAuth
Antworten
200Projektliste mit Standardwert und Pflichtfeld-Kennzeichnung.
Antwort-Schema:
NameTypDescription
projectsProjectDto[]Liste der Projekte, die für das Unternehmen des authentifizierten Benutzers verfügbar sind.
idstringInterne ID des Projekts, die beim Einreichen eines Zeiteintrags verwendet wird.
namestringLesbarer Name des Projekts.
isFavoritebooleanOb dieses Projekt vom authentifizierten Benutzer als Favorit markiert wurde.
defaultProjectIdstringID des Projekts, das beim Erstellen eines Zeiteintrags standardmäßig vorausgewählt ist. `null`, wenn kein Standard konfiguriert ist.
isProjectMandatorybooleanOb der Mitarbeiter beim Erstellen eines Zeiteintrags ein Projekt auswählen muss.
Antwortbeispiele
{
  "projects" : [ {
    "id" : "5",
    "name" : "Website Relaunch",
    "isFavorite" : true
  } ],
  "defaultProjectId" : "5",
  "isProjectMandatory" : true
}
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/projects" \
  -H "Authorization: Bearer <token>"

Stempeluhr

Echtzeit-Stempeluhr. Startet, pausiert, setzt fort, stoppt oder bricht die laufende Uhr für den authentifizierten Benutzer ab. Der Dienstgangmodus wird ebenfalls hier gesteuert.

POST/time-clock/business-trip-end

Dienstgang beenden

Markiert das Ende eines aktiven Dienstgangs auf der aktuellen Stempeluhr. Gibt 409 zurück, wenn kein Dienstgang aktiv ist.

Autorisierungen:
bearerAuth
Antworten
200Dienstgang beendet; gibt den aktuellen Status zurück.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Dienstgänge nicht aktiviert oder Zeiterfassung nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
409Kein Dienstgang ist derzeit aktiv.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/business-trip-end" \
  -H "Authorization: Bearer <token>"
POST/time-clock/business-trip-start

Dienstgang starten

Markiert den Beginn eines Dienstgangs auf der aktuell laufenden oder pausierten Stempeluhr. Gibt 400 zurück, wenn Dienstgänge für dieses Unternehmen nicht aktiviert sind; gibt 409 zurück, wenn die Stempeluhr nicht aktiv ist oder ein Dienstgang bereits läuft.

Autorisierungen:
bearerAuth
Antworten
200Dienstgang gestartet; gibt den aktuellen Status zurück.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Dienstgänge nicht aktiviert oder Zeiterfassung nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
409Stempeluhr läuft nicht/ist nicht pausiert oder ein Dienstgang ist bereits aktiv.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/business-trip-start" \
  -H "Authorization: Bearer <token>"
POST/time-clock/cancel

Stempeluhr abbrechen

Verwirft die aktuelle Stempeluhr-Sitzung ohne einen Zeiteintrag zu speichern. Gibt 409 zurück, wenn die Stempeluhr bereits `idle` ist.

Autorisierungen:
bearerAuth
Antworten
200Stempeluhr abgebrochen; gibt den Status `idle` zurück.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
409Die Stempeluhr ist bereits `idle`.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/cancel" \
  -H "Authorization: Bearer <token>"
GET/time-clock/status

Stempeluhr-Status abrufen

Gibt den aktuellen Status der Stempeluhr zurück: `idle`, `running`, `paused` oder `waiting`. Enthält außerdem die verstrichene Zeit, die Pausenzeit und den Dienstgang-Status.

Autorisierungen:
bearerAuth
Antworten
200Aktueller Stempeluhr-Status.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/time-clock/status" \
  -H "Authorization: Bearer <token>"
POST/time-clock/pause

Stempeluhr pausieren

Pausiert eine laufende Stempeluhr. Gibt 409 zurück, wenn die Stempeluhr nicht im Status `running` ist.

Autorisierungen:
bearerAuth
Antworten
200Stempeluhr pausiert; gibt den aktuellen Status zurück.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
409Die Stempeluhr läuft nicht.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/pause" \
  -H "Authorization: Bearer <token>"
POST/time-clock/resume

Stempeluhr fortsetzen

Setzt eine pausierte Stempeluhr fort. Gibt 409 zurück, wenn die Stempeluhr nicht im Status `paused` ist.

Autorisierungen:
bearerAuth
Antworten
200Stempeluhr fortgesetzt; gibt den aktuellen Status zurück.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
409Die Stempeluhr ist nicht pausiert.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/resume" \
  -H "Authorization: Bearer <token>"
POST/time-clock/start

Stempeluhr starten

Startet die Stempeluhr für den authentifizierten Benutzer. Gibt 409 zurück, wenn die Stempeluhr bereits läuft. Die Uhr kann den Status `waiting` annehmen, wenn ein Mindest-Startintervall konfiguriert ist.

Autorisierungen:
bearerAuth
Antworten
200Stempeluhr gestartet; gibt den aktuellen Status zurück.
Antwort-Schema:
NameTypDescription
statusstringAktueller Zustand der Zeiterfassung. Einer von `idle` (nicht aktiv), `running` (eingestempelt), `paused` oder `waiting` (gestartet, aber bis zum Ablauf eines Mindestintervalls gehalten).
Mögliche Werte: idle running paused waiting
startTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Einstempelung begonnen hat. `null`, wenn `status` `idle` ist.
pauseTimestampinteger(int64)Unix-Zeitstempel in Millisekunden, wann die aktuelle Pause begonnen hat. `null`, wenn die Uhr nicht pausiert ist.
workTimeElapsedSecondsinteger(int32)Gesamte bisher vergangene Arbeitszeit in der aktuellen Sitzung, in Sekunden (ohne Pausen).
breakElapsedSecondsinteger(int32)Dauer der aktuell laufenden Pause, in Sekunden. `0`, wenn die Uhr nicht pausiert ist.
accumulatedBreakSecondsinteger(int32)Gesamte aufgelaufene Pausenzeit in der aktuellen Sitzung, in Sekunden (einschließlich abgeschlossener Pausen).
waitSecondsinteger(int32)Mindestanzahl verbleibender Sekunden, bevor der Mitarbeiter gemäß Unternehmensrichtlinie ausstempeln darf. `null`, wenn kein Minimum gilt.
isBusinessTripActivebooleanOb für diese Sitzung aktuell eine Dienstreise aktiv ist. `false`, wenn keine Dienstreise aktiv ist oder die Funktion nicht aktiviert ist.
Antwortbeispiele
{
  "status" : "running",
  "startTimestamp" : 1753700400000,
  "pauseTimestamp" : 1753714800000,
  "workTimeElapsedSeconds" : 14400,
  "breakElapsedSeconds" : 0,
  "accumulatedBreakSeconds" : 1800,
  "waitSeconds" : 0,
  "isBusinessTripActive" : false
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Benutzer ist nicht berechtigt, Zeiteinträge zu erstellen.
409Die Stempeluhr läuft bereits oder die Startbedingungen sind nicht erfüllt.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/start" \
  -H "Authorization: Bearer <token>"
POST/time-clock/stop

Stempeluhr stoppen und speichern

Stoppt die laufende oder pausierte Stempeluhr und speichert den resultierenden Zeiteintrag. Optional können eine Projekt-ID und Anmerkungen angegeben werden. Befindet sich die Uhr im Status `waiting`, wird sie verworfen und 204 zurückgegeben. Gibt 409 zurück, wenn die Gesamtdauer zu kurz ist (< 1 Minute) oder ein doppelter Eintrag erkannt wird.

Autorisierungen:
bearerAuth
Anfragekörper

Optionale Projekt-ID, Kategorie-ID und Anmerkungen für den gespeicherten Eintrag.

Anfragekörper-Schema:
NameTypDescription
projectIdinteger(int32)ID des Projekts, dem die abgeschlossene Sitzung zugeordnet werden soll. `0` senden, wenn keine Projektzuordnung benötigt wird.
categoryIdinteger(int32)ID der Kategorie, der die abgeschlossene Sitzung zugeordnet werden soll. `0` senden, wenn keine Kategoriezuordnung benötigt wird.
remarksstringOptionaler Freitextkommentar für den abgeschlossenen Zeiteintrag.
Antworten
200Stempeluhr gestoppt; gibt die gespeicherten Eintragsdetails zurück (ID, Dauer, Pause).
Antwort-Schema:
NameTypDescription
idstringInterne ID des Zeiteintrags, der beim Ausstempeln erstellt wurde.
workedMinutesinteger(int32)Erfasste Nettoarbeitszeit der Sitzung, in Minuten (Gesamtdauer minus Pausen).
breakMinutesinteger(int32)Erfasste Gesamtpausenzeit der Sitzung, in Minuten.
Antwortbeispiele
{
  "id" : "98765",
  "workedMinutes" : 480,
  "breakMinutes" : 30
}
204Stempeluhr war im Status `waiting` und wurde verworfen, ohne zu speichern.
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
409Stempeluhr ist nicht aktiv, Dauer zu kurz oder doppelter Eintrag erkannt.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-clock/stop" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"projectId":5,"categoryId":7,"remarks":"Code review"}'

Stornierungsanträge

Anträge von Mitarbeitern zur Stornierung (Löschung) einer bereits genehmigten Abwesenheit. Vorgesetzte und Administratoren sehen offene Stornierungsanträge ihres Teams und können diese genehmigen oder ablehnen.

POST/cancellation-requests/{id}/approve

Stornierungsantrag genehmigen

Genehmigt den ausstehenden Stornierungsantrag für die angegebene Abwesenheit. Die Abwesenheit wird gelöscht und Benachrichtigungs-E-Mails werden versendet. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID der Abwesenheit.
Antworten
200Stornierung genehmigt; gibt den Snapshot der gelöschten Abwesenheit zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des zu stornierenden Abwesenheitsantrags.
employeeIdstringInterne ID des Mitarbeiters, der den ursprünglichen Abwesenheitsantrag gestellt hat.
employeeNamestringAnzeigename des Mitarbeiters, der den ursprünglichen Abwesenheitsantrag gestellt hat.
absenceTypestringAbwesenheitstyp-Code (3 Zeichen) des zu stornierenden Antrags.
startDatestringStartdatum der zu stornierenden Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringEnddatum der zu stornierenden Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst.
statusstringAktueller Status des Stornierungsantrags. Einer von `pending` (wartet auf Genehmigung) oder `approved`.
Mögliche Werte: pending approved
cancelCommentsstringOptionaler Freitextgrund, den der Mitarbeiter beim Stellen des Stornierungsantrags angegeben hat.
Antwortbeispiele
{
  "id" : "12345",
  "employeeId" : "42",
  "employeeName" : "Maria Müller",
  "absenceType" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "cancelComments" : "Plans changed"
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator, oder ist nicht der Vorgesetzte des Antragsstellers.
404Abwesenheit nicht gefunden.
409Kein ausstehender Stornierungsantrag für diese Abwesenheit.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/cancellation-requests/{id}/approve" \
  -H "Authorization: Bearer <token>"
GET/cancellation-requests

Offene Stornierungsanträge auflisten

Gibt alle offenen Stornierungsanträge zurück, die für den authentifizierten Vorgesetzten oder Administrator sichtbar sind. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Antworten
200Liste offener Stornierungsanträge.
Antwortbeispiele
[ {
  "id" : "12345",
  "employeeId" : "42",
  "employeeName" : "Maria Müller",
  "absenceType" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "cancelComments" : "Plans changed"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/cancellation-requests" \
  -H "Authorization: Bearer <token>"
GET/cancellation-requests/pending-count

Anzahl offener Stornierungsanträge abrufen

Gibt die Anzahl der Stornierungsanträge zurück, die auf eine Entscheidung eines Vorgesetzten oder Administrators warten. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Antworten
200Anzahl offener Anträge.
Antwort-Schema:
NameTypDescription
numberOfCancellationRequestsinteger(int32)Anzahl der Stornierungsanträge im Team des Aufrufers, die auf eine Genehmigung warten.
Antwortbeispiele
{
  "numberOfCancellationRequests" : 2
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/cancellation-requests/pending-count" \
  -H "Authorization: Bearer <token>"
POST/cancellation-requests/{id}/reject

Stornierungsantrag ablehnen

Lehnt den ausstehenden Stornierungsantrag ab. Die Abwesenheit bleibt bestehen; der Mitarbeiter wird per E-Mail benachrichtigt. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID der Abwesenheit.
Antworten
200Stornierung abgelehnt; gibt die aktualisierte Abwesenheit zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des zu stornierenden Abwesenheitsantrags.
employeeIdstringInterne ID des Mitarbeiters, der den ursprünglichen Abwesenheitsantrag gestellt hat.
employeeNamestringAnzeigename des Mitarbeiters, der den ursprünglichen Abwesenheitsantrag gestellt hat.
absenceTypestringAbwesenheitstyp-Code (3 Zeichen) des zu stornierenden Antrags.
startDatestringStartdatum der zu stornierenden Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringEnddatum der zu stornierenden Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst.
statusstringAktueller Status des Stornierungsantrags. Einer von `pending` (wartet auf Genehmigung) oder `approved`.
Mögliche Werte: pending approved
cancelCommentsstringOptionaler Freitextgrund, den der Mitarbeiter beim Stellen des Stornierungsantrags angegeben hat.
Antwortbeispiele
{
  "id" : "12345",
  "employeeId" : "42",
  "employeeName" : "Maria Müller",
  "absenceType" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending",
  "cancelComments" : "Plans changed"
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator, oder ist nicht der Vorgesetzte des Antragsstellers.
404Abwesenheit nicht gefunden.
409Kein ausstehender Stornierungsantrag für diese Abwesenheit.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/cancellation-requests/{id}/reject" \
  -H "Authorization: Bearer <token>"

Vertretungsanfragen

Anfragen an den authentifizierten Benutzer, während der Abwesenheit eines Kollegen als Vertretung zu fungieren. Der Benutzer kann jede Anfrage annehmen oder ablehnen.

POST/substitute-requests/{id}/accept

Vertretungsanfrage annehmen

Nimmt die Vertretungsanfrage für die angegebene Abwesenheit an. Nur die vorgesehene Vertretung darf diesen Endpunkt aufrufen.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID der Abwesenheit.
Antworten
200Anfrage angenommen; gibt die aktualisierte Abwesenheit zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Abwesenheitsantrags, für den die Vertretung angefragt wurde.
employeeIdstringInterne ID des abwesenden Mitarbeiters, der eine Vertretung benötigt.
employeeNamestringAnzeigename des abwesenden Mitarbeiters.
absenceTypestringAbwesenheitstyp-Code (3 Zeichen) der Abwesenheit, für die diese Vertretung angefragt wurde.
startDatestringStartdatum der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringEnddatum der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst.
statusstringAktueller Status der Vertretungsbestätigung. Einer von `pending` (wartet auf Bestätigung des Vertreters) oder `confirmed`.
Mögliche Werte: pending confirmed
Antwortbeispiele
{
  "id" : "12345",
  "employeeId" : "7",
  "employeeName" : "Anna Bauer",
  "absenceType" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending"
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist nicht die vorgesehene Vertretung.
404Abwesenheit nicht gefunden.
409Die Anfrage kann im aktuellen Status nicht angenommen werden (bereits angenommen, abgelehnt oder keine Annahme erforderlich).
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/substitute-requests/{id}/accept" \
  -H "Authorization: Bearer <token>"
GET/substitute-requests/pending-count

Anzahl offener Vertretungsanfragen abrufen

Gibt die Anzahl der Vertretungsanfragen zurück, die noch auf die Antwort des authentifizierten Benutzers warten.

Autorisierungen:
bearerAuth
Antworten
200Anzahl offener Anfragen.
Antwort-Schema:
NameTypDescription
numberOfSubstituteRequestsinteger(int32)Anzahl der Vertretungsanfragen, die auf die Bestätigung des Aufrufers warten.
Antwortbeispiele
{
  "numberOfSubstituteRequests" : 1
}
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/substitute-requests/pending-count" \
  -H "Authorization: Bearer <token>"
GET/substitute-requests

Vertretungsanfragen auflisten

Gibt alle Vertretungsanfragen zurück, die an den authentifizierten Benutzer gerichtet sind, unabhängig von deren Status (ausstehend, angenommen, abgelehnt).

Autorisierungen:
bearerAuth
Antworten
200Liste der Vertretungsanfragen.
Antwortbeispiele
[ {
  "id" : "12345",
  "employeeId" : "7",
  "employeeName" : "Anna Bauer",
  "absenceType" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/substitute-requests" \
  -H "Authorization: Bearer <token>"
POST/substitute-requests/{id}/reject

Vertretungsanfrage ablehnen

Lehnt die Vertretungsanfrage für die angegebene Abwesenheit ab. Nur die vorgesehene Vertretung darf diesen Endpunkt aufrufen.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID der Abwesenheit.
Antworten
200Anfrage abgelehnt; gibt die aktualisierte Abwesenheit zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Abwesenheitsantrags, für den die Vertretung angefragt wurde.
employeeIdstringInterne ID des abwesenden Mitarbeiters, der eine Vertretung benötigt.
employeeNamestringAnzeigename des abwesenden Mitarbeiters.
absenceTypestringAbwesenheitstyp-Code (3 Zeichen) der Abwesenheit, für die diese Vertretung angefragt wurde.
startDatestringStartdatum der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
endDatestringEnddatum der Abwesenheit im ISO-8601-Format (`YYYY-MM-DD`).
daysnumber(double)Anzahl der Werktage, die die Abwesenheit umfasst.
statusstringAktueller Status der Vertretungsbestätigung. Einer von `pending` (wartet auf Bestätigung des Vertreters) oder `confirmed`.
Mögliche Werte: pending confirmed
Antwortbeispiele
{
  "id" : "12345",
  "employeeId" : "7",
  "employeeName" : "Anna Bauer",
  "absenceType" : "URL",
  "startDate" : "2025-08-01",
  "endDate" : "2025-08-05",
  "days" : 4.0,
  "status" : "pending"
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist nicht die vorgesehene Vertretung.
404Abwesenheit nicht gefunden.
409Die Anfrage kann im aktuellen Status nicht abgelehnt werden.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/substitute-requests/{id}/reject" \
  -H "Authorization: Bearer <token>"

Vertretungsmitarbeiter

Referenzliste der Mitarbeiter, die beim Einreichen eines Abwesenheitsantrags als Vertretung ausgewählt werden können.

GET/substitute-employees

Vertretungsmitarbeiter auflisten

Gibt alle aktiven Mitarbeiter des Unternehmens zurück, die als Vertretung für den authentifizierten Benutzer fungieren können. Der authentifizierte Benutzer selbst ist nicht in der Liste enthalten.

Autorisierungen:
bearerAuth
Antworten
200Liste der Vertretungsmitarbeiter.
Antwortbeispiele
[ {
  "id" : "42",
  "name" : "Thomas Schmidt",
  "department" : "Engineering"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/substitute-employees" \
  -H "Authorization: Bearer <token>"

Zeiteinträge

Verwaltung einzelner Zeiterfassungseinträge. Vorgesetzte und Administratoren können sehen, wie viele Einträge auf Genehmigung warten; jeder Benutzer kann seine eigenen Einträge löschen (abhängig von Monatsabschluss- und Genehmigungsworkflow-Regeln).

DELETE/time-entries/{id}

Zeiteintrag löschen

Löscht den angegebenen Zeiteintrag. Wenn die Zeiterfassungseinstellungen des Unternehmens eine Genehmigung durch den Vorgesetzten für Löschungen erfordern, wird stattdessen ein Löschantrag gestellt. Das Antwortfeld `result` ist entweder `deleted` oder `deletion_requested`.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID des Zeiteintrags.
Antworten
200Eintrag gelöscht oder Löschantrag gestellt.
Antwort-Schema:
NameTypDescription
idstringInterne ID des betroffenen Eintrags.
resultstringErgebnis der Operation. `"deleted"`, wenn der Eintrag direkt gelöscht wurde; `"cancellation_requested"`, wenn stattdessen ein Stornierungsantrag erstellt wurde; `"deletion_requested"`, wenn ein Löschantrag erstellt wurde (für Zeiteinträge, die genehmigt werden müssen).
Mögliche Werte: deleted cancellation_requested deletion_requested
Antwortbeispiele
{
  "id" : "12345",
  "result" : "deleted"
}
400Ungültige ID oder Zeiterfassung ist für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer darf diesen Eintrag nicht löschen.
404Zeiteintrag nicht gefunden.
409Der Eintrag ist durch den Monatsabschluss gesperrt.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X DELETE "https://app.timebutler.com/api/v2/time-entries/{id}" \
  -H "Authorization: Bearer <token>"
GET/time-entries/pending-count

Anzahl ausstehender Zeiteinträge abrufen

Gibt die Anzahl der Zeiteinträge im Team des Vorgesetzten zurück, die auf Genehmigung warten. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Antworten
200Anzahl ausstehender Einträge.
Antwort-Schema:
NameTypDescription
numberOfTimeEntriesinteger(int32)Anzahl der Zeiteinträge im Team des Aufrufers, die auf eine Genehmigung warten.
Antwortbeispiele
{
  "numberOfTimeEntries" : 5
}
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/time-entries/pending-count" \
  -H "Authorization: Bearer <token>"

Zeiterfassung

Tagesübersicht zur Arbeits- und Abwesenheitszeit des authentifizierten Benutzers sowie ein Endpunkt zum direkten Einreichen abgeschlossener Zeiteinträge (Start-/Endzeitstempel) ohne die Echtzeit-Stempeluhr.

POST/time-tracking/clock-entry

Abgeschlossenen Zeiteintrag einreichen

Erstellt einen Zeiteintrag aus expliziten Start- und End-Unix-Zeitstempeln (Millisekunden). Start und Ende müssen am selben Kalendertag liegen. Wenn das Unternehmen eine Genehmigung durch den Vorgesetzten für neue Einträge erfordert, wird der Eintrag mit dem Status `pending` erstellt; andernfalls ist er sofort `done`.

Autorisierungen:
bearerAuth
Anfragekörper

Zeiteintrag mit Start-/Endzeitstempeln sowie optionalem Projekt und Anmerkungen.

Anfragekörper-Schema:
NameTypDescription
startTimestamperforderlichinteger(int64)Beginn des Arbeitszeitraums als Unix-Zeitstempel in Millisekunden.
endTimestamperforderlichinteger(int64)Ende des Arbeitszeitraums als Unix-Zeitstempel in Millisekunden.
pauseSecondsinteger(int32)Gesamte Pausendauer innerhalb des Arbeitszeitraums, in Sekunden.
projectIdinteger(int32)ID des Projekts, dem dieser Eintrag zugeordnet werden soll. `0` senden, wenn keine Projektzuordnung benötigt wird.
remarksstringOptionaler Freitextkommentar für diesen Zeiteintrag.
Antworten
200Eintrag erstellt; gibt die Eintrags-ID sowie die geleisteten und Pausenminuten zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des erstellten Zeiteintrags.
workedMinutesinteger(int32)Erfasste Nettoarbeitszeit für diesen Eintrag, in Minuten (Gesamtdauer minus Pausen).
breakMinutesinteger(int32)Erfasste Gesamtpausenzeit für diesen Eintrag, in Minuten.
Antwortbeispiele
{
  "id" : "98765",
  "workedMinutes" : 480,
  "breakMinutes" : 30
}
400Fehlender oder ungültiger Anfragetext, ungültige Zeitstempel oder Zeiterfassung nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Benutzer darf keine Zeiteinträge erstellen.
422Die Anmerkungen überschreiten die maximale Länge.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-tracking/clock-entry" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"startTimestamp":1753700400000,"endTimestamp":1753729200000,"pauseSeconds":1800,"projectId":5,"remarks":"Sprint planning"}'
GET/time-tracking/time-off-summary

Abwesenheitszusammenfassung abrufen

Gibt die verbleibenden und die Gesamtanzahl der Urlaubstage des authentifizierten Benutzers für das laufende Jahr sowie die Anzahl der genommenen Krankheitstage zurück.

Autorisierungen:
bearerAuth
Antworten
200Abwesenheitszusammenfassung.
Antwort-Schema:
NameTypDescription
vacationDaysRemainingnumber(double)Anzahl der Urlaubstage, die dem Mitarbeiter im laufenden Jahr noch zur Verfügung stehen, nach Berücksichtigung genehmigter und ausstehender Anträge.
vacationDaysTotalnumber(double)Gesamter Urlaubsanspruch des Mitarbeiters für das laufende Jahr.
illnessDaysTakennumber(double)Anzahl der in diesem Jahr genommenen Krankheitstage.
Antwortbeispiele
{
  "vacationDaysRemaining" : 12.5,
  "vacationDaysTotal" : 30.0,
  "illnessDaysTaken" : 3.0
}
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/time-tracking/time-off-summary" \
  -H "Authorization: Bearer <token>"
GET/time-tracking/work-summary

Heutige Arbeitszusammenfassung abrufen

Gibt die Sollarbeitszeit, die geleisteten Minuten, die verbleibenden Minuten, den Fertigstellungsgrad und die Pausenminuten des authentifizierten Benutzers für den heutigen Tag zurück.

Autorisierungen:
bearerAuth
Antworten
200Heutige Arbeitszusammenfassung.
Antwort-Schema:
NameTypDescription
commitmentMinutesinteger(int32)Gesamte Arbeitszeit, die der Mitarbeiter im abgefragten Zeitraum vertraglich leisten muss, in Minuten.
workedMinutesinteger(int32)Gesamte Arbeitszeit, die der Mitarbeiter im abgefragten Zeitraum tatsächlich geleistet hat, in Minuten.
remainingMinutesinteger(int32)Verbleibende Arbeitszeit, die im abgefragten Zeitraum noch geleistet werden muss, in Minuten. Negative Werte bedeuten Überstunden.
percentDoneinteger(int32)Prozentsatz der vertraglichen Arbeitszeit, der bisher geleistet wurde, auf die nächste ganze Zahl gerundet.
breakMinutesinteger(int32)Gesamte im abgefragten Zeitraum erfasste Pausenzeit, in Minuten.
Antwortbeispiele
{
  "commitmentMinutes" : 2400,
  "workedMinutes" : 2280,
  "remainingMinutes" : 120,
  "percentDone" : 95,
  "breakMinutes" : 300
}
401Das Inhaber-Token fehlt oder ist ungültig.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/time-tracking/work-summary" \
  -H "Authorization: Bearer <token>"

Zeiterfassungsanträge

Ausstehende Änderungs- oder Löschanträge für Zeiteinträge, die eine Genehmigung durch einen Vorgesetzten oder Administrator erfordern. Vorgesetzte und Administratoren können diese Anträge auflisten, genehmigen und ablehnen.

POST/time-entry-requests/{id}/approve

Zeiterfassungsantrag genehmigen

Genehmigt den ausstehenden Änderungs- oder Löschantrag für den angegebenen Zeiteintrag. Bei Löschanträgen wird der Eintrag entfernt; bei Änderungsanträgen wird der Eintrag auf die vorgeschlagenen Werte aktualisiert. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID des Zeiteintrags.
Antworten
200Antrag genehmigt; gibt den aktualisierten Zeiteintrag zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Zeiteintrags.
employeeIdstringInterne ID des Mitarbeiters, der den Zeiteintrag eingereicht hat. Nur in Team-/Manageransichten vorhanden.
employeeNamestringAnzeigename des Mitarbeiters, der den Zeiteintrag eingereicht hat. Nur in Team-/Manageransichten vorhanden.
datestringDatum des Zeiteintrags im ISO-8601-Format (`YYYY-MM-DD`).
startTimestringEinstempelzeit im Format `HH:mm`.
endTimestringAusstempelzeit im Format `HH:mm`.
workedMinutesinteger(int32)Nettoarbeitszeit für diesen Eintrag, in Minuten (Gesamtdauer minus Pausen).
breakMinutesinteger(int32)Gesamte Pausenzeit für diesen Eintrag, in Minuten.
projectstringName des Projekts, das diesem Eintrag zugeordnet ist. `null`, wenn kein Projekt zugeordnet wurde.
categorystringName der Kategorie, die diesem Eintrag zugeordnet ist. `null`, wenn keine Kategorie zugeordnet wurde.
remarksstringFreitextkommentar, der diesem Eintrag beigefügt ist. `null`, wenn kein Kommentar eingegeben wurde.
requestTypestringTyp der Anfrage, die diesen Eintrag erzeugt hat. Einer von `manual` (manuell eingegeben) oder `clock` (durch Ausstempeln erstellt).
Mögliche Werte: manual clock
statusstringGenehmigungsstatus dieses Zeiteintrags. Einer von `pending` (wartet auf Genehmigung) oder `approved`.
Mögliche Werte: pending approved
Antwortbeispiele
{
  "id" : "98765",
  "employeeId" : "42",
  "employeeName" : "Maria Müller",
  "date" : "2025-07-28",
  "startTime" : "08:00",
  "endTime" : "17:00",
  "workedMinutes" : 480,
  "breakMinutes" : 60,
  "project" : "Website Relaunch",
  "category" : "Internal project",
  "remarks" : "Sprint planning",
  "requestType" : "manual",
  "status" : "pending"
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator, oder nur Administratoren dürfen in diesem Unternehmen genehmigen.
404Zeiteintrag nicht gefunden.
409Kein ausstehender Antrag oder der vorgeschlagene Änderung hat einen Terminkonflikt.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-entry-requests/{id}/approve" \
  -H "Authorization: Bearer <token>"
GET/time-entry-requests

Ausstehende Zeiterfassungsanträge auflisten

Gibt alle ausstehenden Zeiterfassungsanträge im Team des Vorgesetzten zurück, die auf Genehmigung warten. Erfordert die Rolle `MANAGER` oder `ADMIN`. Gibt eine leere Liste zurück, wenn die Zeiterfassung nicht aktiv ist oder der Aufrufer ein Vorgesetzter in einem Unternehmen mit ausschließlicher Admin-Genehmigung ist.

Autorisierungen:
bearerAuth
Antworten
200Liste ausstehender Zeiterfassungsanträge.
Antwortbeispiele
[ {
  "id" : "98765",
  "employeeId" : "42",
  "employeeName" : "Maria Müller",
  "date" : "2025-07-28",
  "startTime" : "08:00",
  "endTime" : "17:00",
  "workedMinutes" : 480,
  "breakMinutes" : 60,
  "project" : "Website Relaunch",
  "category" : "Internal project",
  "remarks" : "Sprint planning",
  "requestType" : "manual",
  "status" : "pending"
} ]
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X GET "https://app.timebutler.com/api/v2/time-entry-requests" \
  -H "Authorization: Bearer <token>"
POST/time-entry-requests/{id}/reject

Zeiterfassungsantrag ablehnen

Lehnt den ausstehenden Änderungs- oder Löschantrag für den angegebenen Zeiteintrag ab. Ein optionaler Ablehnungsgrund kann im Anfragetext angegeben werden. Der Mitarbeiter wird per E-Mail benachrichtigt. Erfordert die Rolle `MANAGER` oder `ADMIN`.

Autorisierungen:
bearerAuth
Pfad-Parameter
NameTypDescription
iderforderlichinteger(int32)ID des Zeiteintrags.
Anfragekörper

Optionaler Ablehnungsgrund.

Anfragekörper-Schema:
NameTypDescription
reasonstringOptionaler Freitextgrund für die Ablehnung. Wird am Antrag gespeichert und dem Mitarbeiter angezeigt.
Antworten
200Antrag abgelehnt; gibt den Zeiteintrag im aktuellen Status zurück.
Antwort-Schema:
NameTypDescription
idstringInterne ID des Zeiteintrags.
employeeIdstringInterne ID des Mitarbeiters, der den Zeiteintrag eingereicht hat. Nur in Team-/Manageransichten vorhanden.
employeeNamestringAnzeigename des Mitarbeiters, der den Zeiteintrag eingereicht hat. Nur in Team-/Manageransichten vorhanden.
datestringDatum des Zeiteintrags im ISO-8601-Format (`YYYY-MM-DD`).
startTimestringEinstempelzeit im Format `HH:mm`.
endTimestringAusstempelzeit im Format `HH:mm`.
workedMinutesinteger(int32)Nettoarbeitszeit für diesen Eintrag, in Minuten (Gesamtdauer minus Pausen).
breakMinutesinteger(int32)Gesamte Pausenzeit für diesen Eintrag, in Minuten.
projectstringName des Projekts, das diesem Eintrag zugeordnet ist. `null`, wenn kein Projekt zugeordnet wurde.
categorystringName der Kategorie, die diesem Eintrag zugeordnet ist. `null`, wenn keine Kategorie zugeordnet wurde.
remarksstringFreitextkommentar, der diesem Eintrag beigefügt ist. `null`, wenn kein Kommentar eingegeben wurde.
requestTypestringTyp der Anfrage, die diesen Eintrag erzeugt hat. Einer von `manual` (manuell eingegeben) oder `clock` (durch Ausstempeln erstellt).
Mögliche Werte: manual clock
statusstringGenehmigungsstatus dieses Zeiteintrags. Einer von `pending` (wartet auf Genehmigung) oder `approved`.
Mögliche Werte: pending approved
Antwortbeispiele
{
  "id" : "98765",
  "employeeId" : "42",
  "employeeName" : "Maria Müller",
  "date" : "2025-07-28",
  "startTime" : "08:00",
  "endTime" : "17:00",
  "workedMinutes" : 480,
  "breakMinutes" : 60,
  "project" : "Website Relaunch",
  "category" : "Internal project",
  "remarks" : "Sprint planning",
  "requestType" : "manual",
  "status" : "pending"
}
400Zeiterfassung für dieses Unternehmen nicht aktiv.
401Das Inhaber-Token fehlt oder ist ungültig.
403Der Aufrufer ist kein Vorgesetzter oder Administrator, oder nur Administratoren dürfen in diesem Unternehmen ablehnen.
404Zeiteintrag nicht gefunden.
409Kein ausstehender Antrag für diesen Eintrag.
500Unerwarteter Serverfehler.
Anforderungsbeispiele
curl -X POST "https://app.timebutler.com/api/v2/time-entry-requests/{id}/reject" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Insufficient staffing during that period"}'