Docs/Channels/Airbnb

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).

POST/v1/channels/airbnb/offers

Parameters

typestringRequired

preapproval (the guest may book the dates and price they asked about) or offer (your own terms).

thread_idstringRequired

The Airbnb message-thread id the offer answers (externalThreadId on a conversation). threadId is accepted too.

block_instant_bookingboolean

Pre-approval only. true makes the guest book through the pre-approval rather than Instant Book. blockInstantBooking is accepted too.

listing_idstring

Offer only, required. The Airbnb listing id, as a string (airbnbId on GET /v1/channels/airbnb/listings).

start_datestring

Offer only, required. First night, YYYY-MM-DD.

nightsinteger

Offer only, required. 1 or more.

total_pricenumber

Offer only, required. Total for the whole stay, in the listing's Airbnb currency.

guest_detailsobject

Offer 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 type are refused too, so 422 invalid_params always names the field to fix.
  • Airbnb's refusals come back as codes you can act on: 409 inquiry_no_longer_open or 409 inquiry_expired when the inquiry moved on (do not retry), 422 airbnb_rejected with Airbnb's reason in message otherwise, 403 connection_reauth_required when 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.
  • GET and DELETE take the offer id as ?offerId=, read the offer from Airbnb, or withdraw one the guest has not booked.
  • Send Idempotency-Key on the POST, 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"
AI