# HomePro Thailand Search & Product Scraper (`mai_amm/homeprothai`) Actor

Scrapes HomePro Thailand search results, prices, availability, product details, images, and specifications by keyword, category URL, or product URL.

- **URL**: https://apify.com/mai\_amm/homeprothai.md
- **Developed by:** [wiseld\_squid](https://apify.com/mai_amm) (community)
- **Categories:** E-commerce, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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

## HomePro Thailand Search & Product Scraper

Scrape HomePro Thailand products by keyword, category URL, or product URL. The actor extracts search rankings, prices, stock signals, sellers, product URLs, images, categories, and optional product-detail data such as specifications and highlights.

### What you can scrape

- Keyword search results, for example `สว่าน`, `สว่านไฟฟ้า`, `แอร์`, `DEWALT`
- HomePro category/listing pages
- Direct HomePro product detail pages
- Product details, images, specifications, breadcrumbs, price fields, and availability when `includeDetails` is enabled

### Output

Each dataset item represents a HomePro product or listing. Common fields include:

- `sku`
- `name`
- `nameEn`
- `brand`
- `seller`
- `price`
- `finalPrice`
- `originalPrice`
- `availability`
- `categories`
- `image` / `images`
- `url`
- `searchKeyword`
- `searchRank`
- `searchPage`
- `searchTotalItems`
- `specifications`
- `scrapedAt`

### How search works

For keyword search, the actor opens HomePro search result pages such as `/search?q=สว่าน&page=1&size=100`, parses the server-rendered product cards, and follows pagination until `maxItems` or `maxPages` is reached.

When `includeDetails` is enabled, the actor also opens each product detail page to enrich results with specifications, images, breadcrumbs, stock, and richer price fields.

HomePro `robots.txt` disallows `/search/`. The actor exposes `respectRobotsTxt`; when enabled, it skips website search pages and relies on product/category URLs plus optional suggestion/category fallback.

### Example input

Keyword search:

```json
{
  "mode": "search",
  "searchQuery": "สว่าน",
  "maxItems": 100,
  "useWebsiteSearch": true,
  "searchPageSize": 100,
  "includeDetails": true,
  "maxConcurrency": 3
}
````

Multiple keywords:

```json
{
  "mode": "search",
  "searchTerms": ["สว่าน", "สว่านไฟฟ้า"],
  "maxItems": 200,
  "includeDetails": false
}
```

Category scrape:

```json
{
  "categoryUrls": [{ "url": "https://www.homepro.co.th/c/APP01" }],
  "maxItems": 100
}
```

Product detail scrape:

```json
{
  "productUrls": [{ "url": "https://www.homepro.co.th/p/1310209" }],
  "maxItems": 1
}
```

### Notes

- Use `maxItems` to control dataset size and run cost.
- `includeDetails: false` is faster and returns listing/search fields only.
- `includeDetails: true` is slower but returns richer product detail fields.
- Keep `maxConcurrency` conservative because HomePro is protected by Cloudflare.

### Technical details

HomePro search and category pages include product cards in the server-rendered HTML:

- `#itemsSize`, `#pageTotal`, `#page`
- `.product-plp-card`
- `#gtmName-{sku}`, `#gtmPrice-{sku}`, `#gtmNetPrice-{sku}`, `#gtmAvailability-{sku}`

Product pages also include structured data and PDP fields in HTML:

- `script[type="application/ld+json"]` Product
- `.prd-name h1`, `.prd-brand`, `.prd-sku`
- `.quantity-remain span`
- `#product-specification table tr`

Pagination works with `?page=2`, `?page=3`, etc. Search pages support `?q=keyword&page=1&size=100`.

# Actor input Schema

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

Use search for Home Depot-style keyword input, category for listing URLs, product for detail URLs, or auto.

## `searchQuery` (type: `string`):

Keyword to search on HomePro, for example สว่าน, แอร์, DEWALT. By default the actor reads HomePro search result pages and can open product detail pages.

## `searchTerms` (type: `array`):

Multiple keywords to search, Home Depot-style.

## `keywords` (type: `array`):

Aliases for search terms. Matches product name, English name, brand, SKU, and category.

## `categoryPreset` (type: `string`):

Optional category set to crawl while searching. Use auto to rely on the suggestion endpoint's category hints.

## `useSuggestApi` (type: `boolean`):

Also use HomePro's suggestion endpoint as a lightweight fallback seed. This is not a full search result API.

## `useWebsiteSearch` (type: `boolean`):

Use HomePro's public search result pages, for example /search?q=สว่าน\&page=1\&size=100. This is the most accurate keyword-search mode.

## `searchPageSize` (type: `integer`):

Number of products requested per HomePro search page. HomePro currently supports 100 on search result pages.

## `maxPages` (type: `integer`):

Maximum number of search pages to crawl per keyword. Use 0 for all available pages up to maxItems.

## `respectRobotsTxt` (type: `boolean`):

When enabled, the actor skips HomePro /search pages and relies on product/category URLs plus optional suggestion API/category fallback.

## `productUrls` (type: `array`):

Direct HomePro product URLs.

## `categoryUrls` (type: `array`):

HomePro category/listing URLs.

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

HomePro category URLs like https://www.homepro.co.th/c/APP01 or product URLs like https://www.homepro.co.th/p/888163300011.

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

Maximum number of product records to save.

## `includeDetails` (type: `boolean`):

Open product detail pages and extract images, specs, breadcrumbs, and richer pricing.

## `matchMode` (type: `string`):

When using search, require any keyword or all keywords to match category/listing products.

## `minMatchScore` (type: `integer`):

Minimum keyword match score for category-discovered products.

## `maxConcurrency` (type: `integer`):

Keep this conservative because HomePro is behind Cloudflare.

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

Apify proxy configuration.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "สว่าน",
  "categoryPreset": "auto",
  "useSuggestApi": false,
  "useWebsiteSearch": true,
  "searchPageSize": 100,
  "maxPages": 0,
  "respectRobotsTxt": false,
  "startUrls": [
    {
      "url": "https://www.homepro.co.th/c/APP01"
    }
  ],
  "maxItems": 100,
  "includeDetails": true,
  "matchMode": "any",
  "minMatchScore": 1,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Product listings and product detail records including SKU, name, brand, seller, prices, availability, categories, images, search metadata, and specifications when detail scraping is enabled.

# 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 = {
    "mode": "search",
    "searchQuery": "สว่าน",
    "startUrls": [
        {
            "url": "https://www.homepro.co.th/c/APP01"
        }
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("mai_amm/homeprothai").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 = {
    "mode": "search",
    "searchQuery": "สว่าน",
    "startUrls": [{ "url": "https://www.homepro.co.th/c/APP01" }],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("mai_amm/homeprothai").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 '{
  "mode": "search",
  "searchQuery": "สว่าน",
  "startUrls": [
    {
      "url": "https://www.homepro.co.th/c/APP01"
    }
  ],
  "maxItems": 100
}' |
apify call mai_amm/homeprothai --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "HomePro Thailand Search & Product Scraper",
        "description": "Scrapes HomePro Thailand search results, prices, availability, product details, images, and specifications by keyword, category URL, or product URL.",
        "version": "0.1",
        "x-build-id": "jeUeasXJB1ojfLHf5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mai_amm~homeprothai/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mai_amm-homeprothai",
                "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/mai_amm~homeprothai/runs": {
            "post": {
                "operationId": "runs-sync-mai_amm-homeprothai",
                "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/mai_amm~homeprothai/run-sync": {
            "post": {
                "operationId": "run-sync-mai_amm-homeprothai",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "auto",
                            "search",
                            "category",
                            "product"
                        ],
                        "type": "string",
                        "description": "Use search for Home Depot-style keyword input, category for listing URLs, product for detail URLs, or auto.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword to search on HomePro, for example สว่าน, แอร์, DEWALT. By default the actor reads HomePro search result pages and can open product detail pages."
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Multiple keywords to search, Home Depot-style.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Filter keywords",
                        "type": "array",
                        "description": "Aliases for search terms. Matches product name, English name, brand, SKU, and category.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categoryPreset": {
                        "title": "Category preset",
                        "enum": [
                            "auto",
                            "tools",
                            "appliances",
                            "bathroom",
                            "kitchen",
                            "furniture",
                            "lighting",
                            "plumbing",
                            "electrical",
                            "garden",
                            "allKnownCategories"
                        ],
                        "type": "string",
                        "description": "Optional category set to crawl while searching. Use auto to rely on the suggestion endpoint's category hints.",
                        "default": "auto"
                    },
                    "useSuggestApi": {
                        "title": "Use suggestion API",
                        "type": "boolean",
                        "description": "Also use HomePro's suggestion endpoint as a lightweight fallback seed. This is not a full search result API.",
                        "default": false
                    },
                    "useWebsiteSearch": {
                        "title": "Use website search",
                        "type": "boolean",
                        "description": "Use HomePro's public search result pages, for example /search?q=สว่าน&page=1&size=100. This is the most accurate keyword-search mode.",
                        "default": true
                    },
                    "searchPageSize": {
                        "title": "Search page size",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Number of products requested per HomePro search page. HomePro currently supports 100 on search result pages.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "Max search pages",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of search pages to crawl per keyword. Use 0 for all available pages up to maxItems.",
                        "default": 0
                    },
                    "respectRobotsTxt": {
                        "title": "Respect robots.txt",
                        "type": "boolean",
                        "description": "When enabled, the actor skips HomePro /search pages and relies on product/category URLs plus optional suggestion API/category fallback.",
                        "default": false
                    },
                    "productUrls": {
                        "title": "Product URLs",
                        "type": "array",
                        "description": "Direct HomePro product URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "categoryUrls": {
                        "title": "Category URLs",
                        "type": "array",
                        "description": "HomePro category/listing URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "HomePro category URLs like https://www.homepro.co.th/c/APP01 or product URLs like https://www.homepro.co.th/p/888163300011.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of product records to save.",
                        "default": 100
                    },
                    "includeDetails": {
                        "title": "Include product details",
                        "type": "boolean",
                        "description": "Open product detail pages and extract images, specs, breadcrumbs, and richer pricing.",
                        "default": true
                    },
                    "matchMode": {
                        "title": "Keyword match mode",
                        "enum": [
                            "any",
                            "all"
                        ],
                        "type": "string",
                        "description": "When using search, require any keyword or all keywords to match category/listing products.",
                        "default": "any"
                    },
                    "minMatchScore": {
                        "title": "Minimum match score",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum keyword match score for category-discovered products.",
                        "default": 1
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Keep this conservative because HomePro is behind Cloudflare.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
