The booking object
One representation, returned by every booking endpoint and carried as the data
block of every booking.changed webhook. Write one parser.
Fields
| Field | Type | Description |
|---|---|---|
id
|
integer | Doorloom's booking id. Use it in the REST paths. |
external_booking_id
|
string|null | The id you supplied at create. |
external_reference
|
string|null | Your source.reference, e.g. the OTA confirmation code. |
revision
|
integer | Increments on every change, from either side. |
origin
|
string | "partner" or "doorloom" — who made the latest change. |
status
|
string | pending, confirmed, cancelled, completed or refunded. |
property.doorloom_id
|
integer | The booked property. |
property.external_id
|
string|null | Your alias for it. |
check_in
|
string | Y-m-d. |
check_out
|
string | Y-m-d. Exclusive — the guest leaves this morning. |
guests.adults
|
integer | Total adults across all units. |
guests.children
|
integer | Total children across all units. |
guest.name
|
string | Lead guest name. |
guest.phone_code
|
string | Dialling code, e.g. "+91". |
guest.mobile
|
string | Mobile number without the dialling code. |
units[].property
|
object | {doorloom_id, external_id} for the unit's property. |
units[].inventory_id
|
integer | The allocated unit. |
units[].external_unit_id
|
string|null | Your alias for it. |
units[].adults
|
integer | Adults in this unit. |
units[].children
|
integer | Children in this unit. |
units[].meal_plan
|
string|null | EP, CP, MP or AP. |
units[].stay_price
|
number | Room money for this unit across the stay. |
units[].meal_total
|
number | Meal money for this unit across the stay. |
units[].line_total
|
number | stay_price plus meal_total. |
pricing.currency
|
string | Always "INR". |
pricing.total
|
number | Booking total. For a booking you created, this is the total you sent. |
pricing.advance
|
number | Recorded as collected. |
pricing.balance
|
number | Still owed. |
pricing.partner_breakdown
|
object|null | The pricing.breakdown you sent at create, stored verbatim and never interpreted. |
payment
|
object|null | The payment object you sent, stored verbatim. |
source.channel
|
string|null | The channel you named at create, e.g. "airbnb". |
source.reference
|
string|null | Your reference on that channel. |
notes
|
string|null | Free-text note on the booking. |
cancelled_at
|
string|null | ISO-8601 in Asia/Kolkata. Non-null once cancelled. |
cancellation_note
|
string|null | Why it was cancelled. |
created_at
|
string | ISO-8601 in Asia/Kolkata. |
updated_at
|
string | ISO-8601 in Asia/Kolkata. |
Example
{
"id": 55231,
"external_booking_id": "PMS-100234",
"external_reference": "HM-77",
"revision": 2,
"origin": "doorloom",
"status": "confirmed",
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9"
},
"check_in": "2026-10-12",
"check_out": "2026-10-14",
"guests": {
"adults": 4,
"children": 1
},
"guest": {
"name": "Asha Rao",
"phone_code": "+91",
"mobile": "9876543210"
},
"units": [
{
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9"
},
"inventory_id": 31,
"external_unit_id": "ROOM-A",
"adults": 2,
"children": 1,
"meal_plan": "CP",
"stay_price": 8000,
"meal_total": 2600,
"line_total": 10600
},
{
"property": {
"doorloom_id": 902,
"external_id": "VILLA-9"
},
"inventory_id": 32,
"external_unit_id": "ROOM-B",
"adults": 2,
"children": 0,
"meal_plan": "EP",
"stay_price": 8000,
"meal_total": 0,
"line_total": 8000
}
],
"pricing": {
"currency": "INR",
"total": 18600,
"advance": 4000,
"balance": 14600,
"partner_breakdown": {
"room": 16000,
"meals": 2600
}
},
"payment": {
"status": "partial",
"amount_collected": 4000,
"collected_by": "partner",
"reference": "pay_123"
},
"source": {
"channel": "airbnb",
"reference": "HM-77"
},
"notes": "Late arrival, around 11pm",
"cancelled_at": null,
"cancellation_note": null,
"created_at": "2026-10-01T15:58:12+05:30",
"updated_at": "2026-10-01T16:22:40+05:30"
}
Three fields worth understanding
revision
Starts at 1 and increments on every change, from either side. It is what
If-Match compares against on
update, and it is the cheapest way to
tell whether a booking you hold is stale.
origin
Who made the most recent change. "partner" is you; "doorloom" is the
host editing in the app. On a webhook this is the field that separates an echo of your own write
from a change you actually need to apply.
status
| Field | Type | Description |
|---|---|---|
pending
|
string | Held but not confirmed. Holds inventory exactly as a confirmed booking does. |
confirmed
|
string | The normal state of a live booking. |
cancelled
|
string | Terminal. Inventory is released. The booking cannot be modified. |
completed
|
string | The stay has finished. |
refunded
|
string | Money was returned. |
What is not here
- The guest\'s email and country. They can be sent at create and are stored, but are not returned. Keep your own copy.
- Anything Doorloom computed about the price.
pricing.totalis the number you supplied.partner_breakdownandpaymentare your own objects handed back verbatim, never interpreted. - Per-night detail. A booking carries totals per unit, not a nightly
breakdown. Nightly prices live in
rates.changed.
Where you get it
- Create — as
dataon a 201, or on a 200 withduplicate: trueadded. - Retrieve — singly, or as an array in a paged list.
- Update and cancel — the state after the change.
booking.changed— as the event\'sdatablock.