Skip to content

List Customers ​

Returns a paginated list of all customers of the company.

Request ​

GET /api/oauth/v2/resource/customers

HeaderValue
AuthorizationBearer {access_token}

Query parameters ​

ParameterTypeRequiredDescription
offsetintegerNoStart position (default: 0)
limitintegerNoNumber of results (default: 50, max: 200)
termstringNoSearch term for name (min. 3 characters)
customerNumberstringNoCustomer number (exact match)
socialNumberstringNoSocial security number (exact match)
emailstringNoEmail address (exact match)
phonestringNoPhone number. Matches the national number (123412345678), E.164 with plus (+43123412345678), and 00-prefix (0043123412345678).
viewstringNoResponse shape: default (default) or slim
createdSincestring (ISO 8601)NoOnly customers created at or after this timestamp (createdAt >=)
createdUntilstring (ISO 8601)NoOnly customers created at or before this timestamp (createdAt <=)
updatedSincestring (ISO 8601)NoOnly customers modified at or after this timestamp (updatedAt >=). Newly created customers are included, because the modification timestamp is set on creation.
updatedUntilstring (ISO 8601)NoOnly customers modified at or before this timestamp (updatedAt <=)
deletedSincestring (ISO 8601)NoOnly 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 socialNumber and term at the same time. There is one exception: deletedSince excludes the other timestamp filters — see below.

Note: customerNumber is currently not guaranteed to be unique. The filter can theoretically return more than one customer.

Note: For a sync, updatedSince alone is enough — it covers new and modified customers. Fetch deleted customers with a second request using deletedSince.

Note: deletedSince cannot be combined with createdSince, createdUntil, updatedSince, or updatedUntil. The API responds with 400 validation_error, because deletedSince switches 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.total trap work the same across all timestamp filters. See Incremental Sync.

Note on customers without a modification timestamp: For some customers, updatedAt is empty. This affects legacy data from before automatic timestamping, as well as bulk imports. updatedSince does 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) ​

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

FieldTypeDescription
dataArrayList of customers
data[].idstring (UUID)Unique customer ID
data[].titlestring | nullTitle (e.g. Dr., Mag.)
data[].firstNamestring | nullFirst name
data[].lastNamestring | nullLast name
data[].emailstring | nullEmail address
data[].phonestring | nullFull primary number: country code + national number, concatenated in 00-format (e.g. 00436641234567)
data[].telstring | nullNational primary number without country code (e.g. 6641234567)
data[].telCodestring | nullCountry dialing code of the primary number in 00-format (e.g. 0043)
data[].phoneSecondarystring | nullFull secondary number: country code + number, concatenated in 00-format
data[].telSecondarystring | nullNational secondary number without country code
data[].telCodeSecondarystring | nullCountry dialing code of the secondary number in 00-format
data[].birthdaystring | nullDate of birth (YYYY-MM-DD)
data[].socialNumberstring | nullSocial security number
data[].customerNumberstring | nullCustomer number
data[].tenanciesArrayAssigned tenants
data[].tenancies[].idstring (UUID)Tenant ID
data[].tenancies[].namestringName of the tenant
data[].tenancies[].abbreviationstringAbbreviation
data[].tenancies[].colorstringColor as hex code
data[].createdAtstring (ISO 8601) | nullCreation timestamp
data[].updatedAtstring (ISO 8601) | nullLast modification timestamp
data[].deletedAtstring (ISO 8601) | nullDeletion timestamp, null if not deleted
meta.totalintegerTotal number of customers
meta.offsetintegerCurrent start position
meta.limitintegerNumber 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) and identificationNumber are 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, and deletedAt.

Warning: Deleted customers are currently not detectable through this endpoint — it does not return deleted customers. deleted is therefore currently always false and deletedAt is always null. 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

json
{
  "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
  }
}
Beispiele
bash
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}"
Parameter
Zuerst Token anfordern

Possible errors ​

StatusCodeDescription
400validation_errorInvalid value for view (valid values: default, slim)
400validation_errorA timestamp filter contains an invalid value
400validation_errordeletedSince was combined with createdSince, createdUntil, updatedSince, or updatedUntil
401invalid_clientInvalid or missing access token
403insufficient_scopeScope customers not present

Offisy GmbH