List properties
Every property your integration covers, with its units and the aliases mapped for both. The call you make first, and again whenever you need to rebuild your mapping.
No parameters. Returns everything you cover, in one response — coverage is a small, hand-curated list, so there is no pagination.
curl https://api.doorloom.com/api/integrations/v1/properties \
-H "Authorization: Bearer $DOORLOOM_API_KEY"
Response
{
"success": true,
"message": "OK",
"data": {
"sequence": 1047,
"properties": [
{
"doorloom_id": 902,
"external_id": "VILLA-9",
"coverage": "active",
"name": "Amber Villa, Alibaug",
"property_type": "Villa",
"status": "active",
"is_master": true,
"master_property_id": 902,
"units": [
{
"inventory_id": 31,
"external_unit_id": "ROOM-A",
"name": "Garden Suite",
"code": "GS",
"is_active": true,
"is_default": true,
"max_occupancy": 4,
"deleted": false
},
{
"inventory_id": 32,
"external_unit_id": "ROOM-B",
"name": "Pool Suite",
"code": "PS",
"is_active": true,
"is_default": false,
"max_occupancy": 4,
"deleted": false
}
]
}
]
}
}
| Field | Type | Description |
|---|---|---|
sequence
|
integer | The integration's sequence watermark, read before the list was built. Any event with a higher sequence is safe to apply on top of this snapshot. |
properties[].doorloom_id
|
integer | Doorloom's permanent property id. |
properties[].external_id
|
string|null | Your alias, if one is mapped. |
properties[].coverage
|
string | active or inactive. An inactive property is no longer in your scope and will send you no further events. |
properties[].name
|
string | The listing name. |
properties[].property_type
|
string|null | Villa, apartment, homestay and so on. |
properties[].status
|
string | active, inactive or archived. Archived properties cannot be booked. |
properties[].is_master
|
boolean | True when this is the head of its cluster, or is not in one. |
properties[].master_property_id
|
integer | The cluster head's id. |
properties[].units[].inventory_id
|
integer | Doorloom's permanent unit id. |
properties[].units[].external_unit_id
|
string|null | Your alias for the unit. |
properties[].units[].name
|
string | Unit name. |
properties[].units[].code
|
string|null | Host-entered short code. |
properties[].units[].is_active
|
boolean | Whether the unit is sellable. |
properties[].units[].is_default
|
boolean | True for the property's default unit. |
properties[].units[].max_occupancy
|
integer|null | Guests the unit sleeps. Not enforced by Doorloom. |
properties[].units[].deleted
|
boolean | True once the host deletes the unit. |
Only active units appear here
inventory.changed
event, which deliberately includes them.Aliases
An external_id or external_unit_id is a mapping Doorloom staff
create between your identifier and theirs. Where one exists you may use it anywhere the API takes
a property or unit reference, which usually means you never have to store Doorloom's ids at all.
Where one does not exist the field is null, and you must use the numeric id.
Alias changes are announced as
inventory.changed
and property.changed
events.
What coverage means
Coverage is the set of properties the brand owner owns. Properties they merely cohost for another host are never included, however visible they are in the Doorloom app.
Booking a property outside your coverage is
422 PROPERTY_NOT_MAPPED, and you receive no events for it.
Using the sequence watermark
data.sequence is read before the properties are gathered, which makes it
safe in the useful direction: any event numbered higher than it describes a change that may or may
not already be reflected in this snapshot, so applying it on top is always correct. An event
numbered lower or equal is definitely already included.
The same pattern is used by the availability, rates and restriction snapshots.
Errors
Errors
| Status | Code | Meaning |
|---|---|---|
| 401 | UNAUTHENTICATED |
No API key, or a key that is not valid. Rotating your API key invalidates the previous one immediately. |
| 403 | NOT_INTEGRATION_TOKEN |
The bearer token is valid but is not an integration API key — it belongs to another Doorloom token surface. Integration keys are the only credential this API accepts. |
| 403 | INTEGRATION_DISABLED |
Doorloom staff disabled this integration. No events are recorded and no API call succeeds. This is distinct from paused: a paused integration keeps full API access and only stops receiving webhooks. |
| 429 | RATE_LIMITED |
You exceeded one of the rate limits. The standard Retry-After and X-RateLimit-* headers are set on the response. |