Units
A unit belongs to a building. This endpoint creates and updates units. The same item shape is also accepted nested inside a prospect to create a unit on the fly.
See the Onboarding overview for the array, result, and upsert conventions this endpoint shares.
Create or update units
POST /partners/{owner_slug}/units
Content-Type: application/json
[
{ "external_system_id": "acme-unit-456",
"property_external_id": "acme-prop-123",
"address": {
"line_one": "1101 Midland Avenue APT 01",
"line_two": null,
"city": "New Brunswick",
"state": "NJ",
"zip": "08901"
},
"pms_unit_id": "0401",
"default_coverage": { "type": "multiplier", "value": 1.5 } }
]
The example omits name, so Rhino derives it as "01" from the address.
Request fields
| Field | Required | Notes |
|---|---|---|
external_system_id | yes | Your own identifier. The upsert key |
property_external_id | yes | Your property identifier, never a Rhino one |
name | no | Unit number or name. When omitted, it is derived from address. Sending it always takes precedence over derivation |
address | no | The unit's full address, exactly as stored, including any line 1 and line 2 inconsistency, designators, and extraneous text. Object: line_one, line_two, city, state, zip. Used to derive the building street and, when name is absent, the unit's label. line_two is not read for identity |
pms_unit_id | no | The PMS unit code, when applicable. For an owner with an existing Rhino relationship, send it: it is the primary unit match key |
default_coverage | no | Inherits from the property when absent |
Response
{
"status_code": 200,
"results": [
{ "external_system_id": "acme-unit-456", "action": "created" }
],
"meta": { "created": 1, "updated": 0, "failed": 0 }
}
Units key on property_external_id, so properties and units may be sent in the same pass. A property_external_id that Rhino does not recognize fails that item, so send the property first, in the same request or an earlier one. Sending a building's units in a single request is recommended, because it resolves the building's derived address and unit names immediately.
Unit name derivation
When name is absent, the label is derived, in order:
- The designator found in the unit's own street line (
"APT 01"yields"01"). - The street line with the building's established street removed, so a bare
"…Blvd. 208"resolves to"208". - A designator in
line_two. - The
pms_unit_id.
A single unit building defaults to "1". Standard designator words are dropped ("APT 01" yields "01"); nonstandard ones are kept verbatim, such as "5th Floor" or "Loft B". Where nothing is derivable in a multi unit building, the item fails with "unit name required and not derivable", because Rhino never guesses a label that will appear on a policy.
Unit matching
Within the parent building, in the same order as properties:
- If
external_system_idis already linked to a unit, that unit is updated. - PMS code, when sent. An existing unit with the same
pms_unit_idis adopted and linked. This match is exact and unaffected by naming style, which is why an owner with an existing Rhino relationship should always send it: a derived name such as"113"may not match the PMS's stored"0113". - Otherwise, by
name, ignoring case. A unit already linked to a different identifier fails the item, as with properties. - Otherwise, create.
One unit buildings. A property of type single_family or garden_community holds exactly one unit; a second unit sent for it fails as an individual item error.
There is no unit level removal; a unit cannot be individually deactivated. Remove the whole building with the property's active: false, or resolve it with your Partner Success Manager.
Next steps
- Partner Prospect API: point a prospect at a building and unit