Airbnb Rooms & Sleeping Arrangements
Create, update and remove the rooms on an Airbnb listing, and set the beds in each one. Rooms are what Airbnb's per-room photo galleries and the "where you'll sleep" section are built from.
/v1/channels/airbnb/listings/:id/roomsParameters
idpathRequiredThe Repull listing id (not the Airbnb listing id).
roomIdqueryRequiredOn PUT and DELETE: the Airbnb-side room id — the roomId field of GET /rooms.
room_typestringRequiredOn POST; optional on PUT. One of bedroom, bathroom, living_room, kitchen, studio, dining_room, family_room, office, garage, laundry_room, entrance_to_home, recreation_area, outdoor_space.
room_numberintegerRequiredOn POST; optional on PUT. The room's position among the listing's rooms, from 1 up. Airbnb keys rooms of the same type by this number, so two bedrooms are 1 and 2.
bedsarrayThe room's sleeping arrangement: [{"type": "queen_bed", "quantity": 1}]. Replaces the whole arrangement — send every bed, not just the changed one.
is_privatebooleanWhether the room is private to the guest.
room_amenitiesarrayAmenities attached to this room rather than to the listing: [{"id": "..."}].
The four calls
{id}is the Repull listing id — fromGET /v1/propertiesorGET /v1/channels/airbnb/listings— not the Airbnb listing id. Repull translates it before calling Airbnb.GET /v1/channels/airbnb/listings/{id}/rooms— every room in room-number order, each with itsbeds. Served from Repull's copy; never calls Airbnb.POST /v1/channels/airbnb/listings/{id}/rooms— create a room, optionally with its beds in the same call.PUT /v1/channels/airbnb/listings/{id}/rooms?roomId=...— change a room's type, number, privacy, room amenities or beds. Send only the fields you want to change.DELETE /v1/channels/airbnb/listings/{id}/rooms?roomId=...— remove the room and its beds.
Sleeping arrangements
Beds ride on the room object — there is no separate endpoint. beds replaces the room's whole arrangement, which is Airbnb's own semantics for the field, so always send the complete list. An empty array clears it.
- Bed types seen on live listings:
king_bed,queen_bed,double_bed,small_double_bed,single_bed,bunk_bed,sofa_bed,couch,air_mattress,floor_mattress,toddler_bed,crib,hammock. - The list above is a guide, not a closed set. Airbnb's vocabulary drifts, so Repull validates the shape (lowercase snake_case,
quantitya whole number of 1 or more) and lets Airbnb answer on the value itself — an unknown type comes back as422 airbnb_rejectedcarrying Airbnb's own message, rather than being refused here on a stale list. quantityis how many beds of that type are in the room, 1 to 20.
# One queen and a sofa bed in the main bedroom
curl -X PUT 'https://api.repull.dev/v1/channels/airbnb/listings/4118/rooms?roomId=824113' \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"beds": [{"type": "queen_bed", "quantity": 1}, {"type": "sofa_bed", "quantity": 1}]}'Rooms are addressed by room id upstream
Airbnb's room endpoints take a room id with no listing attached, so the listing in your path does not constrain them on Airbnb's side. Repull proves the room belongs to that listing before sending anything: a room id from one of your other listings returns 404 — the same answer a room that does not exist gets. This closes a real hole, where a DELETE could reach a room on a different listing than the one named in the path.
Errors
A successful write returns 200 (201 for a create).
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.
Example
# Add a second bedroom with a king bed
curl -X POST https://api.repull.dev/v1/channels/airbnb/listings/4118/rooms \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"room_number": 2, "room_type": "bedroom", "is_private": true,
"beds": [{"type": "king_bed", "quantity": 1}]}'
# Change its sleeping arrangement (replaces every bed in the room)
curl -X PUT 'https://api.repull.dev/v1/channels/airbnb/listings/4118/rooms?roomId=824113' \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"beds": [{"type": "queen_bed", "quantity": 2}]}'
# Remove the room
curl -X DELETE 'https://api.repull.dev/v1/channels/airbnb/listings/4118/rooms?roomId=824113' \
-H "Authorization: Bearer sk_live_YOUR_KEY"Response
// 200 — PUT /rooms
{
"data": {
"roomId": "824113",
"listingId": "22616426",
"roomNumber": 2,
"roomType": "bedroom",
"beds": [{ "type": "queen_bed", "quantity": 2 }]
},
"stored": true
}