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?

Use GET /v1/properties/:id to fetch a single property with full details including custom fields, photos, and amenities.

List properties

GET/v1/properties
curl "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: 50

Maximum number of results to return.

offsetintegerDefault: 0

Number of results to skip for pagination.

statusstringDefault: active

Which properties to return. Defaults to active only. Inactive properties are returned with identity fields only: id, name, status, lifecycleStatus, channels and updatedAt.

active inactive all
channelstring

Filter to properties published on that OTA. Omit for all.

airbnb booking vrbo

Response 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

idstring

Unique property identifier.

namestring

Internal property name.

publicNamestring

Guest-facing display name.

statusstring

active or inactive. An inactive property is not billed and cannot be read or changed through the API until it is activated.

addressobject

Property address.

locationobject

Geographic coordinates.

bedroomsinteger

Number of bedrooms.

bathroomsinteger

Number of bathrooms.

maxGuestsinteger

Maximum occupancy.

thumbnailstringnullable

URL of the primary listing photo.

currencystring

Default 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.

createdAtstring

ISO 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.

AI