# Meteojob Search Scraper (`jobsapi/meteojob-jobs-search-scraper`) Actor

Extract rich Meteojob listings with structured descriptions, locations, contracts, experience, qualifications, and publication metadata.

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

## Pricing

from $2.99 / 1,000 job details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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 Search Scraper

This Apify Actor fetches public jobs from the official [Meteojob](https://www.meteojob.com) search and detail pages. The extraction path uses bounded native HTTPS and Cheerio; it does not use a browser, proxy, mirror, fingerprint spoofing, or access-control bypass.

### Modes

- `search` requests the official `/jobs?what=...&where=...` SSR page, parses current offer cards, then fetches selected `/jobs/<numeric-id>` detail pages.
- `single` fetches one exact official detail URL.
- `multiple` fetches several exact official detail URLs.

Detail records combine the official `JobPosting` JSON-LD with the official `candidate-front-state` job-offer payload. This captures title, company, rich descriptions, profile and company text, benefits, location coordinates and country data, contracts, salary, job taxonomy, experience, skills/languages, synonyms, telework/travel labels, publication dates, and source provenance. Incomplete rows are omitted and diagnostics are stored only in `RUN_DIAGNOSTICS`.

### Input

```json
{
  "mode": "search",
  "query": "developpeur",
  "location": "Paris",
  "maxItems": 3,
  "maxCandidates": 20,
  "maxRequests": 20,
  "timeoutMs": 15000,
  "deadlineMs": 120000,
  "retries": 1,
  "includeDescription": true
}
```

For `single`, provide `jobUrl`; for `multiple`, provide `jobUrls`. Compatibility aliases `url` and `urls` are accepted. Detail URLs must be official HTTPS `https://www.meteojob.com/jobs/<numeric-id>` URLs.

`includeDescription: false` retains the required text description while omitting optional HTML, section, and bullet arrays. The request count, retries, and total wall-clock run are bounded.

Meteojob’s current apply control is rendered as a client-side button. The actor therefore preserves `directApply` and the application method when published by the source, but does not fabricate an `applyUrl` from the job URL.

### Local verification

```text
npm ci --ignore-scripts --no-audit --no-fund
npm run check
npm test
npm run lint
npx --yes apify-cli validate-schema .actor/input_schema.json
npx --yes apify-cli run --purge --input-file INPUT.json
npm run validate
```

`INPUT-search-global.json`, `INPUT-single.json`, `INPUT-multiple.json`, `INPUT-no-description.json`, and `INPUT-negative.json` provide reproducible local checks. Run evidence is written to `RUN_SUMMARY`, `RUN_DIAGNOSTICS`, `RUN_REQUESTS`, `RUN_HEALTH`, and `RUN_METADATA` in the default local key-value store.

### Cost and responsible use

Request, candidate, item, retry, and wall-clock limits keep runs predictable. Begin with the small defaults; search mode uses one listing request plus one detail request per candidate until `maxItems` is reached. The Actor reads public pages only. Follow Meteojob's terms and applicable privacy and data-use laws.

# Actor input Schema

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

Search the official listing or fetch exact Meteojob detail URLs.

## `query` (type: `string`):

French job title, skill, or keyword.

## `location` (type: `string`):

Optional French city or region, for example Paris.

## `jobUrl` (type: `string`):

Official HTTPS Meteojob /jobs/<numeric-id> URL.

## `jobUrls` (type: `array`):

Official HTTPS detail URLs used by multiple mode.

## `url` (type: `string`):

Alias for jobUrl.

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

Alias for jobUrls.

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

Maximum complete records written to the dataset.

## `maxCandidates` (type: `integer`):

Maximum listing/detail candidates considered.

## `maxRequests` (type: `integer`):

Hard upper bound on direct official HTTPS requests, including retries.

## `timeoutMs` (type: `integer`):

Maximum wait for one official request.

## `deadlineMs` (type: `integer`):

Hard wall-clock bound for the complete run.

## `retries` (type: `integer`):

Small bounded retry count for transient direct requests.

## `includeDescription` (type: `boolean`):

Keep required text and omit optional HTML/section arrays when false.

## Actor input object example

```json
{
  "mode": "search",
  "query": "developpeur",
  "location": "",
  "maxItems": 3,
  "maxCandidates": 20,
  "maxRequests": 20,
  "timeoutMs": 15000,
  "deadlineMs": 120000,
  "retries": 1,
  "includeDescription": true
}
```

# Actor output Schema

## `dataset` (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 = {
    "query": "developpeur"
};

// Run the Actor and wait for it to finish
const run = await client.actor("jobsapi/meteojob-jobs-search-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 = { "query": "developpeur" }

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

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

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

```

## CLI example

```bash
echo '{
  "query": "developpeur"
}' |
apify call jobsapi/meteojob-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobsapi/meteojob-jobs-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0oYT0gjVNp7M9Jz4T/builds/1g2v0YgbNLXRgfF9h/openapi.json
