# Extraire n° Siren de sites web ou noms de domaine (`sbzh/extract-siren`) Actor

Obtenez le numéro de Siren, le numéro de Siret ou la TVA intracommunautaire attribués aux entreprises françaises par Infogreffe et l'Insee. Entrez une liste de sites web ou noms de domaine et récupérer les informations légales relatives à l'entreprise

- **URL**: https://apify.com/sbzh/extract-siren.md
- **Developed by:** [Sambzh](https://apify.com/sbzh) (community)
- **Categories:** Automation, Developer tools, Lead generation
- **Stats:** 23 total users, 1 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.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

## SIREN Extractor

Identifiez rapidement les numéros SIREN associés aux éditeurs de n'importe quel site web français, en volume et sans configuration complexe.

Fournissez une liste d'URLs ou de noms de domain, l'acteur navigue au sein de chaque site et extrait le numéro de SIREN à partir du moment où celui-ci y figure. Chaque site produit une ligne JSON structurée, prête à être croisée avec Pappers, l'INSEE ou Infogreffe.

---

### SIREN, SIRET et TVA intracommunautaire

#### Le numéro SIREN

Le **SIREN** (Système d'Identification du Répertoire des ENtreprises) est l'identifiant unique attribué à chaque entreprise ou personne morale immatriculée en France. Il est délivré par l'**INSEE** lors de la création de l'entité et reste inchangé tout au long de sa vie, quelles que soient les modifications de dénomination, d'adresse ou d'activité.

Il se compose de **9 chiffres**, généralement présentés en trois blocs de trois :

````

572 154 286
^^^^^^^^^^^
9 chiffres : identifiant unique de l'entreprise

```

Le SIREN est le socle des données légales françaises : il permet d'accéder aux informations officielles d'une entreprise sur les registres publics (Infogreffe, Pappers, Annuaire des Entreprises, BODACC). Toute société, association assujettie, auto-entrepreneur ou groupement d'intérêt économique exerçant une activité en France est tenu d'en disposer.

> **Obligation légale** : Les sites web d'entreprises sont tenus d'afficher leur numéro SIREN dans leurs mentions légales (décret n° 2004-575 du 21 juin 2004 pour la confiance dans l'économie numérique).

---

#### Le numéro SIRET

Le **SIRET** (Système d'Identification du Répertoire des ETablissements) identifie un **établissement précis** d'une entreprise. Là où le SIREN désigne la personne morale dans son ensemble, le SIRET désigne un lieu d'exercice particulier : siège social, usine, agence, entrepôt…

Il se compose de **14 chiffres** : le SIREN de l'entreprise suivi d'un **NIC** (Numéro Interne de Classement) à 5 chiffres qui identifie l'établissement au sein de l'entreprise.

```

572 154 286 00017
^^^^^^^^^^^ ^^^^^
SIREN      NIC
9 chiffres  5 chiffres = établissement spécifique

```

Une entreprise possède autant de SIRET que d'établissements. L'établissement principal (siège social) est généralement désigné par le NIC `00001` ou la première valeur attribuée à la création. La fermeture d'un établissement entraîne la radiation de son SIRET, sans affecter le SIREN ni les autres établissements.

---

#### La TVA intracommunautaire

Le **numéro de TVA intracommunautaire** (aussi appelé numéro de TVA intra-UE) est l'identifiant fiscal utilisé pour les échanges commerciaux entre entreprises assujetties à la TVA au sein de l'Union européenne. Il est obligatoire sur toutes les factures B2B transfrontalières.

Pour les entreprises françaises, il est **calculé algorithmiquement** à partir du SIREN selon la formule suivante :

```

FR + clé de 2 caractères + SIREN à 9 chiffres

```

La clé est obtenue par l'opération : `(12 + 3 × (SIREN modulo 97)) modulo 97`, puis formatée sur 2 caractères. Le préfixe `FR` identifie le pays d'immatriculation conformément à la norme ISO 3166-1.

```

FR  12  572154286
^^  ^^  ^^^^^^^^^
|   |   SIREN (9 chiffres)
|   Clé de contrôle (2 chiffres calculés)
Préfixe pays (ISO 3166-1)

````

> **À noter** : Contrairement au SIREN et au SIRET qui sont publics et consultables librement, le numéro de TVA intracommunautaire peut être vérifié via le service **VIES** (VAT Information Exchange System) de la Commission européenne.

---

### Input

Seul le champ `websites` est obligatoire.

| Paramètre | Type | Défaut | Description |
|---|---|---|---|
| `websites` | `string[]` | | **Obligatoire.** Liste des URLs à traiter. Accepte les domaines nus (`example.fr`), avec ou sans `https://`. |
| `maxConcurrency` | `integer` | `10` | Nombre de sites traités en parallèle. Nécessite **4 Go de RAM minimum**. |
| `requestTimeoutSecs` | `integer` | `30` | Timeout par navigation en secondes. En dessous de 10s, les sites lents seront incorrectement marqués inaccessibles. |
| `proxyConfiguration` | `object` | désactivé | Configuration Apify Proxy. Activer avec `{"useApifyProxy": true}` pour les sites avec anti-bot renforcé. |

```json
{
  "websites": [
    "eu.vuarnet.com",
    "https://www.decathlon.fr",
    "https://www.leboncoin.fr",
    "maison-du-monde.com"
  ],
  "maxConcurrency": 10,
  "requestTimeoutSecs": 30
}
````

***

### Output

Chaque site produit exactement une ligne dans le dataset Apify. Tous les champs sont toujours présents (`null` si non trouvé).

| Champ | Type | Description |
|---|---|---|
| `initial_website` | `string` | URL brute fournie en entrée |
| `website` | `string` | URL normalisée avec protocole |
| `final_website` | `string \| null` | URL finale après redirections (y compris cross-domain) |
| `legal_page` | `string \| null` | URL exacte de la page où le SIREN a été trouvé |
| `siren` | `string \| null` | SIREN de l'éditeur du site au format `XXX XXX XXX` |
| `siret` | `string \| null` | SIRET complet si mentionné sur la page (14 chiffres) |
| `vat_number` | `string \| null` | Numéro de TVA intracommunautaire au format `FRXXXXXXXXX` |
| `web_host_siren` | `string \| null` | SIREN de l'hébergeur détecté, distinct de l'éditeur |
| `web_host_siret` | `string \| null` | SIRET de l'hébergeur |
| `web_host_vat_number` | `string \| null` | TVA de l'hébergeur |
| `http_code` | `integer` | Code HTTP de la réponse principale |
| `status` | `string` | Statut du résultat (voir ci-dessous) |
| `extraction_date` | `string` | Horodatage ISO 8601 de l'extraction |

#### Valeurs de `status`

| status | http\_code | Signification |
|---|---|---|
| `Success` | 200 | SIREN éditeur trouvé et extrait avec succès |
| `Siren not found` | 200 | Site accessible mais aucun SIREN trouvé sur les pages légales |
| `empty website` | 204 | Site vide, page parking ou domaine expiré |
| `blocked by Cloudflare` | 403 | Protection anti-bot active (Cloudflare, WAF, Akamai…) |
| `website unreachable` | 404 | Domaine inexistant, erreur réseau ou TLS invalide |

#### Exemple de résultat (succès)

```json
{
  "initial_website":     "eu.vuarnet.com",
  "website":             "https://eu.vuarnet.com",
  "final_website":       "https://eu.vuarnet.com/",
  "legal_page":          "https://eu.vuarnet.com/pages/conditions-generales-de-vente",
  "siren":               "572 154 286",
  "siret":               "572 154 286 00017",
  "vat_number":          "FR12572154286",
  "web_host_siren":      null,
  "web_host_siret":      null,
  "web_host_vat_number": null,
  "http_code":           200,
  "status":              "Success",
  "extraction_date":     "2025-03-06T09:14:22.481Z"
}
```

***

### Cas d'usage

**Enrichissement CRM & base de données**
Vous avez une liste de prospects avec leurs sites web mais pas leurs SIREN. Lancez l'acteur sur vos URLs, récupérez les SIREN et croisez avec Pappers, l'INSEE ou Infogreffe pour obtenir forme juridique, capital, dirigeants et bilans financiers.

**Conformité & vérification légale**
Vérifiez que vos fournisseurs ou partenaires affichent bien leurs mentions légales obligatoires (SIREN, RCS, siège social). Identifiez les sites non-conformes à l'article L123-1 du Code de commerce.

**Veille concurrentielle & market intelligence**
Constituez un panel de sites concurrents, récupérez leurs SIREN et surveillez leurs dépôts de comptes, leurs appels d'offres ou leurs annonces légales au fil du temps.

**Qualification de leads entrants**
À chaque nouveau lead (formulaire, email, LinkedIn), extrayez le SIREN depuis son site en quelques secondes pour qualifier automatiquement la taille, le secteur et la santé financière de l'entreprise avant un premier contact.

**Marketplaces & plateformes e-commerce**
Vérifiez l'existence légale des marchands qui s'inscrivent sur votre plateforme en croisant le SIREN extrait de leur site avec les registres officiels avant validation du compte.

**Due diligence & scoring crédit (KYB)**
Complétez vos processus Know Your Business en récupérant automatiquement le SIREN depuis le site de vos clients avant de déclencher une analyse financière ou un scoring crédit.

***

### Configuration recommandée

Ces réglages sont à définir dans **Settings → Run** sur Apify, indépendamment des paramètres d'input.

| Réglage | Valeur recommandée | Pourquoi |
|---|---|---|
| **RAM** | **4 096 Mo minimum** | Jusqu'à 10 recherches en simultané. En dessous de 4 Go, des crashes mémoire (`Page crashed`) peuvent se produire. |
| **Timeout acteur** | **30 min** | Suffisant pour 500+ sites. Augmenter à 60 min pour des listes supérieures à 1 000 URLs. |
| **maxConcurrency** | **10** | Valeur optimale avec 4 Go RAM. Ne pas dépasser 15 même avec davantage de mémoire disponible. |

***

### Limites connues

**Sites avec anti-bot renforcé (Cloudflare Enterprise, Akamai, Imperva)**
Ces protections bloquent même les navigateurs en mode stealth. L'activation du proxy Apify améliore le taux de passage mais ne garantit pas 100% de réussite. Ces sites sont retournés avec `status: "blocked by Cloudflare"`.

**Sites sans contenu français**
L'acteur recherche uniquement des numéros au format SIREN (9 chiffres) ou SIRET (14 chiffres). Les entreprises étrangères sans présence légale française ne produiront aucun résultat.

**Mentions légales en PDF**
Certains sites publient leurs informations légales uniquement dans un fichier PDF. L'extraction de texte depuis un PDF n'est pas prise en charge — ces cas retournent `status: "Siren not found"`.

**Pages légales derrière authentification**
Si les mentions légales sont accessibles uniquement après connexion (extranet, espace client), l'acteur ne pourra pas les atteindre.

# Actor input Schema

## `websites` (type: `array`):

List of domain names or website URLs to process (e.g. 'example.fr', 'https://www.example.com').

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

Number of websites processed in parallel.

## `requestTimeoutSecs` (type: `integer`):

Timeout par requête de navigation en secondes. Recommandé : 30s.

## Actor input object example

```json
{
  "websites": [
    "exemple.fr",
    "https://www.example.com"
  ],
  "maxConcurrency": 10,
  "requestTimeoutSecs": 30
}
```

# 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 = {
    "websites": [
        "exemple.fr",
        "https://www.example.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sbzh/extract-siren").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 = { "websites": [
        "exemple.fr",
        "https://www.example.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("sbzh/extract-siren").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 '{
  "websites": [
    "exemple.fr",
    "https://www.example.com"
  ]
}' |
apify call sbzh/extract-siren --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Extraire n° Siren de sites web ou noms de domaine",
        "description": "Obtenez le numéro de Siren, le numéro de Siret ou la TVA intracommunautaire attribués aux entreprises françaises par Infogreffe et l'Insee. Entrez une liste de sites web ou noms de domaine et récupérer les informations légales relatives à l'entreprise",
        "version": "0.0",
        "x-build-id": "gU9Efph577dSAeHec"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sbzh~extract-siren/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sbzh-extract-siren",
                "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/sbzh~extract-siren/runs": {
            "post": {
                "operationId": "runs-sync-sbzh-extract-siren",
                "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/sbzh~extract-siren/run-sync": {
            "post": {
                "operationId": "run-sync-sbzh-extract-siren",
                "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": [
                    "websites"
                ],
                "properties": {
                    "websites": {
                        "title": "Websites",
                        "type": "array",
                        "description": "List of domain names or website URLs to process (e.g. 'example.fr', 'https://www.example.com').",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Number of websites processed in parallel.",
                        "default": 10
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Timeout par requête de navigation en secondes. Recommandé : 30s.",
                        "default": 30
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
