# Airbnb Scraper — Prices, Availability Calendar & Occupancy (`kestrel/airbnb-prices-calendar`) Actor

Airbnb scraper for prices and availability: search a place or paste Airbnb URLs and get each listing’s price for your dates and guests, plus up to 24 months of availability calendar with occupancy, listing details and reviews. No login, no Airbnb API key. Pay per row; unknown places are free.

- **URL**: https://apify.com/kestrel/airbnb-prices-calendar.md
- **Developed by:** [Tedj MEABIOU](https://apify.com/kestrel) (community)
- **Categories:** Travel, Real estate, Business
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper — Prices, Availability Calendar & Occupancy

An Airbnb scraper for Airbnb prices and availability: search any place or paste Airbnb URLs and get every listing's nightly rate and total for your dates and guests in any currency, its rating, location and badges — then, per listing, up to 24 months of availability calendar with occupancy data, the full listing details with the exact price breakdown, and reviews. Scrape Airbnb data as rows you own — the short term rental data behind market analysis, an Airbnb price tracker, or a rate check on your own listings — without an Airbnb API key, a login or cookies: it reads the same public endpoints the airbnb.com front-end uses. You pay per row you receive; a place Airbnb does not recognise, an empty search and every status row cost nothing.

### What does this Airbnb scraper do?

A listing has a price only for a stay — dates and guests — and many scrapers quietly return a default figure, or listings from anywhere in the world when the place name is not understood. This one prices exactly the stay you ask for and tells you when it could not:

- **`listing` rows** — for a place search, a pasted search URL or listing ids: total for the stay, base nightly rate and effective per-night price, discounts, rating and review count, bedrooms/beds/baths, coordinates, Guest favorite / Superhost badges, free cancellation, pictures. Searches page through the results up to the site's cap (about 280 per search).
- **`calendar` rows** — one per listing: day-by-day availability for the next 1–24 months (`available`, `available_for_checkin`, `min_nights`…) plus an occupancy summary for the next 30/90/365 nights, the next available date and the typical minimum stay.
- **Listing details** on request: description, amenities, house rules, cancellation policy, category ratings, host, capacity, sleeping arrangement, and the exact price breakdown for the dates — including "not available for these dates" when that is the answer.
- **`review` rows** — newest, highest, lowest or most relevant first, with reviewer, date, text and host reply.
- **`status` rows** — one per place, URL or listing: what Airbnb searched (`resolved_place`), how many rows were priced and charged, `unknown_area`, `no_results` or an error. Never charged.

### Airbnb prices for exact dates — nightly rate, total and discounts

Every listing row carries `price_total` (what Airbnb displays for the stay after discounts), `price_original` (before discounts), `price_nightly` (the base nightly rate from the site's own breakdown) and `price_nightly_effective` (total ÷ nights), in the `currency` you chose, with `price_breakdown` lines such as "3 nights x $171.73", "Early booking discount −$89.73" and "Taxes". Airbnb prices include all fees it shows a logged-out guest for that market; the breakdown tells you which. Without dates you get each listing's default displayed price and `price_nights` as Airbnb chose it. Prices depend on guests exactly as on the site, so set `adults`, `children`, `infants` and `pets`. An Airbnb nightly rate estimate for a market is one search — an Airbnb price calculator without the guesswork: the median `price_nightly_effective` of the rows.

### Airbnb availability calendar and Airbnb occupancy data

`calendarMonths: 12` adds a calendar row per listing: 365 days with availability flags and minimum/maximum nights, and `occupancy_30`, `occupancy_90`, `occupancy_365` (share of nights not available — blocked or booked, the calendar does not tell which), `available_90`, `next_available`, `min_nights_typical`. This is the Airbnb availability API people search for and the company does not offer: an Airbnb calendar API you call with listing ids. Run it on a schedule and the dataset becomes an occupancy and price history for a market or a portfolio: the short term rental data API investors and revenue managers otherwise buy as AirDNA-style subscriptions, at a few cents per listing. Airbnb occupancy rate by city, by neighbourhood or by bedroom count is a group-by on the calendar rows.

### Does Airbnb have an API? Airbnb API vs Airbnb scraper vs AirDNA alternative

Airbnb's only API is a closed partner program for property-management systems (listings, bookings, messages) — there is no Airbnb API for prices, availability or occupancy, no API key to request, and "Airbnb API access" for analytics does not exist. What developers actually use is one of two things:

| | Airbnb data vendors (AirDNA, AirROI, Airbtics, Mashvisor, Rabbu) | This Airbnb scraper |
|---|---|---|
| Data | Aggregated, modelled estimates by market; monthly or weekly refresh | Raw rows per listing, dates and guests, fetched when you run it |
| Coverage | Their markets and their listing sample | Any place Airbnb serves, any listing id, any currency and locale |
| Price | Subscription per market or plan | Cents per row; empty searches free |
| Occupancy | Modelled from calendars and reviews | Availability per night from the listing's calendar, with the caveat that blocked nights look booked |
| History | Theirs | Yours: every run appends dated rows |
| Access | Dashboard or paid API | Apify API, scheduler, webhooks, n8n/Make/Zapier, MCP for AI agents |

So as an AirDNA alternative it is not a dashboard: it is the Airbnb data API layer you build a dashboard, a model or a spreadsheet on, free of a per-market subscription. If you searched for "Airbnb scraper Python", "Airbnb scraper free" or "Airbnb scraper Apify": the Python and JavaScript calls below are complete, Apify's free plan covers small runs, and the maintenance — the site rotates its query hashes and formats — is done for you, with a daily canary run and status rows instead of silent zeros.

### Airbnb price tracker and Airbnb price history

Schedule the actor with relative dates (`"checkIn": "30 days"`) and every run prices the same stay window again. The dataset grows into an Airbnb price history per listing — `price_total` and `price_nightly_effective` by `fetched_at` — and, with `calendarMonths`, an occupancy history. Connect a run-finished webhook to n8n, Make or Zapier for an Airbnb price tracker that alerts on drops in a shortlist, on a competitor undercutting you, or on new availability. For a portfolio, put your listing ids in `listingIds` and your competitive set in a second run; each listing and stay is billed once.

### Airbnb market data: comps, revenue and occupancy for investors

To scrape Airbnb listings for a market — a city, a neighbourhood, a coastline — combine a place search with `calendarMonths`: the listing rows give the price distribution for the dates (use `price_nightly_effective` for like-for-like nightly figures), the calendar rows give occupancy for the next 30, 90 and 365 nights per listing, and `rating`, `reviews_count`, `bedrooms`, `room_type` and coordinates let you segment. Airbnb comps for an underwriting: search the neighbourhood with the same bedrooms and room type, take the median `price_nightly_effective` and `occupancy_90`. An Airbnb revenue calculator follows: median nightly price × occupied nights × 12. A search is capped at about 280 listings, so cover a large market with price bands or map bounds in pasted URLs; the status rows tell you how many pages each search returned and which place was resolved.

### Airbnb reviews scraper

`maxReviewsPerListing` adds review rows per listing (a reviews scraper without a separate run) — newest first by default, or highest, lowest or most relevant — with the rating, text (and the site's translation when it exists), date, reviewer first name and location, the host's reply and the stay-type tag. `reviews_total` carries the listing's total review count so you know how much you sampled. To scrape Airbnb reviews for one property, give its id in `listingIds` with `maxReviewsPerListing: 200`.

### Input

| Field | Meaning |
|---|---|
| `locationQueries` | Places as you would type them on the site: `"Lisbon, Portugal"`, `"Algarve"`, `"Brooklyn, NY"`. Unknown places produce an `unknown_area` status row and cost nothing. |
| `startUrls` | Search URLs (dates, guests, price, room type, bedrooms and map bounds in the URL are honoured) or listing URLs. |
| `listingIds` | Listing ids to price, calendar, detail or review directly. |
| `checkIn`, `checkOut` | `YYYY-MM-DD` or relative to the run date (`"30 days"`, `"6 weeks"`) for schedules. Leave both empty for default prices. |
| `adults`, `children`, `infants`, `pets` | Guests; prices depend on them. |
| `currency`, `locale` | Any ISO currency; site locale for names, descriptions and reviews. |
| `priceMin`, `priceMax`, `roomTypes`, `minBedrooms`, `minBeds`, `minBathrooms` | Search filters (prices per night in `currency`; 0 = no limit). |
| `maxListingsPerQuery` | Distinct listings per place or search URL, up to about 280 (the site's cap; split big areas into neighbourhoods or price bands for more). |
| `includeDetails` | Fetch each listing's page (details + exact breakdown; one extra call per listing). |
| `calendarMonths` | 0–24 months of availability per listing. |
| `maxReviewsPerListing`, `reviewsSort` | Reviews per listing and their order. |
| `proxyConfiguration`, `sessions`, `perIp` | Apify datacenter proxies work; defaults are fine. |

#### Example: Airbnb prices for a weekend in Lisbon

```json
{ "locationQueries": ["Lisbon, Portugal"], "checkIn": "2026-10-03", "checkOut": "2026-10-06", "adults": 2, "currency": "EUR", "maxListingsPerQuery": 80 }
```

#### Example: occupancy and prices for a market, weekly, always 30 days out

```json
{ "locationQueries": ["Algarve, Portugal"], "checkIn": "30 days", "checkOut": "33 days", "adults": 2, "currency": "EUR", "maxListingsPerQuery": 200, "calendarMonths": 6 }
```

#### Example: your own listings and competitors — details, 12-month calendar, latest reviews

```json
{ "listingIds": ["11562247", "45307024"], "checkIn": "30 days", "checkOut": "33 days", "includeDetails": true, "calendarMonths": 12, "maxReviewsPerListing": 20, "reviewsSort": "most_recent" }
```

#### Example: a pasted search with its own filters

```json
{ "startUrls": ["https://www.airbnb.com/s/Paris--France/homes?checkin=2026-11-10&checkout=2026-11-14&adults=2&price_max=200&room_types%5B%5D=Entire%20home%2Fapt&min_bedrooms=2"], "currency": "USD" }
```

### Output

`listing` row (search; with `includeDetails` the same row also carries `description`, `amenities`, `house_rules`, `cancellation_policy`, `rating_breakdown`, `host`, `person_capacity`, `available`):

```json
{ "type": "listing", "id": "1018680572065141154", "url": "https://www.airbnb.com/rooms/1018680572065141154", "name": "Lisboa Bica Nature Fast Net AC Heating", "title": "Apartment in Lisbon",
  "query": "Lisbon, Portugal", "check_in": "2026-10-03", "check_out": "2026-10-06", "nights": 3, "adults": 2, "children": 0, "infants": 0, "pets": 0, "currency": "USD",
  "price_total": 426.0, "price_total_display": "$426", "price_original": 516.0, "price_nightly": 171.73, "price_nightly_effective": 142.0, "price_nights": 3,
  "price_breakdown": [{ "label": "3 nights x $171.73", "amount": 515.19 }, { "label": "Early booking discount", "amount": -89.73 }, { "label": "Price after discount", "amount": 425.46 }],
  "rating": 4.88, "reviews_count": 156, "bedrooms": 1, "beds": 1, "bathrooms": null, "lat": 38.70975, "lng": -9.14708, "badges": ["Guest favorite"], "is_guest_favorite": true, "is_superhost": false, "free_cancellation": false,
  "pictures": ["https://a0.muscache.com/im/pictures/…"], "details": false, "fetched_at": "2026-08-26T09:10:00+00:00" }
```

`calendar` row:

```json
{ "type": "calendar", "id": "11562247", "name": "Charming studio in Baixa", "months": 12, "first_day": "2026-08-01", "last_day": "2027-07-31",
  "nights_30": 30, "available_30": 6, "occupancy_30": 0.8, "nights_90": 90, "available_90": 47, "occupancy_90": 0.478, "nights_365": 340, "available_365": 137, "occupancy_365": 0.597,
  "next_available": "2026-08-29", "min_nights_typical": 3, "days": [{ "date": "2026-08-29", "available": true, "available_for_checkin": true, "available_for_checkout": true, "min_nights": 3, "max_nights": 1125, "bookable": null, "price": null }], "fetched_at": "…" }
```

`review` row: `{ "type": "review", "id": "11562247", "review_id": "1740402488245156304", "rating": 5, "text": "…", "created_at": "2026-07-29T07:09:04Z", "reviewer_name": "Sarah Sofia", "reviewer_location": "…", "host_reply": null, "language": "en", "reviews_total": 441 }`

`status` row (per place, URL or `listing_id`): `{ "type": "status", "query": "Lisbon, Portugal", "listing_id": null, "status": "ok", "resolved_place": "Lisbon, Portugal", "canonical_url": "/s/Lisbon--Portugal/homes", "pages": 2, "listings": 80, "priced": 80, "duplicates": 0, "calendars": 80, "calendar_months": 480, "reviews": 0, "error": null }`

The Console's **Listings**, **Calendar**, **Reviews** and **Run status** tabs show the same rows as tables; every run's dataset downloads as JSON, CSV or Excel — an Airbnb dataset CSV for exactly the market, dates and listings you chose, instead of a stale Kaggle file.

### How much does it cost?

Pay per row: a `listing` row that carries a price, each `calendar_month` (a 12-month calendar row = 12 events), each `review` row. Listings that could not be priced, unknown places, empty searches and `status` rows are free, and a listing and stay is billed once per run even if two searches return it. Worked examples: 80 Lisbon listings with prices for a weekend = 80 listing events; the same 80 with a 6-month calendar = 80 + 480 calendar-month events; your 10 listings with details, 12-month calendars and 20 reviews each = 10 + 120 + 200 events. Platform compute for those runs is a fraction of a cent. Exact per-event prices are on this page's pricing tab.

### Airbnb scraper in Python, JavaScript, curl, n8n, Make or an AI agent

"Airbnb API python" in practice means calling this actor: one POST with a place or listing ids and a stay, a dataset of typed rows back. The same call from JavaScript, curl or an HTTP node is an Airbnb calendar API when `calendarMonths` is set. The examples are complete; the row schemas are documented above and in the Output tab, so an agent or a script can filter on `price_nightly_effective`, `occupancy_90` or `available` without parsing HTML.

```python
from apify_client import ApifyClient
client = ApifyClient("<TOKEN>")
run = client.actor("kestrel/airbnb-prices-calendar").call(run_input={"locationQueries": ["Lisbon, Portugal"], "checkIn": "30 days", "checkOut": "33 days", "adults": 2, "currency": "EUR", "maxListingsPerQuery": 80, "calendarMonths": 3})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
listings = [r for r in rows if r["type"] == "listing"]; cal = {r["id"]: r for r in rows if r["type"] == "calendar"}
for l in sorted(listings, key=lambda r: r["price_nightly_effective"] or 0)[:10]: print(l["name"], l["price_nightly_effective"], "occupancy 90d", cal.get(l["id"], {}).get("occupancy_90"))
```

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<TOKEN>' });
const run = await client.actor('kestrel/airbnb-prices-calendar').call({ listingIds: ['11562247'], checkIn: '30 days', checkOut: '33 days', includeDetails: true, calendarMonths: 12 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter(r => r.type === 'calendar').map(r => [r.id, r.occupancy_90, r.next_available]));
```

```bash
curl -X POST "https://api.apify.com/v2/acts/kestrel~airbnb-prices-calendar/run-sync-get-dataset-items?token=<TOKEN>" -H "Content-Type: application/json" \
  -d '{"locationQueries": ["Lisbon, Portugal"], "checkIn": "2026-10-03", "checkOut": "2026-10-06", "maxListingsPerQuery": 20}'
```

- **n8n, Make, Zapier**: run on a schedule, read the dataset, alert on price drops or occupancy changes.
- **AI agents and MCP**: available through the Apify MCP server and Apify AI; rows are flat and typed so "cheapest entire homes in Lisbon for these dates with a rating over 4.8" is a filter.
- **Google Sheets, BigQuery**: export the dataset from the run or through Apify integrations.

### Is it legal to scrape Airbnb prices?

The rows are public listing data as any logged-out visitor sees it: prices, availability, ratings, amenities, and reviews as published. No login, no personal data beyond what is shown publicly (reviewer first names, host first name); it does not scrape Airbnb host emails or phone numbers. Terms of service and local law vary — check that your use complies, and use the data for your own analysis.

### Limits and honest notes

- A search returns the site's ranking up to its cap (about 280 listings); cover a city with neighbourhood queries, price bands (`priceMin`/`priceMax`) or map bounds in a pasted URL.
- `occupancy_*` counts nights that are not available; blocked nights and booked nights look the same in the calendar.
- Prices are what a logged-out visitor sees in `currency` for the stay and guests given; some markets show all-in prices, others add fees at checkout — the breakdown says which.
- The query hashes change occasionally; the actor refreshes them automatically from the site's bundles, a daily canary run watches it, and failures appear as `status` rows rather than silent zeros.

### FAQ

#### Does it need an Airbnb API key, login or cookies?

No. It uses the public key every visitor's browser uses and no session; there is no API key for guests to request.

#### Is there a free Airbnb scraper here?

Apify's free plan covers small runs, and the actor never charges for unknown places, unpriced listings or empty searches. The Python and JavaScript examples above are complete.

#### Why does a place come back as `unknown_area`?

An unrecognised place is answered with listings from all over the world; the actor detects that (empty canonical URL, listings thousands of km apart), returns a status row and charges nothing. Use the spelling the site suggests, e.g. `"Lisbon, Portugal"`.

#### Can I get more than 280 listings for a city?

Yes — run several searches: neighbourhoods, price bands, room types, or pasted search URLs with map bounds. Each listing is billed once per run.

#### Is occupancy the same as bookings?

No. It is the share of nights not available; hosts also block nights. Over a market it tracks demand well; for one listing treat it as an upper bound.

#### Can I track Airbnb prices and availability over time?

Yes. Schedule the actor with relative dates; every run appends dated rows (`fetched_at`), and the calendar summary gives occupancy per run.

#### Can I scrape Airbnb host emails or phone numbers?

No, by design: the rows carry the host's public first name, Superhost and verification flags and stats, nothing off-platform.

#### Can I download an Airbnb dataset as CSV?

Every run's dataset downloads as JSON, CSV or Excel from the run page or the API — an Airbnb dataset for the market, dates and listings you chose, with calendar days as nested arrays (CSV flattens them per day).

#### Can I get Airbnb listing data without dates?

Yes: leave `checkIn`/`checkOut` empty and each listing row carries the default displayed price and `price_nights`; add `includeDetails` for description, amenities and host.

#### Which languages and currencies?

Any site locale for text (`locale`) and any ISO currency for prices (`currency`); both are echoed in every row.

Last verified working: 2026-08-29.

### Related scrapers

Prices and availability are one half of a listing's story; reviews are the other. These share the same row shape and billing model:

- **[Airbnb Occupancy Rate Scraper](https://apify.com/kestrel/airbnb-occupancy-scraper)** — one row per listing and month from the same calendar: days free vs blocked or booked, occupancy %, minimum stay and a sampled nightly rate, billed per month instead of per calendar.
- **[Google Hotels Prices Scraper](https://apify.com/kestrel/google-hotels-prices)** — hotel prices and every booking site’s rate for a stay.
- **[Google Flights Scraper](https://apify.com/kestrel/google-flights-prices)** — airfare for a route and date, with a cheapest-day sweep.
- **[Airbnb Reviews Scraper](https://apify.com/kestrel/airbnb-reviews-scraper)** — every guest review of an Airbnb listing, with translations.
- **[Agoda Reviews Scraper](https://apify.com/kestrel/agoda-reviews-scraper)** — Agoda hotel reviews with separate positives and negatives.

All of them bill per delivered row, never charge for rows a filter or a spending limit removed, and write an Apify dataset you can export to CSV, Excel or JSON.

# Actor input Schema

## `locationQueries` (type: `array`):

Places to search exactly as you would type them on Airbnb: "Lisbon, Portugal", "Algarve", "Brooklyn, NY". An unrecognised place produces a status row (unknown\_area) and costs nothing instead of random listings.

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

Airbnb search URLs (all their filters are honoured: dates, guests, price, room type, bedrooms, map bounds) or listing URLs (https://www.airbnb.com/rooms/12345678).

## `listingIds` (type: `array`):

Numeric Airbnb listing ids to price and/or fetch calendars, details and reviews for — no search needed.

## `maxListingsPerQuery` (type: `integer`):

Distinct listings to collect per place or search URL (Airbnb returns at most about 280 for one search; split big areas into neighbourhoods or price bands for more).

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

Check-in date, YYYY-MM-DD or relative to the run date ("30 days", "6 weeks") — relative dates keep a schedule valid forever. Leave empty for each listing’s default displayed price.

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

Check-out date (after check-in), absolute or relative.

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

Adults; prices depend on guests exactly as on Airbnb.

## `children` (type: `integer`):

Children (2–12).

## `infants` (type: `integer`):

Infants (under 2).

## `pets` (type: `integer`):

Pets.

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

Currency for every price (USD, EUR, GBP, …). Echoed in every row.

## `locale` (type: `string`):

Airbnb locale for names, descriptions and reviews (en, fr, de, es, pt, it, ja, …).

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

Minimum nightly price in the currency above; 0 = no minimum.

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

Maximum nightly price in the currency above; 0 = no maximum.

## `roomTypes` (type: `array`):

Restrict to entire homes, private rooms, shared rooms and/or hotel rooms.

## `minBedrooms` (type: `integer`):

Minimum bedrooms.

## `minBeds` (type: `integer`):

Minimum beds.

## `minBathrooms` (type: `integer`):

Minimum bathrooms.

## `includeDetails` (type: `boolean`):

Fetch each listing’s page: description, amenities, house rules, cancellation policy, category ratings, host, capacity, sleeping arrangement, exact price breakdown for the dates (one extra call per listing; same listing price).

## `calendarMonths` (type: `integer`):

0 = no calendar. N = a calendar row per listing with day-by-day availability for the next N months (up to 24) and an occupancy summary. Priced per listing-month.

## `maxReviewsPerListing` (type: `integer`):

0 = none. N = up to N reviews per listing with rating, text, date, reviewer and host reply.

## `reviewsSort` (type: `string`):

Which reviews to take first.

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

Airbnb accepts Apify datacenter proxies for these calls; keep the default.

## `sessions` (type: `integer`):

Concurrent egress IPs; each paced at perIp requests per second.

## `perIp` (type: `number`):

Pace per session. Airbnb tolerated 1 request/second and short bursts in tests.

## Actor input object example

```json
{
  "locationQueries": [
    "Lisbon, Portugal"
  ],
  "startUrls": [],
  "listingIds": [],
  "maxListingsPerQuery": 40,
  "checkIn": "30 days",
  "checkOut": "33 days",
  "adults": 2,
  "children": 0,
  "infants": 0,
  "pets": 0,
  "currency": "USD",
  "locale": "en",
  "priceMin": 0,
  "priceMax": 0,
  "roomTypes": [],
  "minBedrooms": 0,
  "minBeds": 0,
  "minBathrooms": 0,
  "includeDetails": false,
  "calendarMonths": 0,
  "maxReviewsPerListing": 0,
  "reviewsSort": "most_recent",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "sessions": 4,
  "perIp": 1
}
```

# Actor output Schema

## `dataset` (type: `string`):

Listing rows with prices, day-by-day calendar rows, review rows and status rows. Charged rows are billed as delivered; status rows are always free.

## `summary` (type: `string`):

One JSON record with the counts this run delivered and charged, its error and duplicate tallies, and its HTTP stats.

# 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 = {
    "locationQueries": [
        "Lisbon, Portugal"
    ],
    "checkIn": "30 days",
    "checkOut": "33 days",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kestrel/airbnb-prices-calendar").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 = {
    "locationQueries": ["Lisbon, Portugal"],
    "checkIn": "30 days",
    "checkOut": "33 days",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kestrel/airbnb-prices-calendar").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 '{
  "locationQueries": [
    "Lisbon, Portugal"
  ],
  "checkIn": "30 days",
  "checkOut": "33 days",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kestrel/airbnb-prices-calendar --silent --output-dataset

```

## MCP server setup

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

```

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/3TFHH1D94DhrxnZbb/builds/iSqZlzCfja5Xtzj0O/openapi.json
