Skip to main content

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 familydata keySubject
prospect.*third_party_prospectThe prospect you created via the Partner API
policy.*insurance_policyAn issued Rhino policy
policy_application.*policy_applicationA renter's in-progress application
delinquency.*delinquencyA 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

FieldDescription
idRhino prospect ID (tpp_…). On prospect.created only, this is your source_prospect_id instead.
source_prospect_idYour identifier for the prospect
statusincomplete, processing, ready, or error
enrollment_urlLink to start enrollment. Present only when the prospect is eligible.
pms_typePMS the prospect came from, currently only yardi
pms_property_id, pms_unit_id, pms_prospect_idPMS 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

FieldDescription
idRhino policy ID (policy_…)
policy_numberHuman-readable policy number
statusactive, upcoming, pending, expired, or canceled
pms_typePMS integration type for the matched resident
pms_property_id, pms_unit_idPMS codes for the property and unit
pms_resident_idPMS resident identifier
source_prospect_idYour prospect ID. Omitted when the policy did not originate from a prospect you created.
policy_urlpolicy.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

FieldDescription
idRhino application ID (pa_…)
statuscreated 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_idPMS identifiers for the matched resident
source_prospect_idYour 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

FieldDescription
idRhino delinquency ID (delinquency_…)
statusactive or resolved
amount_centsOutstanding amount in cents
policy_numberPolicy the delinquency belongs to
pms_property_code, pms_unit_code, pms_tenant_codePMS identifiers. Note these use _code suffixes, unlike the _id suffixes on policy and application payloads.
source_prospect_idYour prospect ID. Omitted when the policy did not originate from a prospect you created.