Skip to content

Airbnb Scraper API ​

Turn Airbnb searches and listing pages into structured data. Send a destination with your dates, guests and filters, get back one page of stays - listing id and URL, title, property type, price for the stay with its breakdown, rating and review count, coordinates, bedrooms, beds and baths, badges, free cancellation and photos - or send one listing and get its page: description, capacity, every amenity, house rules, host, category ratings, the reviews shown, photos by room, check-in and check-out, the cancellation policy and the stay price. No proxy pool, bot-check handling or parser maintenance on your side.

It ships as two synchronous Scraper APIs and a no-code scraper:

ProductTypeProduct codeWhat it does
Airbnb Search APIScraper API (synchronous)airbnb_searchSearch stays for a destination and get one page of 18 listings.
Airbnb Listing APIScraper API (synchronous)airbnb_listingGive one listing id or URL, get the listing page and its price.
Airbnb ScraperNo-code scraperairbnbSweep up to 15 search pages and export JSON, CSV or XML.

Every field is snake_case, the same convention as the Web Scraping API.

Airbnb Search API ​

GET https://api.scrapeit.io/api/v1/scrape/airbnb/search
x-api-key: YOUR_SCRAPEIT_API_KEY
ParameterTypeExampleDescription
locationstringParis, FranceRequired. Where to stay, as typed into the Airbnb search box, up to 200 characters.
checkinstring2027-03-12Check-in date, YYYY-MM-DD, from today on. Send together with checkout.
checkoutstring2027-03-15Check-out date, YYYY-MM-DD, after checkin.
adultsnumber2Adult guests, 1–16.
childrennumber1Children (2–12), 0–15.
infantsnumber0Infants (under 2), 0–5.
petsnumber1Pets, 0–5.
room_typestringentire_homeType of place: entire_home, private_room, shared_room or hotel_room.
property_typesarrayhouse,apartmentAny of these property types: house, apartment, guesthouse. Comma-separated in a query string.
min_bedroomsnumber3At least this many bedrooms, 1–8.
min_bedsnumber4At least this many beds, 1–8.
min_bathroomsnumber2At least this many bathrooms, 1–8.
amenitiesarraywifi,poolStays with every one of these amenities: wifi, kitchen, washer, dryer, air_conditioning, heating, dedicated_workspace, tv, hair_dryer, iron, pool, hot_tub, free_parking, ev_charger, crib, king_bed, gym, bbq_grill, breakfast, indoor_fireplace, smoking_allowed, smoke_alarm, carbon_monoxide_alarm, self_check_in. Comma-separated in a query string.
instant_bookbooleantrueOnly stays you can book without waiting for the host's approval.
guest_favoritebooleantrueOnly stays Airbnb marks as a guest favorite.
host_languagesarrayen,frA host who speaks any of these languages, as Airbnb's codes: en, es, fr, de, it, pt, nl, ru, uk, pl, cs, da, fi, no, sv, el, hu, tr, ar, he, fa, hi, bn, pa, ta, zh, ja, ko, th, vi, id, ms, fil, tl, sgn (sign language). Comma-separated in a query string.
min_pricenumber80Lowest nightly price, in currency.
max_pricenumber300Highest nightly price, in currency.
currencystringEURUSD (default), EUR, GBP, CAD, AUD, JPY, CHF, PLN, BRL, MXN or INR.
pagenumber2Results page of 18 listings, 1–15. Defaults to 1.
include_htmlbooleanfalseAlso return the fetched page HTML in html. Paid add-on: +4 credits per request.

The filters are the ones of Airbnb's own filter panel and combine like there: a stay must match all of them.

Example request ​

bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/airbnb/search' \
  -H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
  --data-urlencode 'location=Paris, France' \
  --data-urlencode 'checkin=2026-12-01' \
  --data-urlencode 'checkout=2026-12-05' \
  --data-urlencode 'adults=2' \
  --data-urlencode 'amenities=wifi,kitchen'
js
const response = await fetch(
  'https://api.scrapeit.io/api/v1/scrape/airbnb/search?' +
    new URLSearchParams({ location: 'Paris, France', adults: '2' }),
  { headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
for (const stay of data.results) console.log(stay.listing_id, stay.price, stay.rating);
python
import requests

response = requests.get(
    "https://api.scrapeit.io/api/v1/scrape/airbnb/search",
    headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
    params={"location": "Paris, France", "adults": 2},
    timeout=120,
)
for stay in response.json()["data"]["results"]:
    print(stay["listing_id"], stay["price"], stay["rating"])

Search response ​

json
{
  "data": {
    "location": "Paris, France",
    "search_url": "https://www.airbnb.com/s/Paris--France/homes?query=Paris%2C+France&adults=2&currency=USD&locale=en",
    "total_results": 12084,
    "place": {
      "name": "Paris, France",
      "city": "Paris",
      "region": "Île-de-France",
      "country": "France"
    },
    "map_bounds": {
      "north": 48.89600153774691,
      "east": 2.3849444000000033,
      "south": 48.82939215742346,
      "west": 2.303313399999971
    },
    "price_range": { "min_price": 50, "max_price": 2700, "histogram": [0, 0, 0, 0, 0, 10] },
    "popular_neighborhoods": ["Montmartre", "Saint-Germain-des-Prés", "11th Arrondissement"],
    "results": [
      {
        "position": 1,
        "listing_id": "1537571171655055747",
        "url": "https://www.airbnb.com/rooms/1537571171655055747",
        "title": "Almarine Eiffel Hotel & SPA by Malone",
        "name": "Almarine Eiffel Hotel & SPA by Malone",
        "subtitle": "Hotel in 7th Arrondissement",
        "property_type": "Hotel",
        "neighborhood": null,
        "latitude": 48.857,
        "longitude": 2.3033,
        "rating": 4.89,
        "reviews_count": 148,
        "price": 1209,
        "original_price": null,
        "price_qualifier": "for 5 nights",
        "price_text": "$1,209 for 5 nights",
        "nightly_price": 232.25,
        "nights": 5,
        "price_breakdown": [
          { "label": "5 nights x $232.25", "amount": 1161.25 },
          { "label": "Resort fee", "amount": 47.15 }
        ],
        "price_notes": ["Standard room"],
        "currency": "USD",
        "checkin": "2026-11-01",
        "checkout": "2026-11-06",
        "details": [],
        "bedrooms": null,
        "beds": null,
        "baths": null,
        "badges": ["Featured hotel"],
        "is_guest_favorite": false,
        "is_superhost": false,
        "free_cancellation": false,
        "payment_messages": ["+$174 Airbnb credit"],
        "photos": ["https://a0.muscache.com/im/pictures/…/original/….jpeg"]
      }
    ],
    "pagination": { "current_page": 1, "total_pages": 15, "next_page": 2 }
  }
}
FieldDescription
total_resultsStays matching the search across all pages; Airbnb serves at most 270 of them.
placeThe place Airbnb resolved location to: name, city, region and country.
map_boundsThe map area the search covers.
price_rangeThe price filter: its lowest and highest price, and histogram - stay counts per equal-width price bucket between them.
popular_neighborhoodsThe "Popular neighborhoods" filter of the destination.
results[].position1-based position across pages: page 2 starts at 19.
results[].listing_idAirbnb listing id; url is its /rooms/ page - pass the id to the Listing API.
results[].property_typeE.g. Apartment, Condo, Hotel, read off the <type> in <area> line.
results[].ratingAverage rating out of 5; null with reviews_count for a new listing.
results[].priceThe price for the stay as a number in currency; price_qualifier says what it covers.
results[].original_priceThe struck-through price of a discounted stay.
results[].nightly_price, nightsThe nightly rate before fees and discounts, and the nights it is for.
results[].price_breakdown"Price details": the nights, fees and discounts that make up the price (a discount is negative).
results[].price_notesNotes under the price, e.g. the hotel room it is for, or a recent price drop.
results[].checkin, checkoutThe stay the price is for. Without dates Airbnb picks its own and they show here.
results[].detailsBedroom, bed and bath lines as the card shows them; bedrooms, beds and baths are the numbers.
results[].payment_messagesPills under the price, e.g. Free cancellation, +$127 Airbnb credit.
pagination.total_pagesPages Airbnb offers for the search, at most 15.

A missing field is null or an empty list, never an error.

Airbnb Listing API ​

GET https://api.scrapeit.io/api/v1/scrape/airbnb/listing
x-api-key: YOUR_SCRAPEIT_API_KEY
ParameterTypeExampleDescription
listing_idstring1227163127160749519The digits of airbnb.com/rooms/<id>. Send either listing_id or url.
urlstringhttps://www.airbnb.com/rooms/1800717513599809075A https://www.airbnb.com/rooms/<id> URL. Send either listing_id or url.
checkinstring2027-03-12Check-in date, YYYY-MM-DD, from today on. Send together with checkout to get the stay price.
checkoutstring2027-03-15Check-out date, YYYY-MM-DD, after checkin.
adultsnumber2Adult guests, 1–16.
childrennumber1Children (2–12), 0–15.
infantsnumber0Infants (under 2), 0–5.
petsnumber1Pets, 0–5.
currencystringEURCurrency of the price, as in the Search API. Defaults to USD.
include_htmlbooleanfalseAlso return the rendered page HTML in html. Paid add-on: +4 credits per request.

A url is never fetched as given: ScrapeIt reads the listing id out of it and loads the airbnb.com listing page for your dates, guests and currency. The page is rendered in a browser, because Airbnb loads the price, the reviews, check-in and check-out and the cancellation policy with its own scripts - a request takes about 8–10 seconds.

Example request ​

bash
curl -G 'https://api.scrapeit.io/api/v1/scrape/airbnb/listing' \
  -H 'x-api-key: YOUR_SCRAPEIT_API_KEY' \
  --data-urlencode 'listing_id=1800717513599809075' \
  --data-urlencode 'checkin=2026-12-06' \
  --data-urlencode 'checkout=2026-12-11' \
  --data-urlencode 'adults=2'
js
const response = await fetch(
  'https://api.scrapeit.io/api/v1/scrape/airbnb/listing?' +
    new URLSearchParams({
      listing_id: '1800717513599809075',
      checkin: '2026-12-06',
      checkout: '2026-12-11',
      adults: '2',
    }),
  { headers: { 'x-api-key': 'YOUR_SCRAPEIT_API_KEY' } },
);
const { data } = await response.json();
console.log(data.name, data.price_text, data.host?.name, data.amenities.length);
python
import requests

response = requests.get(
    "https://api.scrapeit.io/api/v1/scrape/airbnb/listing",
    headers={"x-api-key": "YOUR_SCRAPEIT_API_KEY"},
    params={
        "listing_id": "1800717513599809075",
        "checkin": "2026-12-06",
        "checkout": "2026-12-11",
        "adults": 2,
    },
    timeout=120,
)
listing = response.json()["data"]
print(listing["name"], listing["price_text"], listing["host"]["name"], len(listing["amenities"]))

Listing response ​

json
{
  "data": {
    "listing_id": "1800717513599809075",
    "url": "https://www.airbnb.com/rooms/1800717513599809075",
    "name": "The Marais from above: Private terrace and A/C",
    "title": "Entire rental unit in Paris, France",
    "property_type": "Entire rental unit",
    "room_type": "Entire home/apt",
    "description": "Your own rooftop terrace above Paris, in the heart of Le Marais. …",
    "description_sections": [
      {
        "title": null,
        "text": "Your own rooftop terrace above Paris, in the heart of Le Marais. …"
      },
      { "title": "Registration Details", "text": "7500412345679" }
    ],
    "highlights": [
      { "title": "Self check-in", "description": "Check yourself in with the lockbox." }
    ],
    "city": "Paris",
    "location": "Paris, Île-de-France, France",
    "breadcrumbs": ["France", "Seine"],
    "latitude": 48.8544,
    "longitude": 2.363,
    "is_exact_location": true,
    "guests": 2,
    "bedrooms": 1,
    "beds": 1,
    "baths": 1,
    "details": ["2 guests", "1 bedroom", "1 bed", "1 bath"],
    "sleeping_arrangements": [{ "room": "Bedroom", "beds": ["1 queen bed"] }],
    "amenities": [
      {
        "group": "Bathroom",
        "items": [
          { "title": "Hair dryer", "subtitle": null, "available": true },
          { "title": "Cleaning products", "subtitle": null, "available": true }
        ]
      },
      {
        "group": "Not included",
        "items": [{ "title": "Private entrance", "subtitle": null, "available": false }]
      }
    ],
    "house_rules": [
      { "group": null, "title": "Up to 2 overnight guests", "description": null },
      { "group": null, "title": "No pets", "description": null }
    ],
    "safety_and_property": [
      { "group": "Safety devices", "title": "Carbon monoxide alarm installed", "description": null }
    ],
    "check_in_text": "Check in after 3:00 PM",
    "check_out_text": "Check out before 11:00 AM, self check-in with lockbox",
    "cancellation_policy": "Free cancellation before December 5. Cancel before check-in on December 6 for a partial refund.",
    "minimum_nights": 2,
    "children_allowed": true,
    "infants_allowed": true,
    "host": {
      "name": "Baptiste",
      "is_superhost": true,
      "is_verified": true,
      "rating": 4.92,
      "reviews_count": 216,
      "years_hosting": 3,
      "months_hosting": 1,
      "response_rate": 100,
      "response_time": "Responds within an hour",
      "about": "Hello, I'm Baptiste. …",
      "highlights": ["Born in the 90s"],
      "cohosts": []
    },
    "rating": 5,
    "reviews_count": 2,
    "category_ratings": {
      "cleanliness": 5,
      "accuracy": 5,
      "check_in": 5,
      "communication": 5,
      "location": 5,
      "value": 5
    },
    "rating_distribution": [],
    "review_tags": [],
    "is_guest_favorite": false,
    "is_new_listing": true,
    "reviews": [
      { "author_name": "Quentin", "date": "6 days ago", "rating": 5, "text": "Great stay! …" }
    ],
    "photos": [
      {
        "url": "https://a0.muscache.com/im/pictures/hosting/Hosting-1800717513599809075/original/16c8d807-77e2-4636-bb69-b5b2ecb8c3a8.png",
        "caption": null,
        "room": "Living room"
      }
    ],
    "checkin": "2026-12-06",
    "checkout": "2026-12-11",
    "price": 1167,
    "price_qualifier": "for 5 nights",
    "price_text": "$1,167 for 5 nights",
    "currency": "USD"
  }
}
FieldDescription
title, property_type, room_typeThe overview line, e.g. Entire home in Austin, Texas; the property type; Airbnb's type of place, e.g. Entire home/apt.
description_sectionsThe description split by its headings (The space, Guest access…); description is the whole text.
breadcrumbsCountry down to city, e.g. United States, Texas, Travis County, Austin.
is_exact_locationfalse when the pin is approximate ("Exact location will be provided after booking").
sleeping_arrangements"Where you'll sleep": each room with its beds.
amenities"What this place offers" by group; the Not included group lists what the place lacks, with available: false.
house_rules, safety_and_propertyRules and safety notes with the group they are shown under.
check_in_text, check_out_textCheck-in and check-out as shown, e.g. Check in after 3:00 PM.
cancellation_policy, minimum_nightsThe cancellation policy for your dates and the shortest stay the calendar accepts.
hostDisplay name, Superhost and verified flags, rating, reviews, years hosting, response rate and time, about text and co-hosts.
category_ratingsAverage ratings out of 5 for cleanliness, accuracy, check-in, communication, location and value.
rating_distribution, review_tagsThe share of reviews per star count, and the "Guests mention" topics with their counts and Airbnb's summary.
is_new_listingToo few reviews for Airbnb to show the rating on the page.
reviewsThe reviews the page shows (about six): the guest's first name, date as shown, rating and text.
photosEvery photo with its caption and the photo-tour room it is filed under.
checkin, checkout, priceThe dates the page was priced for and the price for the stay with fees, in currency. Without dates the price is null.

A missing field is null or an empty list, never an error.

No-code Airbnb Scraper ​

Prefer a dashboard run and a file? Scrapers without code → Airbnb Scraper takes the same filters, sweeps up to 15 search pages and produces JSON, CSV and XML files with one record per listing (the search result fields above). With include_detail it also opens every listing page, priced for the run's own dates, guests and currency, and nests it under detail. The same job is available over HTTP with an API key (x-api-key; scope scrapers:run to start, scrapers:read to poll):

POST https://api.scrapeit.io/api/v1/scrapers/airbnb/jobs
GET  https://api.scrapeit.io/api/v1/scrapers/airbnb/jobs/{jobId}
ParameterTypeExampleDescription
locationstringParis, FranceRequired. Where to stay. All the Search API filters above apply, except page and include_html.
max_pagesnumber10Search pages to sweep, 1–20; Airbnb stops at 15. Defaults to 5.
include_detailbooleantrueAlso fetch each listing page and nest it under detail (the Listing API fields). Defaults to false.
output_formatarray["json", "csv"]One or more of json, csv, xml. Defaults to ["json"]; an empty list is rejected.

A sweep of five pages or fewer without include_detail finishes inline and the POST already answers with the result-file ids; a larger one, or any run with include_detail, answers queued, so poll the GET endpoint until status is finished (or failed). A listing Airbnb repeats on a later page is written once. Each swept page is billed like one Search API request and each listing page like one Listing API request; pages already swept are kept and billed even when a later page fails, and a listing whose page fails keeps its search fields with detail: null and a detail_error code, and that page costs nothing.

Errors ​

CodeHTTPMeaning
VALIDATION_ERROR400Missing location; only one of checkin/checkout, a date the calendar does not have (2027-02-30), checkin in the past or checkout not after checkin; max_price below min_price; both or neither of listing_id/url; a URL that is not an https airbnb.com /rooms/ page.
NOT_FOUND404Listing API: airbnb.com has no listing with this id.
TARGET_BLOCKED502Every proxy attempt got a page without search results or without the listing. Retry later; the request costs nothing.

See Error codes for the shared error format.

Credits and billing ​

Both APIs bill one flat price per request under their own product code - the residential proxy and the browser are part of it (billing & credits). Every request is scraped live - never served from the shared cache - so prices and availability are current.

Price per request: 40 credits, flat for the Search API and 50 credits, flat for the Listing API (its page is rendered); the dashboard Pricing page always shows the current price. A no-code job pays the Search API price per results page it fetched, and the Listing API price per listing page with include_detail.

Limits and behavior ​

  • One search request returns one page of 18 listings; Airbnb serves at most 15 pages (270 listings) per search. Narrow the search (dates, price, type of place, rooms, amenities) to reach further.
  • Prices are those Airbnb shows a signed-out visitor for the dates, guests and currency asked; taxes and fees follow Airbnb's own display.
  • A search is a plain fetch; a listing is rendered in a browser and takes about 8–10 seconds - set your client timeout to at least 120 seconds.
  • The listing page shows the first reviews only; this API does not page through all reviews.

ScrapeIt Web Scraping API documentation. Managed web scraping services: www.scrapeit.io.