# Airbnb Market Monitor (`lukas-ebner/airbnb-market-monitor`) Actor

Monitor public Airbnb search markets and listing pages for nightly pricing, ratings, host quality, amenities, and recurring market snapshots. Designed for STR comp tracking and change detection.

- **URL**: https://apify.com/lukas-ebner/airbnb-market-monitor.md
- **Developed by:** [Lukas Ebner](https://apify.com/lukas-ebner) (community)
- **Categories:** Travel, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Market Monitor — Public Listing Search + Detail Monitoring

Monitor Airbnb markets with one actor instead of stitching together separate search dumps and one-off room scrapes. This actor pulls public search results, enriches each listing from the room detail page, and returns the fields STR analysts actually use: nightly pricing, total stay pricing, ratings, host quality, amenities, rules, and neighborhood context.

No login and no private API bypasses required for the validated core flow.

### Why this exists

The validated wedge is not “another Airbnb scraper.” Buyers already have that. What they are missing is a reliable monitor-first actor that combines:

- public search-result coverage
- room-detail enrichment
- recurring snapshots for price/review/host deltas
- built-in market summary metrics per location

The niche leader has adoption, but weak satisfaction and support. This actor is shaped around recurring market intelligence, not raw row dumping.

### Best-fit buyers

- STR market-intelligence teams
- hosts and property managers tracking comps
- real-estate and vacation-rental analysts
- agencies benchmarking nightly pricing and listing quality
- data vendors building recurring listing-monitor feeds

### What you get

Per listing:

- listing ID and canonical room URL
- title, room type, area/location label
- lat/lng
- guests, bedrooms, beds, baths
- nightly price and total price for selected dates when present
- rating and review count
- host name, host ID, superhost flag
- guest-favorite badges
- amenities summary
- photo URLs
- house-rules summary
- neighborhood / getting-around text when surfaced
- capture timestamp

Per location report:

- nightly-price min / p25 / median / mean / p75 / max
- total-price stats
- average rating
- median review count
- superhost rate
- guest-favorite rate
- room-type breakdown
- top amenities across the market snapshot

### Example input

```json
{
  "searchTerms": ["paris", "austin texas"],
  "maxItemsPerSearch": 30,
  "includeItemDetails": true,
  "checkIn": "2026-06-22",
  "checkOut": "2026-06-27",
  "adults": 1,
  "proxyConfiguration": { "useApifyProxy": true }
}
````

### Example output row

```json
{
  "recordType": "listing",
  "query": "paris",
  "listingId": "36276450",
  "canonicalUrl": "https://www.airbnb.com/rooms/36276450",
  "title": "A quiet little corner in the heart of Paris",
  "roomType": "Room in Paris",
  "cityArea": "Montreuil",
  "nightlyPrice": 81.53,
  "totalPriceForDates": 462.88,
  "currency": "€",
  "ratingValue": 4.94,
  "reviewCount": 633,
  "hostName": "Claire",
  "superhost": true,
  "amenitiesSummary": ["Kitchen", "Wifi", "Dedicated workspace"],
  "capturedAt": "2026-06-04T12:00:00.000Z"
}
```

### Example market report

```json
{
  "recordType": "marketReport",
  "query": { "location": "paris", "market": "global", "checkIn": "2026-06-22", "checkOut": "2026-06-27" },
  "listingCount": 30,
  "nightlyPriceStats": { "currency": "€", "median": 118, "p25": 82, "p75": 176 },
  "averageRating": 4.81,
  "reviewCountMedian": 91,
  "superhostRate": 46.67,
  "guestFavoriteRate": 33.33
}
```

### Recurring use cases

- daily or weekly city snapshot monitoring
- price change tracking on comp sets
- guest-favorite / superhost mix tracking
- review-count and rating drift monitoring
- new-listing and delisting monitoring
- host portfolio quality benchmarking

### Reliability and risk posture

Validated flow: public homepage, search pages, and room detail pages returned plain HTTP 200 in live probing. The actor stays HTTP-first with got-scraping, homepage cookie minting, re-mint on block, and Apify Proxy support.

Robots posture for Airbnb is restrictive. This actor is therefore positioned only around public page extraction for monitoring use cases. It does not market private review-path/API bypasses.

### Practical note

The hardened template was eBay-shaped, so the minimal pragmatic change here was to replace the eBay-specific engine wiring in `src/main.ts` and `src/cli.ts` to point at a new `src/target.ts` Airbnb implementation while preserving the same session/retry/proxy pattern and the rest of the packaging/build flow.

# Actor input Schema

## `mode` (type: `string`):

Run a location search snapshot or enrich direct Airbnb room URLs.

## `searchTerms` (type: `array`):

City, district, or market queries to monitor, e.g. "paris" or "austin texas".

## `startUrls` (type: `array`):

Direct Airbnb room URLs to enrich in item mode.

## `listingType` (type: `string`):

Compatibility field from the template. Airbnb has only active public listings, so any option runs the same search flow.

## `market` (type: `string`):

Which Airbnb host/domain to use for the public scrape.

## `maxItemsPerSearch` (type: `integer`):

Maximum number of search-result listings to keep per monitored location.

## `includeItemDetails` (type: `boolean`):

Visit each room page to add host, amenities, rules, neighborhood, and richer pricing fields.

## `enrichConcurrency` (type: `integer`):

Parallel room-detail fetches when enrichment is enabled.

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

Optional YYYY-MM-DD. Improves total-price comparability.

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

Optional YYYY-MM-DD. Improves total-price comparability.

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

Adult guest count used for the public search and room-price context.

## `requestDelayMs` (type: `integer`):

Polite delay between requests. Lower is faster but raises block risk.

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

Proxy settings for Apify Proxy or custom proxy groups.

## Actor input object example

```json
{
  "mode": "searchComps",
  "searchTerms": [
    "paris"
  ],
  "listingType": "both",
  "market": "global",
  "maxItemsPerSearch": 30,
  "includeItemDetails": true,
  "enrichConcurrency": 4,
  "adults": 1,
  "requestDelayMs": 800,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchTerms": [
        "paris"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lukas-ebner/airbnb-market-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 = { "searchTerms": ["paris"] }

# Run the Actor and wait for it to finish
run = client.actor("lukas-ebner/airbnb-market-monitor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "paris"
  ]
}' |
apify call lukas-ebner/airbnb-market-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=lukas-ebner/airbnb-market-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Market Monitor",
        "description": "Monitor public Airbnb search markets and listing pages for nightly pricing, ratings, host quality, amenities, and recurring market snapshots. Designed for STR comp tracking and change detection.",
        "version": "0.1",
        "x-build-id": "4LxEQf5qX8CNHMszK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lukas-ebner~airbnb-market-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lukas-ebner-airbnb-market-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/lukas-ebner~airbnb-market-monitor/runs": {
            "post": {
                "operationId": "runs-sync-lukas-ebner-airbnb-market-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/lukas-ebner~airbnb-market-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-lukas-ebner-airbnb-market-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "searchComps",
                            "items"
                        ],
                        "type": "string",
                        "description": "Run a location search snapshot or enrich direct Airbnb room URLs.",
                        "default": "searchComps"
                    },
                    "searchTerms": {
                        "title": "Locations",
                        "type": "array",
                        "description": "City, district, or market queries to monitor, e.g. \"paris\" or \"austin texas\".",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Room URLs",
                        "type": "array",
                        "description": "Direct Airbnb room URLs to enrich in item mode.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "listingType": {
                        "title": "Listing window",
                        "enum": [
                            "active",
                            "sold",
                            "both"
                        ],
                        "type": "string",
                        "description": "Compatibility field from the template. Airbnb has only active public listings, so any option runs the same search flow.",
                        "default": "both"
                    },
                    "market": {
                        "title": "Market host",
                        "enum": [
                            "global"
                        ],
                        "type": "string",
                        "description": "Which Airbnb host/domain to use for the public scrape.",
                        "default": "global"
                    },
                    "maxItemsPerSearch": {
                        "title": "Max listings per location",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of search-result listings to keep per monitored location.",
                        "default": 30
                    },
                    "includeItemDetails": {
                        "title": "Fetch listing details",
                        "type": "boolean",
                        "description": "Visit each room page to add host, amenities, rules, neighborhood, and richer pricing fields.",
                        "default": true
                    },
                    "enrichConcurrency": {
                        "title": "Detail concurrency",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "Parallel room-detail fetches when enrichment is enabled.",
                        "default": 4
                    },
                    "checkIn": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Optional YYYY-MM-DD. Improves total-price comparability."
                    },
                    "checkOut": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Optional YYYY-MM-DD. Improves total-price comparability."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Adult guest count used for the public search and room-price context.",
                        "default": 1
                    },
                    "requestDelayMs": {
                        "title": "Request delay (ms)",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Polite delay between requests. Lower is faster but raises block risk.",
                        "default": 800
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings for Apify Proxy or custom proxy groups.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
