# Binance Crypto Price Scraper - OHLCV, Tickers, Order Book (`mangudai/binance-crypto-price-scraper`) Actor

Scrape Binance spot and futures market data with no API key. Live 24h tickers for any pair, full historical OHLCV candles from 1m to 1M with deep pagination, and order book depth snapshots. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/mangudai/binance-crypto-price-scraper.md
- **Developed by:** [Mangudäi](https://apify.com/mangudai) (community)
- **Categories:** Developer tools, E-commerce, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.95 / 1,000 results

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

## Binance crypto price scraper: OHLCV candles, live tickers, order book

Pull crypto market data straight from Binance's public REST API. Live 24 hour ticker stats for any pair, full historical OHLCV candle history going back years, and order book depth snapshots. No API key, no account, no captcha.

Binance is the largest crypto exchange by volume, so its order book is where price discovery actually happens. This actor turns that public feed into a clean dataset you can drop into a spreadsheet, a backtest, or a dashboard.

### What you get

Three modes, one actor.

**Live 24h tickers.** One row per trading pair: last price, 24 hour change and percent change, open, high, low, weighted average price, best bid and ask with sizes, spread, base and quote volume, trade count, and the day's range as a percentage. Run it against five pairs or against all 460 USDT pairs at once.

**Historical OHLCV candles.** One row per candle: open time, open, high, low, close, volume, quote volume, trade count, taker buy volumes, and the candle's own change and change percent. Fifteen intervals from one minute to one month. Give it a start and end date and it pages through Binance 1,000 candles at a time until the window is filled, so multi-year minute history works.

**Order book snapshot.** One row per pair: best bid and ask with sizes, spread and spread percent, mid price, cumulative bid and ask depth in both base and quote terms, plus the full ladder of levels as arrays. Up to 5,000 levels a side.

Spot and USD-M perpetual futures are both supported. Switch with one field.

### Example input

Live tickers for the top pairs:

```json
{
  "mode": "tickers",
  "market": "spot",
  "symbols": ["BTCUSDT", "ETHUSDT", "SOLUSDT"]
}
````

Two years of daily bitcoin candles:

```json
{
  "mode": "klines",
  "symbols": ["BTCUSDT"],
  "interval": "1d",
  "startDate": "2024-01-01",
  "endDate": "2025-12-31",
  "maxCandlesPerSymbol": 0
}
```

Every liquid USDT pair, ranked by volume:

```json
{
  "mode": "tickers",
  "allSymbols": true,
  "quoteAsset": "USDT",
  "minQuoteVolume": 1000000
}
```

### Example output

A ticker row:

```json
{
  "symbol": "BTCUSDT",
  "market": "spot",
  "baseAsset": "BTC",
  "quoteAsset": "USDT",
  "lastPrice": 64203.89,
  "priceChange": -517.6,
  "priceChangePercent": -0.8,
  "openPrice": 64721.49,
  "highPrice": 65107.99,
  "lowPrice": 64082.49,
  "bidPrice": 64203.89,
  "askPrice": 64203.9,
  "spread": 0.01,
  "volume": 9513.44218,
  "quoteVolume": 614446041.19,
  "tradeCount": 2089469,
  "dayRangePercent": 1.6003,
  "closeTime": "2026-07-20T06:16:13Z"
}
```

A candle row:

```json
{
  "symbol": "BTCUSDT",
  "interval": "1h",
  "openTime": "2026-07-15T00:00:00Z",
  "open": 65043.99,
  "high": 65065.01,
  "low": 64765.12,
  "close": 64824.58,
  "volume": 352.45343,
  "quoteVolume": 22876740.13,
  "tradeCount": 89993,
  "takerBuyBaseVolume": 145.01703,
  "changePercent": -0.337326
}
```

### Input fields

| Field | What it does |
|---|---|
| mode | tickers, klines, or orderBook |
| market | spot or futures |
| symbols | Pairs to scrape. BTCUSDT, BTC/USDT and BTC-USDT all work |
| allSymbols | Scrape every trading pair instead of the list |
| quoteAsset | Keep only pairs quoted in this asset when allSymbols is on |
| minQuoteVolume | Drop pairs below this 24h quote volume |
| maxSymbols | Stop after this many symbols |
| interval | Candle size, 1m through 1M |
| startDate, endDate | Candle window, ISO dates or epoch milliseconds |
| maxCandlesPerSymbol | Per-symbol candle cap, 0 for the full range |
| orderBookDepth | Levels per side, 5 to 5000 |
| maxItems | Hard cap on rows for the run |
| proxyConfiguration | Apify Proxy settings |

### Notes

Binance publishes this data openly and allows roughly 6,000 request weight per minute per IP. The actor retries with exponential backoff on 429 and 418 responses and routes through Apify Proxy so large runs spread across IPs.

Candle history depth varies by pair. Bitcoin goes back to 2017, a pair listed last month only goes back to its listing date. Ask for more and you get what exists.

Futures mode covers perpetual contracts only. Quarterly and delivery contracts are filtered out.

This is market data, not advice. Nothing here is a recommendation to trade.

# Actor input Schema

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

tickers gives one row per symbol with live 24h stats. klines gives one row per OHLCV candle over a date range. orderBook gives one bid and ask depth snapshot per symbol.

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

Binance spot market, or USD-M perpetual futures.

## `symbols` (type: `array`):

Trading pairs to scrape. BTCUSDT, BTC/USDT and BTC-USDT are all accepted. Ignored when Scrape all symbols is on.

## `allSymbols` (type: `boolean`):

Scrape every pair currently trading on Binance instead of the list above. Roughly 460 pairs quote in USDT.

## `quoteAsset` (type: `string`):

When Scrape all symbols is on, keep only pairs quoted in this asset. Leave empty to keep every pair.

## `minQuoteVolume` (type: `integer`):

Drop pairs whose 24h volume in the quote asset is below this. Useful for filtering out dead pairs. 0 disables the filter.

## `maxSymbols` (type: `integer`):

Stop after this many symbols. 0 means no limit.

## `interval` (type: `string`):

Candle size used in klines mode.

## `startDate` (type: `string`):

First candle to fetch in klines mode, for example 2024-01-01. Leave empty to look back far enough to fill the per-symbol candle cap.

## `endDate` (type: `string`):

Last candle to fetch in klines mode, for example 2024-12-31. Leave empty to run up to now.

## `maxCandlesPerSymbol` (type: `integer`):

Cap on candles returned for each symbol in klines mode. 0 means the full date range.

## `orderBookDepth` (type: `integer`):

How many bid and ask levels to capture per symbol in orderBook mode. Binance allows up to 5000.

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

Hard cap on dataset rows for the whole run. 0 means no limit.

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

Apify Proxy spreads requests across IPs, which keeps Binance rate limits comfortable on large runs.

## Actor input object example

```json
{
  "mode": "tickers",
  "market": "spot",
  "symbols": [
    "BTCUSDT",
    "ETHUSDT",
    "SOLUSDT",
    "BNBUSDT",
    "XRPUSDT"
  ],
  "allSymbols": false,
  "quoteAsset": "USDT",
  "minQuoteVolume": 0,
  "maxSymbols": 0,
  "interval": "1d",
  "maxCandlesPerSymbol": 1000,
  "orderBookDepth": 100,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per symbol, candle, or order book snapshot depending on the selected mode.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "symbols": [
        "BTCUSDT",
        "ETHUSDT",
        "SOLUSDT",
        "BNBUSDT",
        "XRPUSDT"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mangudai/binance-crypto-price-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 = {
    "symbols": [
        "BTCUSDT",
        "ETHUSDT",
        "SOLUSDT",
        "BNBUSDT",
        "XRPUSDT",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("mangudai/binance-crypto-price-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 '{
  "symbols": [
    "BTCUSDT",
    "ETHUSDT",
    "SOLUSDT",
    "BNBUSDT",
    "XRPUSDT"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call mangudai/binance-crypto-price-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Binance Crypto Price Scraper - OHLCV, Tickers, Order Book",
        "description": "Scrape Binance spot and futures market data with no API key. Live 24h tickers for any pair, full historical OHLCV candles from 1m to 1M with deep pagination, and order book depth snapshots. Export to JSON, CSV or Excel.",
        "version": "0.0",
        "x-build-id": "CdY1x8bz0lcxlHoL8"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mangudai~binance-crypto-price-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mangudai-binance-crypto-price-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/mangudai~binance-crypto-price-scraper/runs": {
            "post": {
                "operationId": "runs-sync-mangudai-binance-crypto-price-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/mangudai~binance-crypto-price-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-mangudai-binance-crypto-price-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": "What to scrape",
                        "enum": [
                            "tickers",
                            "klines",
                            "orderBook"
                        ],
                        "type": "string",
                        "description": "tickers gives one row per symbol with live 24h stats. klines gives one row per OHLCV candle over a date range. orderBook gives one bid and ask depth snapshot per symbol.",
                        "default": "tickers"
                    },
                    "market": {
                        "title": "Market",
                        "enum": [
                            "spot",
                            "futures"
                        ],
                        "type": "string",
                        "description": "Binance spot market, or USD-M perpetual futures.",
                        "default": "spot"
                    },
                    "symbols": {
                        "title": "Symbols",
                        "type": "array",
                        "description": "Trading pairs to scrape. BTCUSDT, BTC/USDT and BTC-USDT are all accepted. Ignored when Scrape all symbols is on.",
                        "default": [
                            "BTCUSDT",
                            "ETHUSDT",
                            "SOLUSDT",
                            "BNBUSDT",
                            "XRPUSDT"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "allSymbols": {
                        "title": "Scrape all symbols",
                        "type": "boolean",
                        "description": "Scrape every pair currently trading on Binance instead of the list above. Roughly 460 pairs quote in USDT.",
                        "default": false
                    },
                    "quoteAsset": {
                        "title": "Quote asset filter",
                        "type": "string",
                        "description": "When Scrape all symbols is on, keep only pairs quoted in this asset. Leave empty to keep every pair.",
                        "default": "USDT"
                    },
                    "minQuoteVolume": {
                        "title": "Minimum 24h quote volume",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop pairs whose 24h volume in the quote asset is below this. Useful for filtering out dead pairs. 0 disables the filter.",
                        "default": 0
                    },
                    "maxSymbols": {
                        "title": "Maximum symbols",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many symbols. 0 means no limit.",
                        "default": 0
                    },
                    "interval": {
                        "title": "Candle interval",
                        "enum": [
                            "1m",
                            "3m",
                            "5m",
                            "15m",
                            "30m",
                            "1h",
                            "2h",
                            "4h",
                            "6h",
                            "8h",
                            "12h",
                            "1d",
                            "3d",
                            "1w",
                            "1M"
                        ],
                        "type": "string",
                        "description": "Candle size used in klines mode.",
                        "default": "1d"
                    },
                    "startDate": {
                        "title": "Start date",
                        "type": "string",
                        "description": "First candle to fetch in klines mode, for example 2024-01-01. Leave empty to look back far enough to fill the per-symbol candle cap."
                    },
                    "endDate": {
                        "title": "End date",
                        "type": "string",
                        "description": "Last candle to fetch in klines mode, for example 2024-12-31. Leave empty to run up to now."
                    },
                    "maxCandlesPerSymbol": {
                        "title": "Maximum candles per symbol",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Cap on candles returned for each symbol in klines mode. 0 means the full date range.",
                        "default": 1000
                    },
                    "orderBookDepth": {
                        "title": "Order book depth",
                        "minimum": 5,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "How many bid and ask levels to capture per symbol in orderBook mode. Binance allows up to 5000.",
                        "default": 100
                    },
                    "maxItems": {
                        "title": "Maximum results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on dataset rows for the whole run. 0 means no limit.",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy spreads requests across IPs, which keeps Binance rate limits comfortable on large runs.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
