Enquiries Channel manager Bookings Your website Booking engine Pricing
v2026-09

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

GET https://api.doorloom.com/api/integrations/v1/bookings/{doorloom_id}
Request bash
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

GET https://api.doorloom.com/api/integrations/v1/bookings/external/{external_booking_id}
Request bash
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

GET https://api.doorloom.com/api/integrations/v1/bookings

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.

Request bash
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"
Response 200 json
{
    "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

It is a top-level key of the response object. 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.

Something unclear or wrong on this page? Write to [email protected] and tell us which page — we would rather fix the doc than answer the ticket twice.