List Properties
Retrieve your full property catalog from every connected PMS in a single, normalized API call.
When to use this endpoint
- Sync your property catalog into your own database
- Build a property picker or search dropdown for a booking widget
- Populate a calendar view with all available listings
- Generate a property directory or portfolio page
Need property details?
GET /v1/properties/:id to fetch a single property with full details including custom fields, photos, and amenities.List properties
/v1/propertiescurl "https://api.repull.dev/v1/properties?limit=20" \ -H "Authorization: Bearer sk_live_YOUR_KEY" # Only properties published on Booking.com curl "https://api.repull.dev/v1/properties?channel=booking" \ -H "Authorization: Bearer sk_live_YOUR_KEY"
Query parameters
limitintegerDefault: 50Maximum number of results to return.
offsetintegerDefault: 0Number of results to skip for pagination.
statusstringDefault: activeWhich properties to return. Defaults to active only. Inactive properties are returned with identity fields only: id, name, status, lifecycleStatus, channels and updatedAt.
active inactive allchannelstringFilter to properties published on that OTA. Omit for all.
airbnb booking vrboResponse format
Returns a paginated array of property objects.
{
"data": [
{
"id": "123",
"name": "Oceanview Villa",
"publicName": "Stunning Oceanview Villa",
"status": "active",
"address": {
"line1": "123 Beach Rd",
"city": "Malibu",
"state": "CA",
"country": "US",
"postalCode": "90265"
},
"location": {
"latitude": 34.025,
"longitude": -118.779
},
"bedrooms": 3,
"bathrooms": 2,
"maxGuests": 8,
"thumbnail": "https://images.example.com/villa-123.jpg",
"currency": "USD",
"channels": ["airbnb", "booking"],
"createdAt": "2026-01-15T10:00:00Z"
}
],
"pagination": {
"total": 12,
"limit": 50,
"offset": 0,
"hasMore": false
}
}Response fields
idstringUnique property identifier.
namestringInternal property name.
publicNamestringGuest-facing display name.
statusstringactive or inactive. An inactive property is not billed and cannot be read or changed through the API until it is activated.
addressobjectProperty address.
locationobjectGeographic coordinates.
bedroomsintegerNumber of bedrooms.
bathroomsintegerNumber of bathrooms.
maxGuestsintegerMaximum occupancy.
thumbnailstringnullableURL of the primary listing photo.
currencystringDefault currency for this property (ISO 4217).
channelsstring[]The OTAs this property is currently published on (e.g. airbnb, booking, vrbo). Empty if the property is not linked to any channel.
createdAtstringISO 8601 timestamp when the property was created.
Filtering examples
Inactive properties you can activate
curl "https://api.repull.dev/v1/properties?status=inactive" \
-H "Authorization: Bearer sk_live_YOUR_KEY"
# Inactive rows carry identity fields only:
# { "id": "4119", "name": "Harbor Loft", "status": "inactive",
# "lifecycleStatus": "live", "channels": ["airbnb"], "updatedAt": "2026-09-01T12:00:00.000Z" }Every other property endpoint returns 403 listing_inactive for an inactive property. Activate it with POST /v1/listings/status. See Active & inactive listings.
Properties published on a specific OTA
curl "https://api.repull.dev/v1/properties?channel=booking" \ -H "Authorization: Bearer sk_live_YOUR_KEY"
Paginate through all properties
curl "https://api.repull.dev/v1/properties?limit=10&offset=10" \ -H "Authorization: Bearer sk_live_YOUR_KEY"
Pagination
Results are cursor-paginated. Pass the previous response's pagination.nextCursor back as cursor, and stop when pagination.hasMore is false.
// Page through all properties
let cursor: string | undefined
do {
const { data, pagination } = await repull.properties.list({ limit: 20, cursor });
for (const property of data) {
await syncProperty(property);
}
cursor = pagination.hasMore ? pagination.nextCursor ?? undefined : undefined;
} while (cursor);API Reference
See the complete Properties API Reference for all endpoints including get, create, and update.
Want to keep only some of the properties you imported? See Active & Inactive Listings— deactivate the ones you don't need without touching your upstream account.