TRAVEL
Airbnb: Listings, Prices & Availability
Airbnb scraper for any city and dates: nightly price, stay total, discounts, the fees and taxes Airbnb states, rating, reviews, beds, baths, photos, coordinates and URL.
About this data
Airbnb scraper for any city and dates: nightly price, stay total, discounts, the fees and taxes Airbnb states, rating, reviews, beds, baths, photos, coordinates and URL.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/airbnb/stays
Up to three lodging cards from one location's first search page: listing ID/link, name, room type, location, source-stated nightly/stay price, source stay dates, fees, aggregate rating/count, coordinates and photos.
Optional dates support stays up to 14 nights; without dates, inspect each row's source-selected stay.
Location matching and row price normalization use the actor core.
Host profiles, contacts and detail expansion are excluded.
Input
Send a JSON body to POST https://api.ssh.autos/v1/airbnb/stays.
| Field | Type | Required | Notes |
|---|---|---|---|
location | string | required | 2–120 characters |
checkIn | string | optional | pattern ^\d{4}-\d{2}-\d{2}$ |
checkOut | string | optional | pattern ^\d{4}-\d{2}-\d{2}$ |
adults | integer | optional | 1–4; default 2 |
currency | string | optional | pattern ^[A-Z]{3}$; default "USD" |
maxResults | integer | optional | 1–3; default 3 |
Returned fields
The answer is JSON: records, a list of up to 3, and summary, the run status and counts. Each record has these 37 fields; a field the source does not publish comes back null.
37 fields per record
| Field | Type | Notes |
|---|---|---|
listingId | string | Airbnb listing id (stable, numeric). |
url | string | Public listing URL. |
bookingUrl | string | Listing URL with this row's check-in, check-out and adult count set, so it opens priced for the reported stay. |
name | string | Listing name shown on the search result. |
roomType | string | Room/place type, e.g. Apartment, Home, Room, Guest suite, Hotel. |
location | string | Neighbourhood/area shown with the listing. |
tagline | string | Short secondary title from the search result. |
propertyType | string | Structured property type from the listing page (full-detail mode). |
spaceType | string | Structured space type from the listing page (full-detail mode). |
pricePerNight | number | Effective nightly price in the returned currency: the discounted rate after any Airbnb discount, never the pre-discount rate. Null on a discounted listing when the stay length or the discount amount… |
pricePerNightEffective | number | Total price divided by the reported stay nights, rounded to 2 decimals. Lets a 28-night and a 31-night (or monthly) total be compared on the same nightly basis; for multi-month windows the total is t… |
originalPricePerNight | number | Pre-discount nightly rate stated in Airbnb's nightly price explanation when Airbnb states a discount; null when there is no discount. The headline original total is not used because it can include ta… |
discountAmount | number | Discount amount Airbnb states (positive): a discount explanation line or the headline original/discounted price pair; null when Airbnb states no discount. A negative fee or tax credit (for example a… |
totalPrice | number | Displayed total for the stay (or the headline price when no dates were given). For a stay longer than one month that Airbnb prices per month (28+ nights), this is pricePerMonth times the months in th… |
pricePerMonth | number | Airbnb's displayed average monthly price, after discounts, when Airbnb prices the stay per month (stays of 28+ nights, including monthly and month-long flexible searches); null otherwise. For a windo… |
stayCheckIn | string | Check-in date (YYYY-MM-DD) this row is priced for: the listing's own window in a flexible-date or monthly search, otherwise the requested check-in. |
stayCheckOut | string | Check-out date (YYYY-MM-DD) this row is priced for. |
stayNights | integer | Number of nights between stayCheckIn and stayCheckOut. |
currency | string | ISO currency code for the price fields. |
feeBreakdown | array of objects | Itemized fees and taxes shown with the price, each with a label and amount. |
rating | number | Average guest rating (0-5). |
reviewCount | integer | Number of guest reviews. |
bedrooms | integer | Number of bedrooms. |
beds | integer | Number of beds. |
bathrooms | number | Number of bathrooms (halves preserved). |
maxGuests | integer | Maximum guests allowed (full-detail mode). |
latitude | number | Listing latitude. |
longitude | number | Listing longitude. |
images | array of strings | Listing photo URLs. |
amenities | array of strings | Available amenities (full-detail mode). |
houseRules | array of objects | House rules (full-detail mode), each with its group, type, rule text and optional detail. |
resolvedLocation | string | Place Airbnb resolved for this search query. |
locationVerified | boolean | True when results were scoped to the resolved place boundary. |
query | string | The place/search this listing was found under. |
mode | string | search or full. |
source | string | Always 'airbnb'. |
scrapedAt | string | UTC ISO-8601 collection timestamp. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/airbnb/stays -m POST -b '{"location": "Lisbon, Portugal", "maxResults": 2}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: Airbnb Scraper: Listings, Prices & Availability. Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt