Skip to content

List Customers ​

Returns a paginated list of all customers of the company.

Breaking Change

Without the new status parameter, this list now also returns deleted customers (archived customers were already included before). Get only active customers with status=active.

Without a timestamp filter, the list now sorts by internal ID ascending instead of by last name and first name.

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).
groupIdstring (UUID)NoFilters customers to members of a specific customer group. The value matches the id returned by GET /customers/groups.
statusstringNoComma-separated list (default: all). Allowed values: active, archived, deleted. active returns customers that are neither archived nor deleted. Invalid value → 400 validation_error. See Conventions for details.
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.
viewstringNodefault (the default) or slim. slim returns only the most important fields per customer — see Conventions for details. Invalid value → 400 validation_error.

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: groupId filters the customer list to members of the given customer group, e.g. GET /api/oauth/v2/resource/customers?groupId=b2c3d4e5-f6a7-8901-bcde-f12345678901. The response structure stays the same, and meta.total reflects the filtered count. If the customer group is unknown or the UUID format is invalid, the API responds with 404 not_found in both cases instead of an empty list. An empty value (?groupId=) acts like no filter — the API returns the unfiltered list.

Known limitation: data[].groups currently always returns an empty array on this list route, even when customer groups are assigned to the customer. The detail route GET /customers/{uuid} returns the assigned customer groups correctly.

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"
        }
      ],
      "groups": [],
      "archived": false,
      "deleted": false,
      "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[].groupsArrayAssigned customer groups, see customer groups reference
data[].groups[].idstring (UUID)Unique customer group ID
data[].groups[].namestringName of the customer group
data[].archivedbooleantrue if the customer is archived
data[].deletedbooleantrue if the customer is deleted
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
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&groupId=b2c3d4e5-f6a7-8901-bcde-f01234567890&status=all&createdSince=beispiel&createdUntil=beispiel&updatedSince=2026-04-15T10%3A00%3A00&updatedUntil=2026-04-15T10%3A00%3A00&deletedSince=beispiel&view=default" \
  -H "Authorization: Bearer {access_token}"
Parameter
Zuerst Token anfordern

Possible errors ​

StatusCodeDescription
400validation_errorA timestamp filter contains an invalid value
400validation_errordeletedSince was combined with createdSince, createdUntil, updatedSince, or updatedUntil
400validation_errorstatus contains an invalid value
400validation_errorview is neither default nor slim
401invalid_clientInvalid or missing access token
403insufficient_scopeScope customers not present
404not_foundCustomer group for groupId not found (also on invalid UUID format)

Offisy GmbH