# Meteojob Jobs Scraper | 1$/1k Cheap (`trev0n/meteojob-scraper`) Actor

Scrapes job listings from Meteojob.com - one of France's largest employment platforms. API-based, fast and reliable, with rich filters and 50+ output fields.

- **URL**: https://apify.com/trev0n/meteojob-scraper.md
- **Developed by:** [Paweł](https://apify.com/trev0n) (community)
- **Categories:** Jobs, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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

## 💼 Meteojob Jobs Scraper

🎯 **Pull thousands of fresh French job listings from Meteojob.com — fully structured, ready to analyze, with salaries, contracts, locations and recruiter details in every record.**

This scraper turns Meteojob — one of France's largest job boards — into a clean dataset. Search by keyword, city, contract type or salary, and get back rich job offers: titles, full descriptions, compensation ranges, company and recruiter info, locations with coordinates, freshness signals and more. Perfect for recruiters, HR analysts and job-board builders.

### 🚀 What Does It Do?

This scraper automatically collects **structured, ready-to-use data** from Meteojob.com. No manual browsing needed — just set your filters and hit Start.

💡 **Two modes of operation:**

1. **🔍 Discovery Mode** — Enter keywords, locations and filters. The scraper finds every matching offer, paginates through all results and returns each one fully structured.
2. **📋 Direct URL Mode** — Already have Meteojob search links or specific offer pages? Paste them in and the scraper extracts them exactly, page by page.

### 👥 Who Is This For?

| 🏢 Use Case | 💬 How It Helps |
| --- | --- |
| 📊 **Recruiters & staffing agencies** | Monitor the French market in real time and spot who is hiring for which roles |
| 💰 **HR & compensation analysts** | Benchmark salary ranges across sectors, regions and contract types |
| 🧩 **Job-board & aggregator builders** | Feed clean, normalized offers straight into your own platform |
| 🎓 **Labor-market researchers** | Track hiring demand by region, industry and employment type over time |
| 📈 **Sales & lead-gen teams** | Build lists of companies actively recruiting in a given niche |
| 🤖 **Data & AI teams** | Source structured job text for NLP, skill extraction and trend models |

### ✨ Features

- 🌐 **Whole-board coverage** — Reach every public Meteojob offer, not just the first page
- 🔑 **Keyword search** — Run many keywords at once; results are merged and de-duplicated
- 📍 **Location filtering** — Filter by any French city or region, geocoded automatically
- 📑 **Contract-type filtering** — CDI, CDD, internship, apprenticeship, interim and more
- 💶 **Salary & freshness filters** — Minimum salary and "published in the last N days"
- 🧠 **Rich data per offer** — Salary, experience, skills, recruiter, company, geo-coordinates
- 🎛️ **Smart Filters** — Keyword, location, contract type, salary, recency and sort order
- 🔁 **Optional deep details** — One click to enrich every offer with skills, synonyms and job cluster
- ⚡ **Fast & Scalable** — Thousands of offers per run, straight from the source
- 🧹 **Deduplication** — The same offer is never returned twice in a run
- 📤 **Export Anywhere** — Download results as JSON, CSV, Excel, or push to Google Sheets, Zapier, Make, or your CRM

### 🎛️ Filters & Options

| Option | What It Does |
| --- | --- |
| 🏷️ **Search keywords** | One or more job keywords; each runs as its own search |
| 📍 **Locations** | City / region names to restrict results to, geocoded for you |
| 📑 **Contract types** | Keep only CDI, CDD, internship, apprenticeship, interim, etc. |
| 💶 **Minimum salary** | Drop offers below a target annual salary |
| 🗓️ **Published since** | Keep only offers posted within the last N days |
| ↕️ **Sort order** | Best match (relevance) or newest first |
| 🔬 **Fetch full details** | Add skills, synonyms and job cluster to every offer |
| 🔢 **Max Results** | Control how many items to extract per search and in total |
| 🔗 **Direct URLs** | Optionally provide specific Meteojob search or offer URLs to scrape |

### 📦 What You Get (Output Fields)

Every job offer includes:

#### Identification & Dates

| Field | Example |
| --- | --- |
| id | `53817605` |
| reference | `DEV-PY-2026-0142` |
| externalReference | `ATS-99812` |
| status | `PUBLISHED` |
| publicationDate | `2026-06-28T09:14:00.000Z` |
| lastModification | `2026-06-29T07:02:11.000Z` |

#### Job Content

| Field | Example |
| --- | --- |
| title | `Développeur Python (H/F)` |
| description | `Au sein de notre équipe data, vous concevez et maintenez des services back-end...` |
| profileDescription | `Vous maîtrisez Python, les API REST et au moins une base SQL...` |
| companyDescription | `Cabinet de recrutement spécialisé dans les métiers de la tech...` |
| contentLanguage | `fr` |
| metaTitle | `Emploi Développeur Python (H/F) - Lyon` |
| metaDescription | `Postulez à l'offre Développeur Python à Lyon en CDI sur Meteojob.` |

#### Classification

| Field | Example |
| --- | --- |
| mainJob | `Développeur Python (H/F)` |
| mainJobId | `11559` |
| mainJobExecutive | `true` |
| jobs | `["Développeur Python", "Ingénieur logiciel"]` |
| jobCategories | `["Informatique / Développement"]` |
| jobType | `["FULL_TIME"]` |
| contractTypes | `["CDI"]` |
| permanent | `true` |

#### Salary & Requirements

| Field | Example |
| --- | --- |
| salaryFrom | `50000` |
| salaryTo | `60000` |
| salaryCurrency | `EUR` |
| salaryPeriod | `ANNUM` |
| salaryDisplay | `BETWEEN` |
| experienceInJobRequired | `3` |
| drivingLicence | `["LICENSE_B"]` |
| skills | `["DEVOPS", "REST-API", "POSTGRESQL"]` |

#### Location

| Field | Example |
| --- | --- |
| locationName | `Lyon (69)` |
| city | `Lyon` |
| department | `Rhône` |
| region | `Auvergne-Rhône-Alpes` |
| country | `France` |
| latitude | `45.74846` |
| longitude | `4.84671` |

#### Company & Recruiter

| Field | Example |
| --- | --- |
| company | `ADSEARCH` |
| companyId | `26784` |
| industryField | `Recrutement et placement` |
| recruiter | `null` |
| publisher | `ADSEARCH` |
| anonymous | `false` |

#### Relevance Signals & URLs

| Field | Example |
| --- | --- |
| score | `0.8742` |
| temperature | `87` |
| top | `false` |
| offerPremium | `true` |
| jobOfferUrl | `https://www.meteojob.com/jobs/53817605` |
| logoUrl | `https://www.meteojob.com/images/4/8/7/26784_IMAGE_SMALL.png` |

### 📊 Example Output

```json
{
    "id": "53817605",
    "reference": "DEV-PY-2026-0142",
    "externalReference": "ATS-99812",
    "status": "PUBLISHED",
    "publicationDate": "2026-06-28T09:14:00.000Z",
    "lastModification": "2026-06-29T07:02:11.000Z",
    "title": "Développeur Python (H/F)",
    "description": "Au sein de notre équipe data, vous concevez et maintenez des services back-end...",
    "profileDescription": "Vous maîtrisez Python, les API REST et au moins une base SQL...",
    "companyDescription": "Cabinet de recrutement spécialisé dans les métiers de la tech...",
    "contentLanguage": "fr",
    "mainJob": "Développeur Python (H/F)",
    "mainJobId": 11559,
    "mainJobExecutive": true,
    "jobs": ["Développeur Python", "Ingénieur logiciel"],
    "jobCategories": ["Informatique / Développement"],
    "jobType": ["FULL_TIME"],
    "contractTypes": ["CDI"],
    "permanent": true,
    "salaryFrom": 50000,
    "salaryTo": 60000,
    "salaryCurrency": "EUR",
    "salaryPeriod": "ANNUM",
    "salaryDisplay": "BETWEEN",
    "experienceInJobRequired": 3,
    "drivingLicence": [],
    "skills": ["DEVOPS", "REST-API", "MONGODB", "POSTGRESQL"],
    "locationName": "Lyon (69)",
    "city": "Lyon",
    "department": "Rhône",
    "region": "Auvergne-Rhône-Alpes",
    "country": "France",
    "latitude": 45.74846,
    "longitude": 4.84671,
    "company": "ADSEARCH",
    "companyId": 26784,
    "industryField": "Recrutement et placement",
    "recruiter": null,
    "publisher": "ADSEARCH",
    "anonymous": false,
    "score": 0.8742,
    "temperature": 87,
    "top": false,
    "offerPremium": true,
    "jobOfferUrl": "https://www.meteojob.com/jobs/53817605",
    "redirectUrl": null,
    "logoUrl": "https://www.meteojob.com/images/4/8/7/26784_IMAGE_SMALL.png",
    "sourcePlatform": "meteojob.com",
    "searchQuery": "développeur",
    "detailFetched": false,
    "scrapedAt": "2026-06-29T12:00:00.000Z"
}
````

### 📋 Dataset Views

The Apify Console gives you **3 ready-made table views** to quickly browse your results:

| View | What It Shows |
| --- | --- |
| 📊 **Overview** | Title, company, city, region, contract, salary and the offer link |
| 💰 **Salary & Contract** | Compensation, employment type and experience side by side |
| 📋 **Full Details** | Every single field — the complete dataset |

### ❓ FAQ

**🤔 Which jobs can I scrape?**
Any public listing on Meteojob.com — across every sector, region and contract type. Filter by keyword, location, salary and recency, or paste your own search URLs.

**🤔 Do I get the full job description?**
Yes. Every offer comes with its complete description, candidate profile and company description. Turn on "Fetch full details" to also collect skills, synonyms and the job cluster.

**🤔 How fresh is the data?**
It is scraped live at run time. Use the "Published since" filter to keep only the newest offers, and schedule daily runs for continuous monitoring.

**🤔 Can I export the data?**
Yes — JSON, CSV, Excel, XML, HTML, RSS. You can also push data directly to Google Sheets, Zapier, Make, or any webhook/API endpoint.

**🤔 How often should I run this?**
For fresh data, run daily or weekly. You can schedule automatic runs on Apify with just a few clicks.

**🤔 Does it work with proxies?**
Yes — the scraper works with Apify's built-in proxy service. French residential proxies are recommended for the largest runs.

### 🛠️ Need Custom Filters or Features?

**I'm happy to customize this scraper for your specific needs!** 🤝

Whether you need:

- 🎯 Additional filters (industry sector, experience level, remote-only, specific recruiters)
- 📊 Extra data fields or custom output formats
- 🔄 Integration with your CRM, Google Sheets, or database
- ⏰ Scheduled scraping with automatic deduplication of new offers
- 🌐 Scraping from other job platforms alongside Meteojob

👉 **Don't hesitate to reach out via private message** — I respond quickly and I'm always open to building exactly what you need. No request is too small or too specific!

### ⚖️ Legal & Ethical Use

This scraper collects **only publicly available information** from Meteojob.com. It does not access private data, bypass authentication, or log into any account. Please use the data responsibly and in compliance with applicable laws and platform terms of service.

# Actor input Schema

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

One or more job keywords (e.g. 'développeur', 'comptable', 'infirmier'). Each keyword runs as a separate search and results are de-duplicated across all keywords. Leave empty to scrape all jobs (optionally narrowed by location and filters).

## `locations` (type: `array`):

City / region names to filter by (e.g. 'Paris', 'Lyon', 'Bordeaux'). Each name is geocoded automatically. Leave empty for all of France.

## `contractTypes` (type: `array`):

Filter by contract type. Combine several to widen the search.

## `salaryMin` (type: `integer`):

Only return offers whose advertised annual salary is at or above this amount. Leave empty to ignore salary.

## `publishedSinceDays` (type: `integer`):

Only return offers published within the last N days. Leave empty for all currently online offers.

## `sort` (type: `string`):

Result ordering. 'relevance' = best match first (default), 'date' = newest first.

## `fetchDetails` (type: `boolean`):

Search results already include the full job description. Enable this to make one extra request per offer to additionally collect skills, synonyms and the job cluster. Slower and costs more — leave off unless you need those fields.

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

Optional. Paste Meteojob search URLs (e.g. https://www.meteojob.com/jobs?what=comptable\&where=Lyon) or single-offer URLs (https://www.meteojob.com/jobs/53817605). Search URLs are scraped page by page; offer URLs are scraped (and their live status reported) one by one.

## `extraParams` (type: `object`):

Power-user passthrough of raw search API query parameters (e.g. {"jobType": "FULL\_TIME"}). Most users can leave this empty.

## `maxItemsPerSearch` (type: `integer`):

Maximum number of offers to scrape per keyword / URL. Set to 0 for unlimited per search.

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

Maximum total number of offers across all searches. Set to 0 for unlimited.

## `ignoreUrlFailures` (type: `boolean`):

Continue the run if an individual URL or page fails instead of aborting the whole job. Recommended when scraping many URLs.

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

Maximum number of parallel requests.

## `maxRequestRetries` (type: `integer`):

Maximum number of retries for failed requests (exponential backoff handles occasional rate limiting).

## `maxRequestsPerMinute` (type: `integer`):

Throttle to stay under the site's rate limit.

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

Proxy settings. The API is usually reachable without a proxy, but French residential proxies improve reliability for large runs.

## Actor input object example

```json
{
  "keywords": [
    "développeur"
  ],
  "sort": "relevance",
  "fetchDetails": false,
  "extraParams": {},
  "maxItemsPerSearch": 100,
  "maxItems": 0,
  "ignoreUrlFailures": true,
  "maxConcurrency": 10,
  "maxRequestRetries": 4,
  "maxRequestsPerMinute": 90,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "keywords": [
        "développeur"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trev0n/meteojob-scraper").call(input);

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = { "keywords": ["développeur"] }

# Run the Actor and wait for it to finish
run = client.actor("trev0n/meteojob-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keywords": [
    "développeur"
  ]
}' |
apify call trev0n/meteojob-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Meteojob Jobs Scraper | 1$/1k Cheap",
        "description": "Scrapes job listings from Meteojob.com - one of France's largest employment platforms. API-based, fast and reliable, with rich filters and 50+ output fields.",
        "version": "1.0",
        "x-build-id": "33tBuLdGuXVeCAZ5f"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trev0n~meteojob-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trev0n-meteojob-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/trev0n~meteojob-scraper/runs": {
            "post": {
                "operationId": "runs-sync-trev0n-meteojob-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/trev0n~meteojob-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-trev0n-meteojob-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "One or more job keywords (e.g. 'développeur', 'comptable', 'infirmier'). Each keyword runs as a separate search and results are de-duplicated across all keywords. Leave empty to scrape all jobs (optionally narrowed by location and filters).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "City / region names to filter by (e.g. 'Paris', 'Lyon', 'Bordeaux'). Each name is geocoded automatically. Leave empty for all of France.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "contractTypes": {
                        "title": "Contract types",
                        "type": "array",
                        "description": "Filter by contract type. Combine several to widen the search.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "CDI",
                                "CDD",
                                "INTERIM",
                                "TRAINING",
                                "APPRENTICE",
                                "INDEPEDENT",
                                "SEASONAL",
                                "INTERMIT",
                                "CDIC",
                                "TFP",
                                "VIE",
                                "MILITARY",
                                "CTTEE",
                                "EXTRA",
                                "VOLUNTEERING",
                                "CDI_INTERIMAIRE",
                                "CIDD"
                            ],
                            "enumTitles": [
                                "CDI (permanent)",
                                "CDD (fixed-term)",
                                "Intérim (temp work)",
                                "Stage (internship)",
                                "Alternance / Apprenticeship",
                                "Indépendant / Franchise",
                                "Saisonnier (seasonal)",
                                "CDI Intermittent",
                                "CDIC",
                                "Public servant",
                                "VIE - VTE",
                                "Military",
                                "Educational engagement",
                                "Extra",
                                "Volunteering",
                                "CDI Intérimaire",
                                "Fixed-term intervention"
                            ]
                        }
                    },
                    "salaryMin": {
                        "title": "Minimum annual salary (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only return offers whose advertised annual salary is at or above this amount. Leave empty to ignore salary."
                    },
                    "publishedSinceDays": {
                        "title": "Published in the last N days",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Only return offers published within the last N days. Leave empty for all currently online offers."
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Result ordering. 'relevance' = best match first (default), 'date' = newest first.",
                        "default": "relevance"
                    },
                    "fetchDetails": {
                        "title": "Fetch full offer details",
                        "type": "boolean",
                        "description": "Search results already include the full job description. Enable this to make one extra request per offer to additionally collect skills, synonyms and the job cluster. Slower and costs more — leave off unless you need those fields.",
                        "default": false
                    },
                    "startUrls": {
                        "title": "Direct Meteojob URLs",
                        "type": "array",
                        "description": "Optional. Paste Meteojob search URLs (e.g. https://www.meteojob.com/jobs?what=comptable&where=Lyon) or single-offer URLs (https://www.meteojob.com/jobs/53817605). Search URLs are scraped page by page; offer URLs are scraped (and their live status reported) one by one.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "extraParams": {
                        "title": "Advanced: extra query params",
                        "type": "object",
                        "description": "Power-user passthrough of raw search API query parameters (e.g. {\"jobType\": \"FULL_TIME\"}). Most users can leave this empty.",
                        "default": {}
                    },
                    "maxItemsPerSearch": {
                        "title": "Max items per search",
                        "minimum": 0,
                        "maximum": 200000,
                        "type": "integer",
                        "description": "Maximum number of offers to scrape per keyword / URL. Set to 0 for unlimited per search.",
                        "default": 100
                    },
                    "maxItems": {
                        "title": "Max items (total)",
                        "minimum": 0,
                        "maximum": 200000,
                        "type": "integer",
                        "description": "Maximum total number of offers across all searches. Set to 0 for unlimited.",
                        "default": 0
                    },
                    "ignoreUrlFailures": {
                        "title": "Ignore URL failures",
                        "type": "boolean",
                        "description": "Continue the run if an individual URL or page fails instead of aborting the whole job. Recommended when scraping many URLs.",
                        "default": true
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum number of parallel requests.",
                        "default": 10
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum number of retries for failed requests (exponential backoff handles occasional rate limiting).",
                        "default": 4
                    },
                    "maxRequestsPerMinute": {
                        "title": "Max requests per minute",
                        "minimum": 10,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Throttle to stay under the site's rate limit.",
                        "default": 90
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. The API is usually reachable without a proxy, but French residential proxies improve reliability for large runs.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
