Availability

Calendar-level availability and pricing for properties.

Get availability calendar for a property

GET/v1/availability/:propertyId

Note

The listing's own calendar — one per listing, the same whichever channels it is on. `price` is the listing's price before any channel markup: a $200 night with a 35% Airbnb markup is sold on Airbnb for $270 while this returns 200. Markups: GET/PUT /v1/listings/{id}/markups. What a channel holds right now: read the channel (GET /v1/channels/booking/availability, GET /v1/channels/airbnb/listings/{id}/availability).

Request

curl https://api.repull.dev/v1/availability/123?from=2026-06-01&to=2026-06-05 \
  -H "Authorization: Bearer $REPULL_API_KEY"

Response

{
  "propertyId": "123",
  "currency": "USD",
  "days": [
    {
      "date": "2026-06-01",
      "available": true,
      "price": 0,
      "minNights": 0
    }
  ],
  "coverage": {
    "requestedDays": 0,
    "coveredDays": 0,
    "missingDates": []
  }
}

Captured from a real response. Regenerated on every release, and CI fails if this shape stops matching the API.

Query Parameters

fromdateRequired

First night, inclusive (YYYY-MM-DD)

todateRequired

Last night, inclusive (YYYY-MM-DD)

Update availability — set prices, block/unblock dates

PUT/v1/availability/:propertyId

Note

At least one of available, price, minNights or maxNights is required — a body with none returns 422 rather than a 200 that changes nothing. The write also pushes to every connected channel; `synced` reports what each one did, and `authErrors` counts channels whose connection needs reauthorising rather than retrying. On a listing a connected PMS manages, open/closed nights, the nightly price and the minimum stay are written to the PMS too when the connection's write policy allows it (calendar.availability / rates / restrictions). For Guesty and Hostaway those switches start off — opt in with PATCH /v1/connect/{provider}/write-policy. Guide: /docs/connect/write-policy#calendar

Request

curl -X PUT https://api.repull.dev/v1/availability/123 \
  -H "Authorization: Bearer $REPULL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "dates": [
    "2026-06-01",
    "2026-06-02"
  ],
  "available": false,
  "price": 320
}'

Response

{
  "data": {
    "listingIds": [123],
    "dates": 2,
    "synced": { "attempted": 2, "succeeded": 2, "failed": 0, "authErrors": 0 }
  }
}

Body Parameters

datesarrayRequired

Nights to write, as ISO dates: `["2026-06-01", "2026-06-02"]`. Max 731 — Airbnb refuses calendar writes spanning more.

availableboolean

Open or block the nights

pricenumber

The listing's own nightly rate. Each channel adds its markup when the price is sent to it.

minNightsinteger

Minimum stay for an arrival on these nights

maxNightsinteger

Maximum stay for an arrival on these nights

Batch update availability across multiple properties (max 500)

PATCH/v1/availability/batch

Request

curl -X PATCH https://api.repull.dev/v1/availability/batch \
  -H "Authorization: Bearer $REPULL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "propertyIds": [
    123,
    124
  ],
  "dates": [
    "2026-06-01",
    "2026-06-02"
  ],
  "price": 299
}'

Response

{
  "data": {
    "listingIds": [123, 456],
    "dates": 1,
    "synced": { "attempted": 4, "succeeded": 4, "failed": 0, "authErrors": 0 }
  }
}

Body Parameters

propertyIdsarrayRequired

Property ids to write, max 500: `[123, 456]`

datesarrayRequired

Nights to write, as ISO dates, applied to every property listed

availableboolean

Open or block the nights

pricenumber

Nightly rate

minNightsinteger

Minimum stay for an arrival on these nights

maxNightsinteger

Maximum stay for an arrival on these nights

AI