Property Owners
A property owner is Rhino's client, the property management company whose renters you serve. This endpoint creates one and returns the slug to which every other Onboarding and Partner API call is scoped.
The same call both creates and updates, keyed on external_org_id; there is no separate update endpoint. It is the only Onboarding endpoint that accepts a single object rather than an array, and the only one not scoped to an owner_slug, because it is the call that returns one.
See Authentication & Environments for base URLs and tokens, and the Onboarding overview for the upsert and error conventions shared across these endpoints.
Create or update a property owner
POST /partners/property_owners
Content-Type: application/json
{
"external_org_id": "acme-mg-77931",
"name": "Hudson Residential Group",
"embedded_frame_ancestors": ["https://www.acme.com"],
"purchase_flow_enabled": false,
"max_coverage_amount_cents": 1000000,
"guarantor_coverage_capable": false
}
Request fields
| Field | Required | Default | Notes |
|---|---|---|---|
external_org_id | yes | Your own identifier for the owner. The upsert key | |
name | yes | The owner's display name | |
embedded_frame_ancestors | no | none | https origins permitted to frame the enrollment flow. An update replaces the entire list |
purchase_flow_enabled | no | false | Enables the embedded purchase flow. Enable only after the roster is loaded |
max_coverage_amount_cents | no | none | Coverage ceiling, in integer cents. No ceiling when unset |
guarantor_coverage_capable | no | false | Enables Renter Guarantee for properties you create under this owner. See Renter Guarantee on creation |
Response
{
"status_code": 201,
"property_owner": {
"external_org_id": "acme-mg-77931",
"name": "Hudson Residential Group",
"slug": "hudson-residential-group",
"status": "pending",
"purchase_flow_enabled": false,
"embedded_frame_ancestors": ["https://www.acme.com"],
"max_coverage_amount_cents": 1000000,
"guarantor_coverage_capable": false
}
}
The HTTP status is 201 on a create and 200 on an update; the status_code field mirrors it. A repeat call with the same external_org_id updates the existing owner.
Rhino assigns the slug. Use it as the {owner_slug} path segment on every subsequent call: bank accounts, properties, units, and prospects.
status reflects purchase_flow_enabled: pending while the flow is disabled, active once it is enabled. With the flow enabled and no roster loaded, a renter resolves no unit and receives no enrollment URL. Load the roster first, then enable the flow. See Provisioning an owner.
embedded_frame_ancestors must contain https origins: https://*.acme.com is accepted, https://*.com is rejected. It governs both iframe rendering and postMessage delivery for the embedded flow.
max_coverage_amount_cents caps coverage across the owner. Leaving it unset applies no ceiling, so configuring one is recommended.
guarantor_coverage_capable only affects properties you create afterward; it does not retroactively enable Renter Guarantee on properties already on the roster. Sending an explicit null clears it back to false. See Renter Guarantee on creation.
Owners with an existing Rhino relationship
Creation is keyed solely on external_org_id. Rhino does not match on name, and cannot automatically determine that the company you are onboarding already has a direct Rhino relationship. Where that is possible, coordinate with your Partner Success Manager before calling this endpoint. Creating the owner regardless produces a duplicate that must be merged manually.
For an owner that already works with Rhino, you do not create it. Rhino grants you access to named buildings and returns the slug (a single company may map to more than one), and purchase_flow_enabled and max_coverage_amount_cents are owned by Rhino, so sending either for such an owner returns 422. Where the external_org_id you send belongs to one of these, the call returns 409. See Owner types.
Next steps
- Bank accounts: register where claims are paid
- Properties: load the building roster