Appearance
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:
| Product | Type | Product code | What it does |
|---|---|---|---|
| Airbnb Search API | Scraper API (synchronous) | airbnb_search | Search stays for a destination and get one page of 18 listings. |
| Airbnb Listing API | Scraper API (synchronous) | airbnb_listing | Give one listing id or URL, get the listing page and its price. |
| Airbnb Scraper | No-code scraper | airbnb | Sweep 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| Parameter | Type | Example | Description |
|---|---|---|---|
location | string | Paris, France | Required. Where to stay, as typed into the Airbnb search box, up to 200 characters. |
checkin | string | 2027-03-12 | Check-in date, YYYY-MM-DD, from today on. Send together with checkout. |
checkout | string | 2027-03-15 | Check-out date, YYYY-MM-DD, after checkin. |
adults | number | 2 | Adult guests, 1–16. |
children | number | 1 | Children (2–12), 0–15. |
infants | number | 0 | Infants (under 2), 0–5. |
pets | number | 1 | Pets, 0–5. |
room_type | string | entire_home | Type of place: entire_home, private_room, shared_room or hotel_room. |
property_types | array | house,apartment | Any of these property types: house, apartment, guesthouse. Comma-separated in a query string. |
min_bedrooms | number | 3 | At least this many bedrooms, 1–8. |
min_beds | number | 4 | At least this many beds, 1–8. |
min_bathrooms | number | 2 | At least this many bathrooms, 1–8. |
amenities | array | wifi,pool | Stays 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_book | boolean | true | Only stays you can book without waiting for the host's approval. |
guest_favorite | boolean | true | Only stays Airbnb marks as a guest favorite. |
host_languages | array | en,fr | A 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_price | number | 80 | Lowest nightly price, in currency. |
max_price | number | 300 | Highest nightly price, in currency. |
currency | string | EUR | USD (default), EUR, GBP, CAD, AUD, JPY, CHF, PLN, BRL, MXN or INR. |
page | number | 2 | Results page of 18 listings, 1–15. Defaults to 1. |
include_html | boolean | false | Also 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¤cy=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 }
}
}| Field | Description |
|---|---|
total_results | Stays matching the search across all pages; Airbnb serves at most 270 of them. |
place | The place Airbnb resolved location to: name, city, region and country. |
map_bounds | The map area the search covers. |
price_range | The price filter: its lowest and highest price, and histogram - stay counts per equal-width price bucket between them. |
popular_neighborhoods | The "Popular neighborhoods" filter of the destination. |
results[].position | 1-based position across pages: page 2 starts at 19. |
results[].listing_id | Airbnb listing id; url is its /rooms/ page - pass the id to the Listing API. |
results[].property_type | E.g. Apartment, Condo, Hotel, read off the <type> in <area> line. |
results[].rating | Average rating out of 5; null with reviews_count for a new listing. |
results[].price | The price for the stay as a number in currency; price_qualifier says what it covers. |
results[].original_price | The struck-through price of a discounted stay. |
results[].nightly_price, nights | The 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_notes | Notes under the price, e.g. the hotel room it is for, or a recent price drop. |
results[].checkin, checkout | The stay the price is for. Without dates Airbnb picks its own and they show here. |
results[].details | Bedroom, bed and bath lines as the card shows them; bedrooms, beds and baths are the numbers. |
results[].payment_messages | Pills under the price, e.g. Free cancellation, +$127 Airbnb credit. |
pagination.total_pages | Pages 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| Parameter | Type | Example | Description |
|---|---|---|---|
listing_id | string | 1227163127160749519 | The digits of airbnb.com/rooms/<id>. Send either listing_id or url. |
url | string | https://www.airbnb.com/rooms/1800717513599809075 | A https://www.airbnb.com/rooms/<id> URL. Send either listing_id or url. |
checkin | string | 2027-03-12 | Check-in date, YYYY-MM-DD, from today on. Send together with checkout to get the stay price. |
checkout | string | 2027-03-15 | Check-out date, YYYY-MM-DD, after checkin. |
adults | number | 2 | Adult guests, 1–16. |
children | number | 1 | Children (2–12), 0–15. |
infants | number | 0 | Infants (under 2), 0–5. |
pets | number | 1 | Pets, 0–5. |
currency | string | EUR | Currency of the price, as in the Search API. Defaults to USD. |
include_html | boolean | false | Also 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"
}
}| Field | Description |
|---|---|
title, property_type, room_type | The overview line, e.g. Entire home in Austin, Texas; the property type; Airbnb's type of place, e.g. Entire home/apt. |
description_sections | The description split by its headings (The space, Guest access…); description is the whole text. |
breadcrumbs | Country down to city, e.g. United States, Texas, Travis County, Austin. |
is_exact_location | false 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_property | Rules and safety notes with the group they are shown under. |
check_in_text, check_out_text | Check-in and check-out as shown, e.g. Check in after 3:00 PM. |
cancellation_policy, minimum_nights | The cancellation policy for your dates and the shortest stay the calendar accepts. |
host | Display name, Superhost and verified flags, rating, reviews, years hosting, response rate and time, about text and co-hosts. |
category_ratings | Average ratings out of 5 for cleanliness, accuracy, check-in, communication, location and value. |
rating_distribution, review_tags | The share of reviews per star count, and the "Guests mention" topics with their counts and Airbnb's summary. |
is_new_listing | Too few reviews for Airbnb to show the rating on the page. |
reviews | The reviews the page shows (about six): the guest's first name, date as shown, rating and text. |
photos | Every photo with its caption and the photo-tour room it is filed under. |
checkin, checkout, price | The 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}| Parameter | Type | Example | Description |
|---|---|---|---|
location | string | Paris, France | Required. Where to stay. All the Search API filters above apply, except page and include_html. |
max_pages | number | 10 | Search pages to sweep, 1–20; Airbnb stops at 15. Defaults to 5. |
include_detail | boolean | true | Also fetch each listing page and nest it under detail (the Listing API fields). Defaults to false. |
output_format | array | ["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
| Code | HTTP | Meaning |
|---|---|---|
VALIDATION_ERROR | 400 | Missing 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_FOUND | 404 | Listing API: airbnb.com has no listing with this id. |
TARGET_BLOCKED | 502 | Every 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.
Related pages
- Booking.com Scraper API - hotel search and property pages with rates.
- Tripadvisor Scraper API - hotel and restaurant lists and place pages.
- Billing & credits - credit prices and plans.
- Files & artifacts - downloading the no-code result files.