Termin buchen
Legt einen neuen Servicetermin an. Der Kunde muss vorab über die Kunden-API angelegt oder gesucht werden.
Request
POST /api/oauth/v2/resource/appointments/service
Header
| Header | Wert |
|---|---|
Authorization | Bearer {access_token} |
Content-Type | application/json |
Erforderlicher Scope: appointments
Request-Body
json
{
"userId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"locationId": "b2c3d4e5-f6a7-8901-bcde-f01234567890",
"serviceId": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"customerId": "e5f6a7b8-c9d0-1234-efab-234567890123",
"status": "active",
"start": "2026-04-02T09:00:00+02:00",
"notes": "Bitte nüchtern erscheinen"
}Request-Felder
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
userId | string (UUID) | Ja | ID des buchenden Mitarbeiters |
locationId | string (UUID) | Ja | ID des Standorts |
serviceId | string (UUID) | Ja | ID der Leistung |
customerId | string (UUID) | Ja | ID des Kunden |
status | string | Nein | Terminstatus: active (Standard) oder request (Terminanfrage) |
start | string (ISO 8601) | Ja | Gewünschter Terminbeginn |
notes | string | Nein | Interne Notiz zum Termin |
availabilityCheck | string | Nein | Verfügbarkeitsprüfung: full (vollständig inkl. Öffnungszeiten), overlap (Standard, nur Doppelbuchungen), none (keine Prüfung) |
Response
Erfolg (201 Created)
json
{
"data": {
"id": "d4e5f6a7-b8c9-0123-defa-123456789012",
"title": "Erstordination – Anna Muster",
"start": "2026-04-02T09:00:00+02:00",
"end": "2026-04-02T10:00:00+02:00",
"allDay": false,
"status": "active",
"type": "customer",
"note": "Bitte nüchtern erscheinen",
"customer": {
"id": "e5f6a7b8-c9d0-1234-efab-234567890123",
"firstName": "Anna",
"lastName": "Muster"
},
"service": {
"id": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"name": "Erstordination"
},
"course": null,
"source": "oauth",
"createdAt": "2026-04-01T14:23:00+02:00",
"updatedAt": "2026-04-01T14:23:00+02:00"
}
}Response-Felder
| Feld | Typ | Beschreibung |
|---|---|---|
data.id | string (UUID) | Eindeutige Termin-ID |
data.title | string | Termintitel |
data.start | string (ISO 8601) | Tatsächliche Startzeit |
data.end | string (ISO 8601) | Tatsächliche Endzeit |
data.allDay | boolean | Ganztägiger Termin |
data.status | string | Terminstatus (active oder request) |
data.type | string | Termintyp (z.B. customer) |
data.note | string | null | Interne Notiz zum Termin |
data.customer | object | null | Verknüpfter Kunde |
data.customer.id | string (UUID) | Kunden-ID |
data.customer.firstName | string | Vorname |
data.customer.lastName | string | Nachname |
data.service | object | null | Gebuchte Leistung |
data.service.id | string (UUID) | Leistungs-ID |
data.service.name | string | Name der Leistung |
data.course | object | null | Verknüpfter Kurs (falls Termin ein Kurstermin ist) |
data.source | string | Buchungsquelle (z.B. oauth) |
data.createdAt | string (ISO 8601) | Erstellungszeitpunkt |
data.updatedAt | string (ISO 8601) | Letzter Änderungszeitpunkt |
Beispiele
bash
curl -X POST "https://my.offisy.at/api/oauth/v2/resource/appointments/service" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{
"userId": "b2c3d4e5-f6a7-8901-bcde-f01234567890",
"locationId": "b2c3d4e5-f6a7-8901-bcde-f01234567890",
"serviceId": "b2c3d4e5-f6a7-8901-bcde-f01234567890",
"customerId": "b2c3d4e5-f6a7-8901-bcde-f01234567890",
"start": "beispiel",
"notes": "Terminnotiz",
"status": "beispiel",
"availabilityCheck": "beispiel"
}'Parameter
Zuerst Token anfordern
Mögliche Fehler
| Status | Code | Beschreibung |
|---|---|---|
| 400 | validation_error | Pflichtfelder fehlen oder UUID ist ungültig |
| 401 | invalid_client | Ungültiger oder fehlender Access Token |
| 403 | insufficient_scope | Scope appointments nicht vorhanden |
| 404 | not_found | Mitarbeiter, Standort, Leistung oder Kunde nicht gefunden |
| 409 | conflict | Das gewählte Zeitfenster ist nicht mehr verfügbar |
| 422 | unprocessable_entity | start liegt in der Vergangenheit |
| 422 | booking_error | Allgemeiner Buchungsfehler (z.B. Konfigurationsproblem) |