Für Entwickler

MeisterTakt API und Webhooks

Schlüssel erzeugen Administratoren unter Einstellungen, API & Integrationen. Die vollständige Beschreibung gibt es als OpenAPI-Datei.

Schnellstart

# Kunden lesen
curl https://meistertakt.de/api/v1/customers?limit=10 \
  -H "Authorization: Bearer mt_IHR_SCHLUESSEL"

# Kunden anlegen. Mit "external" aktualisiert ein zweiter Aufruf, statt zu verdoppeln.
curl -X POST https://meistertakt.de/api/v1/customers \
  -H "Authorization: Bearer mt_IHR_SCHLUESSEL" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Muster GmbH",
    "type": "GEWERBLICH",
    "contact": "Anna Muster",
    "address": "Musterweg 1, 12345 Musterstadt",
    "phone": "+49 30 1234567",
    "email": "info@muster.example",
    "external": { "system": "mein-shop", "id": "K-1001" }
  }'
  • Listen liefern höchstens 200 Einträge je Seite, gesteuert über limit und offset.
  • Mit updatedSince holen Sie nur seit dem letzten Abgleich geänderte Datensätze.
  • Je Schlüssel sind 120 Anfragen pro Minute möglich, danach antwortet die API mit 429.
  • Fehler kommen einheitlich als JSON mit error.code und error.message. Festgeschriebene Monate lehnen Buchungen mit 409 ab.
  • Lohn-, Bank- und Steuerdaten sowie Zugangsdaten gibt die API nicht heraus.

Endpunkte

AufrufZweckBerechtigung
GET /api/v1/employeesMitarbeiter auflistenemployees:read
GET /api/v1/employees/{id}Mitarbeiter lesenemployees:read
GET /api/v1/customersKunden auflistencustomers:read
POST /api/v1/customersKunden anlegen oder über external aktualisierencustomers:write
GET /api/v1/customers/{id}Kunden lesencustomers:read
PATCH /api/v1/customers/{id}Kunden änderncustomers:write
GET /api/v1/materialsMaterial auflistenmaterials:read
POST /api/v1/materialsMaterial anlegen oder über external aktualisierenmaterials:write
GET /api/v1/materials/{id}Material lesenmaterials:read
PATCH /api/v1/materials/{id}Material ändernmaterials:write
GET /api/v1/ordersAufträge auflistenorders:read
POST /api/v1/ordersAuftrag anlegen oder über external aktualisierenorders:write
GET /api/v1/orders/{id}Auftrag lesenorders:read
PATCH /api/v1/orders/{id}Auftrag ändernorders:write
GET /api/v1/time-eventsStempel auflistentime:read
POST /api/v1/time-eventsStempel buchen. Festgeschriebene Monate werden abgelehnt.time:write
GET /api/v1/time-entriesManuelle Zeiteinträge auflistentime:read
GET /api/v1/absencesAbwesenheiten auflistenabsences:read
POST /api/v1/absencesAbwesenheitsantrag stellenabsences:write
GET /api/v1/period-locksMonatsabschlüsse auflistentime:read

Berechtigungen

BerechtigungErlaubt
employees:readMitarbeiter lesen (ohne Lohn- und Bankdaten)
customers:readKunden lesen
customers:writeKunden anlegen und ändern
materials:readMaterial lesen
materials:writeMaterial anlegen und ändern
orders:readAufträge lesen
orders:writeAufträge anlegen und ändern
time:readStempel, Zeiteinträge und Monatsabschlüsse lesen
time:writeStempel buchen
absences:readAbwesenheiten lesen
absences:writeAbwesenheitsanträge stellen

Webhooks

MeisterTakt ruft Ihre HTTPS-Adresse auf, sobald ein Ereignis eintritt. Die Nachricht trägt nur Kennungen, Details holen Sie über die API. Bei Fehlern folgen bis zu sechs Wiederholungen mit wachsendem Abstand, zuletzt nach 24 Stunden.

POST /ihr/webhook
x-meistertakt-event: order.created
x-meistertakt-delivery: 3f1c...
x-meistertakt-timestamp: 1793523600
x-meistertakt-signature: sha256=8a2f...

{
  "id": "b7e4...",
  "type": "order.created",
  "createdAt": "2026-11-01T12:00:00.000Z",
  "data": { "id": "c91d..." }
}
import { createHmac, timingSafeEqual } from "node:crypto";

function isValid(rawBody, headers, secret) {
  const timestamp = headers["x-meistertakt-timestamp"];
  // Alte Nachrichten verwerfen, damit sich nichts wiederholen lässt.
  if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;

  const expected = createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex");
  const received = headers["x-meistertakt-signature"].replace("sha256=", "");

  return (
    expected.length === received.length &&
    timingSafeEqual(Buffer.from(expected), Buffer.from(received))
  );
}
EreignisBedeutung
customer.createdKunde angelegt
customer.updatedKunde geändert
material.createdMaterial angelegt
material.updatedMaterial geändert
order.createdAuftrag angelegt
order.updatedAuftrag geändert
absence.approvedAbwesenheit genehmigt
period.lockedMonat festgeschrieben

Sie möchten die Anbindung nicht selbst bauen?

Im Enterprise-Tarif setzen wir individuelle Anbindungen als Projekt um.

Tarife ansehen