# Airbnb Price Tracker - Airbnb Scraper for Prices and Ratings (`kamerozkan/airbnb-price-tracker`) Actor

Airbnb price tracker and scraper: total and nightly prices, ratings, review counts, superhost and guest favorite flags for every listing in a city and date range. Flags new listings and price changes since your last run. No login, no API key.

- **URL**: https://apify.com/kamerozkan/airbnb-price-tracker.md
- **Developed by:** [Kamer Ozkan](https://apify.com/kamerozkan) (community)
- **Categories:** Travel, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Airbnb Price Tracker - Airbnb Scraper for Prices and Ratings

Airbnb price tracker and Airbnb scraper in one: get the total price, nightly rate, rating, review count, superhost and guest favorite flags of every listing in a city for your dates, and see which listings are new and which prices changed since your last run.

### What does Airbnb Price Tracker do?

It runs the same search a guest runs on airbnb.com (a city or area, check-in and check-out dates, number of guests, currency) and returns one clean row per listing, in Airbnb's own ranking order. Each row has the price for the whole stay including taxes and fees as Airbnb shows it, the nightly rate before discounts, the original price when a discount applies, the rating, the number of reviews, room and bed counts, coordinates and the listing URL.

With **Track price changes between runs** on (the default), the actor remembers the last price of every listing it has seen for that exact search. Schedule the same input every day and each row tells you the previous price, the change in money and in percent, and whether the listing is new in the results. Turn on **Only output new listings and price changes** to receive (and pay for) only what moved.

No login, no Airbnb account, no API key and no proxy setup are needed. It reads public search results only and does not collect host names, host photos or reviewer names.

### Who is it for?

- **Short-term rental investors** comparing what similar listings charge in a neighbourhood before buying.
- **Property managers and hosts** watching competitor prices for the same dates every morning and adjusting their own rate.
- **Revenue and market analysts** building price, rating and supply data for many cities and stay dates.
- **Travel agencies and price comparison sites** that need current Airbnb totals for a destination and date range.

### What data can you get?

| Field | Example |
|---|---|
| `roomId` | `1227680005996192680` |
| `name` | Luxury living near downtown |
| `listingType` | Home in East Austin |
| `location` | Austin, TX |
| `position` | 1 (rank in Airbnb's results) |
| `totalPrice` | 663 (whole stay, as shown by Airbnb) |
| `pricePerNight` | 221 (nightly rate before discounts and taxes) |
| `originalTotalPrice` | 255 (only when a discount applies) |
| `hasDiscount` | false |
| `currency` | USD |
| `rating` | 4.98 |
| `reviewsCount` | 94 |
| `isSuperhost` | false |
| `isGuestFavorite` | true |
| `isNewListing` | false (Airbnb's own "New" mark, no rating yet) |
| `rooms` | 3 bedrooms, 4 beds, 3 baths |
| `freeCancellation` | true |
| `latitude`, `longitude` | 30.26997, -97.71789 |
| `checkIn`, `checkOut`, `nights`, `adults` | 2026-12-04, 2026-12-07, 3, 4 |
| `previousTotalPrice` | 663 (last run of the same search) |
| `priceChange`, `priceChangePct` | 0, 0 |
| `isNewSinceLastRun` | false |
| `url` | Listing link with your dates and guests |
| `thumbnail` | Cover photo of the listing |
| `scrapedAt` | 2026-10-17T20:24:50+00:00 |

### How much does it cost?

You pay only for listings: **$1.50 per 1,000 listings** on the Free plan, with lower prices on paid Apify plans. There is no charge per page or per search.

Worked example: a host tracks the 50 top listings in their area for one weekend, every day for 30 days. That is 50 x 30 = 1,500 listings, about **$2.25 per month**. With **Only output new listings and price changes** on, unchanged listings are skipped and not charged, so the same tracker usually costs less.

Set "Max listings in total" or a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Enter one or more locations as you would type them on Airbnb ("Lisbon, Portugal", "Austin, TX"), or paste an Airbnb search URL to keep its filters.
3. Pick check-in and check-out dates, or leave check-in empty to always look 30 days ahead, and set the number of adults and the currency.
4. Click **Start**, then download the results as JSON, CSV or Excel, or read them with the API.
5. To track prices, save the input as a task and add a daily schedule. Keep the same location, dates, guests and currency, because price history is kept per exact search.

### Input example

```json
{
  "locations": ["Austin, TX", "Barcelona, Spain"],
  "checkIn": "2026-12-04",
  "checkOut": "2026-12-07",
  "adults": 4,
  "currency": "USD",
  "maxItemsPerLocation": 40,
  "trackChanges": true,
  "onlyChanges": false
}
```

### Output example

Real row from a run on 2026-10-17 (second run of the same search, so the change fields are filled):

```json
{
  "roomId": "1227680005996192680",
  "url": "https://www.airbnb.com/rooms/1227680005996192680?check_in=2026-12-04&check_out=2026-12-07&adults=4",
  "name": "Luxury living near downtown",
  "listingType": "Home in East Austin",
  "location": "Austin, TX",
  "position": 1,
  "latitude": 30.26997,
  "longitude": -97.71789,
  "rating": 4.98,
  "reviewsCount": 94,
  "isNewListing": false,
  "isSuperhost": false,
  "isGuestFavorite": true,
  "rooms": "3 bedrooms, 4 beds, 3 baths",
  "currency": "USD",
  "totalPrice": 663,
  "originalTotalPrice": null,
  "pricePerNight": 221,
  "hasDiscount": false,
  "priceLabel": "$663 for 3 nights",
  "freeCancellation": true,
  "checkIn": "2026-12-04",
  "checkOut": "2026-12-07",
  "nights": 3,
  "adults": 4,
  "isNewSinceLastRun": false,
  "previousTotalPrice": 663,
  "priceChange": 0,
  "priceChangePct": 0,
  "scrapedAt": "2026-10-17T20:24:50+00:00"
}
```

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify, or connect it to Make, n8n, Zapier, Google Sheets or a webhook (for example a Slack message when `priceChange` is not zero).

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/airbnb-price-tracker").call(run_input={
    "locations": ["Lisbon, Portugal"],
    "checkIn": "2026-11-20",
    "checkOut": "2026-11-23",
    "adults": 2,
    "currency": "EUR",
    "maxItemsPerLocation": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["totalPrice"], item["priceChange"])
```

### FAQ

**How does the Airbnb price tracker know the previous price?** It stores the last total price of each listing in a key-value store in your own Apify account, one record per search (location, dates, guests, currency). Change any of these and it is a new search with a fresh history.

**What counts as a new listing?** `isNewSinceLastRun` is true when the listing never appeared in any earlier run of this search. Airbnb reorders results, so a listing can drop out of the top positions and come back; it then keeps its history and `previousTotalPrice` is its last known price.

**How many listings can I get per city?** Airbnb shows up to about 270 listings per search (15 pages of 18). For more, split the city into neighbourhoods or paste search URLs with price ranges or room types.

**Is the total price the final price?** It is the price Airbnb shows in the search results for your dates and guests, in your currency. Fees and taxes shown at checkout can differ slightly by country.

**Can I filter by room type, price or amenities?** Set the filters on airbnb.com, copy the search URL and paste it into Locations. Dates, guests and currency from the input replace the ones in the URL.

**Is it legal to collect this data?** It collects publicly available listing data only and leaves out host and reviewer names. You are responsible for how you use it, including privacy laws like GDPR.

### Support and feedback

- Found a bug or missing a field? Open an issue on the **Issues** tab of this Actor with your run link. We reply within
  48 hours and ship most fixes within a few days.
- Have an idea for a feature? Issues are the fastest way to get it built.
- If the Actor saves you time, a short review on this page helps other users find it.

# Actor input Schema

## `locations` (type: `array`):

Cities or areas as you would type them on Airbnb, for example 'Lisbon, Portugal' or 'Austin, TX'. You can also paste a full Airbnb search URL (airbnb.com/s/...) to keep its filters (room type, price range, amenities); dates, guests and currency from this form replace the ones in the URL.

## `checkIn` (type: `string`):

YYYY-MM-DD. Leave empty for 30 days from today, which keeps a scheduled tracker always looking at the same distance ahead.

## `checkOut` (type: `string`):

YYYY-MM-DD. Leave empty to use check-in plus 'Nights'.

## `nights` (type: `integer`):

Length of stay when check-out is empty.

## `adults` (type: `integer`):

Number of adult guests. Prices and availability depend on it.

## `currency` (type: `string`):

Three-letter currency code for all prices, for example USD, EUR or GBP.

## `maxItemsPerLocation` (type: `integer`):

Listings are returned in Airbnb's own ranking order. Airbnb shows up to about 270 listings per search (15 pages of 18); narrow the area or add filters in a search URL to go deeper.

## `maxItems` (type: `integer`):

Stop after this many listings across all locations. You are charged per listing, so this also caps the cost of the run.

## `trackChanges` (type: `boolean`):

Remember the last price of every listing for this exact search (location, dates, guests, currency) and add previousTotalPrice, priceChange, priceChangePct and isNewSinceLastRun. Schedule the same input daily to get a price tracker.

## `onlyChanges` (type: `boolean`):

With tracking on, skip listings whose price did not change since the last run (you are not charged for skipped listings). The first run of a search always returns everything.

## `proxyConfiguration` (type: `object`):

Apify Proxy is used by default. Leave as is unless runs get blocked.

## Actor input object example

```json
{
  "locations": [
    "Lisbon, Portugal"
  ],
  "nights": 3,
  "adults": 2,
  "currency": "USD",
  "maxItemsPerLocation": 20,
  "maxItems": 1000,
  "trackChanges": true,
  "onlyChanges": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One row per result in the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Lisbon, Portugal"
    ],
    "currency": "USD",
    "maxItemsPerLocation": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/airbnb-price-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Lisbon, Portugal"],
    "currency": "USD",
    "maxItemsPerLocation": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/airbnb-price-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Lisbon, Portugal"
  ],
  "currency": "USD",
  "maxItemsPerLocation": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kamerozkan/airbnb-price-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kamerozkan/airbnb-price-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RihTlXY1DK2BFrdsJ/builds/tAIWdQ2mHMay7Thc8/openapi.json
