Zum Inhalt springen
EN

Für Entwickler

Die Tiveo-API Beta

ab Business

Beschäftigte, Abwesenheiten, Zeiten und Schichten aus Tiveo in Ihre eigenen Systeme holen.

  • REST mit JSON, beschrieben als OpenAPI 3.1
  • In der Beta nur lesen, Schreiben ist geplant
  • Schlüssel mit Rechten, jeder Aufruf im Protokoll

Schnellstart

In drei Schritten zur ersten Antwort.

  1. Schlüssel anlegen

    Eigentümer oder Administration: Einstellungen › Schnittstellen › API. Rechte wählen, auf Wunsch ein Ablaufdatum. Sichern Sie den Schlüssel sofort, er wird nur einmal angezeigt.

  2. Ersten Aufruf senden

    /v1/me braucht kein besonderes Recht und zeigt, was der Schlüssel darf.

    curl https://api.tiveo.de/v1/me \
      -H "Authorization: Bearer tiveo_…"
  3. Antwort lesen

    Unternehmen, Rechte, Grenzen und Module. Danach weiter mit der Referenz unten.

    {
      "data": {
        "beta": true,
        "company": {
          "id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
          "name": "Tischlerei Muster GmbH",
          "country": "DE",
          "region": "NW",
          "time_zone": "Europe/Berlin"
        },
        "key": {
          "id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
          "name": "Lohnbüro",
          "scopes": [
            "employees:read",
            "absences:read"
          ],
          "expires_on": null
        },
        "limits": {
          "per_minute": 60,
          "per_day": 10000,
          "max_page_size": 200
        },
        "modules": {
          "time_tracking": true,
          "shift_planning": false,
          "vehicle_logbook": false
        },
        "write_access": false
      }
    }

Grundlagen

Anmeldung

  • Kopfzeile Authorization: Bearer tiveo_… bei jedem Aufruf
  • Format: tiveo_ und 43 Zeichen; Tiveo speichert nur den SHA-256-Wert
  • Höchstens 5 aktive Schlüssel je Unternehmen, jederzeit widerrufbar
  • Kein CORS: für Server gedacht, nie in den Browser

Blättern

  • Listen antworten mit data und next_cursor
  • limit setzt die Seitengröße: Vorgabe 50, höchstens 200
  • Nächste Seite: cursor = next_cursor, bis er null ist
  • updated_since liefert nur Änderungen, etwa für den Abgleich

Grenzen

  • Vorgabe: 60 Anfragen je Minute und 10.000 je Tag, je Unternehmen
  • Die geltenden Werte nennt /v1/me unter limits
  • Bei 429 sagt Retry-After, wann es weitergeht
Kopfzeilen jeder Antwort
RateLimit-Limit
Anfragen je Minute.
RateLimit-Remaining
Übrig in dieser Minute.
RateLimit-Reset
Sekunden bis zur nächsten Minute.
X-Daily-Limit
Anfragen je Tag.
X-Daily-Remaining
Übrig heute.
Retry-After
Nur bei 429 und 503: Sekunden bis zum nächsten Versuch.

Versionen

  • In /v1 kommen Felder und Endpunkte nur hinzu
  • Unbekannte Felder bitte ignorieren
  • Entfernen oder Umbenennen nur mit /v2; /v1 bleibt dann mindestens sechs Monate

Sensible Daten

  • Krankheit und andere sensible Arten nur mit absences:read_sensitive, sonst „abwesend“
  • Freitexte wie Gründe und Notizen der Anträge liefert die API nie
  • Jeder Aufruf wird 90 Tage protokolliert (Zeit, Pfad, Status, IP) und ist in Tiveo einsehbar

Rechte

Jeder Schlüssel trägt nur die Rechte, die Sie beim Anlegen wählen.

Recht Erlaubt Stand
employees:read Beschäftigte und Einheiten (Abteilungen, Teams, Standorte) lesen. verfügbar
absences:read Abwesenheiten, Abwesenheitsarten, Urlaubsstände und Feiertage lesen. Krankheit und andere sensible Arten erscheinen nur als „abwesend“. verfügbar
absences:read_sensitive Zusätzlich die Art sensibler Abwesenheiten (z. B. Krankheit) lesen — Gesundheitsdaten nach Art. 9 DSGVO. Nur vergeben, wenn das empfangende System das darf. verfügbar
time:read Stempelungen, Tageswerte der Zeiterfassung, Projekte und Projektzeiten lesen (Modul Zeiterfassung). verfügbar
shifts:read Veröffentlichte Schichten und Schichtarten lesen (Modul Schichtplanung). verfügbar
vehicles:read Fahrzeuge, Fahrten, Fahrzeugkosten und freigegebenes Kilometergeld lesen (Modul Fahrtenbuch). Nie die Route. verfügbar
employees:write Geplant: Beschäftigte anlegen und Stammdaten ändern. geplant
absences:write Geplant: Abwesenheiten eintragen, genehmigen, ablehnen und stornieren. geplant
time:write Geplant: Arbeitszeit buchen. geplant
shifts:write Geplant: Schichten eintragen. geplant

Fehler

Fehler kommen als application/problem+json nach RFC 9457. Entscheidend ist code; type verweist auf die Zeile hier.

{
  "type": "https://tiveo.de/entwickler/#fehler-insufficient-scope",
  "title": "API key lacks the required scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This API key needs the scope \"time:read\"."
}
Code Status Bedeutung
invalid_parameter 400 Ein Parameter fehlt oder stimmt nicht; detail nennt ihn.
invalid_key 401 Kein oder ein unbekannter API-Schlüssel.
key_revoked 401 Der Schlüssel wurde widerrufen.
key_expired 401 Der Schlüssel ist abgelaufen.
insufficient_scope 403 Dem Schlüssel fehlt das nötige Recht.
plan_required 403 Die API gibt es ab dem Paket Business.
api_paused 403 Die API ist für dieses Unternehmen angehalten.
company_locked 403 Das Konto des Unternehmens ist gesperrt oder beendet.
module_not_active 403 Das Unternehmen nutzt das Modul nicht.
write_not_available_in_beta 403 Schreiben steht in der Beta noch nicht zur Verfügung.
not_found 404 Unbekannter Pfad oder unbekannte Kennung.
method_not_allowed 405 Nur GET.
rate_limited 429 Zu viele Anfragen je Minute; Retry-After sagt, wann es weitergeht.
daily_limit_reached 429 Die Tagesgrenze des Unternehmens ist erreicht.
too_many_failed_attempts 429 Zu viele ungültige Schlüssel von dieser Adresse; Retry-After sagt, wann es weitergeht (bis zu 15 Minuten).
internal_error 500 Fehler bei Tiveo; später erneut versuchen.
server_busy 503 Die API ist ausgelastet oder die Anfrage dauerte zu lang; Retry-After beachten, Zeitraum verkleinern.

Referenz

Alle Pfade unter https://api.tiveo.de/v1. Nur GET.

Schlüssel prüfen

GET /v1/me

Recht: jeder gültige Schlüssel

Unternehmen, Rechte und Grenzen dieses Schlüssels — der erste Aufruf jeder Anbindung.

Parameter

Keine Parameter.

Felder (21)
Name Typ Bedeutung
beta boolean Die API ist in der Beta.
company object Das Unternehmen des Schlüssels.
company.id string · uuid Kennung des Unternehmens.
company.name string Name.
company.country string Land (DE, AT, CH).
company.region string oder null Standardregion für Feiertage.
company.time_zone string Zeitzone.
key object Der Schlüssel.
key.id string · uuid Kennung des Schlüssels.
key.name string Name, den das Unternehmen vergeben hat.
key.scopes array<string> Rechte.
key.expires_on string · date oder null Läuft ab (einschließlich dieses Tages gültig).
limits object Grenzen des Unternehmens.
limits.per_minute integer Anfragen je Minute.
limits.per_day integer Anfragen je Tag.
limits.max_page_size integer Größte Seite (limit).
modules object Welche Module das Unternehmen nutzt.
modules.time_tracking boolean Zeiterfassung.
modules.shift_planning boolean Schichtplanung.
modules.vehicle_logbook boolean Fahrtenbuch.
write_access boolean Schreiben möglich — in der Beta immer false.
Beispiel
{
  "data": {
    "beta": true,
    "company": {
      "id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "name": "Tischlerei Muster GmbH",
      "country": "DE",
      "region": "NW",
      "time_zone": "Europe/Berlin"
    },
    "key": {
      "id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "name": "Lohnbüro",
      "scopes": [
        "employees:read",
        "absences:read"
      ],
      "expires_on": null
    },
    "limits": {
      "per_minute": 60,
      "per_day": 10000,
      "max_page_size": 200
    },
    "modules": {
      "time_tracking": true,
      "shift_planning": false,
      "vehicle_logbook": false
    },
    "write_access": false
  }
}

Beschäftigte

GET /v1/employees GET /v1/employees/{id}

Recht: employees:read

Alle Beschäftigten des Unternehmens, auch Stammsätze ohne Konto und Ausgetretene. Ohne Beispielpersonen und Verwaltungskonten.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
status string Nur dieser Status. Werte: record_only invited active inactive left
unit_id string · uuid Nur diese Einheit (Haupteinheit).
updated_since string · date-time Nur, was seit diesem Zeitpunkt geändert wurde (ISO 8601 mit Zeitzone) — für den Abgleich.
Felder (16)
Name Typ Bedeutung
id string · uuid Kennung der Person in diesem Unternehmen.
personnel_number string oder null Personalnummer.
display_name string Angezeigter Name.
first_name string oder null Vorname (aus dem Konto, sonst leer).
last_name string oder null Nachname (aus dem Konto, sonst leer).
email string oder null E-Mail-Adresse.
role string Rolle in Tiveo. Werte: owner admin hr manager employee
status string record_only = Stammsatz ohne Konto, invited = eingeladen, active, inactive = ruht, left = ausgetreten. Werte: record_only invited active inactive left
unit_id string · uuid oder null Haupteinheit.
additional_unit_ids array<uuid> Weitere Einheiten.
region string oder null Region für Feiertage, wenn abweichend.
entry_date string · date oder null Eintritt.
exit_date string · date oder null Austritt.
weekly_hours number oder null Wochenstunden laut heutigem Arbeitsmodell.
created_at string · date-time Angelegt.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "personnel_number": "00042",
      "display_name": "Anna Achter",
      "first_name": "Anna",
      "last_name": "Achter",
      "email": "anna.achter@example.com",
      "role": "employee",
      "status": "active",
      "unit_id": "8c0e4f7a-2d1b-4c3e-9a55-6f7e8d9c0b1a",
      "additional_unit_ids": [],
      "region": null,
      "entry_date": "2024-01-01",
      "exit_date": null,
      "weekly_hours": 40,
      "created_at": "2026-03-02T08:14:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Einheiten

GET /v1/units GET /v1/units/{id}

Recht: employees:read

Bereiche, Abteilungen, Teams und Standorte als Baum (parent_id), mit Leitung.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
Felder (12)
Name Typ Bedeutung
id string · uuid Kennung.
parent_id string · uuid oder null Übergeordnete Einheit.
name string Name.
type string Art. Werte: division department team location
region string oder null Region für Feiertage.
active boolean Aktiv.
sort_order integer oder null Reihenfolge.
leads array<object> Leitung und Stellvertretung.
leads[].employee_id string · uuid Person.
leads[].kind string Leitung oder Stellvertretung. Werte: lead deputy
created_at string · date-time Angelegt.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "8c0e4f7a-2d1b-4c3e-9a55-6f7e8d9c0b1a",
      "parent_id": null,
      "name": "Werkstatt",
      "type": "team",
      "region": null,
      "active": true,
      "sort_order": 10,
      "leads": [
        {
          "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
          "kind": "lead"
        }
      ],
      "created_at": "2026-03-02T08:14:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Abwesenheitsarten

GET /v1/absence-types GET /v1/absence-types/{id}

Recht: absences:read

Urlaub, Krankheit, Homeoffice und eigene Arten des Unternehmens.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
Felder (15)
Name Typ Bedeutung
id string · uuid Kennung.
key string Schlüssel (urlaub, krankheit … oder eigener).
name object Name auf Deutsch und Englisch.
name.de string Deutsch.
name.en string Englisch.
short_name string Kürzel (1–3 Zeichen).
color string Farbe (#rrggbb).
text_color string Schriftfarbe (#rrggbb).
counts_against_allowance boolean Zählt auf den Urlaubsanspruch.
requires_approval boolean Braucht eine Genehmigung.
requires_certificate boolean Braucht einen Nachweis.
half_days_allowed boolean Halbe Tage erlaubt.
sensitive boolean Sensibel (z. B. Krankheit): ohne absences:read_sensitive maskiert.
active boolean Aktiv.
sort_order integer oder null Reihenfolge.
Beispiel
{
  "data": [
    {
      "id": "b7d1e2f3-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
      "key": "urlaub",
      "name": {
        "de": "Urlaub",
        "en": "Annual leave"
      },
      "short_name": "U",
      "color": "#1a7d57",
      "text_color": "#ffffff",
      "counts_against_allowance": true,
      "requires_approval": true,
      "requires_certificate": false,
      "half_days_allowed": true,
      "sensitive": false,
      "active": true,
      "sort_order": 10
    }
  ],
  "next_cursor": null
}

Abwesenheiten

GET /v1/absences GET /v1/absences/{id}

Recht: absences:read

Anträge und eingetragene Abwesenheiten, ohne Entwürfe und ohne Freitext. Ohne absences:read_sensitive sind sensible Arten maskiert (masked: true, type_id: null).

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
from string · date Nur Abwesenheiten, die an diesem Tag oder später enden.
to string · date Nur Abwesenheiten, die an diesem Tag oder früher beginnen.
employee_id string · uuid Nur diese Person.
status string Nur dieser Status. Werte: requested partially_approved approved rejected cancellation_requested cancelled
updated_since string · date-time Nur, was seit diesem Zeitpunkt geändert wurde (ISO 8601 mit Zeitzone) — für den Abgleich.
Felder (12)
Name Typ Bedeutung
id string · uuid Kennung.
employee_id string · uuid Person.
type_id string · uuid oder null Abwesenheitsart; null, wenn maskiert.
masked boolean Art verborgen (sensibel, Recht fehlt).
start_date string · date Erster Tag.
end_date string · date Letzter Tag.
start_day_part string Erster Tag ganz oder halb. Werte: full morning afternoon
end_day_part string Letzter Tag ganz oder halb. Werte: full morning afternoon
working_days number Arbeitstage, die die Abwesenheit kostet.
status string Stand des Antrags. Werte: requested partially_approved approved rejected cancellation_requested cancelled
created_at string · date-time Angelegt.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "type_id": "b7d1e2f3-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
      "masked": false,
      "start_date": "2026-08-03",
      "end_date": "2026-08-14",
      "start_day_part": "full",
      "end_day_part": "full",
      "working_days": 10,
      "status": "approved",
      "created_at": "2026-03-02T08:14:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Urlaubsstände

GET /v1/leave-balances

Recht: absences:read

Je Person und Jahr Anspruch, genommen, beantragt, Rest und Übertrag — live gerechnet wie in der App. Geblättert wird nach Personen.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite (eine Personen-Kennung).
year integer Jahr, Vorgabe das laufende. von 2000 bis 2100
employee_id string · uuid Nur diese Person.
Felder (12)
Name Typ Bedeutung
employee_id string · uuid Person.
year integer Jahr.
entitlement number oder null Anspruch in Tagen (mit Übertrag).
approved number oder null Genehmigt.
requested number oder null Beantragt, noch offen.
remaining number oder null Rest.
carry_over number oder null Übertrag aus dem Vorjahr.
carry_over_remaining number oder null Davon noch offen.
carry_over_expires_on string · date oder null Übertrag verfällt am.
expiring number oder null Verfällt bald.
expired number oder null Verfallen.
paid_out number oder null Ausgezahlt.
Beispiel
{
  "data": [
    {
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "year": 2026,
      "entitlement": 30,
      "approved": 18,
      "requested": 2,
      "remaining": 10,
      "carry_over": 3,
      "carry_over_remaining": 0,
      "carry_over_expires_on": "2026-03-31",
      "expiring": 0,
      "expired": 0,
      "paid_out": 0
    }
  ],
  "next_cursor": null
}

Feiertage und freie Tage

GET /v1/holidays

Recht: absences:read

Gesetzliche Feiertage (nach Land und Region) und freie Tage des Betriebs eines Jahres, nach Datum. Ohne Blättern.

Parameter

Name Typ Bedeutung
year integer Jahr, Vorgabe das laufende. von 2000 bis 2100
region string Region wie NW oder BY, Vorgabe die Standardregion des Unternehmens.
Felder (7)
Name Typ Bedeutung
date string · date Tag.
name string Name.
kind string Gesetzlich oder vom Betrieb. Werte: public_holiday company_day_off
region string oder null Region.
unit_id string · uuid oder null Nur für diese Einheit (freie Tage).
value number 1 ganzer, 0.5 halber Tag.
deducted_from_leave boolean Zählt auf den Urlaub.
Beispiel
{
  "data": [
    {
      "date": "2026-12-25",
      "name": "1. Weihnachtstag",
      "kind": "public_holiday",
      "region": "NW",
      "unit_id": null,
      "value": 1,
      "deducted_from_leave": false
    }
  ],
  "next_cursor": null
}

Stempelungen

GET /v1/time-entries

Recht: time:read nur mit Zeiterfassung

Kommen, Gehen und Pausen, wie sie gelten: ohne aufgehobene und ersetzte Buchungen. Zeitraum höchstens 93 Tage.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
from Pflicht string · date Erster Tag (JJJJ-MM-TT).
to Pflicht string · date Letzter Tag, einschließlich.
employee_id string · uuid Nur diese Person.
Felder (8)
Name Typ Bedeutung
id string · uuid Kennung.
employee_id string · uuid Person.
kind string Art. Werte: clock_in clock_out break_start break_end
timestamp string · date-time Zeitpunkt.
work_date string · date Arbeitstag, dem die Buchung gehört.
source string Herkunft. Werte: app terminal manual correction import automatic sample
location string oder null Ort. Werte: on_site remote
recorded_at string · date-time Erfasst am.
Beispiel
{
  "data": [
    {
      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "kind": "clock_in",
      "timestamp": "2026-10-19T06:58:00Z",
      "work_date": "2026-10-19",
      "source": "app",
      "location": "on_site",
      "recorded_at": "2026-10-19T06:58:02Z"
    }
  ],
  "next_cursor": null
}

Tageswerte

GET /v1/timesheets

Recht: time:read nur mit Zeiterfassung

Je Person und Tag Arbeit, Pause, Soll und Saldo in Minuten — gerechnet wie „Meine Zeiten“. Zeitraum höchstens 62 Tage; limit zählt Personen (Vorgabe 10, höchstens 25).

Parameter

Name Typ Bedeutung
limit integer Personen je Seite, Vorgabe 10.
cursor string · uuid next_cursor der vorigen Seite (eine Personen-Kennung).
from Pflicht string · date Erster Tag; höchstens 62 Tage bis to.
to Pflicht string · date Letzter Tag, einschließlich.
employee_id string · uuid Nur diese Person.
Felder (15)
Name Typ Bedeutung
employee_id string · uuid Person.
date string · date Tag.
recorded boolean Es gibt Buchungen.
start string · date-time oder null Beginn.
end string · date-time oder null Ende.
work_minutes integer oder null Arbeit.
break_minutes integer oder null Pause.
deducted_break_minutes integer oder null Pause, die nach der Pausenregel abgezogen wurde.
target_minutes integer oder null Soll.
credit_minutes integer oder null Gutschrift (Urlaub, Krankheit, Feiertag).
balance_minutes integer oder null Saldo des Tages. Leer, wenn der Tag noch läuft oder der Betrieb offene Tage getrennt führt und das Gehen fehlt (open).
open boolean oder null Unvollständig (z. B. Gehen fehlt).
running boolean oder null Läuft gerade.
violations array<string> Hinweise nach Arbeitszeitgesetz (Kürzel).
absent boolean An dem Tag abwesend (ohne Art).
Beispiel
{
  "data": [
    {
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "date": "2026-10-19",
      "recorded": true,
      "start": "2026-10-19T06:58:00Z",
      "end": "2026-10-19T15:31:00Z",
      "work_minutes": 483,
      "break_minutes": 30,
      "deducted_break_minutes": 0,
      "target_minutes": 480,
      "credit_minutes": 0,
      "balance_minutes": 3,
      "open": false,
      "running": false,
      "violations": [],
      "absent": false
    }
  ],
  "next_cursor": null
}

Projekte

GET /v1/projects GET /v1/projects/{id}

Recht: time:read nur mit Zeiterfassung

Projekte, auf die Beschäftigte Zeit buchen.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
Felder (8)
Name Typ Bedeutung
id string · uuid Kennung.
number string oder null Projektnummer.
title string Titel.
link string oder null Verweis.
contact_employee_id string · uuid oder null Ansprechperson.
active boolean Aktiv.
created_at string · date-time Angelegt.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f",
      "number": "P-2026-014",
      "title": "Dachstuhl Hauptstraße",
      "link": null,
      "contact_employee_id": null,
      "active": true,
      "created_at": "2026-03-02T08:14:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Projektzeiten

GET /v1/project-times

Recht: time:read nur mit Zeiterfassung

Gebuchte Minuten je Person, Tag und Projekt. Zeitraum höchstens 93 Tage.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
from Pflicht string · date Erster Tag (JJJJ-MM-TT).
to Pflicht string · date Letzter Tag, einschließlich.
employee_id string · uuid Nur diese Person.
project_id string · uuid Nur dieses Projekt.
Felder (9)
Name Typ Bedeutung
id string · uuid Kennung.
employee_id string · uuid Person.
date string · date Tag.
project_id string · uuid oder null Projekt; leer bei freiem Text.
text string oder null Freier Text statt Projekt.
minutes integer Minuten.
note string oder null Notiz.
recorded_at string · date-time Erfasst am.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "d5e6f7a8-b9c0-4d1e-8f2a-3b4c5d6e7f80",
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "date": "2026-10-19",
      "project_id": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f",
      "text": null,
      "minutes": 240,
      "note": null,
      "recorded_at": "2026-10-19T15:40:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Schichtarten

GET /v1/shift-types GET /v1/shift-types/{id}

Recht: shifts:read nur mit Schichtplanung

Früh, Spät, Bereitschaft und weitere Arten mit Zeiten.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
Felder (11)
Name Typ Bedeutung
id string · uuid Kennung.
unit_id string · uuid oder null Einheit.
name string Name.
short_name string Kürzel.
color string Farbe (#rrggbb).
start_time string · time oder null Beginn (Ortszeit).
end_time string · time oder null Ende (Ortszeit).
break_minutes integer Pause.
kind string Art. Werte: shift on_call_duty standby training appointment
active boolean Aktiv.
sort_order integer oder null Reihenfolge.
Beispiel
{
  "data": [
    {
      "id": "f7a8b9c0-d1e2-4f3a-9b4c-5d6e7f8a9b0c",
      "unit_id": "8c0e4f7a-2d1b-4c3e-9a55-6f7e8d9c0b1a",
      "name": "Frühdienst",
      "short_name": "F",
      "color": "#2563eb",
      "start_time": "06:00:00",
      "end_time": "14:00:00",
      "break_minutes": 30,
      "kind": "shift",
      "active": true,
      "sort_order": 10
    }
  ],
  "next_cursor": null
}

Schichten

GET /v1/shifts

Recht: shifts:read nur mit Schichtplanung

Veröffentlichte Schichten, auch ausgefallene und abgesagte; keine Entwürfe, keine Notizen. Zeitraum höchstens 93 Tage.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
from Pflicht string · date Erster Tag (JJJJ-MM-TT).
to Pflicht string · date Letzter Tag, einschließlich.
employee_id string · uuid Nur diese Person.
unit_id string · uuid Nur diese Einheit.
Felder (12)
Name Typ Bedeutung
id string · uuid Kennung.
employee_id string · uuid oder null Person; leer bei offener Schicht.
unit_id string · uuid Einheit.
shift_type_id string · uuid oder null Schichtart.
date string · date Tag.
start string · date-time Beginn.
end string · date-time Ende.
break_minutes integer Pause.
status string Stand. Werte: published dropped cancelled
dropped_reason string oder null Grund eines Ausfalls; „sickness“ nur mit absences:read_sensitive, sonst „absence“. Werte: leave sickness absence company
published_at string · date-time oder null Veröffentlicht am.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "0a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "unit_id": "8c0e4f7a-2d1b-4c3e-9a55-6f7e8d9c0b1a",
      "shift_type_id": "f7a8b9c0-d1e2-4f3a-9b4c-5d6e7f8a9b0c",
      "date": "2026-10-20",
      "start": "2026-10-20T04:00:00Z",
      "end": "2026-10-20T12:00:00Z",
      "break_minutes": 30,
      "status": "published",
      "dropped_reason": null,
      "published_at": "2026-10-01T09:00:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Fahrzeuge

GET /v1/vehicles GET /v1/vehicles/{id}

Recht: vehicles:read nur mit Fahrtenbuch

Firmenfahrzeuge (Pool und Dienstwagen) und eigene Autos von Beschäftigten für Kilometergeld, auch ausgemusterte.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
Felder (18)
Name Typ Bedeutung
id string · uuid Kennung.
license_plate string Kennzeichen.
name string oder null Bezeichnung.
kind string Firmenfahrzeug oder eigenes Auto einer beschäftigten Person. Werte: company private
usage string oder null Poolfahrzeug oder Dienstwagen; leer beim eigenen Auto. Werte: pool assigned
private_use boolean Privatfahrten erlaubt.
drive string Antrieb. Werte: combustion hybrid electric
list_price number oder null Bruttolistenpreis in Euro.
first_registration string · date oder null Erstzulassung.
start_odometer integer Kilometerstand zu Beginn des Fahrtenbuchs.
logbook_from string · date Fahrtenbuch ab.
inspection_due string · date oder null Hauptuntersuchung fällig.
safety_check_due string · date oder null UVV-Prüfung fällig.
owner_employee_id string · uuid oder null Halterin oder Halter beim eigenen Auto.
unit_id string · uuid oder null Standort.
retired_on string · date oder null Ausgemustert ab.
created_at string · date-time Angelegt.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
      "license_plate": "D-AB 123",
      "name": "Caddy",
      "kind": "company",
      "usage": "pool",
      "private_use": false,
      "drive": "combustion",
      "list_price": 38500,
      "first_registration": "2024-03-01",
      "start_odometer": 12500,
      "logbook_from": "2026-11-01",
      "inspection_due": "2027-05-31",
      "safety_check_due": null,
      "owner_employee_id": null,
      "unit_id": null,
      "retired_on": null,
      "created_at": "2026-03-02T08:14:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Fahrten

GET /v1/trips

Recht: vehicles:read nur mit Fahrtenbuch

Fahrten in ihrer gültigen Fassung, ohne aufgehobene. Privatfahrt und Arbeitsweg nur mit Tag und Kilometern. Geschützte Geschäftspartner nur als Nummer. Nie die Route. Zeitraum höchstens 93 Tage.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
from Pflicht string · date Erster Tag (JJJJ-MM-TT).
to Pflicht string · date Letzter Tag, einschließlich.
employee_id string · uuid Nur diese Person.
vehicle_id string · uuid Nur dieses Fahrzeug.
Felder (25)
Name Typ Bedeutung
id string · uuid Kennung der Fahrt (gleich über alle Fassungen).
version integer Fassung; jede Änderung ist eine neue.
journey_id string · uuid Reise: Teile einer Mischfahrt haben dieselbe.
split_from_id string · uuid oder null Abgeteilt aus dieser Fahrt.
vehicle_id string · uuid Fahrzeug.
employee_id string · uuid Fahrende Person.
category string Betrieblich, privat oder Arbeitsweg. Werte: business private commute
date string · date Tag (Ortszeit).
start string · date-time oder null Beginn; leer bei Privatfahrt und Arbeitsweg.
end string · date-time oder null Ende; leer, solange sie läuft, und bei Privatfahrt und Arbeitsweg.
odometer_start integer oder null Kilometerstand am Beginn.
odometer_end integer oder null Kilometerstand am Ende.
distance_km integer oder null Gefahrene Kilometer.
origin string oder null Start; geschützte Partner als „Nr. 17“.
destination string oder null Reiseziel; geschützte Partner als „Nr. 17“.
purpose string oder null Reisezweck.
business_partner string oder null Aufgesuchter Geschäftspartner; geschützte Partner als „Nr. 17“.
detour string oder null Umweg und Grund.
project_id string · uuid oder null Projekt.
status string Läuft, offen (kann noch ergänzt werden) oder abgeschlossen. Werte: running open closed
incomplete boolean Es fehlen Angaben.
changed boolean Nach der Erfassung geändert (Verlauf in Tiveo).
late_entry boolean Nachgetragen oder nach der Frist erfasst.
recorded_at string · date-time oder null Erfasst am (erste Fassung); leer bei Privatfahrt und Arbeitsweg.
updated_at string · date-time oder null Diese Fassung erfasst am; leer bei Privatfahrt und Arbeitsweg.
Beispiel
{
  "data": [
    {
      "id": "2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f",
      "version": 2,
      "journey_id": "2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f",
      "split_from_id": null,
      "vehicle_id": "1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "category": "business",
      "date": "2026-11-03",
      "start": "2026-11-03T07:40:00Z",
      "end": "2026-11-03T08:25:00Z",
      "odometer_start": 12500,
      "odometer_end": 12542,
      "distance_km": 42,
      "origin": "Werkstatt",
      "destination": "Kunde Meier, Hauptstraße 1, 40210 Düsseldorf",
      "purpose": "Wartung Heizung",
      "business_partner": "Herr Meier",
      "detour": null,
      "project_id": null,
      "status": "closed",
      "incomplete": false,
      "changed": false,
      "late_entry": false,
      "recorded_at": "2026-11-03T07:40:05Z",
      "updated_at": "2026-11-03T08:26:10Z"
    }
  ],
  "next_cursor": null
}

Fahrzeugkosten

GET /v1/vehicle-costs

Recht: vehicles:read nur mit Fahrtenbuch

Kosten je Fahrzeug, ohne Notiz und ohne Beleg (nur ob es einen gibt). Zeitraum höchstens 366 Tage.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
from Pflicht string · date Erster Tag (JJJJ-MM-TT).
to Pflicht string · date Letzter Tag, einschließlich.
vehicle_id string · uuid Nur dieses Fahrzeug.
Felder (11)
Name Typ Bedeutung
id string · uuid Kennung.
vehicle_id string · uuid Fahrzeug.
date string · date Tag.
kind string Art. Werte: fuel charging workshop tyres insurance tax leasing financing depreciation tolls_parking cleaning other
amount_gross number Betrag brutto in Euro.
amount_net number oder null Betrag netto in Euro.
quantity number oder null Menge (Liter oder kWh).
odometer integer oder null Kilometerstand.
has_receipt boolean Ein Beleg liegt in Tiveo.
recorded_at string · date-time Erfasst am.
updated_at string · date-time Zuletzt geändert.
Beispiel
{
  "data": [
    {
      "id": "3d4e5f6a-7b8c-4d9e-8f0a-1b2c3d4e5f6a",
      "vehicle_id": "1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e",
      "date": "2026-11-04",
      "kind": "fuel",
      "amount_gross": 71.4,
      "amount_net": 60,
      "quantity": 38.2,
      "odometer": 12542,
      "has_receipt": true,
      "recorded_at": "2026-11-04T16:02:00Z",
      "updated_at": "2026-10-01T12:30:00Z"
    }
  ],
  "next_cursor": null
}

Kilometergeld

GET /v1/mileage-allowances

Recht: vehicles:read nur mit Fahrtenbuch

Freigegebenes Kilometergeld für betriebliche Fahrten mit dem eigenen Auto: die jüngste Fassung je Person und Monat.

Parameter

Name Typ Bedeutung
limit integer Einträge je Seite, Vorgabe 50, höchstens die Seitengröße des Unternehmens (meist 200).
cursor string · uuid next_cursor der vorigen Seite.
year integer Jahr, Vorgabe das laufende. von 2000 bis 2100
employee_id string · uuid Nur diese Person.
Felder (9)
Name Typ Bedeutung
id string · uuid Kennung dieser Freigabe.
employee_id string · uuid Person.
month string · date Monat (der Erste).
version integer Fassung; eine neue Freigabe ersetzt die alte.
distance_km integer Kilometer.
rate number Satz je Kilometer in Euro.
amount number Betrag in Euro.
trip_count integer Fahrten.
approved_at string · date-time Freigegeben am.
Beispiel
{
  "data": [
    {
      "id": "4e5f6a7b-8c9d-4e0f-9a1b-2c3d4e5f6a7b",
      "employee_id": "3f2a9c1e-7b4d-4e8a-9f61-2c5d8e0b1a74",
      "month": "2026-10-01",
      "version": 1,
      "distance_km": 420,
      "rate": 0.3,
      "amount": 126,
      "trip_count": 18,
      "approved_at": "2026-11-02T09:15:00Z"
    }
  ],
  "next_cursor": null
}

Schreiben geplant

Geplant und schon beschrieben. In der Beta antworten diese Wege immer mit 403 write_not_available_in_beta.

Name Recht Bedeutung
POST /v1/absences absences:write Abwesenheit eintragen (geplant) Trägt eine Abwesenheit ein oder stellt einen Antrag — mit den Regeln der App (Genehmigung, Sperren, Lizenz).
POST /v1/absences/{id}/approve absences:write Antrag genehmigen (geplant) Genehmigt einen offenen Antrag.
POST /v1/absences/{id}/reject absences:write Antrag ablehnen (geplant) Lehnt einen offenen Antrag ab.
POST /v1/absences/{id}/cancel absences:write Abwesenheit stornieren (geplant) Storniert eine Abwesenheit.
POST /v1/time-entries time:write Arbeitszeit buchen (geplant) Bucht Kommen, Gehen oder Pause.
POST /v1/employees employees:write Beschäftigte anlegen (geplant) Legt einen Stammsatz an.
PATCH /v1/employees/{id} employees:write Stammdaten ändern (geplant) Ändert Name, Personalnummer, Einheit, Eintritt oder Austritt.

OpenAPI

Die vollständige Beschreibung zum Einlesen in Postman, Insomnia oder einen Code-Generator.

Was „Beta“ heißt

Als Beta ist die API eine freiwillige Zusatzleistung und gehört nicht zum vereinbarten Leistungsumfang; wir können sie ändern oder einstellen (AGB § 4 Abs. 8). Solange es /v1 gibt, gilt dafür die Regel zu den Versionen oben.

Allgemeine Geschäftsbedingungen, § 4 →

Weiterlesen