List Users
Returns a paginated list of all users.
Breaking Change
This list already included deleted users before, without marking them. New is the deleted field and the status parameter, which lets you show or hide deleted users on purpose (status=active hides them).
Without a timestamp filter, the list now sorts by internal ID ascending instead of in unspecified order.
Request
GET /api/oauth/v2/resource/users
Header
| Header | Value |
|---|---|
Authorization | Bearer {access_token} |
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
offset | integer | No | Start position (default: 0) |
limit | integer | No | Number of results (default: 50, max: 200) |
createdSince | string (ISO 8601) | No | Only users created at or after this timestamp (createdAt >=) |
createdUntil | string (ISO 8601) | No | Only users created at or before this timestamp (createdAt <=) |
updatedSince | string (ISO 8601) | No | Only users modified at or after this timestamp (updatedAt >=). Newly created users are included, because the modification timestamp is set on creation. |
updatedUntil | string (ISO 8601) | No | Only users modified at or before this timestamp (updatedAt <=) |
status | string | No | Comma-separated list (default: all). Allowed values: active, deleted. Invalid value → 400 validation_error. See Conventions for details. |
view | string | No | default (the default) or slim. slim returns only the most important fields per user — see Conventions for details. Invalid value → 400 validation_error. |
Required scope: users
Note: For a sync,
updatedSincealone is enough — it covers new and modified users.
Note: Formats, time zone behavior, sorting, cursor strategy, and the
meta.totaltrap work the same across all timestamp filters. See Incremental Sync.
Note on deleted users: Users do not carry a deletion timestamp. There is no
deletedSincehere. Identify deleted users through thedeletedfield, or fetch them specifically withstatus=deleted.In the
updatedSincefeed a deletion looks like an ordinary change, evaluated through thedeletedfield. So do not count on a dedicated deletion timestamp when syncing users.
Note on users without a modification timestamp: For some users,
updatedAtis empty. This affects legacy data from before automatic timestamping, as well as bulk imports.updatedSincedoes not return those users, not even with a very early date.So for the initial sync, fetch the full set once without a timestamp filter. After that, continue incrementally with
updatedSince.
Response
Success (200 OK)
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": "Dr.",
"firstName": "Maria",
"lastName": "Muster",
"abbreviation": "MM",
"sex": 1,
"email": "maria.muster@example.com",
"color": "#74AFAD",
"isDoctor": true,
"showBookingWeeks": 6,
"sort": 0,
"isBookable": true,
"tenancies": [
{
"id": "f0e1d2c3-b4a5-6789-fedc-ba9876543210",
"name": "Ordination Muster",
"abbreviation": "OM",
"color": "#00adba"
}
],
"deleted": false,
"createdAt": "2026-01-15T08:00:00+01:00",
"updatedAt": "2026-06-10T16:20:00+02:00"
}
],
"meta": {
"total": 5,
"offset": 0,
"limit": 50
}
}Response fields
| Field | Type | Description |
|---|---|---|
data | Array | List of users |
data[].id | string (UUID) | Unique user ID |
data[].title | string | null | Academic title (e.g. Dr.) |
data[].firstName | string | First name |
data[].lastName | string | Last name |
data[].abbreviation | string | null | Abbreviation |
data[].sex | integer | null | Sex (0 = male, 1 = female) |
data[].email | string | null | Email address |
data[].color | string | Color as hex code (e.g. #74AFAD) |
data[].isDoctor | boolean | Whether the user is a doctor |
data[].showBookingWeeks | integer | How many weeks ahead are bookable |
data[].sort | integer | Sort order |
data[].isBookable | boolean | Whether the user is bookable |
data[].tenancies | Array | Assigned tenants |
data[].tenancies[].id | string (UUID) | Tenant ID |
data[].tenancies[].name | string | Name of the tenant |
data[].tenancies[].abbreviation | string | Abbreviation |
data[].tenancies[].color | string | Color as hex code |
data[].deleted | boolean | true if the user is deleted |
data[].createdAt | string (ISO 8601) | null | Creation timestamp |
data[].updatedAt | string (ISO 8601) | null | Last modification timestamp |
meta.total | integer | Total number of users |
meta.offset | integer | Current start position |
meta.limit | integer | Number of returned entries |
Note: The
idis returned as a UUID and is required for querying available slots and booking appointments.
curl -X GET "https://my.offisy.at/api/oauth/v2/resource/users?offset=0&limit=50&createdSince=beispiel&createdUntil=beispiel&updatedSince=2026-04-15T10%3A00%3A00&updatedUntil=2026-04-15T10%3A00%3A00&status=all&view=default" \
-H "Authorization: Bearer {access_token}"Possible errors
| Status | Code | Description |
|---|---|---|
| 400 | validation_error | A timestamp filter contains an invalid value |
| 400 | validation_error | status contains an invalid value |
| 400 | validation_error | view is neither default nor slim |
| 401 | invalid_client | Invalid or missing access token |
| 403 | insufficient_scope | Scope users not present |