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/airbnbsends your values; Airbnb decides what it accepts. Some fields are locked on host-managed listings, some are normalised, some are refused outright — and Airbnb answers200either 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
What it refreshes, and what it does not
| Refreshed by a pull | Not refreshed — arrives on its own |
|---|---|
|
|
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.nameis the public title as it stands on the channel.nameat 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-statusreportslastPulledAtfor each channel — the same timestamp the pull returned aspulledAt.refreshedFromChannel: falsemeans 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 withpublish-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
| Status | Meaning |
|---|---|
403 listing_inactive | The 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_found | No listing with that id in your workspace. |
409 no_connection | The 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_exceeded | Pulled 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
GET /v1/listings/{id}/publish-status, which the pull updates.