IDs & External IDs

TL;DR

There is one Repull id per property. The same value is the id on a property, the listingId on a reservation, and the propertyId for availability. A channel's own id (Airbnb listing id, Booking hotel id) is a separate externalId.

Repull normalizes every property, room, and unit behind a single canonical id. Learn this once and you never have to guess which id a given endpoint expects.

The Repull id

Every property has one stable Repull id (an integer, e.g. 4118). That same value appears under different field names depending on the resource you're reading — but it always points at the same property:

EndpointFieldExample
GET /v1/propertiesid4118
GET /v1/listings/{id}id4118
GET /v1/reservationslistingId4118
GET /v1/availability/{propertyId}propertyId (path)4118
GET /v1/channels/airbnb/listingslistingId4118
GET /v1/channels/booking/propertieslistingId4118

One id to store

Persist the Repull id against your own records. Any endpoint that takes a property, listing, or availability id takes this value — you never need to translate between them.

External IDs

An externalId is the id a specific channel uses for the same property — the Airbnb listing id, the Booking.com hotel id, and so on. One Repull property can carry several external ids (one per channel it's published to). Read them from the listing's channels array:

curl https://api.repull.dev/v1/listings/4118 \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
{
  "id": 4118,
  "name": "R-Sable 1302",
  "status": "active",
  "channels": [
    { "platform": "airbnb",  "externalId": "12345678", "active": true, "syncEnabled": true },
    { "platform": "booking", "externalId": "998877",   "active": true, "syncEnabled": true }
  ]
}

GET /v1/properties returns a lighter shape — channels is just the list of connected platforms:

{ "id": 4118, "name": "R-Sable 1302", "channels": ["airbnb", "booking"] }

Channel-specific ids

When you need the raw ids a channel exposes (host id, connection id, hotel id), use the per-channel routes. Each groups connections under the Repull listingId.

Airbnb

curl https://api.repull.dev/v1/channels/airbnb/listings \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
{
  "data": [
    {
      "listingId": 4118,
      "name": "R-Sable 1302",
      "connections": [
        {
          "id": 55,                 // Airbnb connection id (the "airbnbConnectionId")
          "airbnbId": "12345678",   // Airbnb listing id
          "hostId": "112233",       // Airbnb host id
          "active": true,
          "syncEnabled": true,
          "primary": true
        }
      ]
    }
  ],
  "pagination": { "next_cursor": null, "has_more": false, "total": 1 }
}

Booking.com

Note this route returns a bare array (no data wrapper).

curl https://api.repull.dev/v1/channels/booking/properties \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
[
  {
    "listingId": 4118,
    "name": "R-Sable 1302",
    "connections": [
      {
        "id": 12,                 // Booking connection id
        "hotelId": "998877",      // Booking.com property (hotel) id
        "active": true,
        "syncEnabled": true,
        "syncCategory": "full"
      }
    ]
  }
]

Rooms are separate from properties

Booking.com models room types under a property. Property-level reads return the hotelId; individual room ids are handled during pairing — see Pair PMS Listings.
AI