Refresh a Listing from Airbnb

Every Airbnb read on this API is served from your Repull workspace, not from Airbnb. That is what makes reads fast and keeps you off Airbnb's rate limits. POST /v1/listings/{id}/pull/airbnb is the one call that goes and asks Airbnb, and rewrites your copy from the answer.

curl -X POST "https://api.repull.dev/v1/listings/4118/pull/airbnb" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

# {
#   "listingId": "4118",
#   "channel": "airbnb",
#   "connectionId": "2640",
#   "externalId": "918185695324265649",
#   "refreshedFromChannel": true,
#   "sections": ["details", "description", "photos", "rooms", "amenities", "policies"],
#   "pulledAt": "2026-09-18T05:40:11.204Z",
#   "nextPullAvailableAt": "2026-09-18T05:55:11.204Z",
#   "minIntervalSeconds": 900
# }

When to use it

  • After a push, to read back what Airbnb actually kept. POST /v1/listings/{id}/publish/airbnb sends your values; Airbnb decides what it accepts. Some fields are locked on host-managed listings, some are normalised, some are refused outright — and Airbnb answers 200 either way. Pull, then read the listing, and you are looking at the values that are actually live.
  • When a host changed something in the Airbnb app. Title, description, photos, amenities, check-in window, house rules, stay rules. Those edits reach us through background sync eventually; a pull gets them now, on demand, for the one listing you care about.
  • Before you overwrite content you did not write.A pull is Airbnb's version winning, so it is the safe way to see what you are about to replace.

You do not need this for day-to-day reads

Reservations, messages, reviews, payouts and calendar availability arrive continuously on their own. Reading them is always current without a pull — and pulling does not refresh them (see below).

What it refreshes, and what it does not

Refreshed by a pullNot refreshed — arrives on its own
  • Title, summary, description, space, neighbourhood, transit, house rules, host notes
  • Photos, in Airbnb's order and at full resolution
  • Rooms and the beds in them
  • Amenities, including ones the host switched off
  • Property type, bedrooms, beds, bathrooms, guest capacity
  • Check-in window, check-out time, quiet hours, guest controls (pets, children, smoking, events), cancellation policy
  • Minimum and maximum nights, advance-booking window, turnover buffer
  • Pricing settings and standard fees (cleaning, pet fee, security deposit)
  • Permits and registration numbers, checkout tasks, the check-in guide
  • Nightly rates and availability — read GET /v1/channels/airbnb/listings/{id}/availability, and write with Update Pricing
  • Reservations and alterations
  • Messages and conversations
  • Reviews and review replies
  • Payouts and transactions
  • Which listings exist on the account — new Airbnb properties are imported daily

Reading the refreshed values

The pull writes your workspace's own listing record, so every endpoint that reads it is updated by the same call — there is nothing channel-specific to fetch afterwards.

# The title, copy and structural facts, as they now stand on Airbnb
curl "https://api.repull.dev/v1/listings/4118?include=content,details" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

# {
#   "id": "4118",
#   "content": { "name": "Dogwood Den on The Hill", "summary": "...", "houseRules": "..." },
#   "details": { "bedrooms": 2, "beds": 3, "personCapacity": 6, "checkInTimeStart": "16:00" }
# }
  • content.name is the public title as it stands on the channel. name at the top level of a listing is your own internal reference for the property and a pull never touches it — most operators keep a short code there (K-ME 1040) that is deliberately not the guest-facing title.
  • GET /v1/listings/{id}/publish-status reports lastPulledAt for each channel — the same timestamp the pull returned as pulledAt.
  • refreshedFromChannel: false means Airbnb could not be read this time — usually an expired authorisation — and your stored copy was re-projected unchanged rather than replaced. Nothing is broken; it simply is not newer than it was. Check the connection with publish-status.

How often you can pull

One pull per listing every 15 minutes.A single pull is roughly a dozen calls to Airbnb, and Airbnb throttles a host account that is asked too much — a pull loop would take that host's other syncs down with it. A pull inside the window is refused before anything reaches Airbnb:

HTTP/1.1 429 Too Many Requests
Retry-After: 812

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Listing 4118 was pulled from airbnb less than 15 minutes ago. The next pull is available in 812s.",
    "fix": "Wait for the `Retry-After` header (seconds) and retry...",
    "scope": "per_listing_pull",
    "retry_after": 812,
    "last_pulled_at": "2026-09-18T05:40:11.204Z",
    "next_pull_available_at": "2026-09-18T05:55:11.204Z",
    "min_interval_seconds": 900,
    "docs_url": "https://repull.dev/docs/errors/rate_limit_exceeded",
    "request_id": "req_01HXY..."
  }
}
  • The limit is per listing, not per key — pulling fifty different listings is fine, pulling one listing fifty times is not.
  • It is separate from the per-key request limit, and there is no way to opt out of it.
  • Two pulls of the same listing sent at the same moment will never both run: one gets the slot, the other gets the 429.
  • A listing that turned out not to be connected to Airbnb (409 no_connection) does not consume the window — nothing was asked of Airbnb.

Other answers you may get

StatusMeaning
403 listing_inactiveThe listing is inactive, so it cannot be pulled — it is not billed, and a pull spends a dozen Airbnb calls. Its data keeps syncing regardless. Activate it first with PATCH /v1/listings/{id} and {"active": true}. See Active & Inactive Listings.
404 not_foundNo listing with that id in your workspace.
409 no_connectionThe listing exists but is not linked to Airbnb. Link the host account with POST /v1/connect/airbnb, or create the listing on Airbnb with POST /v1/listings/{id}/publish/airbnb and a hostId.
429 rate_limit_exceededPulled too recently. Honour Retry-After.

Listings with more than one Airbnb connection

A property can carry several Airbnb connections — a re-listed property, a host migration, two merged records. A pull uses the primary one by default. To choose, pass the connection id from GET /v1/listings/{id}/publish-status:

curl -X POST "https://api.repull.dev/v1/listings/4118/pull/airbnb" \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"airbnbConnectionId": 2642}'

The call is synchronous

The response is the result, not a job id — expect several seconds while Airbnb answers. There is nothing to poll. If you want only the timestamps, read GET /v1/listings/{id}/publish-status, which the pull updates.
AI