Webhook Event Reference
Every event Rhino emits, and the exact payload for each. See the Webhooks Overview for headers, signatures, and retry behavior.
Envelope
All events share the same two-key envelope. data holds a single object keyed by the subject of the event.
{
"event": "<event name>",
"data": {
"<subject>": { }
}
}
| Event family | data key | Subject |
|---|---|---|
prospect.* | third_party_prospect | The prospect you created via the Partner API |
policy.* | insurance_policy | An issued Rhino policy |
policy_application.* | policy_application | A renter's in-progress application |
delinquency.* | delinquency | A missed premium payment |
Within a family, every event carries the same payload shape — policy.created and policy.canceled differ only in the event name and the policy's status. Subscribe to the specific events you care about; there is no wildcard subscription.
Rhino IDs are prefixed strings (tpp_, policy_, pa_, delinquency_). Wherever a field is described as optional it is omitted entirely rather than sent as null.
Prospect events
prospect.created
Fired when a prospect record is first created, whether from your first partner webhook event for that renter or your initial POST to the prospects endpoint.
This payload is deliberately minimal and is the one place where the shape differs from the rest of the family. Note that id here is your source_prospect_id, not Rhino's tpp_ identifier.
{
"event": "prospect.created",
"data": {
"third_party_prospect": {
"id": "your-prospect-123"
}
}
}
Because a prospect is usually created with incomplete data, this event does not tell you whether the prospect can enroll. Wait for prospect.ready.
prospect.ready
Fired when a prospect transitions to the ready status, meaning Rhino has everything it needs and the renter can begin enrolling. enrollment_url is populated on this event and is the link you send the renter to.
{
"event": "prospect.ready",
"data": {
"third_party_prospect": {
"id": "tpp_a1b2c3d4",
"source_prospect_id": "your-prospect-123",
"status": "ready",
"enrollment_url": "https://www.sayrhino.com/enrollment/embedded/acme-properties/acme/your-prospect-123?email=renter%40example.com",
"pms_type": "yardi",
"pms_property_id": "prop-1",
"pms_unit_id": "unit-101",
"pms_prospect_id": "p0001234"
}
}
}
prospect.incomplete
Fired when a prospect transitions to the incomplete status because required fields are missing. Same payload as prospect.ready, with status set to incomplete and enrollment_url omitted.
The payload does not enumerate which fields are missing. Fetch the prospect with GET /partners/{owner_slug}/prospects/{source}/{source_prospect_id} to see its current state, and re-POST the prospect with the missing values to move it forward.
Prospect fields
| Field | Description |
|---|---|
id | Rhino prospect ID (tpp_…). On prospect.created only, this is your source_prospect_id instead. |
source_prospect_id | Your identifier for the prospect |
status | incomplete, processing, ready, or error |
enrollment_url | Link to start enrollment. Present only when the prospect is eligible. |
pms_type | PMS the prospect came from, currently only yardi |
pms_property_id, pms_unit_id, pms_prospect_id | PMS identifiers you supplied |
Policy events
policy.created
Fired when a policy is issued.
{
"event": "policy.created",
"data": {
"insurance_policy": {
"id": "policy_a1b2c3d4",
"policy_number": "RH12345678",
"status": "active",
"pms_type": "yardi",
"pms_property_id": "prop-1",
"pms_unit_id": "unit-101",
"pms_resident_id": "t0001234",
"source_prospect_id": "your-prospect-123"
}
}
}
policy.updated
Fired when a policy revision is applied successfully — a coverage change, date change, or unit correction. The payload reflects the policy's new state; it does not include a diff of what changed.
policy.canceled
Fired when a policy's status becomes canceled. Payload identical to policy.created with status set to canceled. The payload does not include a cancellation reason or refund amount.
policy.expired
Fired when a policy's status becomes expired.
policy.documents_updated
Fired when the policy document archive is regenerated — after the initial purchase, and again after any revision. Same payload as the other policy events, plus a policy_url field when a document is available.
Documents are generated asynchronously, so policy.created carries no document and arrives before the paperwork exists. If you surface policy documents to renters or property managers, key that off this event rather than off policy.created.
{
"event": "policy.documents_updated",
"data": {
"insurance_policy": {
"id": "policy_a1b2c3d4",
"policy_number": "RH12345678",
"status": "active",
"pms_type": "yardi",
"pms_property_id": "prop-1",
"pms_unit_id": "unit-101",
"pms_resident_id": "t0001234",
"source_prospect_id": "your-prospect-123",
"policy_url": "https://.../policy-documents.pdf"
}
}
}
policy_url points to a zip archive of the policy's documents, and is omitted entirely when no archive exists yet.
Fetch the archive and store the file on your side rather than persisting the URL. Each regeneration writes a new object, so a URL you saved earlier keeps resolving to the superseded document rather than failing — you would serve stale paperwork with no error to warn you. The link is also not access-controlled, so treat it with the same care as the documents themselves.
Policy fields
| Field | Description |
|---|---|
id | Rhino policy ID (policy_…) |
policy_number | Human-readable policy number |
status | active, upcoming, pending, expired, or canceled |
pms_type | PMS integration type for the matched resident |
pms_property_id, pms_unit_id | PMS codes for the property and unit |
pms_resident_id | PMS resident identifier |
source_prospect_id | Your prospect ID. Omitted when the policy did not originate from a prospect you created. |
policy_url | policy.documents_updated only, and only when a document exists |
Policy application events
An application is the renter's in-progress enrollment, before a policy exists. These events let you track drop-off and decisions.
policy_application.created
Fired when a renter starts an application.
{
"event": "policy_application.created",
"data": {
"policy_application": {
"id": "pa_a1b2c3d4",
"status": "created",
"pms_type": "yardi",
"pms_property_id": "prop-1",
"pms_unit_id": "unit-101",
"pms_resident_id": "t0001234",
"source_prospect_id": "your-prospect-123"
}
}
}
policy_application.quoted
Fired when underwriting accepts the application and pricing is available.
policy_application.declined
Fired when underwriting declines the application. The payload does not include a decline reason — declines are subject to FCRA adverse-action requirements and Rhino notifies the renter directly.
policy_application.submitted
Fired when the renter submits the application. A policy typically follows shortly after; watch for policy.created to confirm.
Policy application fields
| Field | Description |
|---|---|
id | Rhino application ID (pa_…) |
status | created or canceled. This is the application's record status, not its underwriting outcome — the outcome is conveyed by the event name. |
pms_type, pms_property_id, pms_unit_id, pms_resident_id | PMS identifiers for the matched resident |
source_prospect_id | Your prospect ID. Omitted when the application did not originate from a prospect you created. |
Delinquency events
delinquency.created
Fired when a renter misses a premium payment.
{
"event": "delinquency.created",
"data": {
"delinquency": {
"id": "delinquency_a1b2c3d4",
"status": "active",
"amount_cents": 3200,
"policy_number": "RH12345678",
"pms_property_code": "prop-1",
"pms_unit_code": "unit-101",
"pms_tenant_code": "t0001234",
"source_prospect_id": "your-prospect-123"
}
}
}
delinquency.resolved
Fired when the delinquency is cleared. Same payload with status set to resolved.
Delinquency fields
| Field | Description |
|---|---|
id | Rhino delinquency ID (delinquency_…) |
status | active or resolved |
amount_cents | Outstanding amount in cents |
policy_number | Policy the delinquency belongs to |
pms_property_code, pms_unit_code, pms_tenant_code | PMS identifiers. Note these use _code suffixes, unlike the _id suffixes on policy and application payloads. |
source_prospect_id | Your prospect ID. Omitted when the policy did not originate from a prospect you created. |