# Capcut Video Downloader (`scraperoka/capcut-video-downloader`) Actor

📹 Capcut Video Downloader lets you quickly download and save your CapCut creations in high quality. 🚀 Fast, easy, and user-friendly—perfect for sharing, archiving, and offline viewing. ✨ Save time, enjoy more!

- **URL**: https://apify.com/scraperoka/capcut-video-downloader.md
- **Developed by:** [Scraperoka](https://apify.com/scraperoka) (community)
- **Categories:** Videos, Social media, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 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.

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

### CapCut Video Downloader 🎯
Manually visiting template pages to collect download-ready video links wastes time—especially when you need many templates fast. **CapCut Video Downloader** automatically scrapes CapCut template metadata and video URLs from the web. This CapCut video downloader is ideal for marketers, researchers, and growth teams who want to download CapCut videos (including template media) and organize results at scale in a single run. You can process multiple CapCut template URLs and return thousands of usable fields in minutes.

---

### What You Get: Sample Output
Here's a sample record from a single run:

```json
[
  {
    "url": "https://www.capcut.com/templates/7372561043429559553",
    "result": {
      "url": "https://www.capcut.com/templates/7372561043429559553",
      "source": "capcut",
      "id": "7372561043429559553",
      "unique_id": "483920517634",
      "author": "CapCut Studio",
      "title": "CapCut template: Cinematic Intro\nMake it yours",
      "thumbnail": "https://p-capcut-online.ee/capcut/thumbnail/abc123.jpg",
      "duration": 125000,
      "medias": [
        {
          "url": "https://p-capcut-online.ee/capcut/video/xyz_hd_no_watermark.mp4",
          "quality": "hd_no_watermark",
          "extension": "mp4",
          "type": "video"
        },
        {
          "url": "https://p-capcut-online.ee/capcut/video/xyz_no_watermark.mp4",
          "quality": "no_watermark",
          "extension": "mp4",
          "type": "video"
        },
        {
          "url": "https://p-capcut-online.ee/capcut/video/xyz_watermark.mp4",
          "quality": "watermark",
          "extension": "mp4",
          "type": "video"
        }
      ],
      "type": "multiple",
      "error": false,
      "time_end": 555
    }
  }
]
````

| Field | Type | What It Tells You |
|---|---|---|
| `url` | string | The CapCut template URL you provided for this record |
| `result.url` | string | The final template URL used as the record source |
| `result.source` | string | Where the data came from (`capcut`) |
| `result.id` | string | The template ID parsed from the template URL |
| `result.unique_id` | string | A generated unique identifier for the scraped record |
| `result.author` | string | Template author name shown on the page |
| `result.title` | string | Title text pulled from page metadata and subtitle content |
| `result.thumbnail` | string | Thumbnail image URL for quick previewing |
| `result.duration` | number | Template duration converted to milliseconds (when detected) |
| `result.medias` | array | Video URLs with different quality variants (e.g., `hd_no_watermark`, `no_watermark`, `watermark`) |
| `result.type` | string | Output type indicator (`multiple`) for media handling |
| `result.error` | boolean | Whether the extractor marked this record as an error (`false` on success) |
| `error` | string | Error message text for failed items (present when scraping fails) |

Export your dataset as JSON, CSV, or Excel — straight from the Apify dashboard.

***

### Why CapCut Video Downloader?

There are a lot of ways to pull data from CapCut templates—here’s what sets CapCut Video Downloader apart.

#### Template metadata + download-ready media URLs in one pass

Instead of manually browsing each page, CapCut Video Downloader extracts the template’s key metadata (author, title, thumbnail, duration) and also returns video URLs (as `medias` items) that you can use for downstream workflows like saving, archiving, or analysis.

#### Built for bulk template URL workflows

This CapCut video downloader supports a list of template URLs via the `urls` input, so you can scale from testing a single CapCut downloader app idea to downloading CapCut videos across many templates in one run.

#### Structured, integration-friendly output

The actor returns consistent JSON objects that include a `result` object and a `medias` array containing quality variants (including `hd_no_watermark`, `no_watermark`, and `watermark`) with `mp4` extension and `type: "video"`.

#### Resilient scraping with per-URL error reporting

If one template URL fails, the actor records the failure for that specific item rather than losing the entire run. You’ll see an `error` string alongside the original `url` for items that couldn’t be extracted.

***

### Configuring Your Run

Drop this into your `input.json` to get started:

```json
{
  "urls": [
    "https://www.capcut.com/templates/7372561043429559553"
  ]
}
```

| Parameter | Required | What It Does |
|---|---:|---|
| `urls` | ✅ | A list of CapCut template URLs to scrape |
| `urls[]` | ✅ | Each string should be a CapCut template URL you want to extract metadata and video URLs from |

***

### Core Capabilities

#### Extracts template ID, author, title, and thumbnail

CapCut Video Downloader parses the template ID from the URL, then reads the template title and author from page content/metadata. It also captures the `thumbnail` URL so you can quickly review which template each record represents.

#### Returns multiple video quality variants

The actor extracts video URLs into the `medias` array and labels each entry with a `quality` value. This is built for workflows like “CapCut reel downloader” style archiving where you may want different watermark variants.

#### Duration conversion for faster downstream analysis

When the page exposes a duration string in the expected format, the actor converts it into `duration` in milliseconds. This makes it easier to filter or segment templates by length when organizing large template libraries.

#### Handles multiple URLs with structured results

Give the actor multiple CapCut template links in `urls`, and it will produce a corresponding list of result objects. Output structure is designed to be straightforward to ingest into BI tools, spreadsheets, or any data pipeline.

#### Error handling per input URL

If extraction fails for a specific template, the output includes `url` and an `error` string for that item. This keeps bulk runs usable even when some templates return incomplete or unexpected page structures.

***

### Who Gets the Most Out of This

Here's how different teams put CapCut Video Downloader to work:

**Content strategists & template curators**\
You can batch-download CapCut video export targets by scraping many template URLs, then use the structured `thumbnail`, `title`, and `duration` fields to build a searchable library of “what to reuse next.”

**Marketers & growth teams**\
When you need to rapidly evaluate template performance or variations, this CapCut video downloader helps you collect template metadata and media URLs in one go—so you can focus on creative testing instead of manual clicking.

**Freelance editors & creators**\
If you’re trying to figure out how to download CapCut videos for quick iteration, CapCut Video Downloader gives you the media URL variants (with `mp4` extension) in `medias`, along with the template context to keep your assets organized.

**Data analysts & researchers (technical workflows)**\
You can integrate the output into your datasets to compare template authors, durations, and available media quality variants, then export results for further processing. The stable JSON structure (including `medias`, `author`, and `duration`) makes it easy to transform for analysis pipelines.

**Automation specialists**\
If you’re building repeatable systems for downloading CapCut templates online, you can run CapCut Video Downloader with a list of URLs and feed the dataset into your downstream automation for consistent, repeatable results.

***

### Step-by-Step: How to Use It

No coding needed. Here's how to run CapCut Video Downloader from start to finish:

1. **Open the actor on Apify** — go to <https://console.apify.com> and open the CapCut Video Downloader actor page.
2. **Enter your inputs** — add one or more template links in the `urls` field (from the Configuring Your Run section).
3. **Configure proxy settings (optional)** — if your environment requires it, enable proxy configuration for more reliable scraping.
4. **Hit Run and watch the live log** — monitor progress and see which URLs are being fetched.
5. **View results in the dataset tab** — each input URL produces a structured record (or an error entry for failed items).
6. **Export as JSON, CSV, or Excel** — download your dataset in the format that fits your workflow.

The whole process takes under 5 minutes to set up.

***

### Integrations & Export Options

Once your data is collected, CapCut Video Downloader plugs directly into your existing workflow.

You can export your results from the Apify dataset tab in common formats like **JSON**, **CSV**, or **Excel**. This makes it easy to share with teammates or load into a spreadsheet for quick filtering by `duration`, `author`, or title keywords.

To automate further, you can connect runs to downstream systems using Apify’s API capabilities (see [apify.com/docs/api](https://apify.com/docs/api)), and trigger actions via webhooks or no-code automation tools like Zapier/Make. For deeper orchestration or scheduled processing, use Apify’s scheduling features so CapCut video downloader runs automatically on a cadence that matches your content pipeline.

***

### Pricing & Free Trial

CapCut Video Downloader runs on the Apify platform, which offers a **free tier** — no credit card required to get started. You typically get enough credits for several test runs, so you can validate output fields (like `medias` quality variants and `thumbnail`) before scaling. After that, pricing is based on Apify platform compute usage (billed by Actor compute units), and you can scale up using Apify plans designed for heavier usage. Start for free at <https://apify.com> and scale when you're ready.

***

### Reliability & Performance

| What We Handle | How |
|---|---|
| Public web page variability | Extracts what’s available on each template page and structures it consistently |
| Scraping interruptions | Continues processing other URLs and records per-item errors |
| Media extraction completeness | Produces a `medias` array with quality variants when video URL metadata is present |
| Bulk-friendly runs | Designed to process multiple CapCut template URLs in one actor run |

**Limitations:** This actor works with **publicly available data** and depends on what the template pages expose at scrape time. If a page structure is missing expected metadata, some fields may be blank or fewer media variants may be returned.

For enterprise-scale runs, contact us to discuss custom configurations.

***

### Frequently Asked Questions

#### Is there a free plan or trial?

Yes. CapCut Video Downloader runs on the Apify platform, which offers a **free tier** for getting started and running initial tests.

#### Do I need to log in to CapCut to use this?

No. The actor is built to scrape information from publicly accessible template pages and does not require a user login.

#### How accurate is the data?

The extractor is accurate to what’s available on each CapCut template page. It pulls values like the template ID, title, author, thumbnail, duration, and the `medias` video URLs as exposed in the page content.

#### How many results can I get per run?

You can pass as many CapCut template URLs as you want in the `urls` array. The run processes the list and returns one structured record per URL (or an error entry when extraction fails).

#### How often is the data updated / how fresh is it?

Data freshness depends on when you run the actor. Each run fetches current publicly available template page content and produces a new dataset output.

#### Is this legal? Does it comply with GDPR / CCPA?

This actor is designed for **publicly available data** from template pages you can access without logging in. You’re responsible for complying with GDPR, CCPA, platform Terms of Service, and any applicable regulations when storing or using the extracted data.

#### Can I export results to Google Sheets or Excel?

Yes. You can export your dataset from the Apify dashboard. If you need a spreadsheet workflow like Google Sheets, you can typically import CSV or Excel into your preferred tool.

#### Can I run this on a schedule automatically?

Yes. Apify supports scheduling so you can run CapCut Video Downloader automatically at a set cadence without manual intervention.

#### Can I access this via API?

Yes. You can retrieve results programmatically via the Apify API. See <https://apify.com/docs/api> for details.

#### What happens if the actor hits an error?

Errors are handled per URL. If a specific template fails to scrape, the output includes the original `url` and an `error` string for that item, while other URLs can still succeed in the same run.

***

### Need Help or Have a Request?

Got a question about CapCut Video Downloader or want a new feature added? Reach out at <dataforleads@gmail.com>. We respond to feedback and actively maintain the actor based on user needs. Want something concrete? Share ideas like “batch CSV upload” for template URLs or “webhook on completion” to trigger your next step automatically.

***

### Disclaimer & Responsible Use

*CapCut Video Downloader is the fastest, most reliable way to collect CapCut template metadata and video URLs — start your free run today.*

This actor accesses **publicly available data** from CapCut template pages. It does not access private accounts, login-gated content, or password-protected pages. You are responsible for complying with GDPR, CCPA, platform Terms of Service, and any applicable regulations when using or storing extracted data. For data removal requests, contact <dataforleads@gmail.com>. Use responsibly, ethically, and only for lawful purposes.

# Actor input Schema

## `urls` (type: `array`):

List of CapCut template URLs to scrape

## Actor input object example

```json
{
  "urls": [
    "https://www.capcut.com/templates/7372561043429559553"
  ]
}
```

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scraperoka/capcut-video-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("scraperoka/capcut-video-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call scraperoka/capcut-video-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Capcut Video Downloader",
        "description": "📹 Capcut Video Downloader lets you quickly download and save your CapCut creations in high quality. 🚀 Fast, easy, and user-friendly—perfect for sharing, archiving, and offline viewing. ✨ Save time, enjoy more!",
        "version": "0.0",
        "x-build-id": "okmkkyfECXwWgnBXs"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scraperoka~capcut-video-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scraperoka-capcut-video-downloader",
                "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/scraperoka~capcut-video-downloader/runs": {
            "post": {
                "operationId": "runs-sync-scraperoka-capcut-video-downloader",
                "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/scraperoka~capcut-video-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-scraperoka-capcut-video-downloader",
                "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": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "CapCut Template URLs",
                        "type": "array",
                        "description": "List of CapCut template URLs to scrape",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "https://www.capcut.com/templates/7372561043429559553"
                        ]
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
