stophy-dev Airbnb API
The Airbnb API from stophy-dev — 3 operation(s) for airbnb.
The Airbnb API from stophy-dev — 3 operation(s) for airbnb.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/stophy-dev:stophy-dev-airbnb-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Stophy Airbnb API
version: '1'
description: 'Every endpoint is a POST that takes its input as a JSON object body. Unknown fields are rejected with 400.
Responses leave out empty values: null, empty strings, empty objects and empty nested lists are not sent.
Text comes back whole. To get shorter responses, add ?maxTextLength= to the URL. Every text value longer than that is cut and ends with …. A screenshot is never cut, and a page whose text was cut has isTruncated set to true.
x-credits is what one call costs. Every call costs the same, whatever it returns, unless an operation''s description says it costs per 10 results, or per second of audio. Then x-credits is the lowest price and x-credits-max the most one call can cost. Where an operation takes limit, send it to return fewer results and pay for fewer.
When a response has a cursor, send it back unchanged with the same input to get the next page. When it has a page, send the next page number.
Endpoints whose security includes {} also work without an API key: 10 requests a minute and 50 a day per IP, and no paging.'
servers:
- url: https://api.stophy.dev
security:
- apiKey: []
tags:
- name: Airbnb
paths:
/v1/airbnb/search:
post:
operationId: airbnbSearch
summary: Scrape Airbnb search results with prices
description: Costs 1 credit per call. Pages with cursor.
x-credits: 1
parameters:
- $ref: '#/components/parameters/MaxTextLength'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
location:
type: string
minLength: 2
maxLength: 200
description: A city, region, neighborhood or landmark, like Lisbon, Portugal.
checkIn:
type: string
format: date
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
description: First night, as YYYY-MM-DD.
checkOut:
type: string
format: date
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
description: Day you leave, as YYYY-MM-DD.
guests:
default: 1
description: Number of guests. Only stays that fit this many.
type: integer
minimum: 1
maximum: 16
minPrice:
description: 'Airbnb''s own price range minimum: the nightly price after discounts and before taxes, in currency.'
type: integer
minimum: 0
maximum: 9007199254740991
maxPrice:
description: 'Airbnb''s own price range maximum: the nightly price after discounts and before taxes, in currency.'
type: integer
exclusiveMinimum: 0
maximum: 9007199254740991
roomType:
description: 'Airbnb''s own Type of place filter: entireHome (Entire home) or privateRoom (Room).'
type: string
enum:
- entireHome
- privateRoom
currency:
default: USD
description: Currency of every price in the answer and of minPrice and maxPrice.
type: string
enum:
- USD
- EUR
- GBP
- JPY
- CAD
- AUD
- CHF
- MXN
- BRL
cursor:
type: string
minLength: 1
description: The cursor from the previous response. Send it as is.
required:
- location
- checkIn
- checkOut
additionalProperties: false
example:
location: Lisbon, Portugal
checkIn: '2026-12-12'
checkOut: '2026-12-15'
guests: 2
maxPrice: 200
roomType: entireHome
responses:
'200':
description: The data, and the credits this call used.
headers:
X-Request-ID:
$ref: '#/components/headers/RequestId'
x-credits-used:
$ref: '#/components/headers/CreditsUsed'
X-RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
X-RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
X-RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
x-cache:
$ref: '#/components/headers/Cache'
x-cache-age:
$ref: '#/components/headers/CacheAge'
content:
application/json:
schema:
type: object
required:
- success
- data
- creditsUsed
- requestId
properties:
success:
const: true
data:
type: object
additionalProperties: false
properties:
location:
type: string
results:
type: array
items:
type: object
additionalProperties: false
properties:
listingId:
type: string
listingUrl:
type: string
format: uri
title:
type: string
propertyType:
description: What Airbnb calls the place, like Apartment, Room, Condo or Hotel.
type: string
area:
type: string
rating:
type: number
reviews:
description: Number of reviews Airbnb shows for the stay, the same as total in airbnb.reviews. A room in a larger property shares the property's reviews.
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
priceTotal:
description: 'The Total line of Airbnb''s price details for the whole stay: the nights after discounts, plus every fee and tax Airbnb lists there, like Taxes, Taxes and fees or Resort fee. Airbnb lists no tax or fee for some places, such as Tokyo, Rio de Janeiro and Sydney, and there it equals pricePerNight times the nights. Exact to the cent; Airbnb''s page rounds it up to a whole unit.'
type: number
minimum: 0
priceBeforeDiscount:
description: The whole stay before a discount, when Airbnb shows one.
type: number
minimum: 0
pricePerNight:
description: Average price of one night after discounts, from the nights line of Airbnb's price details. It leaves out taxes and fees, so priceTotal is higher than this times the nights wherever Airbnb lists any.
type: number
minimum: 0
priceCurrency:
type: string
enum:
- USD
- EUR
- GBP
- JPY
- CAD
- AUD
- CHF
- MXN
- BRL
badges:
type: array
items:
type: string
imageUrls:
type: array
items:
type: string
format: uri
latitude:
type: number
minimum: -90
maximum: 90
longitude:
type: number
minimum: -180
maximum: 180
required:
- listingUrl
cursor:
type: string
required:
- results
creditsUsed:
type: integer
requestId:
type: string
4XX:
$ref: '#/components/responses/Error'
5XX:
$ref: '#/components/responses/Error'
tags:
- Airbnb
/v1/airbnb/listing:
post:
operationId: airbnbListing
summary: Scrape an Airbnb listing's details, host, amenities, ratings and price
description: Costs 1 credit per call.
x-credits: 1
parameters:
- $ref: '#/components/parameters/MaxTextLength'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
listingUrl:
type: string
description: Link to the Airbnb listing, like https://www.airbnb.com/rooms/18249319. Send this or listingId.
listingId:
type: string
description: Airbnb listing id, like 18249319. Send this or listingUrl.
checkIn:
description: First night, as YYYY-MM-DD. Send it with checkOut to get the price.
type: string
format: date
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
checkOut:
description: Day you leave, as YYYY-MM-DD. Send it with checkIn to get the price.
type: string
format: date
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
guests:
default: 1
description: Number of guests. Only stays that fit this many.
type: integer
minimum: 1
maximum: 16
currency:
default: USD
description: Currency of every price in the answer and of minPrice and maxPrice.
type: string
enum:
- USD
- EUR
- GBP
- JPY
- CAD
- AUD
- CHF
- MXN
- BRL
sendOne:
- listingUrl
- listingId
additionalProperties: false
responses:
'200':
description: The data, and the credits this call used.
headers:
X-Request-ID:
$ref: '#/components/headers/RequestId'
x-credits-used:
$ref: '#/components/headers/CreditsUsed'
X-RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
X-RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
X-RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
x-cache:
$ref: '#/components/headers/Cache'
x-cache-age:
$ref: '#/components/headers/CacheAge'
content:
application/json:
schema:
type: object
required:
- success
- data
- creditsUsed
- requestId
properties:
success:
const: true
data:
type: object
additionalProperties: false
properties:
listingId:
type: string
listingUrl:
type: string
format: uri
title:
type: string
description:
type: string
propertyType:
type: string
location:
type: string
latitude:
type: number
minimum: -90
maximum: 90
longitude:
type: number
minimum: -180
maximum: 180
hostName:
type: string
hostIsSuperhost:
type: boolean
guests:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
bedrooms:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
beds:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
bathrooms:
type: number
amenities:
type: array
items:
type: string
rating:
type: number
reviews:
description: Number of reviews Airbnb shows for the stay, the same as total in airbnb.reviews. A room in a larger property shares the property's reviews.
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
isGuestFavorite:
type: boolean
ratingAccuracy:
type: number
ratingCheckin:
type: number
ratingCleanliness:
type: number
ratingCommunication:
type: number
ratingLocation:
type: number
ratingValue:
type: number
houseRules:
type: array
items:
type: string
imageUrls:
type: array
items:
type: string
format: uri
isAvailable:
description: Whether the stay can be booked for checkIn to checkOut. Null without dates.
type: boolean
priceTotal:
description: 'The Total line of Airbnb''s price details for the whole stay: the nights after discounts, plus every fee and tax Airbnb lists there, like Taxes, Taxes and fees or Resort fee. Airbnb lists no tax or fee for some places, such as Tokyo, Rio de Janeiro and Sydney, and there it equals pricePerNight times the nights. Exact to the cent; Airbnb''s page rounds it up to a whole unit.'
type: number
minimum: 0
priceBeforeDiscount:
description: The whole stay before a discount, when Airbnb shows one.
type: number
minimum: 0
pricePerNight:
description: Average price of one night after discounts, from the nights line of Airbnb's price details. It leaves out taxes and fees, so priceTotal is higher than this times the nights wherever Airbnb lists any.
type: number
minimum: 0
priceCurrency:
type: string
enum:
- USD
- EUR
- GBP
- JPY
- CAD
- AUD
- CHF
- MXN
- BRL
required:
- listingUrl
- amenities
- houseRules
- imageUrls
creditsUsed:
type: integer
requestId:
type: string
4XX:
$ref: '#/components/responses/Error'
5XX:
$ref: '#/components/responses/Error'
tags:
- Airbnb
/v1/airbnb/reviews:
post:
operationId: airbnbReviews
summary: Scrape an Airbnb listing's guest reviews
description: Costs 1 credit per call. Pages with page.
x-credits: 1
parameters:
- $ref: '#/components/parameters/MaxTextLength'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
listingUrl:
type: string
description: Link to the Airbnb listing, like https://www.airbnb.com/rooms/18249319. Send this or listingId.
listingId:
type: string
description: Airbnb listing id, like 18249319. Send this or listingUrl.
page:
default: 1
description: Page number, starting at 1.
type: integer
minimum: 1
maximum: 200
sendOne:
- listingUrl
- listingId
additionalProperties: false
responses:
'200':
description: The data, and the credits this call used.
headers:
X-Request-ID:
$ref: '#/components/headers/RequestId'
x-credits-used:
$ref: '#/components/headers/CreditsUsed'
X-RateLimit-Limit:
$ref: '#/components/headers/RateLimitLimit'
X-RateLimit-Remaining:
$ref: '#/components/headers/RateLimitRemaining'
X-RateLimit-Reset:
$ref: '#/components/headers/RateLimitReset'
x-cache:
$ref: '#/components/headers/Cache'
x-cache-age:
$ref: '#/components/headers/CacheAge'
content:
application/json:
schema:
type: object
required:
- success
- data
- creditsUsed
- requestId
properties:
success:
const: true
data:
type: object
additionalProperties: false
properties:
listingId:
type: string
total:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
results:
type: array
items:
type: object
additionalProperties: false
properties:
reviewId:
type: string
rating:
type: number
text:
type: string
language:
type: string
translatedText:
description: Airbnb's English translation, when the review is in another language.
type: string
createdAt:
type: string
format: date-time
pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
authorName:
type: string
stayNote:
description: Airbnb's note on the trip, like Stayed a few nights or Stayed with kids.
type: string
hostReplyText:
type: string
required: []
page:
type: integer
minimum: -9007199254740991
maximum: 9007199254740991
required:
- results
- page
creditsUsed:
type: integer
requestId:
type: string
4XX:
$ref: '#/components/responses/Error'
5XX:
$ref: '#/components/responses/Error'
tags:
- Airbnb
components:
headers:
RateLimitLimit:
description: Requests allowed in the current window.
schema:
type: integer
Cache:
description: hit if this result came from the cache, miss if it was fetched live.
schema:
type: string
RateLimitRemaining:
description: Requests left in the current window.
schema:
type: integer
CreditsUsed:
description: Credits this call used.
schema:
type: integer
CacheAge:
description: Seconds since the returned result was written to the cache.
schema:
type: integer
RateLimitReset:
description: Unix time in seconds when the current window resets.
schema:
type: integer
RequestId:
description: The request id. Quote it when you report a problem.
schema:
type: string
RetryAfter:
description: Seconds to wait before retrying.
schema:
type: integer
parameters:
MaxTextLength:
name: maxTextLength
in: query
required: false
description: Cut every text value in the response to this many characters. A value that was cut ends with …, and a page whose text was cut has isTruncated set to true. A screenshot is never cut. Leave it out to get the full text.
schema:
type: integer
minimum: 1
schemas:
Error:
type: object
required:
- success
- error
properties:
success:
const: false
error:
type: object
required:
- code
- message
- retryable
- requestId
properties:
code:
type: string
enum:
- cliSessionCompleted
- cliSessionExists
- cliSessionNotFound
- forbidden
- insufficientCredits
- internalError
- inviteClaimed
- inviteDisabled
- inviteExpired
- inviteUsedUp
- invalidCliSession
- invalidCliVerifier
- invalidRequest
- notFound
- rateLimited
- sourceChanged
- sourceRefused
- sourceTimeout
- sourceUnavailable
- unauthorized
- unsupportedMediaType
message:
type: string
retryable:
type: boolean
retryAfterSeconds:
type: integer
requestId:
type: string
requiredCredits:
type: number
availableCredits:
type: number
billingUrl:
type: string
const: https://stophy.dev/billing
responses:
Error:
description: The request failed. retryable says whether trying again can help.
headers:
X-Request-ID:
$ref: '#/components/headers/RequestId'
Retry-After:
$ref: '#/components/headers/RetryAfter'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
apiKey:
type: http
scheme: bearer