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.
/v1/channels/airbnb/listings/:id/availabilityParameters
idpathRequiredThe Repull listing id (not the Airbnb listing id).
typestringRequiredrules (listing-level availability rules) or calendar (per-date operations).
Which endpoint to use
{id}is the Repull listing id — fromGET /v1/propertiesorGET /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}(orPATCH /v1/availability/batchfor 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 returns403 listing_not_api_connectedand 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'sconnections[]carriessyncCategory(one of the three above, ornullif it has never been reported) andwritable—falseexactly whensyncCategoryisnone. Checkwritablebefore 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 asdefault_min_nights,default_max_nights,booking_lead_time,turnover_days,day_of_week_min_nightsandseasonal_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 ofYYYY-MM-DDdates or inclusive rangesYYYY-MM-DD:YYYY-MM-DD) orstart_date+end_date(inclusive, sent together,end_dateon or afterstart_date). Not both. daily_price— nightly price, a number ≥ 0 in the listing currency.availability—availablereopens the dates,unavailableblocks them (stop-sell),defaultfalls back to the listing rules.busy_subtype— why a blocked date is blocked:BLOCKED_BY_HOSTorOUTSIDE_RESERVATION. Airbnb requires it wheneveravailabilityisunavailable; if you leave it out,BLOCKED_BY_HOSTis sent. UseOUTSIDE_RESERVATIONfor dates held by a booking made on another channel.min_nights,max_nights— whole numbers from 1 to 1125 (Airbnb's limit);max_nightscannot be lower thanmin_nights.closed_to_arrival,closed_to_departure— JSON booleans (true/false, not strings).notes— free text.operationsmust contain at least one operation. Unknown fields are refused rather than ignored: sendingpricereturns422 invalid_paramsnamingoperations.0.price(the field isdaily_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.fieldnames the field (for exampleoperations.0.max_nights),value_receivedechoes it andfixsays what to send.422 airbnb_rejected— Airbnb refused the change.messagecarries 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 isnone), 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_connected403 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 (orPOST /v1/connect/airbnb), then retry.403 listing_inactive— the listing is inactive. Activate it withPATCH /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. Waitretry_afterseconds when present, otherwise back off exponentially, and put many dates in oneoperationsarray 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"
}
}