# France Jobs API (`aspen-technology-labs-inc/france-jobs-api`) Actor

Find job postings in France by role, structured location, company, category, salary, posting age, employment type, remote status, and seniority.

- **URL**: https://apify.com/aspen-technology-labs-inc/france-jobs-api.md
- **Developed by:** [Aspen Technology Labs, Inc.](https://apify.com/aspen-technology-labs-inc) (community)
- **Categories:** Jobs, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 job records

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

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

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

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

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

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

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

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

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

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

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


# README

## France Jobs API - JobsIndex by Aspen Tech Labs

Access French jobs data through the JobsIndex API, built by Aspen Tech Labs. This Actor is fixed to France and sources listings directly from employer career sites and ATS platforms rather than job boards, giving you first-party data. Coverage spans both French-language and English-language postings, so multinational employers and English-first roles in France are captured alongside domestic French job ads. Part of a broader JobsIndex feed aggregating 11M+ active postings daily across 300K+ employer source sites globally.

Filter by role keyword, location, salary, posting age, employment type, remote status, seniority, and pagination to pull exactly the French job postings data you need for recruitment tools, workforce analytics, or labour market research.

*Pour le marché français : nos offres d'emploi couvrent à la fois les annonces en français et en anglais, collectées directement sur les sites carrière des employeurs. Idéal pour l'analyse du marché du travail, les outils de recrutement et les projets de données multilingues.*

### Need More or Something Different?

If this Actor is working well for you, we'd love a review. For more data, custom feeds, feedback, or any questions, reach out via our [website](https://jobsindex.com/) or [email](mailto:inquiry+apify@aspentechlabs.com). You can also explore [JobMarketPulse](https://jobmarketpulse.com/), our labor and job market intelligence platform.

### Built-In Country Preset

This Actor is fixed internally to `country=France`. The runtime always enforces that value even if a different country is submitted.

### Quick Start

```json
{
  "title": "Software Engineer",
  "size": 5
}
````

### Input Parameters

| Parameter | Description | Example |
|---|---|---|
| `salary` | Salary amount or range filter. | `20h-30h` |
| `what` | Job search query. Supports keywords, boolean logic, exact phrases, and field-targeted search. | `software engineer OR data analyst` |
| `country` | Fixed preset. Runtime always uses `France`; changes are ignored. | `France` |
| `region` | Region, state, or province. | `Region name` |
| `city` | City filter. | `City name` |
| `postal_code` | Postal code filter. | `Postal code` |
| `metro_area` | Metropolitan area filter. | `Metro area` |
| `title` | Job title filter. | `Software Engineer` |
| `company_name` | Employer name filter. | `Employer name` |
| `company_domain` | Employer website domain. | `example.com` |
| `category` | Job category. | `Information Technology` |
| `sub_category` | More specific job function or role. | `Software Developer` |
| `industry` | Employer industry. | `Technology` |
| `posted` | Relative posting age or ISO date. | `1w` |
| `employment_type` | Employment type. | `Full-Time` |
| `remote` | Work arrangement. Supported values: `remote`, `on-site`, `hybrid`. | `hybrid` |
| `seniority` | Seniority level. | `Senior` |
| `page` | Page number, starting from 0. | `0` |
| `size` | Results per page. Minimum 1, maximum 100. | `5` |

### Salary Filter Format

Use `NUMBER[UNIT]` or `NUMBER[UNIT]-NUMBER[UNIT]`.

Supported units:

- `h` - per hour
- `d` - per day
- `w` - per week
- `m` - per month
- `y` - per year

Examples: `20h-30h`, `35h`, `50000y-90000y`.

### Advanced Filters

`what` supports plain-text search, boolean logic, exact phrases, and field-targeted search. If no field is provided, the API expands the query across a default set of relevant job and content fields.

```text
what = engineer OR manager
what = @title engineer OR manager
what = @(title,description) (python)
what = @(title,title_raw,description) (engineer OR manager)
```

#### Structured Filter Precedence

When `what` is provided together with structured job filters, the structured filters take priority and may override or narrow the keyword query. Use `what` when the corresponding structured fields are not set.

### Location Filtering

The country is fixed. Use structured fields to narrow results within France:

- `region`
- `city`
- `postal_code`
- `metro_area`

### Limits and Pagination

Results are paginated with `page` and `size`.

| Parameter | Min | Max |
|---|---:|---:|
| `page` | 0 | Depends on `size` and the item cap |
| `size` | 1 | 100 |

Invalid values can return `400 Invalid page or size parameters`.

#### Item Caps

| Query shape | Max items | Effective max `size` | Over-size behavior |
|---|---:|---:|---|
| No company filter | 1000 | 100 | Validation error; not silently capped |
| Company filter plus another keyword or filter | 20 | 20 | Silent cap with capping metadata |
| Company filter only | 5 | 5 | Silent cap with capping metadata |

A company filter means `company_name`, `company_domain`, or a company field referenced inside `what`. Capped responses can include `size_requested` and `size_capped_by` metadata.

#### Free-Text Query Limits

`what` has a maximum of 700 raw URL characters or 500 decoded characters. Unsafe expressions, excessive operators, or malformed filters can return a `400` response.

### Output

Each run stores job records in the default Apify dataset. Common fields include job title, category, company, structured location, salary, employment type, remote status, posting dates, source URL, application URL, description, and JobsIndex ID.

Field availability depends on the source job posting.

# Actor input Schema

## `salary` (type: `string`):

Salary amount/range filter. Format: 1-9 digits followed by y, m, w, d, or h; optional range A-B. Examples: 20h-30h, 35h, 20h-200000y.

## `what` (type: `string`):

Main job search query. Supports keywords, exact phrases, boolean logic (AND, OR, NOT or &, |, !), and field targeting. Maximum 700 raw URL chars or 500 decoded chars. Examples: python developer OR junior javascript, "data scientist", @(title) (manager).

## `country` (type: `string`):

Fixed preset. Runtime always uses `France`; changes are ignored.

## `region` (type: `string`):

State, province, or region. Maximum 80 characters.

## `city` (type: `string`):

City filter. Maximum 100 characters.

## `postal_code` (type: `string`):

Postal or ZIP code. Maximum 20 characters.

## `metro_area` (type: `string`):

Metropolitan area filter. Maximum 100 characters. Example: Denver-Aurora-Centennial, CO.

## `title` (type: `string`):

Job title filter. Maximum 200 characters.

## `company_name` (type: `string`):

Company name filter. Company filters reduce the retrievable item cap; see README.

## `company_domain` (type: `string`):

Company website domain in valid DNS form, for example ibm.com. Company filters reduce the retrievable item cap; see README.

## `category` (type: `string`):

Job category. Maximum 100 characters.

## `sub_category` (type: `string`):

More specific job function or role.

## `industry` (type: `string`):

Company industry. Maximum 100 characters. Example: Food Products or Hotels and Restaurants.

## `posted` (type: `string`):

Relative posting age, such as 1h, 1d, 1w, 1m, or an ISO date: YYYY, YYYY-MM, YYYY-MM-DD.

## `employment_type` (type: `string`):

Employment type, for example Full-Time. Comma-separated values are supported; each value can be up to 31 characters.

## `remote` (type: `string`):

Work arrangement filter. Supported values: remote, on-site, hybrid.

## `seniority` (type: `string`):

Seniority level, for example Junior, Middle, Senior. Comma-separated values are supported; each value can be up to 31 characters.

## `page` (type: `integer`):

Page number. Starts from 0. Pagination is capped by query shape: no company filter up to 1000 items, company filter with another filter up to 20 items, company filter only up to 5 items.

## `size` (type: `integer`):

Number of results per page. Default 5, min 1, max 100. Effective maximum can be lower for company-filtered queries; see README.

## Actor input object example

```json
{
  "what": "",
  "country": "France",
  "region": "",
  "city": "",
  "postal_code": "",
  "metro_area": "",
  "title": "",
  "company_name": "",
  "company_domain": "",
  "category": "",
  "sub_category": "",
  "industry": "",
  "posted": "",
  "employment_type": "",
  "remote": "",
  "seniority": "",
  "page": 0,
  "size": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `meta` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("aspen-technology-labs-inc/france-jobs-api").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("aspen-technology-labs-inc/france-jobs-api").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 aspen-technology-labs-inc/france-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=aspen-technology-labs-inc/france-jobs-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "France Jobs API",
        "description": "Find job postings in France by role, structured location, company, category, salary, posting age, employment type, remote status, and seniority.",
        "version": "0.1",
        "x-build-id": "fznHXHJkYpb1yYoxy"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/aspen-technology-labs-inc~france-jobs-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-aspen-technology-labs-inc-france-jobs-api",
                "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/aspen-technology-labs-inc~france-jobs-api/runs": {
            "post": {
                "operationId": "runs-sync-aspen-technology-labs-inc-france-jobs-api",
                "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/aspen-technology-labs-inc~france-jobs-api/run-sync": {
            "post": {
                "operationId": "run-sync-aspen-technology-labs-inc-france-jobs-api",
                "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": {
                    "salary": {
                        "title": "Salary filter",
                        "type": "string",
                        "description": "Salary amount/range filter. Format: 1-9 digits followed by y, m, w, d, or h; optional range A-B. Examples: 20h-30h, 35h, 20h-200000y."
                    },
                    "what": {
                        "title": "Job search query",
                        "type": "string",
                        "description": "Main job search query. Supports keywords, exact phrases, boolean logic (AND, OR, NOT or &, |, !), and field targeting. Maximum 700 raw URL chars or 500 decoded chars. Examples: python developer OR junior javascript, \"data scientist\", @(title) (manager).",
                        "default": ""
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Fixed preset. Runtime always uses `France`; changes are ignored.",
                        "default": "France"
                    },
                    "region": {
                        "title": "Region",
                        "type": "string",
                        "description": "State, province, or region. Maximum 80 characters.",
                        "default": ""
                    },
                    "city": {
                        "title": "City",
                        "type": "string",
                        "description": "City filter. Maximum 100 characters.",
                        "default": ""
                    },
                    "postal_code": {
                        "title": "Postal code",
                        "type": "string",
                        "description": "Postal or ZIP code. Maximum 20 characters.",
                        "default": ""
                    },
                    "metro_area": {
                        "title": "Metro area",
                        "type": "string",
                        "description": "Metropolitan area filter. Maximum 100 characters. Example: Denver-Aurora-Centennial, CO.",
                        "default": ""
                    },
                    "title": {
                        "title": "Job title",
                        "type": "string",
                        "description": "Job title filter. Maximum 200 characters.",
                        "default": ""
                    },
                    "company_name": {
                        "title": "Company name",
                        "type": "string",
                        "description": "Company name filter. Company filters reduce the retrievable item cap; see README.",
                        "default": ""
                    },
                    "company_domain": {
                        "title": "Company domain",
                        "type": "string",
                        "description": "Company website domain in valid DNS form, for example ibm.com. Company filters reduce the retrievable item cap; see README.",
                        "default": ""
                    },
                    "category": {
                        "title": "Category",
                        "type": "string",
                        "description": "Job category. Maximum 100 characters.",
                        "default": ""
                    },
                    "sub_category": {
                        "title": "Sub-category",
                        "type": "string",
                        "description": "More specific job function or role.",
                        "default": ""
                    },
                    "industry": {
                        "title": "Industry",
                        "type": "string",
                        "description": "Company industry. Maximum 100 characters. Example: Food Products or Hotels and Restaurants.",
                        "default": ""
                    },
                    "posted": {
                        "title": "Posted time frame",
                        "type": "string",
                        "description": "Relative posting age, such as 1h, 1d, 1w, 1m, or an ISO date: YYYY, YYYY-MM, YYYY-MM-DD.",
                        "default": ""
                    },
                    "employment_type": {
                        "title": "Employment type",
                        "type": "string",
                        "description": "Employment type, for example Full-Time. Comma-separated values are supported; each value can be up to 31 characters.",
                        "default": ""
                    },
                    "remote": {
                        "title": "Remote / work arrangement",
                        "enum": [
                            "",
                            "remote",
                            "on-site",
                            "hybrid"
                        ],
                        "type": "string",
                        "description": "Work arrangement filter. Supported values: remote, on-site, hybrid.",
                        "default": ""
                    },
                    "seniority": {
                        "title": "Seniority",
                        "type": "string",
                        "description": "Seniority level, for example Junior, Middle, Senior. Comma-separated values are supported; each value can be up to 31 characters.",
                        "default": ""
                    },
                    "page": {
                        "title": "Page number",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Page number. Starts from 0. Pagination is capped by query shape: no company filter up to 1000 items, company filter with another filter up to 20 items, company filter only up to 5 items.",
                        "default": 0
                    },
                    "size": {
                        "title": "Page size",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Number of results per page. Default 5, min 1, max 100. Effective maximum can be lower for company-filtered queries; see README.",
                        "default": 5
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
