# InfoJobs Scraper - Spanish Job Listings & Salaries | $3/1K Jobs (`santamaria-automations/infojobs-scraper`) Actor

Extract job listings from InfoJobs.net, Spain's largest job board. Returns title, company, salary, location, contract type, experience level, and description. Covers all industries and regions across Spain. Pay-per-result: $3 per 1,000 jobs.

- **URL**: https://apify.com/santamaria-automations/infojobs-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (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 $3.00 / 1,000 serp 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/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

## InfoJobs Scraper - Spain Jobs, EUR Salaries & Skills

Extract structured job listings from [InfoJobs.net](https://www.infojobs.net) - Spain's largest job board with millions of active listings across all industries and provinces. No API credentials required. Get EUR salaries, full descriptions, required skills, languages, benefits, remote type, company ratings, and applicant counts. No code needed.

***

### What it does

- Searches InfoJobs by keyword or accepts a pre-filtered search URL
- Returns structured job data per listing (see output fields below)
- Optionally fetches the full detail page for 40+ fields: description (text, HTML, Markdown), required skills, languages, benefits, salary breakdown, experience and education levels, applicant count, vacancies, category tree, and company rating
- Optionally fetches company profile pages (one per unique employer) for headquarters, employee count, company description, website, and social URLs
- Supports both InfoJobs company URL patterns: subdomain (\*.ofertas-trabajo.infojobs.net) and main-domain (www.infojobs.net/{slug}/em-i{hash})
- Extracts social profile links (LinkedIn, Facebook, Instagram, X, YouTube, TikTok) from descriptions and company pages
- Deduplicates across multiple queries
- Charges per job returned - no flat fee, no monthly subscription
- No InfoJobs developer account needed - works directly against the public site

***

### Sample output

```json
{
  "_type": "job",
  "id": "of1abc2def3ghi",
  "title": "Desarrollador Backend Senior",
  "job_url": "https://www.infojobs.net/barcelona/backend-developer/of-iof1abc2def3ghi",
  "source_url": "https://www.infojobs.net/barcelona/backend-developer/of-iof1abc2def3ghi",
  "apply_url": "https://www.infojobs.net/barcelona/backend-developer/of-iof1abc2def3ghi",
  "source_platform": "infojobs.net",
  "company_name": "Acme Tech S.L.",
  "company_url": "https://acme-tech.ofertas-trabajo.infojobs.net/",
  "company_logo_url": "https://multimedia-logos.infojobs.net/logos/acme.png",
  "company_rating": 4.2,
  "company_review_count": 84,
  "company_industry": "Informatica y Telecomunicaciones",
  "company_headquarters": "Barcelona, Espana",
  "employee_count": 250,
  "employee_count_text": "250 empleados",
  "company_about": "Empresa tecnologica especializada en soluciones cloud para el sector financiero.",
  "company_social_urls": ["https://linkedin.com/company/acme-tech"],
  "company_website": "https://www.acme-tech.com",
  "location": "Barcelona, Cataluna",
  "city": "Barcelona",
  "region": "Cataluna",
  "country": "ES",
  "description_snippet": "Buscamos un desarrollador backend senior con experiencia en Python o Go para unirse a nuestro equipo de producto...",
  "description_full": "Buscamos un desarrollador backend senior...\n\nRequisitos:\n- Experiencia minima 3 anos en Python o Go\n- Conocimiento de PostgreSQL",
  "description_html": "<p>Buscamos un desarrollador backend senior...</p>",
  "description_md": "Buscamos un desarrollador backend senior...\n\n## Requisitos\n\n- Experiencia minima 3 anos en Python o Go",
  "salary_min": 40000,
  "salary_max": 55000,
  "salary_currency": "EUR",
  "salary_period": "year",
  "salary_text": "40.000 - 55.000 EUR brutos/ano",
  "is_salary_hidden": false,
  "employment_type": "full-time",
  "remote_type": "hybrid",
  "is_remote": true,
  "working_hours": "Jornada completa",
  "contract_duration": null,
  "experience_required": "Al menos 3 anos",
  "education_required": "Ingeniero Tecnico",
  "skills": ["Python (Avanzado)", "Go (Intermedio)", "PostgreSQL (Intermedio)"],
  "languages": ["Espanol (Nativo)", "Ingles (Alto)"],
  "benefits": ["Seguro medico", "Teletrabajo", "Formacion continua"],
  "contact_emails": [],
  "contact_phones": [],
  "contact_urls": [],
  "vacancies": 2,
  "applicants_count": 47,
  "category": "Informatica y telecomunicaciones",
  "subcategory": "Programacion",
  "department": "Tecnologia",
  "level": "Mando Intermedio",
  "reference_code": "REF-2026-001",
  "staff_in_charge": "No",
  "posted_at_datetime": "2026-08-20T22:00:00Z",
  "search_query": "desarrollador",
  "scraped_at": "2026-09-05T10:30:00Z"
}
```

***

### Pricing

| Event | Price |
|-------|-------|
| Actor start | $0.001 |
| SERP result (fast mode) | $0.003 per job |
| Detail result (full description + 40 fields) | $0.005 per job |
| Company detail result (company page enrichment) | $0.002 per unique company |

All new Apify accounts include **$5 free monthly credit** - enough for 1,000+ jobs.

***

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQueries` | string\[] | `["desarrollador"]` | One or more keywords (e.g. "programador", "ingeniero software"). Each runs as a separate search. |
| `searchUrls` | string\[] | - | Pre-filtered search URLs from infojobs.net. All URL filters (province, category, salary, contract) are preserved. |
| `sortBy` | enum | `newest` | `newest` sorts by publication date (best for scheduled runs). `relevance` uses InfoJobs default ranking. |
| `includeJobDetails` | boolean | `false` | Fetch full description, skills, languages, benefits, salary details, and 40+ fields from the detail page. |
| `includeCompanyDetails` | boolean | `false` | Fetch company profile pages for headquarters, employee count, company description, website, and social URLs. Requires includeJobDetails=true. One page per unique employer (deduplicated). |
| `maxResultsPerQuery` | integer | `5` | Max results per keyword or URL. |
| `maxResults` | integer | `5` | Total cap across all queries. 0 = unlimited. |

No API credentials required. No proxyConfiguration field - the actor manages proxy internally.

***

### Output fields

**Identity**

- `_type` - always "job"
- `id` - InfoJobs offer code
- `title` - job title in Spanish
- `job_url` / `source_url` - canonical InfoJobs URL
- `apply_url` - URL to view/apply for the job
- `source_platform` - always "infojobs.net"

**Company**

- `company_name` - employer name
- `company_url` - InfoJobs company profile URL
- `company_logo_url` - logo image URL
- `company_rating` - star rating (0-5) from InfoJobs reviews; sourced from SERP ratingScore when present, falls back to company profile page microdata (itemprop=ratingValue) when includeCompanyDetails=true
- `company_review_count` - number of reviews; same dual-source logic as company\_rating (SERP primary, company page fallback)
- `company_industry` - industry classification; company-page value preferred over SERP fallback when includeCompanyDetails=true
- `company_headquarters` - city and country from company profile (e.g. "Madrid, Espana") (company detail mode)
- `employee_count` - number of employees as integer, e.g. 11000 (company detail mode)
- `employee_count_text` - raw employee count string as shown on InfoJobs, e.g. "11.000 empleados" (company detail mode)
- `company_about` - company description from the profile page (company detail mode)
- `company_social_urls[]` - LinkedIn, Facebook, Instagram, X/Twitter, YouTube, or TikTok profile URLs found in job descriptions or company pages (detail mode)
- `company_website` - employer website URL from company profile (e.g. "http://www.plexus.es") (company detail mode)

**Location**

- `location` - "City, Region" combined
- `city` - city name
- `region` - Spanish province/region (Madrid, Cataluna, Andalucia, etc.)
- `country` - always "ES"

**Description quartet** (all four are populated when includeJobDetails=true)

- `description_snippet` - first 300 characters of the plain text description
- `description_full` - full plain text with paragraph breaks
- `description_html` - cleaned original HTML from InfoJobs
- `description_md` - Markdown converted from HTML

**Salary**

- `salary_min` / `salary_max` - numeric EUR amounts
- `salary_currency` - always "EUR" when salary is present
- `salary_period` - "year" / "month" / "hour" (normalized)
- `salary_text` - human-readable salary range from InfoJobs
- `is_salary_hidden` - true when the employer has hidden the salary

**Contract and schedule**

- `employment_type` - normalized: full-time / contract / internship / freelance / apprenticeship / part-time
- `remote_type` - full / hybrid / on-site
- `is_remote` - true when any remote work is permitted
- `working_hours` - workday description (Jornada completa / Jornada parcial)
- `contract_duration` - duration for temporary contracts

**Requirements** (detail mode)

- `experience_required` - minimum experience level
- `education_required` - minimum education (Bachillerato / FP Grado Superior / Ingeniero Tecnico, etc.)
- `skills[]` - required skills with proficiency level
- `languages[]` - required languages with proficiency level

**Benefits** (detail mode)

- `benefits[]` - social benefits listed by the employer

**Contacts** (extracted from description in detail mode)

- `contact_emails[]` - email addresses found in description; more common in non-tech roles (camarero, comercial, hosteleria) than tech roles
- `contact_phones[]` - Spanish phone numbers found in description (+34, 6xx, 7xx, 9xx patterns); more common in non-tech roles
- `contact_urls[]` - external non-social URLs found in description (application portals, company websites)
- `company_social_urls[]` - LinkedIn/Facebook/Instagram/X/YouTube/TikTok URLs found in description or company page

**Job meta** (detail mode)

- `vacancies` - number of open positions
- `applicants_count` - number of applicants so far
- `category` / `subcategory` - InfoJobs category tree
- `department` - department within the company
- `level` - seniority level (Empleado, Mando Intermedio, Direccion, etc.)
- `reference_code` - employer's internal reference
- `staff_in_charge` - whether the role manages other people

**Dates and meta**

- `posted_at_datetime` - ISO 8601 UTC posting date
- `search_query` - which query produced this result
- `scraped_at` - ISO 8601 scrape timestamp

***

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client - Claude Desktop, Cursor, VS Code, LangChain, or custom agents.

```
https://mcp.apify.com?tools=santamaria-automations/infojobs-scraper
```

Example prompt once connected:

> "Use infojobs-scraper to find engineering jobs in Madrid paying over 40,000 EUR. Return the top 20 as a table with title, company, salary, and employment type."

***

### Why this scraper

- **Spain's #1 job board** - InfoJobs dominates the Spanish market with the deepest job inventory and salary disclosure
- **No API credentials** - works directly against the public site, no developer.infojobs.net registration needed
- **EUR salary parsing** - min/max extracted as numbers, always tagged EUR, period normalized
- **Description quartet** - plain text, HTML, Markdown, and snippet, all four in every detail run
- **Skills and languages** - structured arrays with proficiency levels, ready to feed AI matching pipelines
- **Remote type detection** - full / hybrid / on-site normalized from InfoJobs teleworking fields
- **Company intelligence** - rating, review count, industry, headquarters, employee count, website, and company description in a single call
- **Social URL extraction** - LinkedIn, Facebook, Instagram, X/Twitter, YouTube, and TikTok links pulled from descriptions and company pages
- **Spanish employment law contract types** - Indefinido, Temporal, Practicas, Autonomo mapped to fleet-standard employment\_type

***

### Common use cases

- **Job market research** - track salary ranges by province, category, or experience level across Spain
- **Competitive intelligence** - monitor which companies are hiring and for what roles
- **Recruitment pipelines** - feed job data into CRMs, spreadsheets, or internal dashboards
- **AI training data** - structured Spanish-language job descriptions with rich metadata
- **Lead generation** - identify companies actively hiring in target sectors
- **Skills demand analysis** - aggregate the skills\[] and languages\[] arrays to map what the Spanish market needs

***

### Related Actors

**Spain**

- [SEPE Scraper](https://apify.com/santamaria-automations/sepe-es-scraper) - Spain's national public employment service (empleate.gob.es), government-side peer to this private board.

**Southern and Western Europe**

- [Subito.it Jobs Scraper](https://apify.com/santamaria-automations/subito-it-jobs-scraper) - Italian classifieds job listings.
- [Net Empregos Scraper](https://apify.com/santamaria-automations/net-empregos-pt-scraper) - Portugal's leading job board.
- [VDAB Scraper](https://apify.com/santamaria-automations/vdab-be-scraper) - Belgium's public employment service.

**Central and Eastern Europe**

- [Praca.gov.pl Scraper](https://apify.com/santamaria-automations/praca-gov-pl-scraper) - Poland's national job register.
- [Profesia.sk Scraper](https://apify.com/santamaria-automations/profesia-sk-scraper) - Slovakia's #1 job board.
- [Profession.hu Scraper](https://apify.com/santamaria-automations/profession-hu-scraper) - Hungary's leading job board.
- [Kariera.gr Scraper](https://apify.com/santamaria-automations/kariera-gr-scraper) - Greece's largest job board.

***

### Version history

- **v3.4** - Removed always-null `company_active_jobs_count` field (0/123 fill across 13 runs; /ofertas sub-fetch blocked by proxy). Promoted `maxResultsPerQuery` and `maxResults` to top-level inputs (were inside Advanced section).
- **v3.3** - Routes all fetches through Apify residential proxy. Fixes company enrichment fill rate on `*.ofertas-trabajo.infojobs.net` subdomains where DC IPs received a stripped anti-bot response. Per-company session rotation + content-marker retry (3 attempts) ensure full HTML is retrieved.
- **v3.2** - Added `company_website` field; em-i URL pattern now enriched; `company_rating` / `company_review_count` fall back to company page microdata when SERP value is null.
- **v3.1** - Company page enrichment (`includeCompanyDetails`); social URL extraction; PPE per-job charging.
- **v3.0** - Native SSR rewrite; no developer.infojobs.net credentials needed; 40+ fields from detail pages.

***

### Support

Something not working? [Open an issue](https://console.apify.com/actors/9i13YA6zyeXP1OeeZ/issues) and we will fix it fast.

Email: contact@nanoscrape.com

# Actor input Schema

## `searchQueries` (type: `array`):

One or more search keywords (e.g. 'programador', 'ingeniero', 'marketing'). Each runs as a separate search. Results are deduplicated across queries.

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

Paste one or more InfoJobs search URLs. Go to infojobs.net, set your filters (keyword, province, category, contract type, salary), and copy the URL. All filters in the URL are preserved.

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

How to order results from InfoJobs. 'newest' (PUBLICATION\_DATE) is recommended for scheduled scrapes to get the latest postings first. 'relevance' uses InfoJobs default ranking.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per search keyword or URL. Use this to budget per-keyword costs.

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

Total cap across all queries and search URLs combined. Set to 0 for unlimited.

## `includeJobDetails` (type: `boolean`):

Fetch each job's detail page for full description (text, HTML, Markdown), salary details, required skills, languages, benefits, applicant count, and 25+ additional fields. Slower but provides complete data. Charged at job-detail-result rate.

## `includeCompanyDetails` (type: `boolean`):

Fetch the company profile page to add company\_headquarters, employee\_count, employee\_count\_text, company\_about, and company\_social\_urls. Requires includeJobDetails=true. One company page is fetched per unique employer (deduplicated across all jobs in the run). Charged at company-detail-result rate per unique company.

## Actor input object example

```json
{
  "searchQueries": [
    "desarrollador"
  ],
  "sortBy": "newest",
  "maxResultsPerQuery": 5,
  "maxResults": 5,
  "includeJobDetails": false,
  "includeCompanyDetails": false
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped job listings from InfoJobs.net. SERP mode: title, company\_name, location, salary, employment type, remote type, description snippet, posted date. Detail mode (includeJobDetails=true): adds description\_full/html/md, skills\[], languages\[], benefits\[], experience\_required, education\_required, applicants\_count, vacancies, category, subcategory, department, level, reference\_code, contract\_duration, working\_hours, company\_rating (SERP or company-page fallback), company\_review\_count (SERP or company-page fallback), company\_industry, contact\_emails\[], contact\_phones\[], contact\_urls\[], company\_social\_urls\[]. Company mode (includeCompanyDetails=true, requires includeJobDetails=true): adds company\_headquarters, employee\_count, employee\_count\_text, company\_about, company\_website, company\_social\_urls. Two company URL patterns are supported: \*.ofertas-trabajo.infojobs.net (full enrichment) and www.infojobs.net/{slug}/em-i{hash} (microdata fields: headquarters, employee count, website, rating, industry).

# 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 = {
    "searchQueries": [
        "desarrollador"
    ],
    "sortBy": "newest",
    "maxResultsPerQuery": 5,
    "maxResults": 5,
    "includeJobDetails": false,
    "includeCompanyDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/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 = {
    "searchQueries": ["desarrollador"],
    "sortBy": "newest",
    "maxResultsPerQuery": 5,
    "maxResults": 5,
    "includeJobDetails": False,
    "includeCompanyDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/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 '{
  "searchQueries": [
    "desarrollador"
  ],
  "sortBy": "newest",
  "maxResultsPerQuery": 5,
  "maxResults": 5,
  "includeJobDetails": false,
  "includeCompanyDetails": false
}' |
apify call santamaria-automations/infojobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/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/9i13YA6zyeXP1OeeZ/builds/eKHzGFH1QFg8umYg6/openapi.json
