Docs/Channels/Airbnb

Push Availability to Airbnb

Write Airbnb availability: listing-level availability rules, or per-date restrictions — block and unblock dates, min/max nights, closed-to-arrival and closed-to-departure.

PUT/v1/channels/airbnb/listings/:id/availability

Parameters

idpathRequired

The Repull listing id (not the Airbnb listing id).

typestringRequired

rules (listing-level availability rules) or calendar (per-date operations).

Which endpoint to use

  • {id} is the Repull listing id — from GET /v1/properties or GET /v1/channels/airbnb/listings — not the Airbnb listing id. Repull translates it before calling Airbnb.
  • For nightly price, open/closed and min/max nights, the default is PUT /v1/availability/{propertyId} (or PATCH /v1/availability/batch for many properties): it writes the Repull calendar and pushes the change to the channels Repull can write a calendar to — Airbnb and Booking.com — in one step. Use this endpoint for settings that exist only on Airbnb. Writes here go to Airbnb alone.

API sync is authorised per listing

Airbnb turns API sync on one listing at a time, not once for the account. Each listing carries its own sync category, and a listing whose category is none is closed to the API — Airbnb refuses every write to it even though the account is connected and every other listing on it writes fine. Reconnecting the Airbnb account does not change a listing's sync category. Only someone with access to the listing on Airbnb can turn sync on for it, on the listing itself.

  • sync_all — Repull manages content, rates and availability. Every write on this page works.
  • sync_rates_and_availability — Repull manages rates and availability; listing content is managed by the host on Airbnb.
  • none — the listing is not connected to Repull on Airbnb at all. Every write returns 403 listing_not_api_connected and nothing is sent to Airbnb, so nothing is partially applied.
  • To tell which is which, read GET /v1/channels/airbnb/listings: every entry of each listing's connections[] carries syncCategory (one of the three above, or null if it has never been reported) and writable — false exactly when syncCategory is none. Check writable before a write and you never send one that cannot land. Full detail: https://repull.dev/docs/errors/listing_not_api_connected

Body by type

  • rules — {"type": "rules", "rules": {...}}. Airbnb availability rules such as default_min_nights, default_max_nights, booking_lead_time, turnover_days, day_of_week_min_nights and seasonal_min_nights.
  • calendar — {"type": "calendar", "operations": [...]}. The same per-date operations as the calendar type on Update Airbnb Pricing; fields below.

Calendar operations

  • Dates — either dates (a non-empty array of YYYY-MM-DD dates or inclusive ranges YYYY-MM-DD:YYYY-MM-DD) or start_date + end_date (inclusive, sent together, end_date on or after start_date). Not both.
  • daily_price — nightly price, a number ≥ 0 in the listing currency.
  • availability — available reopens the dates, unavailable blocks them (stop-sell), default falls back to the listing rules.
  • busy_subtype — why a blocked date is blocked: BLOCKED_BY_HOST or OUTSIDE_RESERVATION. Airbnb requires it whenever availability is unavailable; if you leave it out, BLOCKED_BY_HOST is sent. Use OUTSIDE_RESERVATION for dates held by a booking made on another channel.
  • min_nights, max_nights — whole numbers from 1 to 1125 (Airbnb's limit); max_nights cannot be lower than min_nights.
  • closed_to_arrival, closed_to_departure — JSON booleans (true / false, not strings).
  • notes — free text.
  • operations must contain at least one operation. Unknown fields are refused rather than ignored: sending price returns 422 invalid_params naming operations.0.price (the field is daily_price), so a misspelling can never look like a successful write.

Errors

A successful write returns 200 with Airbnb's result.

  • 422 invalid_params — the body failed validation before anything was sent to Airbnb. field names the field (for example operations.0.max_nights), value_received echoes it and fix says what to send.
  • 422 airbnb_rejected — Airbnb refused the change. message carries Airbnb's own reason. Correct the request; sending the same body again is refused again.
  • 403 listing_not_api_connected — Airbnb API sync is off for this listing (its sync category is none), so Airbnb accepts no writes to it and nothing was sent. Reconnecting the Airbnb account does not fix this — the host has to turn API sync on for that one listing inside Airbnb. See the section above, and https://repull.dev/docs/errors/listing_not_api_connected
  • 403 connection_reauth_required — the host's Airbnb authorization expired or was revoked, or Airbnb refused to refresh it. This takes the whole account down, not one listing. Retrying will not help. Reconnect Airbnb at https://repull.dev/dashboard/connections (or POST /v1/connect/airbnb), then retry.
  • 403 listing_inactive — the listing is inactive. Activate it with PATCH /v1/listings/{id} and {"active": true}, then retry.
  • 404 not_found — no Airbnb-connected listing with this id in your workspace. Check the id is the Repull listing id. 404 no_connection — the workspace has no Airbnb connection at all.
  • 429 airbnb_rate_limited — Airbnb is rate-limiting writes for this host. Wait retry_after seconds when present, otherwise back off exponentially, and put many dates in one operations array instead of one call per date.
  • 502 airbnb_error — Airbnb had an outage or timed out. Nothing about the request needs to change: retry with backoff.

Reading availability

GET /v1/channels/airbnb/listings/{id}/availability?start_date=2026-07-01&end_date=2026-07-31 returns one row per stored day in the window (date, availability, price, min/max nights, restrictions). Without both dates it returns the listing's availability rules.

Example

# Block dates (4118 is the Repull listing id). busy_subtype defaults to BLOCKED_BY_HOST.
curl -X PUT https://api.repull.dev/v1/channels/airbnb/listings/4118/availability \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type": "calendar", "operations": [{"start_date": "2026-07-01", "end_date": "2026-07-02", "availability": "unavailable"}]}'

# No arrivals on Sundays in August, minimum 3 nights
curl -X PUT https://api.repull.dev/v1/channels/airbnb/listings/4118/availability \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type": "calendar", "operations": [{"dates": ["2026-08-02", "2026-08-09", "2026-08-16"], "closed_to_arrival": true, "min_nights": 3}]}'

# Set the default minimum nights (listing-level rules)
curl -X PUT https://api.repull.dev/v1/channels/airbnb/listings/4118/availability \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type": "rules", "rules": {"default_min_nights": 3}}'

Response

// 403 — Airbnb no longer accepts the connection for this listing
{
  "error": {
    "code": "connection_reauth_required",
    "message": "Authentication failed for listing 22616426",
    "fix": "Airbnb no longer accepts this connection for this listing, so retrying cannot succeed. Reconnect Airbnb at https://repull.dev/dashboard/connections (or re-run `POST /v1/connect/airbnb`), make sure this listing is selected, then retry.",
    "docs_url": "https://repull.dev/docs/errors/connection_reauth_required",
    "request_id": "req_01J5X7Y8Z9ABCDEF12345678"
  }
}
AI