Check Availability

Query the calendar for any property to see which dates are open, their nightly rates, and minimum stay requirements.

When to use this endpoint

  • Show a live availability calendar on your booking widget
  • Verify dates are open before creating a reservation
  • Sync availability to a channel manager or external platform
  • Build a date picker that disables unavailable nights

Need to update availability?

Use Update Pricing to push rate changes, block dates, or set minimum night requirements.

Get availability calendar

GET/v1/availability/{propertyId}

Date parameter names differ by endpoint

This generic calendar read takes from and to query params. The per-channel Airbnb calendar (/v1/channels/airbnb/listings/{id}/availability) uses start_date and end_date instead. Match the parameter names to the exact endpoint you call.
curl "https://api.repull.dev/v1/availability/123?from=2026-07-01&to=2026-07-31" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Path parameter

propertyIdintegerRequired

Property ID to check availability for. Pass the integer id from GET /v1/properties as a path segment (e.g. /v1/availability/123).

Query parameters

fromdateRequired

First date of the range, inclusive. Format: YYYY-MM-DD. (Alias: startDate.)

todateRequired

Last date of the range, inclusive. Format: YYYY-MM-DD. (Alias: endDate.) The window is capped at 366 days.

Response format

Returns the days Repull holds calendar data for, plus the requested dates it does not.

{
  "propertyId": "123",
  "currency": "USD",
  "days": [
    { "date": "2026-07-01", "available": true, "price": 250, "minNights": 2 },
    { "date": "2026-07-02", "available": false, "price": 250, "minNights": 2 }
  ],
  "coverage": {
    "requestedDays": 3,
    "coveredDays": 2,
    "missingDates": ["2026-07-03"]
  }
}

Response fields

propertyIdstring

The property the calendar belongs to.

currencystring

ISO 4217 currency code for every price.

daysarray

One entry per date with calendar data, in date order.

coverageobject

requestedDays, coveredDays, and missingDates — requested dates with no calendar data. Treat a missing date as unknown, never as bookable.

Need max-stay or closed-to-arrival?

This read carries availability, price and minimum nights only. For the full restriction set, read the channel calendar: GET /v1/channels/airbnb/listings/{id}/availability?start_date=…&end_date=… or GET /v1/channels/booking/availability?property_id=….

The listing's price and the channel's price

This calendar is the listing's own: one per listing, the same whichever channels it is on. Each channel can add a markupwhen prices are sent to it — a $200 night with a 35% Airbnb markup is sold on Airbnb for $270, while this calendar keeps $200. Airbnb markups are per listing; a Booking.com markup belongs to the property and is shared by every listing on it. Read and set them with GET/PUT /v1/listings/{id}/markups; a change re-sends the affected prices to that channel straight away.

To see what a channel holds right now — its price with the markup, and what it has for sale — read the channel: GET /v1/channels/booking/availability?property_id=… or GET /v1/channels/airbnb/listings/{id}/availability. The Booking.com read returns availability per room (rooms_to_sell), which is how Booking.com keeps inventory. Its per-rate figure, available with room_level=0, reports 0 rooms for rooms that are on sale, so do not use it to decide what is bookable.

Common examples

Check a specific date range before booking

curl "https://api.repull.dev/v1/availability/123?from=2026-07-10&to=2026-07-15" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Full month calendar view

curl "https://api.repull.dev/v1/availability/123?from=2026-08-01&to=2026-08-31" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Validate availability in code

// Check that every night of a stay is known and open
const res = await fetch('https://api.repull.dev/v1/availability/123?from=2026-07-10&to=2026-07-14', {
  headers: { Authorization: `Bearer ${process.env.REPULL_API_KEY}` },
})
const calendar = await res.json()

const blocked = calendar.days.filter(d => !d.available).map(d => d.date)
const unknown = calendar.coverage.missingDates

if (blocked.length === 0 && unknown.length === 0) {
  // Safe to create the booking
} else {
  console.log('Blocked:', blocked, 'No data:', unknown)
}

API Reference

See the complete Availability API Reference for all endpoints including update and batch operations.

AI