This document contains the complete JSON Schema definitions for all entities and list responses in the Rentiful Open Data v1 contract.
| Field | Required? | Type | Description |
|---|---|---|---|
canonicalUrl |
optional | string | Canonical Rentiful URL (SEO canonical). Format: https://rentiful.ai/{cc}/places/{handle}. Requires handle and countryCode. Mutable, may change if handle changes. May be omitted if handle or countryCode is not available. |
countryCode |
optional | string | ISO 3166-1 alpha-2 country code for this Place (e.g., 'gb', 'ae'). Used for region-scoped marketing URLs. Optional. |
dataUrl |
optional | string | Direct JSON endpoint on the Property Service open data domain. Format: https://{env}.property.rentiful.ai/data/v1/{entityTypePlural}/{entityId}. Same domain family as schemas and OpenAPI. |
handle |
optional | string | Optional human-readable handle for this entity. A mutable alias, not part of identity. Identity remains the canonical placeId. |
idUrl |
optional | string | Immutable, ID-based identity URL for this entity. Uses the Place ID token in the path (eg /places/{token}), never the handle, and never includes a country prefix. Stable, immutable, deterministic. |
name |
required | string | The branded name of this Place (e.g., 'Wembley Park', 'East Village'). |
operatorId |
required | string | The current managing brand for this Place. This may change over time and is not part of the Place's identity. |
placeId |
required | string | Canonical public identifier for this Place. Opaque, human-friendly key. |
url |
optional | string | Public URL for this Place, if available. |
| Field | Required? | Type | Description |
|---|---|---|---|
canonicalUrl |
optional | string | Canonical Rentiful URL (SEO canonical). Format: https://rentiful.ai/{cc}/places/{placeHandle}/collections/{handle}. Requires handle, placeHandle, and countryCode. Mutable, may change if handle changes. May be omitted if handle, placeHandle, or countryCode is not available. |
collectionId |
required | string | Canonical public identifier for this Collection. Opaque, human-friendly key. |
dataUrl |
optional | string | Direct JSON endpoint on the Property Service open data domain. Format: https://{env}.property.rentiful.ai/data/v1/{entityTypePlural}/{entityId}. Same domain family as schemas and OpenAPI. |
handle |
optional | string | Optional human-readable handle for this entity. A mutable alias, not part of identity. Identity remains the canonical collectionId. |
idUrl |
optional | string | Immutable, ID-based identity URL for this entity. Uses the Collection ID token in the path (eg /collections/{token}), never the handle, and never includes a country prefix. Stable, immutable, deterministic. |
name |
required | string | The name of this Collection (e.g., 'Ferrum', 'Portlands Place', 'Luna'). |
operatorId |
required | string | The current managing brand for this Collection. This may change over time and is not part of the Collection's identity. |
placeId |
required | string | The Place this Collection belongs to. A Collection always belongs to a Place. |
| Field | Required? | Type | Description |
|---|---|---|---|
buildingId |
required | string | Canonical public identifier for this Building. Opaque, human-friendly key. |
canonicalUrl |
optional | string | Canonical Rentiful URL (SEO canonical). Format: https://rentiful.ai/{cc}/places/{placeHandle}/buildings/{handle}. Requires handle, placeHandle, and countryCode. Mutable, may change if handle changes. May be omitted if handle, placeHandle, or countryCode is not available. |
city |
optional | string | City where this Building is located. |
collectionId |
optional | string | The Collection this Building belongs to, if any. A Building may belong to a Collection. |
dataUrl |
optional | string | Direct JSON endpoint on the Property Service open data domain. Format: https://{env}.property.rentiful.ai/data/v1/{entityTypePlural}/{entityId}. Same domain family as schemas and OpenAPI. |
handle |
optional | string | Optional human-readable handle for this entity. A mutable alias, not part of identity. Identity remains the canonical buildingId. |
idUrl |
optional | string | Immutable, ID-based identity URL for this entity. Uses the Building ID token in the path (eg /buildings/{token}), never the handle, and never includes a country prefix. Stable, immutable, deterministic. |
lat |
optional | number | Latitude coordinate for this Building. |
lng |
optional | number | Longitude coordinate for this Building. |
name |
required | string | The name of this Building (e.g., 'Sky Point', 'Landsby East'). |
operatorId |
required | string | The current managing brand for this Building. This may change over time and is not part of the Building's identity. |
placeId |
required | string | The Place this Building belongs to. A Building always belongs to a Place. |
postcode |
optional | string | Postal code for this Building. |
streetAddress |
optional | string | Street address for this Building. |
url |
optional | string | Public URL for this Building, if available. |
| Field | Required? | Type | Description |
|---|---|---|---|
availableFrom |
optional | string | Date from which this Unit is available. Format: YYYY-MM-DD. |
bathrooms |
optional | integer | Number of bathrooms in this Unit. |
bedrooms |
optional | integer | Number of bedrooms in this Unit. |
buildingId |
required | string | The Building this Unit belongs to (authoritative parent). A Unit always belongs to a Building. |
canonicalUrl |
optional | string | Canonical Rentiful URL (SEO canonical). Format: https://rentiful.ai/{cc}/property/{idToken}. Uses the Unit ID token in the path (never handle). Uses countryCode if available, otherwise equals idUrl. Mutable, may change if countryCode changes. |
collectionId |
optional | string | The Collection this Unit belongs to, if any (derived/read-only). Derived from the Unit's Building. |
dataUrl |
optional | string | Direct JSON endpoint on the Property Service open data domain. Format: https://{env}.property.rentiful.ai/data/v1/{entityTypePlural}/{entityId}. Same domain family as schemas and OpenAPI. |
floor |
optional | integer | Floor number for this Unit (integer). |
handle |
optional | string | Optional human-readable handle for this entity. A mutable alias, not part of identity. Identity remains the canonical unitId. |
idUrl |
optional | string | Immutable, ID-based identity URL for this entity. Uses the Unit ID token in the path (eg /property/{token}), never the handle, and never includes a country prefix. Stable, immutable, deterministic. |
isActive |
required | boolean | Whether this Unit is currently active. false for retired/superseded units. |
lastVerifiedDate |
required | string | Date when this Unit's information was last verified. Format: YYYY-MM-DD. |
layoutType |
optional | string | Standardized layout classification for cross-operator comparison and filtering. Derived from bedrooms and structure. Consistency: layoutType = 'studio' implies bedrooms = 0. |
marketSegment |
optional | string | The market segment this Unit belongs to. |
name |
optional | string | The name or identifier of this Unit (e.g., 'Apartment 101', 'Flat 12A'). |
operatorId |
required | string | The current managing brand for this Unit. This may change over time and is not part of the Unit's identity. |
placeId |
required | string | The Place this Unit belongs to (derived/read-only, required). Derived from the Unit's Building. |
sqm |
optional | number | Size of this Unit in square meters. |
status |
required | string | Current availability status of this Unit. Availability is derived, not contractual. Lease/tenancy is never exposed. |
structureType |
optional | string | The physical dwelling form of this Unit (standardized). |
supersededByUnitId |
optional | array | Array of Unit IDs that supersede this Unit (for split/merge history). Empty array if none. |
supersedesUnitId |
optional | array | Array of Unit IDs that this Unit supersedes (for split/merge history). Empty array if none. |
unitId |
required | string | Canonical public identifier for this Unit. Opaque, human-friendly key. |
unitType |
optional | string | Operator-specific unit taxonomy. Not standardized or comparable across operators. Examples: operator codes or labels (e.g., '1B-Type-04', 'A1', 'FP-C'), not generic values like 'studio'. |
| Field | Required? | Type | Description |
|---|---|---|---|
availableFrom |
optional | string | Date from which this Listing is available. Format: YYYY-MM-DD. |
canonicalUrl |
optional | string | Canonical Rentiful URL (SEO canonical). Format: https://rentiful.ai/{cc}/property/{handle}. Requires handle and countryCode. Mutable, may change if handle changes. May be omitted if handle or countryCode is not available. |
currency |
optional | string | ISO 4217 currency code for rent amounts. |
dataUrl |
optional | string | Direct JSON endpoint on the Property Service open data domain. |
depositWeeks |
optional | string | Deposit amount expressed as weeks of rent. |
firstPublishedAt |
optional | string | When this Listing was first published. Format: ISO 8601 date-time. |
furnished |
optional | string | Furnishing status of this Listing. |
idUrl |
optional | string | Immutable, ID-based identity URL for this entity. Uses the Listing ID token in the path. |
lastUpdatedAt |
optional | string | When this Listing was last updated. Format: ISO 8601 date-time. |
listingId |
required | string | Canonical public identifier for this Listing. Opaque, human-friendly key. |
maxTenancyMonths |
optional | string | Maximum tenancy length in months, if applicable. |
minTenancyMonths |
optional | string | Minimum tenancy length in months. |
operatorId |
required | string | The current managing brand for this Listing. |
petsAllowed |
optional | string | Whether pets are allowed in this Listing. |
rentPcm |
optional | string | Monthly rent in pence (GBP) or smallest currency unit. |
status |
required | string | Current availability status of this Listing. |
unitId |
required | string | The Unit this Listing is for. A Listing always belongs to a Unit. |
| Field | Required? | Type | Description |
|---|---|---|---|
canonicalUrl |
optional | string | Canonical Rentiful URL (SEO canonical). Format: https://rentiful.ai/operators/{handle}. Requires handle. No country prefix for operators. Mutable, may change if handle changes. May be omitted if handle is not available. |
dataUrl |
optional | string | Direct JSON endpoint on the Property Service open data domain. Format: https://{env}.property.rentiful.ai/data/v1/{entityTypePlural}/{entityId}. Same domain family as schemas and OpenAPI. |
handle |
optional | string | Optional human-readable handle for this entity. A mutable alias, not part of identity. Identity remains the canonical operatorId. |
idUrl |
optional | string | Immutable, ID-based identity URL for this entity. Uses the Operator ID token in the path (eg /operators/{token}), never the handle, and never includes a country prefix. Stable, immutable, deterministic. |
name |
required | string | The name of this Operator (e.g., 'Get Living', 'Quintain Living', 'Vertus'). |
operatorId |
required | string | Canonical public identifier for this Operator. Opaque, human-friendly key. |
url |
optional | string | Public URL for this Operator, if available. |
Place → Contains Collection (optional) and Building
Collection → Groups Buildings (optional, marketing grouping)
Building → Contains Unit
Unit → Belongs to Building (required), Collection (optional, derived), Place (required, derived)
Unit → Has many Listings (rental offerings over time)
Listing → Temporal rental offering for a Unit (price, availability, terms)
Operator → Manages all entities (current managing brand, may change over time)
Note: Unit ancestry fields (placeId, collectionId) are derived/read-only convenience fields. Building and Collection placeId fields represent canonical relationships.
All properties ending in Id must match these patterns:
placeId: ^p_[a-z2-7]{10}$collectionId: ^c_[a-z2-7]{10}$buildingId: ^b_[a-z2-7]{10}$unitId: ^u_[a-z2-7]{10}$listingId: ^l_[a-z2-7]{10}$operatorId: ^o_[a-z2-7]{10}$placeId, operatorId, namecollectionId, placeId, operatorId, namebuildingId, placeId, operatorId, nameunitId, buildingId, placeId, operatorId, status, lastVerifiedDate, isActivelistingId, unitId, operatorId, statusoperatorId, nameAll renter-native entities (Place, Residence, Building, Operator) require name with minLength: 1.
Unit name is optional.
All entities include idUrl field (format: uri) - immutable, ID-based identity URL on rentiful.ai, dereferenceable via content negotiation (HTML by default, JSON with Accept: application/json).
All entities include dataUrl field (format: uri) - direct JSON endpoint on the Property Service open data domain (same domain family as schemas and OpenAPI).
All entities include optional canonicalUrl field (format: uri) - SEO canonical URL for sharing and marketing on rentiful.ai.
External links remain under the url field.
All entity types have corresponding list response schemas (e.g., place.list.schema.json, operator.list.schema.json).
List responses use the standard envelope format: { "schemaUrl": "...", "items": [...], "nextCursor": "..." | null }.
Each list schema references its entity schema via $ref. The items array contains entities conforming to the entity schema.
All schemas enforce additionalProperties: false. Only explicitly allowlisted fields are exposed.
Unit represents the publicly presented rentable home. In co-living or student housing this may be an individual bedroom within a shared flat, rather than a self-contained apartment.