# Telegram Channel Posts Scraper (`fetch_cat/telegram-channel-posts-scraper`) Actor

Scrape public Telegram channel posts with text, dates, views, links, media references, and clean exports for monitoring workflows.

- **URL**: https://apify.com/fetch\_cat/telegram-channel-posts-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.02 / 1,000 post extracteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Telegram Channel Posts Scraper

Extract public Telegram channel posts into a clean Apify dataset for social listening, content research, compliance monitoring, and community intelligence.

### What does Telegram Channel Posts Scraper do?

Telegram Channel Posts Scraper collects posts from public Telegram channels that are visible in Telegram's public web preview.

It saves each post as a structured row with the channel name, post URL, timestamp, text, engagement counters, links, media URLs, and scrape timestamp.

Use it when you need repeatable exports instead of manual copy-paste from Telegram.

### Who is it for?

- 📣 Social listening teams monitoring public community updates.
- 🧭 Brand and PR teams tracking mentions, launches, and announcements.
- 🛡️ Compliance teams collecting public evidence from channel posts.
- 📈 Crypto, news, and research analysts following high-volume Telegram channels.
- 🧑‍💻 Automation builders who need Telegram channel post data in a dataset, API, webhook, or spreadsheet.

### Why use this actor?

Public Telegram channels are often used for announcements, market commentary, project updates, and community broadcasts.

This actor turns those public posts into structured data that can be filtered, exported, enriched, and combined with other sources.

### What data can you extract?

| Field | Description |
| --- | --- |
| `channelUsername` | Public Telegram channel username |
| `channelTitle` | Channel title shown on the post |
| `postId` | Numeric post ID |
| `postUrl` | Direct Telegram post URL |
| `postedAt` | Post timestamp when available |
| `text` | Public post text |
| `views` | Visible view count |
| `forwards` | Visible forward count when shown |
| `replies` | Visible reply count when shown |
| `reactions` | Visible reaction counters when shown |
| `links` | Links found in the post text |
| `mediaUrls` | Public media URLs or post media links when visible |
| `scrapedAt` | Time when the actor saved the row |

### How much does it cost to scrape Telegram channel posts?

The actor uses pay-per-event pricing.

- A small start event is charged once per run.
- A post event is charged for every public post saved to the dataset.

Formula-derived pricing from cloud validation: start event $0.005 per run; post event BRONZE $0.000034535 per post, with standard Apify tier discounts for higher plans.

### Quick start

1. Open the actor on Apify.
2. Add one or more public Telegram channels.
3. Set the maximum number of posts.
4. Optionally set a date filter.
5. Run the actor.
6. Export the dataset as JSON, CSV, Excel, or via API.

### Input example

```json
{
  "channels": ["telegram", "durov"],
  "maxPosts": 20
}
````

### Supported channel formats

You can enter channels in any of these formats:

- `telegram`
- `@telegram`
- `https://t.me/telegram`
- `https://t.me/s/telegram`

The actor normalizes them to the public channel username.

### Date filtering

Use `sinceDate` to keep newer posts only.

Example:

```json
{
  "channels": ["telegram"],
  "maxPosts": 100,
  "sinceDate": "2026-01-01"
}
```

The actor stops saving older visible posts when Telegram provides timestamps for them.

### Output example

```json
{
  "channelUsername": "telegram",
  "channelTitle": "Telegram News",
  "postId": "429",
  "postUrl": "https://t.me/telegram/429",
  "postedAt": "2026-06-20T12:00:00+00:00",
  "text": "Example public Telegram post text",
  "views": 125000,
  "forwards": null,
  "replies": null,
  "reactions": {"👍": 123},
  "links": ["https://telegram.org"],
  "mediaUrls": ["https://t.me/telegram/429"],
  "scrapedAt": "2026-06-27T12:00:00.000Z"
}
```

### Tips for best results

- Use public channel usernames, not private invite links.
- Keep the first run small to confirm the channel is public.
- Increase `maxPosts` for ongoing monitoring jobs.
- Use `sinceDate` for incremental exports.
- Export by API when feeding dashboards or databases.

### Limits

The actor only extracts public content visible without a Telegram account.

It does not scrape private groups, private channels, member lists, direct messages, or login-only content.

If a channel has no public preview, the actor skips it gracefully.

### Proxy settings

Public Telegram preview pages usually work without a proxy.

Leave proxy disabled unless your network or region blocks Telegram.

If needed, enable Apify Proxy in advanced settings.

### Integrations

You can connect the dataset to:

- 📊 Google Sheets or BI dashboards.
- 🧠 LLM classification and summarization pipelines.
- 🔔 Webhooks for new public announcements.
- 🧾 Compliance archives and evidence stores.
- 🗄️ Databases such as BigQuery, Snowflake, Postgres, or Airtable.

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/telegram-channel-posts-scraper').call({
  channels: ['telegram'],
  maxPosts: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/telegram-channel-posts-scraper').call(run_input={
    'channels': ['telegram'],
    'maxPosts': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~telegram-channel-posts-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"channels":["telegram"],"maxPosts":20}'
```

### MCP integration

Use this actor with Apify MCP from Claude Code or Claude Desktop.

MCP URL:

```text
https://mcp.apify.com/?tools=fetch_cat/telegram-channel-posts-scraper
```

Claude Code setup:

```bash
claude mcp add apify-telegram-posts "https://mcp.apify.com/?tools=fetch_cat/telegram-channel-posts-scraper"
```

Claude Desktop JSON config example:

```json
{
  "mcpServers": {
    "apify-telegram-posts": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/telegram-channel-posts-scraper"
    }
  }
}
```

Example prompts:

- "Scrape the latest public posts from the Telegram channel `telegram` and summarize product announcements."
- "Monitor these public Telegram channels and extract posts with links."
- "Export the latest 50 posts from this Telegram channel as a CSV-ready dataset."

### Monitoring workflow

For recurring monitoring:

1. Create an Apify task with your channel list.
2. Set `sinceDate` or keep `maxPosts` modest.
3. Schedule the task hourly, daily, or weekly.
4. Send results to a webhook, database, or dashboard.

### Troubleshooting

#### Why did a channel return no posts?

The channel may be private, deleted, geo-blocked, or may not expose a public preview.

Try opening the channel URL in a logged-out browser. If it is not visible there, this actor cannot collect it.

#### Why are some counters missing?

Telegram only shows some counters for some posts and channel settings. Missing counters are returned as `null`.

#### Why are some posts missing direct media URLs?

Telegram may show a media preview without exposing a reusable direct file URL in every case. The actor returns direct public preview media URLs when they are visible.

### Legality and responsible use

This actor extracts publicly available Telegram channel preview data.

You are responsible for making sure your use complies with applicable laws, Telegram terms, and your organization's policies.

Do not use scraped data for spam, harassment, doxxing, or privacy-invasive profiling.

### Related scrapers

Explore other Apify actors from fetch\_cat for social, content, and monitoring workflows:

- https://apify.com/fetch\_cat/x-profile-tweets-scraper
- https://apify.com/fetch\_cat/youtube-channel-videos-scraper
- https://apify.com/fetch\_cat/bluesky-profile-feed-scraper
- https://apify.com/fetch\_cat/reddit-scraper

### FAQ

#### Can it scrape private Telegram channels?

No. It only works with public channels visible without an account.

#### Can it scrape Telegram groups?

No. Version 0.1 is focused on public channels and public channel posts.

#### Can I scrape multiple channels in one run?

Yes. Add multiple usernames or URLs to the `channels` array.

#### Can I get older history?

The actor follows public preview pagination while respecting your `maxPosts` limit. Availability depends on what Telegram exposes publicly.

#### Does it require cookies?

No. The actor is designed for public pages and does not require account cookies.

#### Can I export to CSV?

Yes. Apify datasets can be exported as CSV, JSON, Excel, XML, and RSS-compatible formats.

### Changelog

#### 0.1

Initial version for public Telegram channel post exports.

### Support

If a public channel that is visible in a logged-out browser does not work, open an issue with:

- The channel URL.
- Your input JSON.
- The Apify run URL.
- A short description of what you expected.

# Actor input Schema

## `channels` (type: `array`):

Public Telegram channel usernames or URLs. Examples: telegram, @telegram, https://t.me/s/telegram, https://t.me/telegram.

## `maxPosts` (type: `integer`):

Maximum number of posts to save across all channels.

## `sinceDate` (type: `string`):

Optional ISO date. The actor skips older visible posts when timestamps are available, for example 2026-01-01.

## `untilDate` (type: `string`):

Optional ISO date. The actor skips newer visible posts when timestamps are available, for example 2026-06-01.

## `includeMedia` (type: `boolean`):

Extract public image/video preview URLs when Telegram exposes them in the public preview HTML.

## `includeRawHtmlSnippet` (type: `boolean`):

Advanced debugging option. Adds a short raw HTML snippet for each post.

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

Optional Apify Proxy settings.

## Actor input object example

```json
{
  "channels": [
    "telegram",
    "durov"
  ],
  "maxPosts": 20,
  "includeMedia": true,
  "includeRawHtmlSnippet": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "channels": [
        "telegram",
        "durov"
    ],
    "maxPosts": 20,
    "includeMedia": true,
    "includeRawHtmlSnippet": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/telegram-channel-posts-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 = {
    "channels": [
        "telegram",
        "durov",
    ],
    "maxPosts": 20,
    "includeMedia": True,
    "includeRawHtmlSnippet": False,
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/telegram-channel-posts-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 '{
  "channels": [
    "telegram",
    "durov"
  ],
  "maxPosts": 20,
  "includeMedia": true,
  "includeRawHtmlSnippet": false
}' |
apify call fetch_cat/telegram-channel-posts-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Telegram Channel Posts Scraper",
        "description": "Scrape public Telegram channel posts with text, dates, views, links, media references, and clean exports for monitoring workflows.",
        "version": "0.1",
        "x-build-id": "9DC5WA0559PoeDig0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fetch_cat~telegram-channel-posts-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fetch_cat-telegram-channel-posts-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/fetch_cat~telegram-channel-posts-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fetch_cat-telegram-channel-posts-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/fetch_cat~telegram-channel-posts-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fetch_cat-telegram-channel-posts-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",
                "required": [
                    "channels"
                ],
                "properties": {
                    "channels": {
                        "title": "Channels",
                        "minItems": 1,
                        "type": "array",
                        "description": "Public Telegram channel usernames or URLs. Examples: telegram, @telegram, https://t.me/s/telegram, https://t.me/telegram.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPosts": {
                        "title": "Maximum posts",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of posts to save across all channels.",
                        "default": 20
                    },
                    "sinceDate": {
                        "title": "Only posts since date",
                        "type": "string",
                        "description": "Optional ISO date. The actor skips older visible posts when timestamps are available, for example 2026-01-01."
                    },
                    "untilDate": {
                        "title": "Only posts until date",
                        "type": "string",
                        "description": "Optional ISO date. The actor skips newer visible posts when timestamps are available, for example 2026-06-01."
                    },
                    "includeMedia": {
                        "title": "Include media URLs",
                        "type": "boolean",
                        "description": "Extract public image/video preview URLs when Telegram exposes them in the public preview HTML.",
                        "default": true
                    },
                    "includeRawHtmlSnippet": {
                        "title": "Include raw HTML snippet",
                        "type": "boolean",
                        "description": "Advanced debugging option. Adds a short raw HTML snippet for each post.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy settings.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
