stophy-dev Airbnb API

The Airbnb API from stophy-dev — 3 operation(s) for airbnb.

Operations 3

POST /v1/airbnb/search Scrape Airbnb search results with prices #
POST /v1/airbnb/listing Scrape an Airbnb listing's details, host, amenities, ratings and price #
POST /v1/airbnb/reviews Scrape an Airbnb listing's guest reviews #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/stophy-dev:stophy-dev-airbnb-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

stophy-dev-airbnb-api-openapi.yml Raw ↑
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