Documentation Python quickstart Blog Free tools hello@quanticdata.ioLog in

Airbnb Scraper API

An Airbnb scraper API that takes a place name and returns the stays Airbnb lists for it, one row each: title and property type, rating and review count, the nightly rate and the stay total with the pre-discount figure when there is one, beds, bedrooms and baths, Guest favorite and free-cancellation flags, the map coordinates, the first photo and the listing URL. Pass check-in and check-out dates to price a specific stay.

$0.001 per delivered stay · $2 free every month · Failed runs never billed

POST /v1/scraper/collectors/airbnb_stays/run
$ curl $QD/airbnb_stays/run \
    -H "Authorization: Bearer $QD_API_KEY" \
    -d '{"location": "Rome,  Italy", "max_results": 18}'
{ "status": "done", "count": 18,
  "results": [
    {
      "listing_id": "…",
      "title": "…",
      "property_type": "…",
      "name": "…" } ],
  "cost": 0.018 }
# 18 stays × $0.001 · nothing delivered, nothing charged
Airbnb Scraper API: location and checkin in, a residential exit in the middle, delivered rows with rank, listing_id and title on the right, $0.001 per stay.
You send location and checkin; the run goes out through a residential exit and comes back as stays with rank, listing_id and title — 29 fields on every row — and you are billed $0.001 for each stay actually delivered, nothing for a run that delivers none.
$0.001 / stay2,000 stays on the free $2 every month
Semantic inputlocation, checkin, checkout — no URL lists
Up to 90stays per run, pagination handled for you
No browserread over HTTP/TLS — cheaper and faster than rendering

Try it

Airbnb stays, running now

Change the input and run it against the live collector — nothing to install, no sign-up.

Run it from your own code, on your own inputs

Same collector, same rows — $2 of free API credit every month, no card.

Get my free API key

What an Airbnb scraper API does

A plain fetch of an Airbnb search page contains no listings at all — zero card nodes, zero room links — because the cards are rendered in the browser. What the page does ship is its hydration island, a JSON block holding every stay as a typed object, and that is what this collector reads. It is not a workaround for the missing DOM; it is the better source. Coordinates, the price breakdown and the review count are in the island and were never in the markup.

Two things about that island would corrupt a naive parser, and both are handled. It holds the listings twice — once for the results list, once for the map — so scanning it for stay objects delivers most rows twice and advances the page cursor past listings that were never read; this collector scopes itself to the results array. And Airbnb streams the page, so the island often arrives cut off mid-JSON: on nine captures of one city search every one ended inside a photo URL. A single JSON.parse fails on all of them. Each row is instead located by marker and brace-matched on its own, so complete rows are delivered and an unfinished tail row is dropped and counted in the run notes — never delivered half-filled.

Limits, in plain numbers

Everything that bounds one run of this collector. No hidden throttles.

Max per run

90 stays

Price

$0.001 / stay

Per 1,000

$1.00

Failed runs

Free zero rows, zero charge

Free every month

$2 no card

Rate limit

60 req/min on the free tier

What one stay looks like

Every delivered stay carries these fields. Nullable means the source did not publish it — the field stays empty instead of being guessed.

FieldTypeWhat it holds
rankintegerPosition in Airbnb's order for this response. Airbnb re-ranks between requests, so this is not a stable property of the listing.
listing_idstring · nullableAirbnb listing id — the number in the /rooms/ URL.
titlestring · nullableCard heading as Airbnb writes it, property type then area ("Apartment in Monti").
property_typestring · nullableProperty type taken from the head of the title ("Apartment", "Condo", "Penthouse"). Null when the title is not of that shape.
namestring · nullableThe host's own listing name.
subtitlestring · nullableCard subtitle — usually the listing name, sometimes a short description.
ratingnumber · nullableAverage rating out of 5. Null on a listing with no reviews yet.
reviewsinteger · nullableNumber of reviews.
guest_favoritebooleanTrue when Airbnb badges the listing a Guest favorite.
badgesstring[] · nullableBadge labels shown on the card, e.g. ["Guest favorite"], ["Superhost"] or ["Luxe"]. Airbnb's flexible-date chip shares the same list and is excluded — it is a date range, not a badge, and check_in/check_out already carry it.
price_per_nightnumber · nullableNightly rate as Airbnb states it in its own price breakdown ("5 nights x $741.37"), never total ÷ nights. When a stay discount is listed as its own line, this is the rate before that discount.
price_totalnumber · nullablePrice shown on the card for the whole stay, after any discount.
price_original_totalnumber · nullableStruck-through stay total on a discounted card; null when the card is not discounted.
price_textstring · nullableThe price exactly as printed on the card, e.g. "$3,707".
price_qualifierstring · nullableWhat the price covers, in Airbnb's words: "for 5 nights" or "night".
nightsinteger · nullableNights the priced stay covers.
currencystring · nullableISO currency of the prices, from the symbol Airbnb printed. Airbnb prices in the exit country's currency; a bare "$" is reported as USD only on a US exit and left null elsewhere rather than guessed.
free_cancellationbooleanTrue when the card carries Airbnb's free-cancellation highlight.
bedsinteger · nullableBeds, from the card's bed line ("3 beds", "4 double beds") — not the bedroom count.
bedroomsinteger · nullableBedrooms. Null on a studio, which Airbnb states in words.
bathroomsnumber · nullableBaths, halves included (1.5). Null when Airbnb states it in words ("Half-bath").
bed_infostring · nullableThe card's bed and bath line verbatim, e.g. "3 bedrooms, 3 beds, 2 baths".
check_instring · nullableCheck-in the price covers (YYYY-MM-DD): the date you asked for, or the one Airbnb chose for this listing when you asked for none.
check_outstring · nullableCheck-out the price covers (YYYY-MM-DD).
latitudenumber · nullableAirbnb's approximate map point — it publishes a fuzzed location until a booking is confirmed, not the exact address.
longitudenumber · nullableApproximate longitude, as above.
imagestring · nullableFirst photo on the card.
photo_countintegerPhotos in the card's carousel — not the listing's full gallery.
urlstring · nullableListing URL, composed from the listing id.

Inputs

The whole request. Anything you leave out falls back to the default shown in the catalog.

InputTypeRequiredWhat it does
locationstringyesCity, region or neighbourhood, e.g. "Rome", "Rome, Italy" or "Brooklyn, New York". Resolved by Airbnb's own search, exactly as typing it into the site would.
checkinstringnoArrival date as YYYY-MM-DD. Must be given together with checkout; omit both to let Airbnb price each listing for its own suggested stay.
checkoutstringnoDeparture date as YYYY-MM-DD. Must be after checkin.
adultsintegernoNumber of adult guests (1–16). Omit for Airbnb's default of one.
countrystringnoISO 3166-1 alpha-2 code — proxy exit geo and Google locale (gl). Omit for the default pool.
max_resultsintegernoHow many stays to deliver at most (1–90). You pay only for delivered stays.

Pricing

Airbnb Scraper API pricing

$0.001 per delivered stay. A run that delivers nothing costs nothing: blocked pages, challenges and retries are on us, and the $2 monthly allowance covers about 2,000 stays before you spend anything.

$0.001per delivered stay$1 per 1,000 delivered stays
2,000 stayson the free allowance$2 every month, no card
Zero rowszero chargeblocks, captchas and retries are on us
−30%on volume tiersthe catalog returns your key's price

Pay as you go

$0/mo
  • $2 free credit / month
  • 60 requests / min
  • List unit prices

Starter

$19/mo
  • $15 free credit / month
  • 300 requests / min
  • 10% off unit prices

Scale

$299/mo
  • $250 free credit / month
  • 1,200 requests / min
  • 30% off unit prices

Same wallet, same key and same $2 monthly allowance as every other Data API. Prices are launch pricing read live from the billing config — GET /v1/scraper/collectors returns the price your key actually pays.

Integration

One POST, typed rows

Base URL https://api.quanticdata.io/v1, Bearer auth, the same key as every other Data API. Endpoint: POST /v1/scraper/collectors/airbnb_stays/run.

curl -X POST https://api.quanticdata.io/v1/scraper/collectors/airbnb_stays/run \
  -H "Authorization: Bearer $QD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"location":"Rome, Italy","max_results":18}'

What people build with the Airbnb scraper API

Three shapes of work this endpoint was designed around.

Short-term rental pricing

Price a city for a weekend a month out and again a week out: price_per_night, price_total and the pre-discount total on every row, with the coordinates to bucket by neighbourhood.

Supply mapping

Count entire homes against private rooms per area, read bedrooms and beds, and see which listings carry the Guest favorite badge — the inputs a rental-investment or tourism study actually needs.

Competitor set for a host

Pull the stays a guest sees around a given listing, with rating and review count, and re-run weekly to watch rates move.

Airbnb Scraper API versus rolling your own

The differences that actually cost time when you build this in-house.

DIY scraperThis collector
Where the rows come fromThe DOM — which is empty without a browserThe page’s own hydration island, with coordinates and price breakdown
Duplicate listingsDelivered twice from the list and the map copiesRead from the results array only
Truncated pagesJSON.parse throws, zero rowsRows brace-matched one by one; the cut row is counted, not delivered
DatesWhatever the page defaults toYour check-in and check-out, or per-listing defaults reported on the row

What people search for

Live autocomplete demand around Airbnb stays, pulled with our own Keyword ideas collector.

Airbnb Scraper API: the POST to /v1/scraper/collectors/airbnb_stays/run with location and checkin on the left, and the JSON envelope on the right with 18 stays and usage.cost_usd $0.018.
The same call you would paste into a terminal: a Bearer key, location, checkin and checkout in the body, and back the envelope every QuanticData endpoint returns — type, message, payload — where count is how many stays arrived and usage.cost_usd is $0.018, which is 18 × $0.001. A run that delivers nothing costs nothing. The key is good for 60 req/min on the free tier.

Sources and standards

The platform documentation and standards this collector is built against — check any claim on this page against the primary source:

FAQ

Questions we get about the Airbnb scraper API.

Something else? Ask us →

Does it need a browser?

No. The listings are in the JSON island Airbnb embeds in the server response, which a plain TLS fetch receives. The rendered cards would need a browser and would carry less: no coordinates and no price breakdown.

Why are some prices “per listing’s own dates”?

When you leave checkin and checkout out, Airbnb prices each listing for a stay of its own choosing, and the row reports those dates in check_in and check_out. Pass your dates to price one specific stay across all rows.

What does “an unclosed tail row was dropped” in the notes mean?

Airbnb streams the page and sometimes cuts the JSON before the last listing is complete. That row cannot be delivered accurately, so it is dropped and counted. The page cursor advances by rows actually read, so nothing is skipped on the next page.

Can I get reviews or host details?

Not from this collector: it reads the search results, which state rating and review count but not the reviews themselves. Host and review data live on the listing page, which is a different surface.

Is there a free Airbnb scraper API?

Every account gets $2 of credit every month with no card, which is about 2,000 delivered stays on this endpoint at $0.001 each. It renews monthly, and a run that delivers nothing is never billed — so a failed or blocked attempt does not eat the allowance.

How much does one run cost?

Multiply the rows you actually receive by $0.001. A run capped at 90 stays — the maximum for this collector — costs $0.09 if every row comes back, and less when the source has fewer. Volume tiers take up to 30% off, and GET /v1/scraper/collectors returns the price your key actually pays.

Run the Airbnb scraper API now

$2 of free credit every month, no card. Your key returns its own prices from GET /v1/scraper/collectors.

Get my free API key