Response Format

OwnerRez API v2 leaves out fields that have no value. A field you expect may be absent from the JSON rather than present with an empty or null value. This differs from APIs that always return [] for an empty array — integration code written against that assumption will fail on OwnerRez. This article explains when fields are omitted and how to read responses safely.

Absent fields

A field is omitted from the response when its value is null and when its value is an empty collection.

A booking with no tags returns neither "tags": [] nor "tags": null. It returns no tags field:

GET /v2/bookings/357821?include_tags=true
→ {
    "id": 357821,
    "property_id": 123,
    "arrival": "2026-10-02",
    "departure": "2026-10-07"
  }

The same booking with one tag returns the field:

→ {
    "id": 357821,
    "property_id": 123,
    "arrival": "2026-10-02",
    "departure": "2026-10-07",
    "tags": ["VIP"]
  }

An absent field does not mean the request failed or the record is incomplete. It means the field has no value.

Empty collections

Array fields follow the same rule — an array with no members is omitted, not returned as []. This includes the arrays in the pagination envelope:

Field Present when Absent when
items The page has at least one record The query matched no records
next_page_url More pages follow This is the last page
tags, charges, door_codes, fields, agreements The booking has at least one The booking has none, or you did not request them

A query that matches nothing returns the envelope without items:

GET /v2/bookings?property_ids=123&since_utc=2030-01-01
→ { "limit": 20, "offset": 0 }

Reading responses safely

Read optional fields with a default instead of indexing directly:

data = response.json()

for booking in data.get("items", []):
    for tag in booking.get("tags", []):
        process(tag)

url = data.get("next_page_url")

Rules:

  • Treat absent, null and empty as the same thing. v2 does not use the difference to carry meaning.
  • Do not mark array fields as required in generated client models. A generator that treats them as required will either fail validation or hand your code a null collection.
  • Do not use the presence of a field to detect that a record changed. Use webhook categories or since_utc.

Include parameters

Several endpoints populate collections only when you ask: include_tags, include_charges, include_door_codes, include_fields, include_guest, include_agreements, include_cancellation_policy. When you leave the parameter off, the field is absent — the same shape you get when the record genuinely has none. The response does not distinguish the two, so set the include parameters your integration needs and treat absent as empty.

Where this applies

  • Every v2 REST response.
  • Every webhook payload. The entity object in a webhook is serialized exactly as the API response for that record. See Webhooks.
  • v1.0 and v1.1 (both deprecated) omit null fields but do return empty arrays as [].