# Airbnb Scraper: Listings, Prices & Occupancy Calendar (`dltik/airbnb-scraper`) Actor

Scrape Airbnb listings for any location: GPS, price (ADR), rating, reviews, room type, images. Plus the availability calendar per listing to estimate occupancy (30/60/90 days). No browser. For short-term-rental market research, comps and revenue estimation.

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

## Pricing

from $6.00 / 1,000 listing scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Scraper — Listings, Prices & Occupancy Calendar

> Scrape [Airbnb](https://www.airbnb.com) listings for any location and read each one's availability calendar to estimate occupancy. Get GPS, price (ADR), rating, reviews, room type, images and 30/60/90-day occupancy. No browser.

⭐ **Bookmark this actor** to keep it on top of your Apify dashboard.

### What is the Airbnb Scraper?

The **Airbnb Scraper** turns any Airbnb search into clean JSON or CSV, and goes one step further than a plain listing scraper: it reads each listing's **availability calendar** and turns it into an **occupancy estimate**. Search a city and get every listing with its coordinates, nightly price, rating, review count, room type and photos; enable occupancy and each listing also comes back with the share of the next 30, 60 and 90 days that are already booked. It reads Airbnb's own page data and calendar API directly, so there is no browser to run.

That makes this Airbnb scraper a real source for **short-term-rental market research**, **revenue and occupancy estimation**, comps for real-estate underwriting, and pricing intelligence, none of which Airbnb's site exposes as an API.

### Use cases

- **STR revenue estimation**: Combine nightly ADR with estimated occupancy to model annual revenue for a market or a single listing.
- **Real-estate comps**: Pull every short-term rental around a location (GPS-based) to benchmark what a property could earn on Airbnb.
- **Occupancy tracking**: Re-run daily to watch how a market's availability tightens or loosens over time.
- **Pricing intelligence**: Track ADR by room type, capacity and area to price your own listing competitively.
- **Investor deal-finding**: Feed ADR × occupancy into a scoring model to rank properties by projected yield.

### Input

Search a location (add dates for exact nightly prices), or paste an Airbnb search URL. Set `includeOccupancy` to add the calendar-based occupancy per listing.

```json
{
  "mode": "search",
  "location": "Marrakech, Morocco",
  "adults": 2,
  "priceMax": 200,
  "currency": "EUR",
  "includeOccupancy": true,
  "occupancyMonths": 6,
  "maxResults": 54,
  "proxyConfig": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
````

For specific listings, use `mode: "calendar"` with `listingIds` (numeric IDs or room URLs) to get occupancy only.

### Output

Each listing is one record. With occupancy enabled, an `occupancy` block is attached.

```json
{
  "listing_id": "1719517144651443946",
  "name": "Cinema & Mini-bar | Gueliz",
  "room_summary": "1 bedroom · 1 bed · 1 bath",
  "latitude": 31.6383,
  "longitude": -8.0187,
  "rating": 5.0,
  "reviews_count": 4,
  "price_value": 195,
  "price_qualifier": "total",
  "occupancy": { "occupancy_30d": 0.29, "occupancy_60d": 0.68, "occupancy_90d": 0.52, "days_booked": 40, "min_nights": 3 },
  "url": "https://www.airbnb.com/rooms/1719517144651443946"
}
```

### Pricing

This actor uses **PAY\_PER\_EVENT**: you are charged per listing returned (`listing-scraped`) and per availability calendar scanned (`occupancy-scanned`). No charge for failed runs, so you only pay for the data you keep.

### Automate & schedule

Occupancy is a moving target, so schedule the Airbnb scraper to run **daily** and store each snapshot: comparing availability day over day is what turns raw calendars into a reliable occupancy signal. Wire it to Google Sheets, a database or a webhook via Apify integrations to build your own occupancy and ADR history. Set it once and let the series build.

### FAQ

**Is there an official Airbnb API?** Not a public one for listing or calendar data. Scraping the site is the practical way to get Airbnb listings, prices and availability programmatically, which is what this actor does.

**How is occupancy calculated?** From the listing's availability calendar: the share of upcoming nights (30/60/90 days) that are not available to book. Run it daily and track the deltas for the most accurate signal, a single snapshot is a good first approximation.

**Can it return the exact GPS location?** Yes, search results include each listing's coordinates, which is what you need for radius-based comps.

**How do I get occupancy for one specific listing?** Use `mode: "calendar"` and pass the room URL or numeric listing ID in `listingIds`.

**Do I need a proxy?** Yes for anything beyond a few requests, Airbnb rate-limits datacenter IPs, so residential is the default. You can also pass your own via `customProxyUrl`.

**What are the best alternatives to AirDNA or Mashvisor?** Those are finished analytics products; this actor gives you the raw ADR + occupancy data to build the same models yourself at a fraction of the cost.

***

⭐ **Found this useful? Bookmark it** — Apify ranks actors by bookmarks, and it keeps the actor visible for you.

#### Related actors

- [Avito.ma Scraper (Morocco real estate & classifieds)](https://apify.com/dltik/avito-scraper)
- [Leboncoin Scraper (France classifieds)](https://apify.com/dltik/leboncoin-scraper)

# Actor input Schema

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

search = find listings (comps) for a location with GPS, ADR, rating, reviews. calendar = get the availability calendar + occupancy for specific listing IDs or room URLs.

## `location` (type: `string`):

City, area or 'City, Country' to search, e.g. 'Marrakech, Morocco', 'Agadir', 'Casablanca, Morocco'.

## `checkin` (type: `string`):

Optional YYYY-MM-DD. Setting a date range makes the price a real nightly/total quote for those dates.

## `checkout` (type: `string`):

Optional YYYY-MM-DD.

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

Number of guests to filter capacity.

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

Minimum nightly price in the chosen currency.

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

Maximum nightly price in the chosen currency.

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

Optional filter: 'Entire home/apt', 'Private room', 'Shared room', 'Hotel room'.

## `includeOccupancy` (type: `boolean`):

For each listing found, also fetch its availability calendar and compute occupancy (30/60/90 days). Adds one calendar scan per listing.

## `occupancyMonths` (type: `integer`):

How many months of availability to scan for occupancy (1-12).

## `rawCalendar` (type: `boolean`):

Also return the raw per-night availability array (occupancy\_days: date + available). Needed to compute true occupancy from day-over-day booking deltas.

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

Airbnb listing IDs (e.g. 1719517144651443946) or room URLs (https://www.airbnb.com/rooms/...) to get occupancy for.

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

ISO currency for prices, e.g. EUR, USD, MAD.

## `maxResults` (type: `integer`):

Maximum listings to return in search mode (~18 per page).

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

Paste airbnb.com/s/... search URLs (search mode) or airbnb.com/rooms/... URLs (calendar mode). Overrides the fields above.

## `inputs` (type: `array`):

Optional list of listing IDs or room URLs for calendar mode.

## `customProxyUrl` (type: `string`):

Optional. Your own proxy (http://user:pass@host:port). Overrides Apify proxy. A residential IP is the most reliable against Airbnb rate limits.

## `proxyConfig` (type: `object`):

Apify proxy settings. Defaults to Residential — Airbnb rate-limits datacenter IPs.

## Actor input object example

```json
{
  "mode": "search",
  "includeOccupancy": false,
  "occupancyMonths": 6,
  "rawCalendar": false,
  "currency": "EUR",
  "maxResults": 54,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/airbnb-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dltik/airbnb-scraper").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 '{}' |
apify call dltik/airbnb-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Airbnb Scraper: Listings, Prices & Occupancy Calendar",
        "description": "Scrape Airbnb listings for any location: GPS, price (ADR), rating, reviews, room type, images. Plus the availability calendar per listing to estimate occupancy (30/60/90 days). No browser. For short-term-rental market research, comps and revenue estimation.",
        "version": "1.0",
        "x-build-id": "EbhQQr2EQwBI9VM9v"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dltik~airbnb-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dltik-airbnb-scraper",
                "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/dltik~airbnb-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dltik-airbnb-scraper",
                "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/dltik~airbnb-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dltik-airbnb-scraper",
                "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": [
                            "search",
                            "calendar"
                        ],
                        "type": "string",
                        "description": "search = find listings (comps) for a location with GPS, ADR, rating, reviews. calendar = get the availability calendar + occupancy for specific listing IDs or room URLs.",
                        "default": "search"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, area or 'City, Country' to search, e.g. 'Marrakech, Morocco', 'Agadir', 'Casablanca, Morocco'."
                    },
                    "checkin": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Optional YYYY-MM-DD. Setting a date range makes the price a real nightly/total quote for those dates."
                    },
                    "checkout": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Optional YYYY-MM-DD."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of guests to filter capacity."
                    },
                    "priceMin": {
                        "title": "Min price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum nightly price in the chosen currency."
                    },
                    "priceMax": {
                        "title": "Max price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum nightly price in the chosen currency."
                    },
                    "roomType": {
                        "title": "Room type",
                        "type": "string",
                        "description": "Optional filter: 'Entire home/apt', 'Private room', 'Shared room', 'Hotel room'."
                    },
                    "includeOccupancy": {
                        "title": "Include occupancy (search mode)",
                        "type": "boolean",
                        "description": "For each listing found, also fetch its availability calendar and compute occupancy (30/60/90 days). Adds one calendar scan per listing.",
                        "default": false
                    },
                    "occupancyMonths": {
                        "title": "Calendar months",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "How many months of availability to scan for occupancy (1-12).",
                        "default": 6
                    },
                    "rawCalendar": {
                        "title": "Include raw calendar days",
                        "type": "boolean",
                        "description": "Also return the raw per-night availability array (occupancy_days: date + available). Needed to compute true occupancy from day-over-day booking deltas.",
                        "default": false
                    },
                    "listingIds": {
                        "title": "Listing IDs / room URLs (calendar mode)",
                        "type": "array",
                        "description": "Airbnb listing IDs (e.g. 1719517144651443946) or room URLs (https://www.airbnb.com/rooms/...) to get occupancy for.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "ISO currency for prices, e.g. EUR, USD, MAD.",
                        "default": "EUR"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum listings to return in search mode (~18 per page).",
                        "default": 54
                    },
                    "startUrls": {
                        "title": "Start URLs (advanced)",
                        "type": "array",
                        "description": "Paste airbnb.com/s/... search URLs (search mode) or airbnb.com/rooms/... URLs (calendar mode). Overrides the fields above.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "inputs": {
                        "title": "Listing IDs / URLs (batch)",
                        "type": "array",
                        "description": "Optional list of listing IDs or room URLs for calendar mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "customProxyUrl": {
                        "title": "Custom proxy URL",
                        "type": "string",
                        "description": "Optional. Your own proxy (http://user:pass@host:port). Overrides Apify proxy. A residential IP is the most reliable against Airbnb rate limits."
                    },
                    "proxyConfig": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy settings. Defaults to Residential — Airbnb rate-limits datacenter IPs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
