List Customers
Returns a paginated list of all customers of the company.
Request
GET /api/oauth/v2/resource/customers
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) |
term | string | No | Search term for name (min. 3 characters) |
customerNumber | string | No | Customer number (exact match) |
socialNumber | string | No | Social security number (exact match) |
email | string | No | Email address (exact match) |
phone | string | No | Phone number. Matches the national number (123412345678), E.164 with plus (+43123412345678), and 00-prefix (0043123412345678). |
view | string | No | Response shape: default (default) or slim |
createdSince | string (ISO 8601) | No | Only customers created at or after this timestamp (createdAt >=) |
createdUntil | string (ISO 8601) | No | Only customers created at or before this timestamp (createdAt <=) |
updatedSince | string (ISO 8601) | No | Only customers modified at or after this timestamp (updatedAt >=). Newly created customers are included, because the modification timestamp is set on creation. |
updatedUntil | string (ISO 8601) | No | Only customers modified at or before this timestamp (updatedAt <=) |
deletedSince | string (ISO 8601) | No | Only deleted customers with a deletion timestamp at or after this value (deletedAt >=). This filter does not return active customers. |
Note: All search filters can be combined (AND logic). For example, you can filter by
socialNumberandtermat the same time. There is one exception:deletedSinceexcludes the other timestamp filters — see below.Note:
customerNumberis currently not guaranteed to be unique. The filter can theoretically return more than one customer.
Note: For a sync,
updatedSincealone is enough — it covers new and modified customers. Fetch deleted customers with a second request usingdeletedSince.
Note:
deletedSincecannot be combined withcreatedSince,createdUntil,updatedSince, orupdatedUntil. The API responds with400 validation_error, becausedeletedSinceswitches the result set to deleted customers. So query changes and deletions in two separate requests.
Note: Formats, time zone behavior, sorting, cursor strategy, and the
meta.totaltrap work the same across all timestamp filters. See Incremental Sync.
Note on customers without a modification timestamp: For some customers,
updatedAtis empty. This affects legacy data from before automatic timestamping, as well as bulk imports.updatedSincedoes not return those customers, 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": null,
"firstName": "Anna",
"lastName": "Muster",
"email": "anna.muster@example.com",
"phone": "00436641234567",
"tel": "6641234567",
"telCode": "0043",
"phoneSecondary": null,
"telSecondary": null,
"telCodeSecondary": null,
"birthday": "1985-04-12",
"socialNumber": "1234 120485",
"customerNumber": "K-00123",
"tenancies": [
{
"id": "f0e1d2c3-b4a5-6789-fedc-ba9876543210",
"name": "Ordination Muster",
"abbreviation": "OM",
"color": "#00adba"
}
],
"createdAt": "2026-05-02T08:15:00+02:00",
"updatedAt": "2026-06-14T11:42:00+02:00",
"deletedAt": null
}
],
"meta": {
"total": 1200,
"offset": 0,
"limit": 50
}
}Response fields
| Field | Type | Description |
|---|---|---|
data | Array | List of customers |
data[].id | string (UUID) | Unique customer ID |
data[].title | string | null | Title (e.g. Dr., Mag.) |
data[].firstName | string | null | First name |
data[].lastName | string | null | Last name |
data[].email | string | null | Email address |
data[].phone | string | null | Full primary number: country code + national number, concatenated in 00-format (e.g. 00436641234567) |
data[].tel | string | null | National primary number without country code (e.g. 6641234567) |
data[].telCode | string | null | Country dialing code of the primary number in 00-format (e.g. 0043) |
data[].phoneSecondary | string | null | Full secondary number: country code + number, concatenated in 00-format |
data[].telSecondary | string | null | National secondary number without country code |
data[].telCodeSecondary | string | null | Country dialing code of the secondary number in 00-format |
data[].birthday | string | null | Date of birth (YYYY-MM-DD) |
data[].socialNumber | string | null | Social security number |
data[].customerNumber | string | null | Customer number |
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[].createdAt | string (ISO 8601) | null | Creation timestamp |
data[].updatedAt | string (ISO 8601) | null | Last modification timestamp |
data[].deletedAt | string (ISO 8601) | null | Deletion timestamp, null if not deleted |
meta.total | integer | Total number of customers |
meta.offset | integer | Current start position |
meta.limit | integer | Number of returned entries |
Slim response (?view=slim)
The view=slim query parameter returns a slim response with only the most important fields. Without the parameter, the response stays unchanged — existing integrations don't need to change anything.
If view is given more than once, the last value wins — ?view=default&view=slim returns the slim response.
The slim response includes the following fields:
id, title, firstName, lastName, companyName, sex, birthday, email, phone, street, zip, city, country, customerNumber, archived, deleted, createdAt, updatedAt, deletedAt
Note: The social security number (
socialNumber) andidentificationNumberare not included in the slim response. If you match customers by social security number, use the default request.Note: The slim response currently also includes
createdAt,updatedAt, anddeletedAt.
Warning: Deleted customers are currently not detectable through this endpoint — it does not return deleted customers.
deletedis therefore currently alwaysfalseanddeletedAtis alwaysnull. A deleted customer silently disappears from the list instead of being marked. For a complete sync, a periodic full fetch is required for now.
Example: view=slim
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"title": null,
"firstName": "Anna",
"lastName": "Muster",
"companyName": null,
"sex": "female",
"birthday": "1985-04-12",
"email": "anna.muster@example.com",
"phone": "00436641234567",
"street": "Hauptstraße 1",
"zip": "1010",
"city": "Wien",
"country": "AT",
"customerNumber": "K-00123",
"archived": false,
"deleted": false,
"createdAt": "2026-03-01T09:00:00+01:00",
"updatedAt": "2026-03-01T09:00:00+01:00",
"deletedAt": null
}
],
"meta": {
"total": 1200,
"offset": 0,
"limit": 50
}
}curl -X GET "https://my.offisy.at/api/oauth/v2/resource/customers?offset=0&limit=50&term=Muster&customerNumber=beispiel&socialNumber=1234010190&email=anna.muster%40example.com&phone=%2B43+664+1234567&view=default&createdSince=beispiel&createdUntil=beispiel&updatedSince=2026-04-15T10%3A00%3A00&updatedUntil=2026-04-15T10%3A00%3A00&deletedSince=beispiel" \
-H "Authorization: Bearer {access_token}"Possible errors
| Status | Code | Description |
|---|---|---|
| 400 | validation_error | Invalid value for view (valid values: default, slim) |
| 400 | validation_error | A timestamp filter contains an invalid value |
| 400 | validation_error | deletedSince was combined with createdSince, createdUntil, updatedSince, or updatedUntil |
| 401 | invalid_client | Invalid or missing access token |
| 403 | insufficient_scope | Scope customers not present |