REST-API einrichten und nutzen
Freie Termine abfragen und Termine buchen – direkt aus Ihrer eigenen Anwendung heraus.
Die API arbeitet mit JSON und wird über die Adresse https://example.com/api aufgerufen.
Der Buchungsablauf besteht aus sechs Aufrufen, die aufeinander aufbauen: Kalender, Termingrund, Tag, Uhrzeit, Formularfelder und schließlich die Buchung.
Alle Aufrufe erfolgen von Ihrem Server aus, nicht aus dem Browser Ihrer Kunden.
Schritt 1: API aktivieren und Token erzeugen
Die API ist im Auslieferungszustand abgeschaltet. Sie aktivieren sie im Administrationsbereich.
- Klicken Sie in der Navigation auf Konfiguration.
- Klicken Sie in der Unternavigation auf Allgemeine Einstellungen.
- Klicken Sie in der Liste auf Schnittstelle.
- Schalten Sie Schnittstelle aktivieren ein. Die Änderung wird sofort gespeichert.
- Klicken Sie auf Neuen Token generieren, um den Zugangs-Token für die Schnittstelle zu erzeugen.
- Kopieren Sie den angezeigten Token sofort und bewahren Sie ihn sicher auf, er wird nicht erneut angezeigt.
Bildschirmfotos
Klicken Sie in der Navigation auf Konfiguration
1
Klicken Sie in der Unternavigation auf Allgemeine Einstellungen
2
Klicken Sie in der Liste auf Schnittstelle
3
Schalten Sie Schnittstelle aktivieren ein. Die Änderung wird sofort gespeichert
4
Klicken Sie auf Neuen Token generieren, um den Zugangs-Token für die Schnittstelle zu erzeugen
5
Kopieren Sie den angezeigten Token sofort und bewahren Sie ihn sicher auf, er wird nicht erneut angezeigt
6
Das Token beginnt mit apm_, gefolgt von 64 Zeichen, und wird nur ein einziges Mal angezeigt. Im System wird ausschließlich ein Hash gespeichert, das Token selbst lässt sich später nicht mehr auslesen.
Es gibt genau ein Token pro Installation: Erzeugen Sie ein neues Token, verliert das bisherige sofort seine Gültigkeit.
Das Token senden Sie bei jedem Aufruf im Kopfbereich der Anfrage mit:
Authorization: Bearer apm_ihr-token
Schritt 2: Verbindung prüfen und Terminkalender abfragen
Mit dem ersten Aufruf prüfen Sie die Verbindung und erhalten die Nummern Ihrer Terminkalender.
curl -H "Authorization: Bearer apm_ihr-token" \
https://example.com/api/schedules
Antwort:
{
"data": [
{ "id": 1, "name": "Hauptstandort" },
{ "id": 2, "name": "Filiale" }
]
}
Die id des gewünschten Kalenders verwenden Sie in allen weiteren Aufrufen als Parameter schedule.
Schritt 3: Termingründe abfragen
curl -H "Authorization: Bearer apm_ihr-token" \
"https://example.com/api/reasons?schedule=1"
Antwort:
{
"data": [
{
"id": 1,
"name": "Beratungsgespräch",
"description": "Standardberatung",
"duration": 1800
},
{
"id": 2,
"name": "Folgetermin",
"description": "",
"duration": 900
}
]
}
duration ist die Dauer in Sekunden (1800 Sekunden entsprechen 30 Minuten).
Die id verwenden Sie weiter als Parameter reason. Sind für einen Kalender keine Termingründe eingerichtet, ist data leer.
Schritt 4: Tage mit freien Terminen abfragen
curl -H "Authorization: Bearer apm_ihr-token" \
"https://example.com/api/days?schedule=1&reason=1"
Antwort:
{
"data": ["2026-05-23", "2026-05-24", "2026-05-26"]
}
Zurückgegeben werden nur Tage, an denen mindestens eine Terminzeit frei ist. Wie weit die Liste in die Zukunft reicht, bestimmen die Einstellungen Ihres Terminkalenders.
Schritt 5: Freie Uhrzeiten eines Tages abfragen
curl -H "Authorization: Bearer apm_ihr-token" \
"https://example.com/api/slots?schedule=1&reason=1&day=2026-05-23"
Antwort:
{
"data": [
"2026-05-23 09:00:00",
"2026-05-23 09:30:00",
"2026-05-23 10:00:00"
]
}
Die Zeitangaben sind Ortszeiten Ihrer Installation, das Format ist immer JJJJ-MM-TT HH:MM:SS.
Schritt 6: Formularfelder der Buchung abfragen
Welche Felder für eine Buchung benötigt werden, legen Sie selbst im Terminplaner fest. Fragen Sie die Felder deshalb immer ab, statt sie im eigenen Programm fest einzutragen.
Das Leerzeichen im Parameter slot muss als %20 kodiert werden.
curl -H "Authorization: Bearer apm_ihr-token" \
"https://example.com/api/forms?schedule=1&reason=1&slot=2026-05-23%2009:00:00"
Antwort:
{
"data": {
"first_name": {
"form_type": "textbox",
"input_type": "text",
"label": "Vorname",
"required": true,
"value": ""
},
"last_name": {
"form_type": "textbox",
"input_type": "text",
"label": "Nachname",
"required": true,
"value": ""
},
"email": {
"form_type": "textbox",
"input_type": "email",
"label": "E-Mail-Adresse",
"required": false,
"value": ""
}
}
}
Alle Felder mit "required": true müssen bei der Buchung gefüllt sein. Das Feld password wird von der API nie ausgegeben.
Schritt 7: Termin buchen
Die Buchung ist der einzige Aufruf mit der Methode POST. Der Kopfbereich muss Content-Type: application/json enthalten.
In submission tragen Sie die Werte zu den Feldnamen aus Schritt 6 ein.
curl -X POST https://example.com/api/bookings \
-H "Authorization: Bearer apm_ihr-token" \
-H "Content-Type: application/json" \
-d '{
"schedule": 1,
"reason": 1,
"slot": "2026-05-23 09:00:00",
"submission": {
"first_name": "Hans",
"last_name": "Pitt",
"email": "hans.pitt@example.com"
}
}'
Antwort bei Erfolg (Status 201):
{
"booking_id": 142,
"booking_details_id": "a3f8c2d1e5b6",
"user_id": 87,
"slot": "2026-05-23T09:00:00Z"
}
booking_id– die Nummer des Termins für Ihre eigenen Unterlagenbooking_details_id– die Kennung, mit der Ihr Kunde seine Termindetails aufrufen kannuser_id– der bei der Buchung angelegte Kundendatensatzslot– der Terminbeginn, hier in UTC nach ISO 8601
Der Termin ist damit im Terminplaner eingetragen. Die Benachrichtigungs-E-Mails werden wie bei jeder anderen Buchung verschickt.
Fehlermeldungen
Fehler werden ebenfalls als JSON ausgegeben, zum Beispiel {"error":"Unauthorized"}.
- 400 Invalid request –
scheduleoderreasonist keine Zahl,slothat nicht das FormatJJJJ-MM-TT HH:MM:SSodersubmissionfehlt. - 400 Invalid JSON – der gesendete Datensatz ist kein gültiges JSON.
- 400 Required field empty – ein Pflichtfeld aus Schritt 6 fehlt. Das betroffene Feld steht in
field. - 401 Unauthorized – Token fehlt, ist falsch oder wurde durch ein neues ersetzt. Manche Server entfernen den
Authorization-Kopfbereich; fragen Sie im Zweifel Ihren Provider. - 404 Schedule/Reason/Day/Slot not found – die angefragte Nummer, der Tag oder die Uhrzeit ist nicht (mehr) verfügbar.
- 404 Not found – die Adresse ist falsch oder ein Parameter fehlt beziehungsweise hat ein falsches Format. Fehlende Parameter erzeugen also keinen Fehler 400, sondern 404.
- 415 Unsupported Media Type – bei der Buchung fehlt
Content-Type: application/json. - 429 Too Many Requests – das Limit von 300 Anfragen pro Minute ist erreicht. Der Kopfbereich
Retry-Afternennt die Wartezeit in Sekunden. - 500 Failed to create user/appointment – der Termin konnte nicht gespeichert werden.
- 503 API disabled – die API ist nicht aktiviert (siehe Schritt 1).
- 503 Not configured – die Installation ist noch nicht abgeschlossen.
Hinweise
- Die Reihenfolge der Aufrufe ist verbindlich: Jeder Aufruf liefert die Angabe, die der nächste benötigt.
- Zeiten werden in Ortszeit gesendet, die Antwort der Buchung enthält den Termin in UTC.
- Zwischen dem Abfragen einer freien Uhrzeit und der Buchung kann der Termin von jemand anderem belegt werden. Fragen Sie in diesem Fall (Fehler 404 Slot not found) die freien Zeiten erneut ab.
- Kalender und Termingründe ändern sich selten und können zwischengespeichert werden. Freie Tage und Uhrzeiten sollten Sie jeweils frisch abfragen.
- Die API ist für die Kommunikation zwischen Servern gedacht. Es werden keine CORS-Kopfzeilen gesendet, ein Aufruf direkt aus dem Browser ist deshalb nicht möglich. Das Token darf nicht in eine Website oder App eingebaut werden.
- Jede Buchung legt einen Kundendatensatz an. Termine aus der API sind im Terminplaner als Quelle
apierkennbar. - Nicht enthalten sind derzeit: Absagen und Verschieben von Terminen, das Auslesen bestehender Termine sowie eine seitenweise Ausgabe. Für automatische Meldungen an externe Systeme nutzen Sie bitte das Modul Webhooks.
- Die vollständige technische Referenz mit allen Parametern, Statuscodes und Schemas finden Sie unter REST-API Referenz, die maschinenlesbare Beschreibung nach OpenAPI 3.1 als openapi.json. Beide Dateien liegen auch in Ihrer eigenen Installation unter
https://example.com/api/docs.htmlundhttps://example.com/api/openapi.json.
Zurück zur Übersicht: Modul "API (Schnittstelle)".