# Airbnb Search Scraper + New Listing Monitor (`mojocakes/airbnb-search-monitor`) Actor

Search Airbnb listings by location with full price breakdown (nightly rate, discounts, total) — no ~240-listing cap — or run in monitor mode to get only listings you haven't seen before. Never billed for listings Airbnb can't price for your dates.

- **URL**: https://apify.com/mojocakes/airbnb-search-monitor.md
- **Developed by:** [James Cook](https://apify.com/mojocakes) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 listing founds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Airbnb Search Scraper + New Listing Monitor

Search **Airbnb listings by location** with the full price breakdown (nightly rate, discounts, total) — no ~240-listing display cap — or flip on **monitor mode** and get only listings you haven't seen before. Built for rental arbitrage, market research, deal alerts, and travel-price tracking.

### What it does

- Search any number of locations (city, neighbourhood, or freeform place names)
- Filter by dates, guest count, price range, and room type
- **No arbitrary results cap** — pages past the ~240-listing limit other Airbnb scrapers document as a hard ceiling
- **Monitor mode:** remembers listings you've already seen per location and returns only new ones — schedule the actor for new-listing/price-drop alerts
- Full price detail: nightly rate, number of nights, active discounts, and the final total — not just a headline number
- **You only pay for listings that actually came back with a price.** Some listings can't be quoted for a given date range and Airbnb returns them anyway with no price — those are reported separately and never billed.

### Output example

```json
{
  "searchLocation": "Edinburgh, Scotland",
  "domain": "www.airbnb.co.uk",
  "listingId": "1746179606587482914",
  "url": "https://www.airbnb.co.uk/rooms/1746179606587482914",
  "name": "Stylish Main Door Retreat | 3-Bed Edinburgh Flat",
  "roomType": "Home",
  "rating": 5.0,
  "reviewsCount": 3,
  "isNewListing": false,
  "isSuperhost": true,
  "badges": ["SUPERHOST"],
  "priceDisplay": "£1,232",
  "priceQualifier": "total",
  "priceTotal": 1232,
  "currency": "GBP",
  "nightlyRate": 256.5,
  "nights": 5,
  "discounts": [{ "description": "Last-minute discount", "priceString": "-£51.32" }],
  "latitude": 55.9344,
  "longitude": -3.2282,
  "photoUrl": "https://a0.muscache.com/im/pictures/...",
  "scrapedAt": "2026-08-26T10:30:00.000Z"
}
```

### Typical uses

- **Rental arbitrage / market research** — nightly rates and occupancy signals by neighbourhood
- **Deal alerts** — monitor a location for newly-listed or newly-priced properties
- **Price tracking** — compare like-for-like listings across dates or locations
- **Travel planning tools** — feed structured pricing into a comparison or booking-assist app

### Monitor mode

Enable `monitorMode` and run the actor on a schedule. The first run establishes a baseline of listing IDs seen per location; every later run returns only ones that weren't in that baseline. Unlike a simple "newest ID" boundary, this works correctly against Airbnb's relevance/price-ranked search results, which have no reliable ordering to rely on.

### A note on pricing and dates

If you don't set `checkIn`/`checkOut`, Airbnb picks its own default dates per listing — and for some listings, no quote can be produced for those dates, so no price comes back. Those listings are still counted against `maxListingsPerSearch` (so run cost stays predictable) but are written to the run's `INCOMPLETE_LISTINGS` key-value record instead of the dataset, and are **never billed**. Setting explicit `checkIn`/`checkOut` dates generally returns a higher proportion of priced listings.

### Fair use

This actor collects only publicly visible search-result data — pricing, location, ratings, and the Superhost badge. **No host names, host profiles, guest identities, or guest review text are collected.** No login, no account, no bypassing anything beyond ordinary rate-limiting. Respect Airbnb's terms and local law for your use case.

# Actor input Schema

## `searchLocations` (type: `array`):

One or more places to search, exactly as you'd type them into Airbnb (e.g. `Edinburgh, Scotland`, `Lake District`, `Manhattan, New York`).

## `domain` (type: `string`):

Which Airbnb site to search. Affects the default display currency shown in results.

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

Leave empty to use Airbnb's own default dates — some listings will then come back without a price if their calendar can't be quoted for those defaults (you are never charged for those, see Output below).

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

Leave empty to use Airbnb's own default dates.

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

Number of adult guests.

## `priceMin` (type: `integer`):

Only listings priced at or above this total (in the domain's currency). Leave empty for no minimum.

## `priceMax` (type: `integer`):

Only listings priced at or below this total (in the domain's currency). Leave empty for no maximum.

## `roomType` (type: `string`):

Restrict to one Airbnb room-type category. Leave as "Any" for no filter.

## `maxListingsPerSearch` (type: `integer`):

How many search results to look through per location, most-relevant first — not capped at Airbnb's own ~240-listing display limit. Some listings come back without a price (their calendar can't be quoted) and are never billed; this cap counts every listing examined, priced or not, so run cost stays predictable.

## `monitorMode` (type: `boolean`):

When enabled, the actor remembers listing IDs it has already returned per location (per Task) and outputs only ones it hasn't seen before. Schedule it regularly for new-listing/price-drop alerts. The first run sets the baseline.

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

Proxy settings. Automatic (datacenter) proxy works for typical volumes; the actor escalates to residential automatically if it starts seeing blocks.

## Actor input object example

```json
{
  "searchLocations": [
    "Edinburgh, Scotland"
  ],
  "domain": "www.airbnb.co.uk",
  "roomType": "",
  "maxListingsPerSearch": 108,
  "monitorMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Airbnb listings found by this run (or only new listings, in monitor mode).

# 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 = {
    "searchLocations": [
        "Edinburgh, Scotland"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mojocakes/airbnb-search-monitor").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 = { "searchLocations": ["Edinburgh, Scotland"] }

# Run the Actor and wait for it to finish
run = client.actor("mojocakes/airbnb-search-monitor").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 '{
  "searchLocations": [
    "Edinburgh, Scotland"
  ]
}' |
apify call mojocakes/airbnb-search-monitor --silent --output-dataset

```

## MCP server setup

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

```

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/KWZQbmq9qAhZO8plS/builds/n58JZikhPFuGdOer6/openapi.json
