Kurse abrufen
Gibt eine paginierte Liste aller Kurse des Unternehmens zurück.
Benötigte Lizenz
Dieser Endpoint erfordert die Kurs-Lizenz des Unternehmens.
Request
GET /api/oauth/v2/resource/courses
Header
| Header | Wert |
|---|---|
Authorization | Bearer {access_token} |
Query-Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
type | string | Nein | Kursart (Standard: alle drei Kursarten). Erlaubte Werte: course, course_once, course_service. Sonderwert all ist ein Alias für den Standard. |
status | string | Nein | Filtert nach Status, kommagetrennt kombinierbar. Erlaubte Werte: active (nicht archiviert), archived. Standard: all (alle Werte). Siehe Konventionen. |
offset | integer | Nein | Startposition (Standard: 0) |
limit | integer | Nein | Anzahl Ergebnisse (Standard: 50, Max: 200) |
Hinweis: Dieser Endpoint erfordert immer die Scopes
coursesundusers. Für die Teilnehmerliste (attendees) ist zusätzlich der Scopecustomerserforderlich.
Hinweis zu Teilnehmern: Ohne den Scope
customersfehlt der Schlüsselattendeesin der Antwort vollständig – er ist nicht[]und nichtnull. Die ZahlcurrentAttendeesbleibt immer enthalten.
Hinweis: Ein archivierter Kurs ist die Löschform des Kurses. Es gibt keinen Löschzeitpunkt und damit kein
deletedSince– der Filterstatus=archivedist der Weg, gelöschte Kurse zu erhalten.
Hinweis: Für Kurse gibt es keinen inkrementellen Abgleich. Ein Kurs führt keine Zeitstempel, es gibt also kein
createdSinceund keinupdatedSince.
Hinweis: Ohne
status-Filter sortiert dieser Endpoint nach interner ID aufsteigend, siehe Konventionen.
Response
Erfolg (200 OK)
Beispiel: mit Scope customers
{
"data": [
{
"id": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"name": "Yoga Anfänger",
"type": "course",
"archived": false,
"internalNumber": "K-2026-014",
"description": "Yoga für Einsteiger",
"information": "Bitte bequeme Kleidung mitbringen",
"maxAttendees": 20,
"currentAttendees": 12,
"color": "#74AFAD",
"price": "120.00",
"priceNet": "100.00",
"vat": "20.00",
"sort": 0,
"billStatus": "open",
"isOnlineBookable": true,
"directBooking": false,
"bookingBefore": "P1D",
"storno": "PT24H",
"category": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"instructors": ["d4e5f6a7-b8c9-0123-defa-123456789012"],
"location": "e5f6a7b8-c9d0-1234-efab-234567890123",
"tenancies": ["9a8b7c6d-5e4f-3210-9876-543210fedcba"],
"attendees": ["b2c3d4e5-f6a7-8901-bcde-f12345678901"]
}
],
"meta": {
"total": 42,
"offset": 0,
"limit": 50
}
}Beispiel: ohne Scope customers
{
"data": [
{
"id": "c3d4e5f6-a7b8-9012-cdef-012345678901",
"name": "Yoga Anfänger",
"type": "course",
"archived": false,
"internalNumber": "K-2026-014",
"description": "Yoga für Einsteiger",
"information": "Bitte bequeme Kleidung mitbringen",
"maxAttendees": 20,
"currentAttendees": 12,
"color": "#74AFAD",
"price": "120.00",
"priceNet": "100.00",
"vat": "20.00",
"sort": 0,
"billStatus": "open",
"isOnlineBookable": true,
"directBooking": false,
"bookingBefore": "P1D",
"storno": "PT24H",
"category": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"instructors": ["d4e5f6a7-b8c9-0123-defa-123456789012"],
"location": "e5f6a7b8-c9d0-1234-efab-234567890123",
"tenancies": ["9a8b7c6d-5e4f-3210-9876-543210fedcba"]
}
],
"meta": {
"total": 42,
"offset": 0,
"limit": 50
}
}Hinweis: Im zweiten Beispiel fehlt der Schlüssel
attendees– er ist nicht vorhanden, nicht[]und nichtnull.currentAttendeesbleibt trotzdem enthalten.
Response-Felder
| Feld | Typ | Beschreibung |
|---|---|---|
data | Array | Liste der Kurse |
data[].id | string (UUID) | Eindeutige Kurs-ID |
data[].name | string | Kursname |
data[].type | string | Kursart (course, course_once, course_service) |
data[].archived | boolean | true, wenn der Kurs archiviert ist – die Löschform des Kurses |
data[].internalNumber | string | null | Interne Kursnummer |
data[].description | string | null | Kursbeschreibung |
data[].information | string | null | Zusatzinformationen zum Kurs |
data[].maxAttendees | integer | null | Maximale Teilnehmeranzahl |
data[].currentAttendees | integer | Anzahl der aktiven (nicht stornierten) Teilnahmen. attendees enthält zusätzlich stornierte Teilnahmen und kann deshalb länger sein als diese Zahl. |
data[].color | string | Farbe als Hex-Code. Fällt auf die Kategoriefarbe oder auf #74AFAD zurück, wenn keine eigene Farbe gesetzt ist – nie null. |
data[].price | string | Kurspreis brutto |
data[].priceNet | string | Kurspreis netto |
data[].vat | string | USt-Satz in Prozent für diesen Kurs, sonst die Standard-USt des Unternehmens |
data[].sort | integer | Sortierposition |
data[].billStatus | string | Abrechnungsstatus: open, invoiced, ignore, unknown |
data[].isOnlineBookable | boolean | true, wenn der Kurs online buchbar ist |
data[].directBooking | boolean | true, wenn eine Online-Buchung ohne Bestätigung sofort gilt |
data[].bookingBefore | string (ISO 8601 Dauer) | Spätester Buchungszeitpunkt vor Kursbeginn, z.B. P1D für einen Tag |
data[].storno | string (ISO 8601 Dauer) | Frist für eine kostenlose Stornierung vor Kursbeginn, z.B. PT24H für 24 Stunden |
data[].category | string (UUID) | null | Kurskategorie. Nachladen über GET /services/categories/{uuid} |
data[].instructors | Array (string, UUID) | UUIDs der Kursleiter. Nachladen über GET /users/{uuid} |
data[].location | string (UUID) | null | Kursort |
data[].tenancies | Array (string, UUID) | IDs der Mandanten, für die dieser Kurs verwendbar ist – leer ohne das Add-on Mandanten |
data[].attendees | Array (string, UUID) | UUIDs aller Kursteilnahmen, einschließlich stornierter. Nur enthalten, wenn der Scope customers vorhanden ist – ohne diesen Scope fehlt der Schlüssel vollständig, er ist nicht [] und nicht null. Details je Teilnahme über Kursteilnehmer anzeigen oder gesammelt über Kursteilnehmer abrufen |
meta.total | integer | Obergrenze der Trefferanzahl vor der Berechtigungsfilterung – nicht die Zahl der tatsächlich zugänglichen Kurse. count(data) kann kleiner als limit sein, obwohl total mehr verspricht. |
meta.offset | integer | Aktuelle Startposition |
meta.limit | integer | Anzahl der zurückgegebenen Einträge |
curl -X GET "https://my.offisy.at/api/oauth/v2/resource/courses?type=all&status=all&offset=0&limit=50" \
-H "Authorization: Bearer {access_token}"Mögliche Fehler
| Status | Code | Beschreibung |
|---|---|---|
| 400 | validation_error | type oder status enthält einen ungültigen Wert |
| 401 | invalid_client | Ungültiger oder fehlender Access Token |
| 403 | insufficient_scope | Scope courses oder users fehlt |
| 403 | insufficient_scope | Kurs-Lizenz nicht vorhanden |