Webhooks
Webhook events
Eight events, each a pointer to a record. Read the current state from the API when one arrives; that is what makes a late or repeated delivery harmless. How to receive and verify them is in the Webhooks guide.
Events
| Event | When | data |
|---|---|---|
| listing.updated | A property was published, or re-published with changes. | {
"propertyId": "0d6e1c2a-…"
} |
| listing.deleted | A property was unpublished or removed. Drop it from your site. | {
"propertyId": "0d6e1c2a-…"
} |
| calendar.updated | Availability changed for a property: a booking, a cancellation, a block. | {
"propertyId": "0d6e1c2a-…"
} |
| reservation.created | A booking was created, in any status. | {
"reservationId": "7c02…",
"propertyId": "0d6e1c2a-…",
"status": "reserved",
"previousStatus": null
} |
| reservation.updated | A booking changed: its status, dates, guest, money or notes. | {
"reservationId": "7c02…",
"propertyId": "0d6e1c2a-…",
"status": "confirmed",
"previousStatus": "reserved"
} |
| reservation.deleted | A booking was deleted outright, which is a data-entry mistake being undone. A cancellation is an update. | {
"reservationId": "7c02…",
"propertyId": "0d6e1c2a-…",
"status": "inquiry",
"previousStatus": null
} |
| agreement.requested | Staff pressed Request contract on a booking while another system signs the contracts. Issue the envelope and report it back. force is true when a live envelope should be re-issued. | {
"reservationId": "7c02…",
"propertyId": "0d6e1c2a-…",
"force": false
} |
| ping | Somebody pressed the test button in settings. Confirms the endpoint and the signature. | {
"orgSlug": "cityretreat",
"sentAt": "2026-09-13T10:00:00.000Z"
} |
The envelope
The body is the delivery id, the event, when it was createdAt, and a small data object that points at the record. It is a
pointer, not the record.
Headers
| Header | Value |
|---|---|
| x-housalot-event | The event name, the same as event in the body. |
| x-housalot-delivery | The delivery id, the same as id in the body. Dedupe on it. |
| x-housalot-signature | sha256= followed by the hex HMAC-SHA256 of the raw body under your endpoint’s secret. |
The header names carry the product’s former name and will be renamed only with notice and a transition period.
Delivery
- One POST per event per endpoint, over https, with a ten-second timeout, following no redirects.
- Any 2xx counts as received. Anything else, a timeout or a refused connection is logged as failed.
- There is no retry queue. The last deliveries and their outcomes are listed under the endpoint in Settings › Integrations, and a full read of the resource is always the recovery.
- Endpoints that resolve to a private address are refused at connection time, not at save time.