# InfoJobs Scraper: Spain Jobs, Salaries and Applicants (`themineworks/infojobs-scraper`) Actor

Scrape InfoJobs (infojobs.net) job offers in Spain by keyword and province: title, company, salary range with period, contract, workday, remote or hybrid, applicants, minimum experience and studies, skills, publish date and full description. No login.

- **URL**: https://apify.com/themineworks/infojobs-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 1,000 jobs

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## InfoJobs Scraper: Spain Jobs, Salaries and Applicants

[![300 InfoJobs offers in 125 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/infojobs-scraper-hero.png)](https://console.apify.com/actors/K0BQRZ8XSIUwokw0C/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

### Why choose this actor?

- **Every offer as a full row, not a half filled card.** The job title, the company, the town and province, the salary as numbers with its period, the contract, the workday, remote or on site, the number of applicants, the minimum experience and studies, the skills and the full description. Our final test run (programador, camarero and enfermera across Spain, 100 each) returned 300 offers from 40 provinces in 125 seconds, with title, company, link, location, applicants, experience and studies filled on all 300.
- **The same input as other InfoJobs scrapers, so you can switch in a minute.** `queries`, `location` and `maxResults` keep the names, types and defaults other popular InfoJobs scrapers use, so you can paste your current input JSON and press Start. The output keeps the familiar `title`, `company`, `url`, `location` and `query` fields, filled with what their names say: the job title in `title`, the company in `company`.
- **No login, no cookies, and you pay only for offers you receive.** A page the site did not answer, a search with no results, an offer found by two of your queries in the same run and, with `onlyNewJobs`, an offer an earlier run already gave you are never charged. A bad location stops the run before anything is charged, the start fee included.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/K0BQRZ8XSIUwokw0C/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Jobs and hiring family:** [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Shine.com Jobs Scraper](https://apify.com/themineworks/shine-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Internshala Scraper](https://apify.com/themineworks/internshala-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns 10 programmer offers in the province of Madrid in about 10 seconds:

```json
{
  "queries": ["programador"],
  "location": "madrid",
  "maxResults": 10
}
```

`queries` takes job titles or skills, one per line, as you would type them on infojobs.net (`programador`, `camarero`, `enfermera`, `comercial`), `*` for every offer that matches your filters, or an InfoJobs search URL copied from your browser. `location` takes a province in Spanish or English (`madrid`, `sevilla` or `seville`, `vizcaya` or `biscay`), a large town (`bilbao`, `vigo`, `malaga`), a region (`andalucia`, `cataluna`, `galicia`) or several separated by commas; leave it empty for all of Spain.

Apify's free plan includes $5 of credit every month, which covers about 2,700 results at this actor's price.

#### Copy to your AI assistant

```text
themineworks/infojobs-scraper on Apify. Scrapes job offers from InfoJobs (infojobs.net, Spain), one row per offer with title, company, offer link, location, the query that found it, offer id, company profile link, town, province and postal code, salary text with minimum, maximum, period, currency and gross or net, contract type, workday, remote or on site, minimum experience and studies, number of applicants, vacancies, job level, category, skills, languages, company rating, publication date and full description. Call ApifyClient("TOKEN").actor("themineworks/infojobs-scraper").call(run_input={"queries": ["programador"], "location": "madrid", "maxResults": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: queries (list of job titles or skills, "*" for every offer, or InfoJobs search URLs). Optional: location (province, large town or region in Spanish or English, several separated by commas; default "" = all of Spain), maxResults (per query, 10 to 5000, default 10), includeDetails (default true: reads each offer page for province, applicants, experience, studies, skills), postedWithin ("any", "24h", "7d", "15d"), sortBy ("relevance", "newest"), contractTypes (list of "permanent", "fixed_term", "seasonal_permanent", "self_employed", "training", "part_time_contract", "relief", "other"), workMode ("any", "remote", "hybrid", "remote_or_hybrid", "on_site"), workday ("any", "full_time", "part_time", "intensive"), onlyNewJobs (default false). Full spec: GET https://api.apify.com/v2/acts/themineworks~infojobs-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Up to 47 fields per offer.** 26 come from the search results (title, company, link, town, salary as numbers and as text, contract, workday, remote or on site, date, promoted flag, full description) and 21 more from each offer's own page: province, postal code, applicants, vacancies, minimum experience, minimum studies, job level, category and subcategory, industry, skills, languages, requirements, benefits and the company's rating on InfoJobs.
- **Province, town or region, in Spanish or English.** InfoJobs filters by province. The actor knows all 52 Spanish provinces by their Spanish, co official and English names (`Biscay`, `Seville`, `Balearic Islands`, `A Coruña` or `La Coruña`), about 50 large towns and the islands (`Bilbao` searches Vizcaya/Bizkaia, `Mallorca` the Balearic Islands) and the autonomous communities (`Catalonia` searches its four provinces).
- **The site's own filters.** Published in the last 24 hours, 7 or 15 days; contract type (permanent, fixed term, seasonal permanent, self employed and more); remote, hybrid or on site; full time, part time or intensive workday; sorted by relevance or newest first.
- **From 10 to 5,000 offers per query, up to 100 queries per run.** A search page holds 20 offers. Deep pages work: page 200 of a search for every offer in Spain answered in our tests.
- **No double charging.** InfoJobs shows promoted offers again further down the results, and the same offer often matches two of your queries. Each offer is delivered and charged once per run.
- **Only new offers on a schedule.** With `onlyNewJobs`, a daily run returns and charges only offers it has not delivered to you before.

### How to use it

#### Basic: one job title in one province

The same input other InfoJobs scrapers take. Raise `maxResults` for more offers:

```json
{
  "queries": ["programador"],
  "location": "madrid",
  "maxResults": 10
}
```

#### Several job titles at once, all of Spain

Each query is its own search with its own `maxResults`. Our final test run of this input returned 300 offers from 40 provinces in 125 seconds, with every offer page read:

```json
{
  "queries": ["programador", "camarero", "enfermera"],
  "location": "",
  "maxResults": 100
}
```

#### Job: daily alerts for new offers

Offers published in the last 24 hours in Barcelona, newest first, and only those not delivered before. Save it as a task and add a daily schedule (Console > Schedules); each run returns and charges only new offers, and a run with nothing new costs only the start fee.

```json
{
  "queries": ["enfermera", "auxiliar de enfermería"],
  "location": "barcelona",
  "postedWithin": "24h",
  "sortBy": "newest",
  "onlyNewJobs": true,
  "maxResults": 100
}
```

#### Job: salary benchmark for one role across a region

Every electrician offer in Andalusia's eight provinces, with `salary_min`, `salary_max` and `salary_period` (`year`, `month` or `hour`) as numbers, plus experience and studies asked. Group by `province` and `salary_period` in a sheet for a pay range per province. Only offers where the company shows a salary carry the numbers: 141 of the 300 offers in our final test run did.

```json
{
  "queries": ["electricista"],
  "location": "andalucia",
  "maxResults": 300
}
```

#### Job: remote tech roles for a talent newsletter

Remote only, several stacks, permanent contracts. `skills` and `languages` come from each offer page.

```json
{
  "queries": ["python", "java", "devops", "frontend"],
  "workMode": "remote",
  "contractTypes": ["permanent"],
  "maxResults": 100
}
```

#### Job: companies hiring this week, as a lead list

Sales roles in Valencia published in the last 7 days. Each row carries the company, its InfoJobs profile link, the town, the number of applicants and the vacancies, so a staffing or HR software team can see who is hiring now and how hard. Run it weekly with `onlyNewJobs` for only the new openings.

```json
{
  "queries": ["comercial", "televenta"],
  "location": "valencia",
  "postedWithin": "7d",
  "maxResults": 200
}
```

#### Paste a search from your browser

Set the filters on infojobs.net, copy the address of the results page and paste it as a query. Its own filters are kept on every page (in our test, page 2 of a Barcelona waiter search stayed in Barcelona).

```json
{
  "queries": ["https://www.infojobs.net/ofertas-trabajo/barcelona/camarero"],
  "maxResults": 30
}
```

#### Faster runs with the search results only

Turn off `includeDetails` to skip the offer pages: no province (unless you filter by one province), applicants, experience, studies or skills, but every search result field, the full description included. In our test, 10 electrician offers in Valencia took 6 seconds.

```json
{
  "queries": ["electricista"],
  "location": "valencia",
  "includeDetails": false,
  "sortBy": "newest",
  "maxResults": 10
}
```

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `queries` | array of strings | `["programador"]` | Job titles or skills, one search each; `*` for every offer that matches the filters; or InfoJobs search URLs, whose own filters are kept. Required. Up to 100 per run. |
| `location` | string | `""` | Province, large town or region, in Spanish or English, several separated by commas. Empty means all of Spain. An unknown name stops the run with a list of the provinces, before anything is charged. `remoto` or `remote` turns on the remote filter. |
| `maxResults` | integer | `10` | Most offers per query, from 10 to 5,000. |
| `includeDetails` | boolean | `true` | Read each offer's page for province, postal code, applicants, minimum experience and studies, skills, languages, category, job level, vacancies, benefits and company rating. |
| `postedWithin` | string | `"any"` | `any`, `24h`, `7d` or `15d`, the site's own date filter. |
| `sortBy` | string | `"relevance"` | `relevance` or `newest`. A `*` search is always newest first. |
| `contractTypes` | array of strings | none | Any of `permanent`, `fixed_term`, `seasonal_permanent`, `self_employed`, `training`, `part_time_contract`, `relief`, `other`. Empty means any contract. |
| `workMode` | string | `"any"` | `any`, `remote`, `hybrid`, `remote_or_hybrid` or `on_site`. |
| `workday` | string | `"any"` | `any`, `full_time`, `part_time` or `intensive`. |
| `onlyNewJobs` | boolean | `false` | Skip offers an earlier run of this actor delivered to you, so a scheduled run returns and charges only new offers. |

### What data do you get?

One row per offer. Fields with no value on an offer are left out of that row rather than filled with blanks.

**The offer:** `title` (the job title as the company wrote it), `url` (the offer page, without tracking parameters), `offer_id`, `query` (the query or search URL that found it), `published_at` (ISO date, UTC), `promoted` (true when the company paid to show it at the top), `short_description` (first 300 characters) and `description` (the full text).

**The company:** `company`, `company_url` (its InfoJobs profile or careers page), `company_logo_url`, `industry`, `company_rating` (out of 5) and `company_reviews` (how many ratings it rests on).

**Where:** `location` (town and province, for example `Vic, Barcelona`), `city`, `province`, `postal_code` and `country`.

**Pay:** `salary_text` exactly as the offer page writes it (a range with gross or net and the period, or `Más de 33.000€` when only a floor is given), `salary_min`, `salary_max`, `salary_period` (`year`, `month` or `hour` in our tests), `salary_currency` (`EUR`) and `salary_type` (`gross` on every salaried offer of our tests, `net` when an offer says so). Only offers where the company shows a salary carry these: 141 of 300 in our final test run.

**Terms:** `contract_type` (`Contrato indefinido`, `Contrato de duración determinada`...), `workday` (`Jornada completa`, `Jornada indiferente`...), `remote_work` as shown (`Presencial`, `Híbrido`, `Solo teletrabajo`, `Sin especificar`) and `work_mode` as a code (`on_site`, `hybrid`, `remote`, `not_specified`), plus `contract_duration` and `working_hours` when the offer gives them.

**The candidate asked for:** `experience_min` (`Al menos 3 años`, `No Requerida`), `studies_min` (`Grado`, `Ciclo Formativo Grado Superior`...), `skills`, `languages` (`Inglés: Avanzado`), `requirements_minimum` and `requirements_desired` (when the company lists them apart from the description), `resident_in`, `job_level` (`Empleado/a`, `Especialista`, `Mando intermedio`...), `category`, `subcategory`, `vacancies` and `benefits`.

**Demand:** `applicants`, the number of people who had applied when the offer page was read. In our final test run the 300 offers had 41,582 applicants between them, up to 1,734 on one offer.

**Run bookkeeping:** `search_rank` (position in its query's results), `search_page`, `scraped_at` and `details_error` (only on a row whose offer page could not be read, saying why).

The offer page fields (`province` when you search several provinces or all of Spain, `postal_code`, `country`, `experience_min`, `studies_min`, `applicants`, `vacancies`, `job_level`, `category`, `subcategory`, `industry`, `skills`, `languages`, `requirements_*`, `benefits`, `company_rating`) need `includeDetails`, which is on by default.

#### Stable fields for automations

These were present in every offer row of our test runs, and their names will not change:

| Field | What it holds |
|---|---|
| `title` | Job title |
| `company` | Company name |
| `url` | Offer page on infojobs.net |
| `location` | Town and province as one text |
| `query` | The query or search URL that found the offer |
| `offer_id` | InfoJobs offer id, stable across runs |
| `company_url` | Company profile on InfoJobs |
| `city` | Town of the job |
| `contract_type` | Contract as shown |
| `workday` | Jornada as shown |
| `published_at` | Publication date, ISO 8601 UTC |
| `short_description` | First 300 characters of the description |
| `description` | Full description as plain text |
| `search_rank` | Position in its query's results |
| `scraped_at` | When the row was read |

With `includeDetails` on (the default), `province`, `experience_min`, `studies_min`, `applicants`, `vacancies`, `job_level` and `category` were also in every row of our final test run.

#### Output examples

Real rows from our test runs on 8 October 2026, descriptions shortened.

A programmer offer in the province of Girona, with the offer page read (the default):

```json
{
  "title": "Programador/a Industrial",
  "company": "ISPROX",
  "url": "https://www.infojobs.net/sant-joan-de-les-abadesses/programador-industrial/of-i781e39ed6846f3ac45b0c73f23b75d",
  "location": "Sant Joan De Les Abadesses, Girona",
  "query": "programador",
  "offer_id": "781e39ed6846f3ac45b0c73f23b75d",
  "company_url": "https://isprox.ofertas-trabajo.infojobs.net",
  "city": "Sant Joan De Les Abadesses",
  "province": "Girona",
  "postal_code": "17860",
  "country": "España",
  "salary_text": "36.000€ - 40.000€ Bruto/año",
  "salary_min": 36000,
  "salary_max": 40000,
  "salary_period": "year",
  "salary_currency": "EUR",
  "salary_type": "gross",
  "contract_type": "Contrato indefinido",
  "workday": "Jornada completa",
  "remote_work": "Presencial",
  "work_mode": "on_site",
  "experience_min": "Al menos 3 años",
  "studies_min": "Ciclo Formativo Grado Superior",
  "applicants": 3,
  "vacancies": 1,
  "job_level": "Especialista",
  "category": "Ingenieros y técnicos",
  "subcategory": "Electrónica y automática industrial",
  "skills": ["programador", "plc", "electricista", "mecatronica", "automatizacion"],
  "company_rating": 4.7,
  "company_reviews": 10,
  "published_at": "2026-09-18T10:46:05.000Z",
  "promoted": false,
  "short_description": "¿Eres un apasionado de la automatización que prefiere el contacto real con la máquina antes que el trabajo estático de oficina? Desde ISPROX seleccionamos un/a Especialista en Programación de PLC y Electricidad Industrial…",
  "search_rank": 3,
  "search_page": 1,
  "scraped_at": "2026-10-07T20:26:29.803Z"
}
```

A waiter offer in a hotel in Tenerife, with languages:

```json
{
  "title": "Camarero/a hotel de lujo en Adeje",
  "company": "Luxury Tenerife Hotels",
  "url": "https://www.infojobs.net/adeje/camarero-hotel-lujo-adeje/of-i20a01f743e4bec8603346764b3ca7e",
  "location": "Adeje, Santa Cruz de Tenerife",
  "query": "camarero",
  "province": "Santa Cruz de Tenerife",
  "salary_text": "24.000€ - 26.000€ Bruto/año",
  "salary_min": 24000,
  "salary_max": 26000,
  "salary_period": "year",
  "contract_type": "Contrato indefinido",
  "workday": "Jornada completa",
  "remote_work": "Presencial",
  "experience_min": "Al menos 1 año",
  "studies_min": "Formación Profesional Grado Superior",
  "applicants": 343,
  "vacancies": 2,
  "industry": "Hostelería y restaurantes",
  "skills": ["atención al cliente", "calidad", "desarrollo profesional", "hoteles", "camarero", "Servicio de mesa", "Servicio de bebidas", "Amabilidad"],
  "languages": ["Inglés: Avanzado"],
  "company_rating": 5,
  "company_reviews": 2,
  "published_at": "2026-10-05T10:00:08.000Z"
}
```

A nursing offer from a hospital in Sabadell with only a salary floor (`salary_max` is left out):

```json
{
  "title": "ENFERMERA/ ENFERMERO",
  "company": "Corporaciò Sanitaria Parc Taulí",
  "url": "https://www.infojobs.net/sabadell/enfermera-enfermero/of-i57054fc0d84830b95f38f6e39b7359",
  "location": "Sabadell, Barcelona",
  "query": "enfermera",
  "salary_text": "Más de 33.000€",
  "salary_min": 33000,
  "salary_period": "year",
  "contract_type": "Contrato otros contratos",
  "experience_min": "No Requerida",
  "studies_min": "Grado",
  "applicants": 85,
  "vacancies": 15,
  "category": "Sanidad y salud",
  "subcategory": "Enfermería",
  "company_rating": 4.54,
  "company_reviews": 136
}
```

The same kind of row with `includeDetails` off (search results only), an electrician offer near Valencia:

```json
{
  "title": "ELECTRICISTA",
  "company": "INSTALACIONES MANUEL GARCIA",
  "url": "https://www.infojobs.net/mislata/electricista/of-i7adffc982448a6bf295f69bc01e853",
  "location": "Mislata, Valencia/València",
  "query": "electricista",
  "offer_id": "7adffc982448a6bf295f69bc01e853",
  "company_url": "https://www.infojobs.net/instalaciones-manuel-garcia/em-i66575451565354737883843007025059501429",
  "city": "Mislata",
  "province": "Valencia/València",
  "salary_text": "21.000€ - 24.000€ Bruto/año",
  "salary_min": 21000,
  "salary_max": 24000,
  "salary_period": "year",
  "salary_currency": "EUR",
  "salary_type": "gross",
  "contract_type": "Contrato indefinido",
  "workday": "Jornada completa",
  "remote_work": "Presencial",
  "work_mode": "on_site",
  "published_at": "2026-10-07T18:00:05.000Z",
  "promoted": false,
  "short_description": "En IMAGA buscamos incorporar electricistas profesionales para trabajar en proyectos de viviendas de obra nueva…",
  "search_rank": 3,
  "search_page": 1
}
```

At the end of a run that delivered offers, one info row (`_type: "info"`) says how many were delivered and how to schedule the actor. It is never charged. The run summary (status per query, pages read, requests, charges) is in the run's key value store under `OUTPUT`.

### Pricing

Pay per event: you pay for the offer rows you receive, plus a flat $0.005 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `job` | Once per offer row stored in your dataset | $1.79 per 1,000 | $1.59 per 1,000 | $1.39 per 1,000 | $1.19 per 1,000 |
| `run-start` | Once per run, when it starts | $0.005 | $0.005 | $0.005 | $0.005 |

The price per single offer is the price per 1,000 divided by 1,000. An offer with its offer page read costs the same as one without.

Never charged:

- a run whose input is refused (an unknown location, an empty query list): not even the start fee;
- pages the site did not answer, and searches the run could not read;
- searches with no results;
- an offer already delivered earlier in the same run (shown again further down, or found by another query);
- with `onlyNewJobs`, an offer an earlier run already delivered to you;
- the info row at the end of a run;
- anything past your "Max cost per run". The actor stops before it reaches your limit, keeps every row it delivered, ends as Succeeded and says in its status line that the result is partial and how to get the rest.

### FAQ

#### What exactly does this actor read?

InfoJobs (infojobs.net) is Spain's biggest job board. The actor reads its public search results pages, the same pages anyone sees without an account, and with `includeDetails` on (the default) each offer's own public page. It reads the data those pages carry for the browser, so the numbers are the site's own: the salary range, the applicant count, the publication date.

#### Does it take the same input as other InfoJobs scrapers?

Yes. It uses the same input fields as other popular InfoJobs scrapers (`queries`, `location`, `maxResults`), with the same types and defaults, so you can switch without changing your input. Every other field is optional and off or neutral by default. The output keeps the usual `title`, `company`, `url`, `location` and `query` fields first.

#### How many offers can I get?

From 10 to 5,000 per query and up to 100 queries per run. The run summary (`OUTPUT` in the key value store) shows how many offers InfoJobs had for each query, so you can see when a search was larger than your `maxResults`. A search for every offer in Spain (`*`) had 66,284 offers on 8 October 2026, and its page 200 answered normally.

#### How long does a run take?

About 2.4 offers per second with offer pages: 300 offers in 125 seconds in our final test, 200 offers of one query in 110 seconds. With `includeDetails` off, a page of 20 offers takes a few seconds (10 offers in 6 seconds in our test).

#### Which locations work?

InfoJobs filters by province, so `location` becomes one or more provinces. All 52 Spanish provinces work by their Spanish, co official or English names, about 50 large towns map to their province (`Bilbao` to Vizcaya/Bizkaia, `Vigo` to Pontevedra) and the autonomous communities map to all their provinces (`Galicia` searches four). Use commas for several. A town search covers its whole province; the `city` field tells you the exact town of each offer, so you can keep only the towns you want after the run.

#### Why is a field missing on some rows?

Because the offer does not have it. About half of the offers on InfoJobs show no salary (159 of 300 in our final test), so they have no `salary_*` fields. `languages`, `requirements_*`, `benefits`, `contract_duration` and `working_hours` appear only when the company filled them in. With `includeDetails` off, the offer page fields are not read at all.

#### How fresh is the data?

Live: every run reads the site at that moment. `applicants` is the count when the run read the offer page, and grows over the life of an offer. `published_at` is the date InfoJobs shows; a company that republishes an offer moves it forward, and the `postedWithin` filter follows the site's own logic.

#### Do I need an account, cookies or a proxy?

No. There is no login and nothing to configure. The actor uses Apify's datacenter proxy, included in the price. In our test runs, 315 of 315 requests were answered on the first try.

#### What happens if an offer is taken down while the run reads it?

The row is still delivered with every search result field, and `details_error` says the offer page was gone. That happened on none of our 300 test offers, but offers do close every day.

#### Can I monitor new offers over time?

Yes. Save your input as a task with `onlyNewJobs` on, and add a schedule in Console (Schedules > Add schedule, for example daily). Each run then returns and charges only offers it has not delivered to you before; a day with nothing new costs only the $0.005 start fee. `sortBy: "newest"` with `postedWithin: "24h"` keeps each run short.

#### Which formats can I download?

JSON, CSV, Excel, XML, HTML or RSS from the dataset, in Console or through the API. The default table view shows the five shared fields first, then salary, contract, workday, remote, applicants, experience and date; a second view shows the offer page fields.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, as a tool through Apify's MCP server.

- Connector URL: https://mcp.apify.com/?tools=themineworks/infojobs-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http infojobs-scraper "https://mcp.apify.com/?tools=themineworks/infojobs-scraper"`

#### Is it legal to scrape InfoJobs?

The actor reads only public pages that anyone can open without an account, and it collects job offers and company names, not candidates. You are responsible for how you use the data: check InfoJobs' terms for your use case and follow data protection law such as the GDPR (and the CCPA if it applies to you). If in doubt, ask a lawyer.

### Integrations

- **Google Sheets**: send each run's rows to a sheet with Apify's Google Sheets integration, or import the dataset's CSV link.
- **Make, Zapier and n8n**: start the actor and read its dataset with the Apify apps and nodes, for example "new nursing offers in Madrid to Slack every morning".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shine.com Jobs Scraper](https://apify.com/themineworks/shine-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Internshala Scraper](https://apify.com/themineworks/internshala-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Indeed Jobs Scraper](https://apify.com/themineworks/indeed-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instahyre Jobs Scraper](https://apify.com/themineworks/instahyre-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Apna Jobs Scraper](https://apify.com/themineworks/apna-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CutShort Jobs Scraper](https://apify.com/themineworks/cutshort-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Jobs Scraper](https://apify.com/themineworks/linkedin-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Recruiting & Jobs MCP](https://apify.com/themineworks/recruiting-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a search that should return offers and does not? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For another job site, a new source or a field you need, email dmineworks@gmail.com.

*Search InfoJobs by job title, province and the site's own filters, and get every Spanish job offer back as a clean row with its pay in numbers, its applicants counted and its company named.*

# Actor input Schema

## `queries` (type: `array`):

One search per line, as you would type it on infojobs.net, for example programador, camarero, enfermera, comercial. Use \* for every offer that matches the other filters. You can also paste an InfoJobs search URL (any page that lists offers); its own filters are kept.

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

InfoJobs filters by province. Type a province in Spanish or English (madrid, barcelona, valencia, sevilla or seville, vizcaya or biscay), a large town (bilbao, vigo, malaga), a region (andalucia, cataluna, galicia) or several separated by commas. Leave empty for all of Spain.

## `maxResults` (type: `integer`):

Most offers to return for each query. A search page holds 20 offers. An offer found by two queries is returned and charged once.

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

On: adds the province, number of applicants, minimum experience and studies, skills, languages, category, job level, vacancies and company rating from each offer's own page. Off: a faster run with the search card fields only (title, company, town, salary, contract, workday, remote, date, full description).

## `postedWithin` (type: `string`):

The site's own date filter. InfoJobs counts an offer as new again when the company republishes it.

## `sortBy` (type: `string`):

Order of the results, as on the site. A search with \* is always newest first.

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

Keep only offers with any of these contracts. Leave empty for any.

## `workMode` (type: `string`):

Where the work happens, as the site's own filter.

## `workday` (type: `string`):

The site's jornada filter.

## `onlyNewJobs` (type: `boolean`):

For scheduled runs: skip offers an earlier run of this actor already delivered to you, so each run returns and charges only new offers.

## Actor input object example

```json
{
  "queries": [
    "programador"
  ],
  "location": "",
  "maxResults": 10,
  "includeDetails": true,
  "postedWithin": "any",
  "sortBy": "relevance",
  "workMode": "any",
  "workday": "any",
  "onlyNewJobs": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "queries": [
        "programador"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/infojobs-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 = { "queries": ["programador"] }

# Run the Actor and wait for it to finish
run = client.actor("themineworks/infojobs-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 '{
  "queries": [
    "programador"
  ]
}' |
apify call themineworks/infojobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,themineworks/infojobs-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/K0BQRZ8XSIUwokw0C/builds/hmEpStQFdN3baqRwj/openapi.json
