Skip to content

List Courses ​

Returns a paginated list of all courses of the company.

Required license

This endpoint requires the company's course license.

Request ​

GET /api/oauth/v2/resource/courses

HeaderValue
AuthorizationBearer {access_token}

Query parameters ​

ParameterTypeRequiredDescription
typestringNoCourse type (default: all three course types). Allowed values: course, course_once, course_service. Special value all is an alias for the default.
statusstringNoFilters by status, combinable as a comma-separated list. Allowed values: active (not archived), archived. Default: all (all values). See Conventions.
offsetintegerNoStart position (default: 0)
limitintegerNoNumber of results (default: 50, max: 200)

Note: This endpoint always requires the scopes courses and users. For the attendee list (attendees), the scope customers is additionally required.

Note on attendees: Without the customers scope, the attendees key is missing from the response entirely — it is not [] and not null. The number currentAttendees is always included.

Note: An archived course is the deletion form of the course. There is no deletion timestamp and therefore no deletedSince — the filter status=archived is the way to retrieve deleted courses.

Note: There is no incremental sync for courses. A course does not carry timestamps, so there is no createdSince and no updatedSince.

Note: Without a status filter, this endpoint sorts by internal ID ascending, see Conventions.

Response ​

Success (200 OK) ​

Example: with scope customers

json
{
  "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
  }
}

Example: without scope customers

json
{
  "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
  }
}

Note: In the second example, the attendees key is missing — it is not present, not [], and not null. currentAttendees is still included.

Response fields ​

FieldTypeDescription
dataArrayList of courses
data[].idstring (UUID)Unique course ID
data[].namestringCourse name
data[].typestringCourse type (course, course_once, course_service)
data[].archivedbooleantrue if the course is archived — the deletion form of the course
data[].internalNumberstring | nullInternal course number
data[].descriptionstring | nullCourse description
data[].informationstring | nullAdditional information about the course
data[].maxAttendeesinteger | nullMaximum number of attendees
data[].currentAttendeesintegerNumber of active (non-canceled) attendances. attendees additionally includes canceled attendances and can therefore be longer than this number.
data[].colorstringColor as a hex code. Falls back to the category color or to #74AFAD if no color of its own is set — never null.
data[].pricestringGross course price
data[].priceNetstringNet course price
data[].vatstringVAT rate in percent for this course, otherwise the company's default VAT
data[].sortintegerSort position
data[].billStatusstringBilling status: open, invoiced, ignore, unknown
data[].isOnlineBookablebooleantrue if the course can be booked online
data[].directBookingbooleantrue if an online booking is confirmed immediately without approval
data[].bookingBeforestring (ISO 8601 duration)Latest booking time before the course starts, e.g. P1D for one day
data[].stornostring (ISO 8601 duration)Deadline for a free cancellation before the course starts, e.g. PT24H for 24 hours
data[].categorystring (UUID) | nullCourse category. Look up via GET /services/categories/{uuid}
data[].instructorsArray (string, UUID)UUIDs of the instructors. Look up via GET /users/{uuid}
data[].locationstring (UUID) | nullCourse location
data[].tenanciesArray (string, UUID)IDs of the tenancies this course is available for — empty without the Tenancies add-on
data[].attendeesArray (string, UUID)UUIDs of all attendances, including canceled ones. Only included when the customers scope is present — without this scope the key is missing entirely, it is not [] and not null. Details per attendance via Attendee Details or collected via List Attendees
meta.totalintegerUpper bound of the match count before permission filtering — not the number of actually accessible courses. count(data) can be smaller than limit even though total promises more.
meta.offsetintegerCurrent start position
meta.limitintegerNumber of returned entries
Beispiele
bash
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}"
Parameter
Zuerst Token anfordern

Possible errors ​

StatusCodeDescription
400validation_errortype or status contains an invalid value
401invalid_clientInvalid or missing access token
403insufficient_scopeScope courses or users is missing
403insufficient_scopeCourse license not present

Offisy GmbH