Retrieve bookings
Read one booking by Doorloom's id or your own, or page through all of them. Three endpoints, one representation.
All three return the
booking object, and all three see only
bookings that belong to your integration. Another integration's booking is a
404, not a 403, so ids cannot be probed across partners.
By Doorloom id
curl https://api.doorloom.com/api/integrations/v1/bookings/55231 \
-H "Authorization: Bearer $DOORLOOM_API_KEY"
The path segment must be numeric.
By your own id
curl https://api.doorloom.com/api/integrations/v1/bookings/external/PMS-100234 \
-H "Authorization: Bearer $DOORLOOM_API_KEY"
Useful when your system holds only its own reference — after a create whose response you lost, for instance. URL-encode the id if it contains anything exotic.
Listing
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
updated_since
|
string | Optional | Any parseable date or timestamp. Returns bookings changed since then. This is the polling parameter. |
status
|
string | Optional | One of pending, confirmed, cancelled, completed, refunded. |
property_id
|
integer | Optional | Doorloom property id. |
check_in_from
|
string | Optional | YYYY-MM-DD. Earliest check-in. |
check_in_to
|
string | Optional | YYYY-MM-DD. Latest check-in. |
page
|
integer | Optional | 1-based. Defaults to 1. |
per_page
|
integer | Optional | 1 to 200. Defaults to 50. |
Results are ordered by when they were last updated, oldest first. That
ordering is deliberate: it makes updated_since safe to page through, because nothing
you have already walked past can jump ahead of your cursor.
curl -G https://api.doorloom.com/api/integrations/v1/bookings \
-H "Authorization: Bearer $DOORLOOM_API_KEY" \
--data-urlencode "updated_since=2026-10-01T00:00:00+05:30" \
--data-urlencode "status=confirmed" \
--data-urlencode "per_page=100"
{
"success": true,
"message": "OK",
"data": [
{
"id": 55231,
"external_booking_id": "PMS-100234",
"revision": 2,
"status": "confirmed",
"…": "…"
},
{
"id": 55240,
"external_booking_id": "PMS-100241",
"revision": 1,
"status": "pending",
"…": "…"
}
],
"pagination": {
"page": 1,
"per_page": 100,
"total": 128,
"last_page": 2
}
}
pagination sits beside data, not inside it
data.pagination is
null.Polling versus webhooks
If you subscribe to
booking.changed,
you do not need to poll. Every change to a booking of yours is pushed.
Poll with updated_since when you are recovering from an outage longer than the
30-day event retention, or as a slow belt-and-braces reconciliation. Store the highest
updated_at you have processed and pass it back next time.
Errors
Errors
| Status | Code | Meaning |
|---|---|---|
| 422 | VALIDATION_FAILED |
The request body failed validation. errors is Laravel's field bag: an object keyed by field path, each holding an array of messages. |
| 404 | NOT_FOUND |
No such booking or property for this integration. Another integration's booking is not found rather than forbidden, so ids cannot be probed across partners. |
| 401 | UNAUTHENTICATED |
No API key, or a key that is not valid. Rotating your API key invalidates the previous one immediately. |
| 429 | RATE_LIMITED |
You exceeded one of the rate limits. The standard Retry-After and X-RateLimit-* headers are set on the response. |