Termine abrufen
Gibt eine paginierte Liste aller Termine des Unternehmens zurück.
Request
GET /api/oauth/v2/resource/appointments
Header
| Header | Wert |
|---|---|
Authorization | Bearer {access_token} |
Query-Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
offset | integer | Nein | Startposition (Standard: 0) |
limit | integer | Nein | Anzahl Ergebnisse (Standard: 50, Max: 200) |
from | string (ISO 8601) | Ja | Zeitraum-Start – als Datum (2026-03-01) oder ISO 8601 (2026-03-01T00:00:00+01:00) |
until | string (ISO 8601) | Ja | Zeitraum-Ende – als Datum (2026-03-31) oder ISO 8601 (2026-03-31T23:59:59+01:00) |
type | string | Nein | Kommaseparierte Liste von Termintypen (Standard: admin,customer,course). Erlaubte Werte: admin, customer, course, pause, private, vacation, illness, official_holiday, external. Sonderwert all gibt alle Typen zurück. |
customerId | string (UUID) | Nein | Filtert Termine auf einen bestimmten Kunden. Gibt nur Termine zurück, bei denen der Kunde direkt zugewiesen ist oder in der Attendee-Liste eines Kurs-Termins vorkommt. |
Hinweis: Die Parameter
fromunduntilsind Pflichtfelder. Die API gibt nur Termine im angegebenen Zeitraum zurück.
Tipp: Bei Angabe ohne Uhrzeit (z.B.
2026-03-01) wirdfromauf00:00:00unduntilauf23:59:59gesetzt – ideal für tagesgenaue Abfragen.
Hinweis: Dieser Endpoint erfordert immer die Scopes
appointmentsundusers. Für Kurs-Termine (Typcourseoderall) ist zusätzlich der Scopecustomerserforderlich.
Hinweis: Wird
customerIdangegeben, ist zusätzlich der Scopecustomerserforderlich – unabhängig vom gewählten Termintyp.
Hinweis zu Kurs-Terminen: Kurs-Termine (
type=course) enthalten personenbezogene Kundendaten (attendees.customer) und Mitarbeiterdaten (instructors). Dafür ist der Scopecustomerserforderlich. Fragst du explizit?type=course(oder?type=all) an, ohne diesen Scope zu besitzen, antwortet die API mit403 insufficient_scope.
Response
Erfolg (200 OK)
Beispiel: Einzeltermin (type: "customer")
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Erstgespräch",
"start": "2026-03-15T10:00:00+01:00",
"end": "2026-03-15T11:00:00+01:00",
"allDay": false,
"status": "active",
"type": "customer",
"course": null,
"note": "Bitte nüchtern erscheinen",
"customer": {
"id": "f0e1d2c3-b4a5-6789-fedc-ba9876543210",
"firstName": "Anna",
"lastName": "Muster"
},
"service": {
"id": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"name": "Erstgespräch"
},
"source": "oauth",
"deleted": false,
"deletedAt": null,
"stornoReason": null,
"createdAt": "2026-03-01T09:00:00+01:00",
"updatedAt": "2026-03-01T09:00:00+01:00"
}
],
"meta": {
"total": 500,
"offset": 0,
"limit": 50
}
}Beispiel: Kurs-Termin (type: "course")
{
"data": [
{
"id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
"title": "Yoga Anfänger",
"start": "2026-03-20T09:00:00+01:00",
"end": "2026-03-20T10:00:00+01:00",
"allDay": false,
"status": "active",
"type": "course",
"course": {
"id": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"name": "Yoga Anfänger",
"maxAttendees": 20,
"currentAttendees": 12,
"color": "#ff0000",
"instructors": [
{ "id": "d4e5f6a7-b8c9-0123-defa-123456789012", "firstName": "Max", "lastName": "Muster" }
],
"location": { "id": "e5f6a7b8-c9d0-1234-efab-234567890123", "name": "Studio 1" },
"attendees": [
{
"customer": { "id": "f0e1d2c3-b4a5-6789-fedc-ba9876543210", "firstName": "Anna", "lastName": "Muster" },
"bookingDate": "2026-03-01T10:00:00+01:00"
}
]
},
"note": null,
"customer": null,
"service": null,
"source": "oauth",
"createdAt": "2026-03-01T09:00:00+01:00",
"updatedAt": "2026-03-01T09:00:00+01:00"
}
],
"meta": {
"total": 500,
"offset": 0,
"limit": 50
}
}Response-Felder
| Feld | Typ | Beschreibung |
|---|---|---|
data | Array | Liste der Termine |
data[].id | string (UUID) | Eindeutige Termin-ID |
data[].title | string | Titel des Termins |
data[].start | string (ISO 8601) | null | Startzeit |
data[].end | string (ISO 8601) | null | Endzeit |
data[].allDay | boolean | Ganztägiger Termin |
data[].status | string | Status des Termins (active oder request) |
data[].type | string | Termintyp (admin, customer, course, pause, private, vacation, illness, official_holiday, external) |
data[].course | object | null | Kurs-Daten – nur bei type: "course" befüllt, sonst null |
data[].course.id | string (UUID) | Kurs-ID |
data[].course.name | string | Kursname |
data[].course.maxAttendees | integer | null | Maximale Teilnehmeranzahl |
data[].course.currentAttendees | integer | Aktuelle Teilnehmeranzahl |
data[].course.color | string | null | Farbe als Hex-Code (z.B. #ff0000) |
data[].course.instructors | Array | Liste der Kursleiter |
data[].course.instructors[].id | string (UUID) | Kursleiter-ID |
data[].course.instructors[].firstName | string | Vorname des Kursleiters |
data[].course.instructors[].lastName | string | Nachname des Kursleiters |
data[].course.location | object | null | Kursort |
data[].course.location.id | string (UUID) | Ort-ID |
data[].course.location.name | string | Ortsname |
data[].course.attendees | Array | Liste der Kursteilnehmer |
data[].course.attendees[].customer | object | Teilnehmer-Kurzinfo |
data[].course.attendees[].customer.id | string (UUID) | Kunden-ID |
data[].course.attendees[].customer.firstName | string | Vorname |
data[].course.attendees[].customer.lastName | string | Nachname |
data[].course.attendees[].bookingDate | string (ISO 8601) | null | Buchungsdatum |
data[].note | string | Interne Notiz |
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 | Verknüpfte Leistung |
data[].service.id | string (UUID) | Leistungs-ID |
data[].service.name | string | Name der Leistung |
data[].source | string | Quelle des Termins |
data[].deleted | boolean | true wenn der Termin storniert ist, sonst false |
data[].deletedAt | string (ISO 8601) | null | Zeitpunkt der Stornierung, null wenn nicht storniert |
data[].stornoReason | string | null | Storno-Grund, null wenn nicht storniert oder kein Grund angegeben |
data[].createdAt | string (ISO 8601) | null | Erstellungszeitpunkt |
data[].updatedAt | string (ISO 8601) | null | Letzter Änderungszeitpunkt |
meta.total | integer | Gesamtanzahl der Termine |
meta.offset | integer | Aktuelle Startposition |
meta.limit | integer | Anzahl der zurückgegebenen Einträge |
Hinweis: Die Objekte
customerundserviceenthalten nur eine Kurzform mit den wichtigsten Feldern (siehe Tabelle oben).
curl -X GET "https://my.offisy.at/api/oauth/v2/resource/appointments?offset=0&limit=50&from=beispiel&until=beispiel&type=admin%2Ccustomer%2Ccourse&customerId=b2c3d4e5-f6a7-8901-bcde-f01234567890" \
-H "Authorization: Bearer {access_token}"Mögliche Fehler
| Status | Code | Beschreibung |
|---|---|---|
| 400 | validation_error | from und/oder until fehlt oder ist ungültig |
| 401 | invalid_client | Ungültiger oder fehlender Access Token |
| 403 | insufficient_scope | Scope appointments oder users fehlt (beide immer erforderlich) |
| 403 | insufficient_scope | ?type=course/?type=all angefragt, aber Scope customers fehlt |