Airbnb Special Offers
Pre-approve an inquiry or send a special offer on an Airbnb thread, and read or withdraw an offer, addressed by Airbnb ids. If you have the Repull conversation id, prefer POST /v1/conversations/{id}/pre-approval and /special-offers, which also record the action on the inquiry — see Inquiries & Booking Requests (/docs/channels/airbnb/inquiries-and-requests).
/v1/channels/airbnb/offersParameters
typestringRequiredpreapproval (the guest may book the dates and price they asked about) or offer (your own terms).
thread_idstringRequiredThe Airbnb message-thread id the offer answers (externalThreadId on a conversation). threadId is accepted too.
block_instant_bookingbooleanPre-approval only. true makes the guest book through the pre-approval rather than Instant Book. blockInstantBooking is accepted too.
listing_idstringOffer only, required. The Airbnb listing id, as a string (airbnbId on GET /v1/channels/airbnb/listings).
start_datestringOffer only, required. First night, YYYY-MM-DD.
nightsintegerOffer only, required. 1 or more.
total_pricenumberOffer only, required. Total for the whole stay, in the listing's Airbnb currency.
guest_detailsobjectOffer only, required. number_of_guests (or number_of_adults, from which it is worked out; Airbnb counts adults + children), plus optional number_of_children, number_of_infants, number_of_pets.
Validation and errors
- The body is checked before anything reaches Airbnb. Unknown fields are refused by name, and fields that belong to the other
typeare refused too, so422 invalid_paramsalways names the field to fix. - Airbnb's refusals come back as codes you can act on:
409 inquiry_no_longer_openor409 inquiry_expiredwhen the inquiry moved on (do not retry),422 airbnb_rejectedwith Airbnb's reason inmessageotherwise,403 connection_reauth_requiredwhen the connection does not allow it,429 airbnb_rate_limited,502 airbnb_error. - The request goes out as the Airbnb account that owns the thread or listing.
GETandDELETEtake the offer id as?offerId=, read the offer from Airbnb, or withdraw one the guest has not booked.- Send
Idempotency-Keyon thePOST, so a retry after a timeout cannot send the guest two offers.
Example
# Pre-approve an inquiry
curl -X POST https://api.repull.dev/v1/channels/airbnb/offers \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Idempotency-Key: preapprove-2675957479" \
-H "Content-Type: application/json" \
-d '{"type": "preapproval", "thread_id": "2675957479"}'
# Send a special offer
curl -X POST https://api.repull.dev/v1/channels/airbnb/offers \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Idempotency-Key: offer-2675957479-1" \
-H "Content-Type: application/json" \
-d '{
"type": "offer",
"thread_id": "2675957479",
"listing_id": "955656266214757921",
"start_date": "2026-10-01",
"nights": 4,
"total_price": 880,
"guest_details": { "number_of_guests": 3, "number_of_adults": 2, "number_of_children": 1 }
}'
# Read, then withdraw, an offer
curl "https://api.repull.dev/v1/channels/airbnb/offers?offerId=1459920384" \
-H "Authorization: Bearer sk_live_YOUR_KEY"
curl -X DELETE "https://api.repull.dev/v1/channels/airbnb/offers?offerId=1459920384" \
-H "Authorization: Bearer sk_live_YOUR_KEY"