# CoinMarketCap Crypto Scraper (`crawlerbros/coinmarketcap-scraper`) Actor

Scrape CoinMarketCap for cryptocurrency prices, market cap, supply, ATH/ATL, audits, and social links.

- **URL**: https://apify.com/crawlerbros/coinmarketcap-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Developer tools, Automation, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 5 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

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

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

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

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

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

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

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

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

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


# README

## CoinMarketCap Crypto Scraper

Pull complete, up-to-date metrics for any cryptocurrency on [CoinMarketCap](https://coinmarketcap.com) — price, market cap, supply, ATH / ATL, audits, socials, official links, and tags — either for a specific list of coins or for the top N by market cap.

### What this actor does

CoinMarketCap is the de facto reference for cryptocurrency market data, covering thousands of coins across every major chain. This actor reads the data that's rendered on each coin's public page and returns a clean, structured record per coin — identity, prices in USD / BTC / ETH, 24h / 7d / 30d / 90d / 1y price changes, circulating / total / max supply, all-time high and low with timestamps, the full links block (websites, explorers, source code, socials), tags, and security-audit history.

You can either supply a specific list of coin slugs (or common tickers like `BTC`, `ETH`, `SOL`, which are accepted as a convenience) or leave the list empty and ask for the top N coins by market cap. The actor will work through each coin, emit one record per coin to the dataset, and never crash the whole run if a single coin fails — it emits a per-coin error record instead.

No API key, no paid plan, no login. Free-tier CoinMarketCap API quotas are irrelevant: the actor reads only publicly rendered pages.

### Key features

- Two input modes — a specific list of coins (`coinSlugs`) or the top N by market cap (`topN`)
- Accepts coin slugs, common tickers (`BTC`, `ETH`, `SOL`), or full coin URLs interchangeably
- Complete metrics: price, market cap, dominance, 24h / 7d / 30d / 90d / 1y changes, volume, supply, ATH / ATL with dates
- Official link block: websites, block explorers, source code, full social map (Twitter, Reddit, Telegram, Discord, Facebook, Instagram, etc.)
- Optional security-audit history per coin
- Tags / categorization (e.g. `mineable`, `pow`, `defi`, `layer-1`)
- Per-coin error records — a bad slug never kills the whole run
- Transparent residential-proxy fallback — direct requests first, proxy only when blocked
- No API key, no login, no cookies
- Zero-null output — empty fields are omitted from each record

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `coinSlugs` | string[] | `["bitcoin","ethereum","solana"]` | List of coins to scrape. Accepts CoinMarketCap slugs (e.g. `bitcoin`), common tickers (`BTC`), or full URLs. |
| `topN` | integer | `20` | When `coinSlugs` is empty, scrape the top N coins by market cap (max 500). |
| `includeAuditInfo` | boolean | `true` | Include the per-coin security-audit list. |
| `autoProxyFallback` | boolean | `true` | Automatically retry through Apify residential proxy when a page looks blocked. |

**Example input — specific coins**

```json
{
  "coinSlugs": ["bitcoin", "ethereum", "solana"],
  "includeAuditInfo": true,
  "autoProxyFallback": true
}
````

**Example input — top 50 by market cap**

```json
{
  "topN": 50
}
```

### Output

One record per coin. Fields without data are omitted.

```json
{
  "id": 1,
  "name": "Bitcoin",
  "symbol": "BTC",
  "slug": "bitcoin",
  "cmcRank": 1,
  "priceUsd": 67890.12,
  "priceBtc": 1.0,
  "priceEth": 20.5,
  "marketCapUsd": 1340000000000,
  "marketCapDominance": 52.5,
  "volumeUsd24h": 32000000000,
  "percentChange1h": 0.15,
  "percentChange24h": -1.23,
  "percentChange7d": 4.56,
  "percentChange30d": 8.9,
  "percentChange90d": 14.2,
  "percentChange1y": 112.4,
  "circulatingSupply": 19700000,
  "totalSupply": 19700000,
  "maxSupply": 21000000,
  "allTimeHighUsd": 73750.07,
  "allTimeHighDate": "2024-03-14T07:10:00+00:00",
  "allTimeLowUsd": 0.0486,
  "allTimeLowDate": "2013-07-05T00:00:00+00:00",
  "dateAdded": "2013-04-28T00:00:00+00:00",
  "lastUpdated": "2026-04-24T11:59:30+00:00",
  "websites": ["https://bitcoin.org/"],
  "explorers": ["https://blockchain.info/", "https://mempool.space/"],
  "sourceCode": ["https://github.com/bitcoin/bitcoin"],
  "socialLinks": {
    "twitter": "https://twitter.com/bitcoin",
    "reddit": "https://reddit.com/r/bitcoin"
  },
  "audits": [
    {"name": "Example Audit Firm", "status": "Passed", "completionDate": "2024-01-10", "reportUrl": "https://..."}
  ],
  "tags": ["mineable", "pow", "sha-256", "store-of-value"],
  "scrapedAt": "2026-04-24T12:00:00+00:00"
}
```

**Field descriptions**

- **Identity** — **`id`**, **`name`**, **`symbol`**, **`slug`**, **`cmcRank`**
- **Price** — **`priceUsd`**, **`priceBtc`**, **`priceEth`**
- **Market** — **`marketCapUsd`**, **`marketCapDominance`**, **`volumeUsd24h`**
- **Changes** — **`percentChange1h`**, **`percentChange24h`**, **`percentChange7d`**, **`percentChange30d`**, **`percentChange90d`**, **`percentChange1y`**
- **Supply** — **`circulatingSupply`**, **`totalSupply`**, **`maxSupply`**
- **History** — **`allTimeHighUsd`** + **`allTimeHighDate`**, **`allTimeLowUsd`** + **`allTimeLowDate`**, **`dateAdded`**, **`lastUpdated`**
- **Links** — **`websites`**, **`explorers`**, **`sourceCode`**, **`socialLinks`** (flat map by platform)
- **Security** — **`audits`** (list of `{name, status, completionDate, reportUrl}`)
- **Categorization** — **`tags`**
- **`scrapedAt`** — ISO-8601 timestamp of this run

**Error record** — emitted per-coin when scraping fails; the run continues:

```json
{
  "type": "coinmarketcap_scraper_error",
  "slug": "nonexistent-coin",
  "reason": "fetch_failed",
  "message": "Could not fetch coin page for slug 'nonexistent-coin'.",
  "scrapedAt": "2026-04-24T12:00:00+00:00"
}
```

### Use cases

- **Portfolio dashboards** — nightly refresh of prices, market caps, and 24h changes for a watchlist
- **Research and due diligence** — pull audits, socials, source-code links, and tags for a shortlist of tokens
- **Market-structure analysis** — scrape the top N coins to study dominance, supply schedules, and volume distribution
- **Competitive mapping** — filter the top 500 by `tags` (e.g. all `defi` or all `layer-2`) and compare key metrics
- **Trading backtests** — seed a historical dataset with ATH / ATL timestamps and current supply for fundamentals-driven strategies

### FAQ

**Do I need a CoinMarketCap API key?**
No. The actor uses only the publicly rendered data on CoinMarketCap's coin pages — no API plan needed.

**Does it work for every coin listed on CoinMarketCap?**
Yes, provided CoinMarketCap exposes a `/currencies/<slug>/` page for it. You can find a coin's slug in the URL of its page on CoinMarketCap.

**What do I put in `coinSlugs`?**
The slug segment from the coin's CoinMarketCap URL (e.g. `bitcoin`, `ethereum`, `solana`). Common tickers (`BTC`, `ETH`, `SOL`) and full CoinMarketCap URLs are also accepted as a convenience.

**How do I scrape the top coins without listing them?**
Leave `coinSlugs` empty and set `topN` — the actor will read the top N coins by market cap from the CoinMarketCap ranking and scrape each in turn.

**How fresh is the data?**
As fresh as what's on CoinMarketCap — typically updated every few minutes.

**Why are some fields missing on some coins?**
CoinMarketCap doesn't publish a fixed supply, audit report, or every social link for every project. The scraper omits fields that have no data so every key in the record is real.

**What happens when one coin fails?**
The actor emits a per-coin error record and keeps going with the rest of the list — you'll never lose an entire run because one slug is wrong.

**How does the proxy fallback work?**
If CoinMarketCap returns a challenge page or an empty response to the direct request, the actor transparently retries through Apify residential proxy. Set `autoProxyFallback: false` to skip the retry.

### Known limitations

- **No historical OHLCV.** This actor returns current snapshot values plus rolling percent changes. For minute-by-minute historical candles you want a dedicated market-data feed.
- **Audit data is sparse.** CoinMarketCap only lists audits that projects have submitted; most small-cap tokens have no audit block.
- **Social-link coverage varies.** Many projects only advertise Twitter and Telegram; Discord / Reddit / Facebook links appear when the project registers them.
- **Rate spikes on CoinMarketCap.** During extreme market events CoinMarketCap occasionally serves a challenge page; the residential-proxy fallback handles most of those, but very long runs may still see a handful of per-coin error records.
- **Top-N is capped at 500.** For broader coverage split the work into multiple runs by explicit slug list.

# Actor input Schema

## `coinSlugs` (type: `array`):

One CoinMarketCap coin slug per entry (e.g. 'bitcoin', 'ethereum', 'solana'). The slug is the URL segment at coinmarketcap.com/currencies/<slug>/. Tickers like 'BTC' are also accepted and mapped to 'bitcoin'. Leave empty to scrape the top-N coins by market cap instead.

## `topN` (type: `integer`):

How many coins to scrape from the CoinMarketCap homepage ranking when no coinSlugs are provided. Ignored when coinSlugs is non-empty.

## `includeAuditInfo` (type: `boolean`):

When enabled, include the per-coin security/audit reports array (auditor, status, completion date, report URL) for coins that have audit data.

## `autoProxyFallback` (type: `boolean`):

When the initial datacenter-IP fetch returns an empty / Cloudflare-challenge page, automatically retry via Apify residential proxy. Only blocked pages burn proxy credits. Leave on for best reliability; turn off to guarantee zero proxy spend.

## Actor input object example

```json
{
  "coinSlugs": [
    "bitcoin",
    "ethereum",
    "solana"
  ],
  "topN": 20,
  "includeAuditInfo": true,
  "autoProxyFallback": true
}
```

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "coinSlugs": [
        "bitcoin",
        "ethereum",
        "solana"
    ],
    "topN": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/coinmarketcap-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 = {
    "coinSlugs": [
        "bitcoin",
        "ethereum",
        "solana",
    ],
    "topN": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/coinmarketcap-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 '{
  "coinSlugs": [
    "bitcoin",
    "ethereum",
    "solana"
  ],
  "topN": 20
}' |
apify call crawlerbros/coinmarketcap-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CoinMarketCap Crypto Scraper",
        "description": "Scrape CoinMarketCap for cryptocurrency prices, market cap, supply, ATH/ATL, audits, and social links.",
        "version": "1.0",
        "x-build-id": "XUQTrAXmnzscKTFyr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~coinmarketcap-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-coinmarketcap-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/crawlerbros~coinmarketcap-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-coinmarketcap-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/crawlerbros~coinmarketcap-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-coinmarketcap-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": {
                    "coinSlugs": {
                        "title": "Coin slugs",
                        "type": "array",
                        "description": "One CoinMarketCap coin slug per entry (e.g. 'bitcoin', 'ethereum', 'solana'). The slug is the URL segment at coinmarketcap.com/currencies/<slug>/. Tickers like 'BTC' are also accepted and mapped to 'bitcoin'. Leave empty to scrape the top-N coins by market cap instead.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "topN": {
                        "title": "Top-N coins (when coinSlugs is empty)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "How many coins to scrape from the CoinMarketCap homepage ranking when no coinSlugs are provided. Ignored when coinSlugs is non-empty.",
                        "default": 20
                    },
                    "includeAuditInfo": {
                        "title": "Include audit info",
                        "type": "boolean",
                        "description": "When enabled, include the per-coin security/audit reports array (auditor, status, completion date, report URL) for coins that have audit data.",
                        "default": true
                    },
                    "autoProxyFallback": {
                        "title": "Auto-retry via proxy when blocked",
                        "type": "boolean",
                        "description": "When the initial datacenter-IP fetch returns an empty / Cloudflare-challenge page, automatically retry via Apify residential proxy. Only blocked pages burn proxy credits. Leave on for best reliability; turn off to guarantee zero proxy spend.",
                        "default": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
