listing_not_api_connected
API sync is switched off for this listing on Airbnb. Turn it on for the listing itself; reconnecting the account will not help.
When it fires
A write to Airbnb — PUT /v1/channels/airbnb/listings/{id}/pricing, /availability, /checkin-guide, or a POST/DELETE on /photos or /rooms — addressed a listing that is not connected to Repull on Airbnb's side.
Airbnb authorises API sync one listing at a time, not one account at a time. Each listing carries its own sync category, and a listing whose category is none is closed to the API: Airbnb refuses every write to it, whatever else is true about the account. That is why this can hit a handful of listings on a host whose every other listing is being written to without a problem.
Reconnecting the Airbnb account does not fix this. The account connection is already healthy — the authorization is valid and the other listings on it are being written to right now. Sending the host through the connect flow again changes nothing, because the switch that is off is on the listing, inside Airbnb. Someone with access to the listing on Airbnb has to turn API sync on for it.
The check runs before anything is sent to Airbnb, so nothing was partially applied: no price moved, no date changed, no photo was uploaded. Fix the listing and send exactly the same request again.
Response shape
Every Repull error follows the same envelope. The code is stable and safe to switch on.
{
"error": {
"code": "listing_not_api_connected",
"message": "Listing 23901 (Airbnb listing 22616426) is not connected to the API on Airbnb's side — its Airbnb sync category is `none`. Airbnb refuses every write to a listing in that state, so nothing was sent.",
"fix": "Turn API sync on for this listing in Airbnb: open the listing, and connect it to Repull there. Airbnb authorises sync one listing at a time, so connecting the account is not enough and reconnecting it will not help. When the listing's sync category is `sync_all` (or `sync_rates_and_availability` for rates and availability only), retry. `GET /v1/channels/airbnb/listings` reports `syncCategory` and `writable` for every listing.",
"docs_url": "https://repull.dev/docs/errors/listing_not_api_connected",
"request_id": "req_01J5X7Y8Z9ABCDEF12345678",
"listing_id": "23901",
"airbnb_listing_id": "22616426",
"sync_category": "none"
}
}How to fix
- Do not reconnect the Airbnb account, and do not retry as-is. Neither changes the listing's sync category, so both fail the same way.
- Confirm which listing is affected: `error.listing_id` is the Repull listing id and `error.airbnb_listing_id` is the listing as Airbnb knows it.
- Ask the host (or whoever administers the Airbnb account) to open that listing on Airbnb and turn API sync on for it, connecting it to Repull. Airbnb asks them to choose what the software partner manages — content, rates and availability, or rates and availability only.
- Re-read `GET /v1/channels/airbnb/listings` and check the listing's `syncCategory`. `sync_all` or `sync_rates_and_availability` means it is connected; `writable` flips to `true`.
- Retry the original request unchanged.
Common gotchas
- Reconnecting is the wrong instinct.This is the single most common wasted step. A 403 usually means "renew the authorization", and here it does not: the account is connected, the token is good, and other listings on the same account accept writes. Only the per-listing switch matters.
- The three sync categories.
sync_all— Repull manages content, rates and availability. Every write on this page works.sync_rates_and_availability— Repull manages rates and availability; listing content is managed by the host on Airbnb.none— the listing is not connected to Repull at all, and this error is what every write to it returns. writableis not a promise that every write lands. It only tells you the listing is not in thenonestate. Onsync_rates_and_availability, rates and availability are Repull's to manage but listing content is not — the host keeps editing that on Airbnb, and Airbnb can refuse a content write on those grounds. When what you are about to send is content rather than rates or dates, readsyncCategory, notwritablealone.- Not the same as an expired connection. An authorization that genuinely expired or was revoked, or a token refresh Airbnb refused, is 403 connection_reauth_required — that one is fixed by reconnecting. A workspace with no Airbnb connection at all is
404 no_connection, and a listing that is not Airbnb-connected in your workspace is404 not_found. - Turning sync on is not instant to you.The category is reported from Repull's own copy of the listing, refreshed on the normal Airbnb sync. If the host has just switched it on, give the next sync a moment before you retry rather than hammering the write.
Examples
curl
# A write to a listing that is not API-connected on Airbnb
curl -X PUT https://api.repull.dev/v1/channels/airbnb/listings/23901/pricing \
-H "Authorization: Bearer sk_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "standard", "settings": {"default_daily_price": 250}}'
# HTTP/1.1 403 Forbidden
# {
# "error": {
# "code": "listing_not_api_connected",
# "sync_category": "none",
# "listing_id": "23901",
# "airbnb_listing_id": "22616426",
# ...
# }
# }
# Check first: which listings can be written to?
curl https://api.repull.dev/v1/channels/airbnb/listings \
-H "Authorization: Bearer sk_live_YOUR_KEY"
# Each entry of connections[] carries:
# "syncCategory": "sync_all" | "sync_rates_and_availability" | "none"
# "writable": true | false <- false means every write returns this errorTypeScript
const API = 'https://api.repull.dev'
const headers = {
Authorization: `Bearer ${process.env.REPULL_API_KEY}`,
'Content-Type': 'application/json',
}
// Check before you write. `writable` is false exactly when the listing's
// Airbnb sync category is "none".
async function airbnbWritableListings() {
const res = await fetch(`${API}/v1/channels/airbnb/listings`, { headers })
const { data } = await res.json()
return data.flatMap((listing: any) =>
listing.connections
.filter((c: any) => c.writable)
.map((c: any) => ({ listingId: listing.listingId, syncCategory: c.syncCategory })),
)
}
async function setNightlyPrice(listingId: number, price: number) {
const res = await fetch(`${API}/v1/channels/airbnb/listings/${listingId}/pricing`, {
method: 'PUT',
headers,
body: JSON.stringify({ type: 'standard', settings: { default_daily_price: price } }),
})
if (res.status === 403) {
const { error } = await res.json()
if (error.code === 'listing_not_api_connected') {
// Nothing was sent to Airbnb. Do NOT reconnect the account — it is
// already connected. The host has to turn API sync on for this one
// listing inside Airbnb.
return {
ok: false,
needsHostAction: true,
airbnbListingId: error.airbnb_listing_id,
message: 'Ask the host to turn on API sync for this listing in Airbnb, then retry.',
}
}
}
return { ok: res.ok }
}If you're an AI agent
Airbnb authorises API sync per listing, and this listing's sync category is `none`, so Airbnb accepts no writes to it. Nothing was sent — no partial write happened. Do NOT tell the user to reconnect Airbnb and do not start a Connect session: the account connection is fine and reconnecting changes nothing. Tell the user that someone with access to the Airbnb account must open this specific listing on Airbnb and turn API sync on for it (error.airbnb_listing_id identifies it). Then check GET /v1/channels/airbnb/listings until that listing's syncCategory is sync_all (or sync_rates_and_availability, which allows rates and availability but not content) and writable is true, and retry the original request unchanged.
Related
- Error reference — the full table of error codes
- Using Repull from AI agents — patterns for handling errors in agent loops
- Manage Airbnb Listings
- Update Airbnb Pricing
- Push Availability to Airbnb
- connection_reauth_required
Hit an error that isn't covered? Email hello@repull.dev with the request id from the response headers.