# InfoJobs Spain Job Offers & Salary Scraper (`solidcode/infojobs-net-scraper`) Actor

\[💰 $0.9 / 1K] Extract job offers from InfoJobs, Spain's largest job board. Get titles, companies, cities, contract types, remote status and salary ranges with the pay period attached. Filter by province, category, contract type, education level and more. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/solidcode/infojobs-net-scraper.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (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 $0.90 / 1,000 job offers

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

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

## What's an Apify Actor?

Actors are 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

## InfoJobs Spain Job Offers & Salary Scraper

Pull open positions from InfoJobs — Spain's largest job board, 61,763 live offers on the day we measured — with the title, employer, city, contract type, working hours, remote status and a salary figure that always ships with its own pay period attached. Built for recruitment agencies, compensation and salary-benchmarking teams, and labour-market analysts who need a filterable dataset of the Spanish job market without clicking through 2,999 pages of a Spanish-language site by hand.

### Why This Scraper?

- **61,763 open positions on the unfiltered board** — measured live on 2026-08-01. A single search reaches up to 59,980 of them across 2,999 pages, and every count in this page is the number InfoJobs itself returned for that query.
- **Salary you can actually compare** — every figure ships beside its period: `YEAR`, `MONTH` or `HOUR`. On a 1,259-offer national sample, 833 offers were priced and all 833 carried a period. This matters more than it sounds: the raw ranges overlap, so a bare "27,000" on this site is genuinely three different jobs.
- **11 search filters, every one measured against the live board** — keyword, province, category, contract type, working hours, workplace type, education level, executive-only, jobs abroad, published-since and sort order. Nothing is offered that was not confirmed to change the result set.
- **All 52 Spanish provinces, spelled the way InfoJobs spells them** — including the bilingual forms (Valencia/València, Islas Baleares/Illes Balears, Guipúzcoa/Gipuzkoa), so a result set cross-checks against the live site. Madrid returns 12,455 offers, Ceuta 43.
- **InfoJobs' own taxonomies, not an approximation** — 21 job categories (IT & Telecommunications 2,425 offers, Pharmaceutical 102), 8 contract types (Permanent 38,304), 10 working-hours patterns (Full time 47,427) and 19 education levels (Bachelor's degree 7,517, Doctorate 13).
- **Remote work is a real field, not a keyword guess** — On site / Hybrid / Fully remote read from the employer's own selection. Fully remote returns 889 offers, and every row comes back tagged.
- **40 fields per job offer** — 19 on every row, plus 21 more when you enable full details: description in plain text and HTML, required skills and languages, minimum studies and experience, category/subcategory/industry, seniority, vacancy count, how many people have already applied, social benefits, and the employer's star rating and review count.
- **A stable 30-character offer code on every row** — `offerCode` is identical no matter which search found the offer, so repeat runs and multi-search jobs join and de-duplicate cleanly. Measured 144 distinct codes across 144 offers.
- **Freshness windows for daily monitoring** — narrow to the last 24 hours (914 offers), 7 days (25,100) or 15 days (36,880) so a repeating job collects only what is new instead of the whole board.

### Use Cases

#### Recruitment & Talent Sourcing

- Track every new posting in your specialism across all 52 provinces and 21 categories, refreshed daily with the 24-hour window.
- Spot hiring surges by employer — vacancy counts and applicant numbers show which roles are being filled at volume and which are struggling to attract candidates.
- Build a live map of who is hiring for a skill: required-skills entries arrive as discrete taxonomy values ("Cloud Computing", "Negociación con grandes superficies"), so you group on a real field instead of searching descriptions for a substring.
- Monitor competitor agencies and staffing firms by watching the employers behind repeated postings.

#### Salary Benchmarking & Compensation

- Build pay bands by role, province and seniority from ranges that carry their own period — annual, monthly and hourly figures never get averaged together by accident.
- Compare gross pay across regions: the same job title in Madrid, Barcelona and Valencia, priced side by side.
- Track how advertised pay moves over time by re-running the same search on a schedule and keeping the offer code as the join key.
- Feed compensation reviews and offer-approval workflows with market evidence rather than survey estimates.

#### Labour Market Research

- Measure the Spanish job market by contract type — permanent versus temporary versus apprenticeship — with counts the board itself reports.
- Quantify the remote-work share: 889 fully remote offers against a board of 61,763 on the day we measured, with on-site and hybrid available as their own filters.
- Study education demand across 19 qualification levels, from no formal requirement up to doctorate.
- Analyse regional concentration, from Madrid's 12,455 offers down to Ceuta's 43.

#### Lead Generation & Sales

- Companies that are hiring are companies that are spending. Every row carries the employer name, its InfoJobs profile link and its logo.
- Qualify prospects by industry type, headcount signals (vacancies per posting) and employer rating.
- Target by growth signal: employers posting several roles at once in one province are expanding a site or team.
- Segment on the executive flag — 890 senior postings — for search and headhunting outreach.

#### Data Enrichment & Integration

- Push results straight into an ATS, CRM or data warehouse in JSON, CSV, Excel or XML.
- Join to your existing employer records on the company name and profile URL, and to your job records on the stable offer code.
- Run several narrow searches in parallel and let de-duplication merge them — an offer matching more than one search is delivered once.
- Keep a Spanish-language corpus of job descriptions, in plain text and in HTML, for classification and language-model work.

### Getting Started

#### Simplest run

```json
{
  "keyword": "",
  "province": "",
  "category": "",
  "workplace": "",
  "contract_type": "",
  "workday": "",
  "education": "",
  "segment": "",
  "abroad_only": "false",
  "since_date": "ANY",
  "sort_by": "PUBLICATION_DATE",
  "maxItems": 100
}
```

#### Paste a filtered search URL from the site

Set your filters on the site, then copy the address bar URL — every filter in it is
carried through.

```json
{
  "searchUrls": [
    "https://www.infojobs.net/ofertas-trabajo?keyword=&provinceIds=&categoryIds=&teleworkingIds=&contractTypeIds=&workdayIds=&educationIds=&segmentId=&onlyForeignCountry=false&sinceDate=ANY&sortBy=PUBLICATION_DATE"
  ],
  "maxItems": 59980
}
```

#### Everything, with full details

```json
{
  "searchUrls": [
    "https://www.infojobs.net/ofertas-trabajo?keyword=&provinceIds=&categoryIds=&teleworkingIds=&contractTypeIds=&workdayIds=&educationIds=&segmentId=&onlyForeignCountry=false&sinceDate=ANY&sortBy=PUBLICATION_DATE"
  ],
  "maxItems": 59980,
  "enrichDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | — | InfoJobs search result URLs. Set your filters on infojobs.net, then paste the address bar URL here. Both forms work and each is followed in its own form, so the filters you can see in the URL are the filters you get: the friendly form (infojobs.net/ofertas-trabajo/madrid, or infojobs.net/ofertas-trabajo/informatica-telecomunicaciones/madrid) and the filtered form (infojobs.net/ofertas-trabajo?provinceIds=33). A page number already in the URL is ignored -- every search starts at the first page. Paste a search results page, not a single job offer; offer URLs are skipped with a note in the log. Overrides the individual filters below when provided. |
| `keyword` | string | `""` | Free-text search over job titles and descriptions. Measured live: 'python' narrows 61,763 offers to 402. Multi-word searches are joined with a hyphen ('desarrollador web' is sent as 'desarrollador-web'), which InfoJobs resolves to the same normalised job title but matches more broadly (1,702 offers vs 148). |
| `province` | string | `""` | Spanish province the job is located in. All 52 provinces, taken from InfoJobs' own province list with its exact spelling (including the bilingual forms it uses, e.g. Valencia/Valencia). Measured live: Madrid returns 12,455 offers, Ceuta 43. |
| `category` | string | `""` | InfoJobs' own 21 top-level job categories. Measured live: IT & telecommunications returns 2,425 offers, Pharmaceutical 102. |
| `contract_type` | string | `""` | Measured live: Permanent returns 38,304 offers, Apprenticeship 421. Every returned row carries the contract type you asked for. |
| `workday` | string | `""` | Full time, part time or compressed shift, with the time of day InfoJobs records for each. Measured live: Full time returns 47,427 offers, Compressed nights 135. |
| `workplace` | string | `""` | On site, hybrid or fully remote. Measured live: fully remote returns 889 offers and every row on page 1 came back tagged Solo teletrabajo. |
| `education` | string | `""` | The minimum qualification the employer asks for, on InfoJobs' own 19-level Spanish scale. Measured live: Bachelor's degree returns 7,517 offers, Doctorate 13. |
| `segment` | string | `""` | InfoJobs flags a small set of senior postings as Executive. Measured live: 890 offers, and all 22 rows on page 1 came back with executive = true. |
| `abroad_only` | string | `false` | InfoJobs also lists jobs based outside Spain. Measured live: 171 offers, and page 1 came back with cities in Munich, Zwolle, Buenos Aires, Arnhem and Bern. Shipped as a two-value choice rather than a checkbox because the generator sends the literal text through to the URL. |
| `since_date` | string | `ANY` | How recently the offer was published. Measured live: last 24 hours 914 offers, last 7 days 25,100, last 15 days 36,880, any date 61,763. InfoJobs offers no wider window -- \_30\_DAYS and LAST\_MONTH both return HTTP 500 -- so those are not listed. |
| `sort_by` | string | `PUBLICATION_DATE` | Newest first, or best keyword match first. IMPORTANT: relevance sorting only applies when Search keyword is set -- on an unfiltered browse InfoJobs silently falls back to publication date. Measured on keyword 'comercial' (9,557 offers): the two orderings share 0 of the 22 offers on page 1. |
| `maxItems` | integer | `100` | Maximum job offers per search URL (0 = collect everything each search returns). Infojobs.net pages through at most 59,980 job offers per search, so use several narrower searches to collect more. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `enrichDetails` | boolean | `false` | Add 21 extra fields per job offer. Adds one request per job offer and is billed at the higher rate. |
| `concurrency` | integer | `8` | How many requests to run in parallel. Lower this if you see failures. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings for the run. |

### Output

Every job offer is one dataset row. Enabling `enrichDetails` adds 21 further fields to the same row — there is no second record type to join.

A real captured row, with `enrichDetails` enabled. The job description is shortened here for
readability, and fields this employer left blank are omitted rather than shown as empty.

```json
{
  "id": "//www.infojobs.net/badalona/comercial-ventas/of-i66e420d0a2430f842910379b9b4d8e?applicationOrigin=search-new&page=1&sortBy=PUBLICATION_DATE",
  "offerCode": "66e420d0a2430f842910379b9b4d8e",
  "url": "https://www.infojobs.net/badalona/comercial-ventas/of-i66e420d0a2430f842910379b9b4d8e?applicationOrigin=search-new&page=1&sortBy=PUBLICATION_DATE",
  "title": "Comercial de ventas",
  "companyName": "Occident - Agente con Plan de Carrera",
  "description": "Descripción del puesto de trabajo: Buscamos un/a Comercial de Ventas apasionado/a por el mundo de las ventas y las relaciones con los clientes...",
  "contractType": "Contrato otros contratos",
  "workday": "Jornada completa",
  "workplaceType": "Híbrido",
  "publishedAt": "2026-08-01T11:00:06Z",
  "isExecutive": false,
  "city": "Badalona",
  "companyUrl": "https://occident-agt-plan-carrera.ofertas-trabajo.infojobs.net",
  "companyLogo": "https://multimedia-logos.infojobs.net/image/upload/63/63ec890a-2989-49ba-b673-d1885516b034",
  "salaryMin": 24000,
  "salaryMax": 40000,
  "salaryPeriod": "YEAR",
  "salaryCurrency": "EUR",
  "salaryType": "GROSS",

  "salaryLabel": "24.000€ - 40.000€ Bruto/año",
  "descriptionHtml": "<p class=\"ij-EnrichedTextArea-paragraph\" style=\"margin:0px 0px 16px\"><strong>Descripción del puesto de trabajo:</strong>...",
  "heroImageUrl": "https://multimedia-logos.infojobs.net/image/upload/c9/c9068dea-f819-4943-9fc4-dd3ac472cd0f",
  "category": "Comercial y ventas",
  "subCategory": "Comercial",
  "jobLevel": "Especialista",
  "minimumExperience": "No Requerida",
  "minimumStudies": "Formación Profesional Grado Medio",
  "province": "Barcelona",
  "requiredSkills": [
    {"name": "Venta", "slug": "venta"},
    {"name": "Relaciones con clientes", "slug": "relaciones-con-clientes"},
    {"name": "Negociación con grandes superficies", "slug": "negociacion-con-grandes-superficies"},
    {"name": "Gestión comercial", "slug": "gestion-comercial"},
    {"name": "Trabajo por objetivos", "slug": "trabajo-por-objetivos"},
    {"name": "Captación de cuentas", "slug": "captacion-cuentas"},
    {"name": "Comunicaciones empresariales", "slug": "comunicaciones-empresariales"},
    {"name": "Asesoramiento profesional", "slug": "asesoramiento-profesional"}
  ],
  "requiredLanguages": [
    {"language": "Español", "level": "Nativo o Bilingüe"}
  ],
  "socialBenefits": ["Otros beneficios: Paquete retributivo con fijos y variables"],
  "industryType": "Seguros",
  "numberOfVacancies": 1,
  "applies": 79,
  "companyRating": 4.4418607,
  "companyRatingCount": 86,
  "referenceCode": "Representante Comercial",
  "isExternal": false
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `url` | string | Job URL |
| `title` | string | Job title |
| `companyName` | string | Company |
| `description` | string | Job description |
| `contractType` | string | Contract type |
| `workday` | string | Working hours |
| `workplaceType` | string | Workplace type |
| `publishedAt` | string | Published |
| `isExecutive` | boolean | Executive role |

#### Price & Value & Location & Contacts & Media & Details & Timestamps

| Field | Type | Description |
|-------|------|-------------|
| `salaryMin` | number | Salary from |
| `salaryMax` | number | Salary to |
| `salaryPeriod` | string | Salary period |
| `salaryCurrency` | string | Currency |
| `salaryType` | string | Gross or net |
| `city` | string | City |
| `companyUrl` | string | Company profile |
| `companyLogo` | string | Company logo |
| `id` | string | Offer path |
| `offerCode` | string | Offer code |

#### With `enrichDetails` enabled

| Field | Type | Description |
|-------|------|-------------|
| `heroImageUrl` | string | Company banner |
| `salaryLabel` | string | Salary (as shown) |
| `descriptionHtml` | string | Description (HTML) |
| `category` | string | Category |
| `subCategory` | string | Subcategory |
| `jobLevel` | string | Seniority |
| `minimumExperience` | string | Experience required |
| `minimumStudies` | string | Education required |
| `province` | string | Province |
| `requiredSkills` | array | Skills |
| `requiredLanguages` | array | Languages |
| `socialBenefits` | array | Benefits |
| `minimumRequirements` | string | Requirements |
| `industryType` | string | Industry |
| `numberOfVacancies` | number | Vacancies |
| `applies` | number | Applications |
| `staffInCharge` | string | Staff in charge |
| `companyRating` | number | Company rating |
| `companyRatingCount` | number | Company reviews |
| `referenceCode` | string | Employer reference |
| `isExternal` | boolean | Hosted off-site |

### Tips for Best Results

- **Read `salaryPeriod` before you compare two salaries.** Annual, monthly and hourly figures share one column and their raw magnitudes overlap, so 27,000 is a plausible yearly salary, a plausible monthly one and — where an employer picked the wrong unit — even an hourly one. The period always travels with the figure; use it as the unit, never the size of the number.
- **How many offers show a salary at all is the employer's choice, and it varies a lot by search.** Across the searches we sampled, the share of offers carrying a price ranged from roughly 40% to 95%. Treat salary as a rich but partial column, and measure its coverage on your own search rather than assuming a board-wide rate.
- **Relevance sorting only bites when you set a keyword.** On an unfiltered browse InfoJobs quietly falls back to publication date. With a keyword it changes everything: on `comercial` (9,557 offers), the two orderings shared 0 of the 22 offers on the first page.
- **A two-word keyword matches wider, not narrower.** InfoJobs resolves a phrase to a normalised job title, so `desarrollador web` returns 1,702 offers where the strict two-word phrase returns 148. Use a single word when you want reach, and add a category filter when you want precision.
- **One search tops out at 59,980 offers.** To collect more than that, split the job into several narrower searches — by province, by category, or by both. 52 provinces and 21 categories give you plenty of ways to cut the board into pieces that each fit comfortably.
- **Join on `offerCode`, not on the URL.** InfoJobs appends its own tracking parameters to a job link, so the same offer found through two different searches carries two different URLs but one 30-character offer code.
- **Start without full details.** The 19 fields on every row already cover title, employer, city, salary, contract, hours and remote status — enough to pick a shortlist. Turn full details on for the shortlist and pay the higher rate only on the offers you actually want to read.

### Pricing

**From $0.90 per 1,000 results** (search only) or **from $1.40 per 1,000 results** (with full details).

| Results | Search Only | With Full Details |
|---------|-------------|-------------------|
| 100 | $0.09 | $0.14 |
| 1,000 | $0.90 | $1.40 |
| 10,000 | $9.00 | $14.00 |
| 100,000 | $90.00 | $140.00 |

Those are the rates on Gold and above. Higher-volume plans pay less per result:

| Your Apify plan | Search Only | With Full Details |
|-----------------|-------------|-------------------|
| No discount | $1.08 | $1.68 |
| Bronze | $1.02 | $1.58 |
| Silver | $0.96 | $1.49 |
| **Gold and above** | **$0.90** | **$1.40** |

Per 1,000 results.

A "result" is any job offer row in the output dataset. When you run several searches at once, a job offer matching more than one of them is de-duplicated before it reaches the dataset, so you are never charged twice for the same job offer. The full-details rate applies only to rows that actually came back enriched — if a job offer's detail record is unavailable, the row is still delivered and charged at the search-only rate. Platform fees (compute, storage) are additional and depend on your Apify plan.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

**This is an unofficial scraper. It is not affiliated with, endorsed by, or connected to Infojobs.net or its operators in any way.** All trademarks belong to their respective owners.

This actor is intended for legitimate market research and analytics. You are responsible for complying with applicable laws and with Infojobs.net's Terms of Service.

Results may include personal data such as contact details. Treat them accordingly: do
not use them for spam, harassment, or any unlawful purpose, and follow applicable
privacy rules when storing or processing them.

# Actor input Schema

## `searchUrls` (type: `array`):

InfoJobs search result URLs. Set your filters on infojobs.net, then paste the address bar URL here. Both forms work and each is followed in its own form, so the filters you can see in the URL are the filters you get: the friendly form (infojobs.net/ofertas-trabajo/madrid, or infojobs.net/ofertas-trabajo/informatica-telecomunicaciones/madrid) and the filtered form (infojobs.net/ofertas-trabajo?provinceIds=33). A page number already in the URL is ignored -- every search starts at the first page. Paste a search results page, not a single job offer; offer URLs are skipped with a note in the log. Overrides the individual filters below when provided.

## `keyword` (type: `string`):

Free-text search over job titles and descriptions. Measured live: 'python' narrows 61,763 offers to 402. Multi-word searches are joined with a hyphen ('desarrollador web' is sent as 'desarrollador-web'), which InfoJobs resolves to the same normalised job title but matches more broadly (1,702 offers vs 148).

## `province` (type: `string`):

Spanish province the job is located in. All 52 provinces, taken from InfoJobs' own province list with its exact spelling (including the bilingual forms it uses, e.g. Valencia/Valencia). Measured live: Madrid returns 12,455 offers, Ceuta 43.

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

InfoJobs' own 21 top-level job categories. Measured live: IT & telecommunications returns 2,425 offers, Pharmaceutical 102.

## `contract_type` (type: `string`):

Measured live: Permanent returns 38,304 offers, Apprenticeship 421. Every returned row carries the contract type you asked for.

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

Full time, part time or compressed shift, with the time of day InfoJobs records for each. Measured live: Full time returns 47,427 offers, Compressed nights 135.

## `workplace` (type: `string`):

On site, hybrid or fully remote. Measured live: fully remote returns 889 offers and every row on page 1 came back tagged Solo teletrabajo.

## `education` (type: `string`):

The minimum qualification the employer asks for, on InfoJobs' own 19-level Spanish scale. Measured live: Bachelor's degree returns 7,517 offers, Doctorate 13.

## `segment` (type: `string`):

InfoJobs flags a small set of senior postings as Executive. Measured live: 890 offers, and all 22 rows on page 1 came back with executive = true.

## `abroad_only` (type: `string`):

InfoJobs also lists jobs based outside Spain. Measured live: 171 offers, and page 1 came back with cities in Munich, Zwolle, Buenos Aires, Arnhem and Bern. Shipped as a two-value choice rather than a checkbox because the generator sends the literal text through to the URL.

## `since_date` (type: `string`):

How recently the offer was published. Measured live: last 24 hours 914 offers, last 7 days 25,100, last 15 days 36,880, any date 61,763. InfoJobs offers no wider window -- \_30\_DAYS and LAST\_MONTH both return HTTP 500 -- so those are not listed.

## `sort_by` (type: `string`):

Newest first, or best keyword match first. IMPORTANT: relevance sorting only applies when Search keyword is set -- on an unfiltered browse InfoJobs silently falls back to publication date. Measured on keyword 'comercial' (9,557 offers): the two orderings share 0 of the 22 offers on page 1.

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

Maximum job offers per search URL (0 = collect everything each search returns). Infojobs.net pages through at most 59,980 job offers per search, so use several narrower searches to collect more.

## `enrichDetails` (type: `boolean`):

Add 21 extra fields per job offer. Adds one request per job offer and is billed at the higher rate.

## `concurrency` (type: `integer`):

How many requests to run in parallel. Lower this if you see failures.

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

Proxy settings for the run.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.infojobs.net/ofertas-trabajo?keyword=&provinceIds=&categoryIds=&teleworkingIds=&contractTypeIds=&workdayIds=&educationIds=&segmentId=&onlyForeignCountry=false&sinceDate=ANY&sortBy=PUBLICATION_DATE"
  ],
  "keyword": "",
  "province": "",
  "category": "",
  "contract_type": "",
  "workday": "",
  "workplace": "",
  "education": "",
  "segment": "",
  "abroad_only": "false",
  "since_date": "ANY",
  "sort_by": "PUBLICATION_DATE",
  "maxItems": 100,
  "enrichDetails": false,
  "concurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `core` (type: `string`):

Core Fields for each job offer.

## `financial` (type: `string`):

Price & Value for each job offer.

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

Location for each job offer.

## `contact` (type: `string`):

Contacts for each job offer.

## `media` (type: `string`):

Media for each job offer.

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

Details & Timestamps for each job offer.

# 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 = {
    "searchUrls": [
        "https://www.infojobs.net/ofertas-trabajo?keyword=&provinceIds=&categoryIds=&teleworkingIds=&contractTypeIds=&workdayIds=&educationIds=&segmentId=&onlyForeignCountry=false&sinceDate=ANY&sortBy=PUBLICATION_DATE"
    ],
    "keyword": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/infojobs-net-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 = {
    "searchUrls": ["https://www.infojobs.net/ofertas-trabajo?keyword=&provinceIds=&categoryIds=&teleworkingIds=&contractTypeIds=&workdayIds=&educationIds=&segmentId=&onlyForeignCountry=false&sinceDate=ANY&sortBy=PUBLICATION_DATE"],
    "keyword": "",
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/infojobs-net-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 '{
  "searchUrls": [
    "https://www.infojobs.net/ofertas-trabajo?keyword=&provinceIds=&categoryIds=&teleworkingIds=&contractTypeIds=&workdayIds=&educationIds=&segmentId=&onlyForeignCountry=false&sinceDate=ANY&sortBy=PUBLICATION_DATE"
  ],
  "keyword": ""
}' |
apify call solidcode/infojobs-net-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VC66Y5IZ4eE1hKZam/builds/tYUxi0XPKc7RlPnRA/openapi.json
