# InfoJobs Jobs Scraper (`khadinakbar/infojobs-jobs-scraper`) Actor

Scrape InfoJobs.net (Spain) job listings — title, company, salary range, contract, location, full description. MCP/API-ready.

- **URL**: https://apify.com/khadinakbar/infojobs-jobs-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 job scrapeds

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

Learn more: https://docs.apify.com/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 Jobs Scraper

**Scrape job listings from [InfoJobs.net](https://www.infojobs.net), Spain's largest job board.** Search by keyword, province, and category, and get back **complete job records** — title, hiring company, **structured salary range**, contract type, working hours, remote/hybrid mode, location, publication date, and the **full job description** — as clean JSON. Runs on the Apify platform with API access, scheduling, integrations, residential proxy rotation, and monitoring built in.

Unlike scrapers that crawl each job's detail page (slow, and blocked by InfoJobs' anti-bot protection), this actor reads everything it needs straight from the search results — so it is **HTTP-only, fast, and reliable**, with no per-job blocking.

### Why use InfoJobs Jobs Scraper?

- **Recruiters & sourcers** — build targeted candidate-facing job lists by role and region across Spain.
- **Salary benchmarking** — every record carries a structured `salaryMin` / `salaryMax` / `currency` / `period`, ready for analysis.
- **Job-market research** — track hiring volume, contract types, and remote-work trends by sector.
- **Competitor monitoring** — watch which companies are hiring, for what, and where.
- **AI agents (MCP)** — narrow input, structured JSON output: a natural tool call for Claude, ChatGPT, and other agents.

### How to use InfoJobs Jobs Scraper

1. Enter a **keyword** (e.g. `desarrollador`), or set a **province** / **category**, or paste full InfoJobs **search URLs**.
2. Optionally pick a **sort order** (relevance or newest) and a **published-since** window (24h / 7d / 15d).
3. Set **Maximum jobs** to control how many results (and the cost) you want.
4. Click **Start**. Download the dataset as JSON, CSV, Excel, or HTML, or pull it via the Apify API.

### Input

| Field | Description |
|-------|-------------|
| `keyword` | Free-text job search (Spanish), e.g. `enfermera`, `marketing manager`. |
| `province` | Province slug to limit by region, e.g. `madrid`, `barcelona`. |
| `category` | Category slug to limit by sector, e.g. `informatica-telecomunicaciones`. |
| `sortBy` | `RELEVANCE` or `PUBLICATION_DATE` (newest first). |
| `publishedSince` | `ANY`, `_24_HOURS`, `_7_DAYS`, `_15_DAYS`. |
| `maxResults` | Max jobs to scrape across all searches (default 100). |
| `searchUrls` | Power mode: full InfoJobs `list.xhtml` search URLs. |
| `proxyConfiguration` | Defaults to Apify Residential proxy in Spain (ES). |

You can use the structured fields **or** paste exact `searchUrls` you built on InfoJobs. Job-detail and SEO URLs are not supported (they are anti-bot protected) — use search URLs.

### Output

Each dataset item is one job:

```json
{
  "url": "https://www.infojobs.net/madrid/desarrollador-software-c-hibrido/of-i9c6164fdcb4cf9a62aa75791d1da09",
  "code": "9c6164fdcb4cf9a62aa75791d1da09",
  "title": "Desarrollador/a software C++ - HÍBRIDO",
  "companyName": "Novanotio",
  "companyUrl": "https://novanotio.ofertas-trabajo.infojobs.net",
  "city": "Madrid",
  "teleworking": "Híbrido",
  "contractType": "Contrato indefinido",
  "workday": "Jornada completa",
  "salaryMin": 33000,
  "salaryMax": 39000,
  "salaryPeriod": "YEAR",
  "salaryCurrency": "EUR",
  "salaryType": "GROSS",
  "salaryText": "33.000–39.000 EUR/year",
  "publishedAt": "2026-06-09T15:11:24Z",
  "description": "¡ÚNETE A NOVANOTIO Y PARTICIPA EN PROYECTOS...",
  "isExecutive": false,
  "scrapedAt": "2026-06-30T10:27:50Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data fields

| Field | Type | Description |
|-------|------|-------------|
| `url` | string | Canonical job-offer URL. |
| `code` | string | InfoJobs internal offer code. |
| `title` | string | Job title. |
| `companyName` | string | Hiring company. |
| `companyUrl` | string | Company profile URL. |
| `companyLogo` | string | Company logo image URL. |
| `city` | string | Job location. |
| `teleworking` | string | On-site / hybrid / remote. |
| `contractType` | string | Contract type. |
| `workday` | string | Full-time / part-time. |
| `salaryMin` / `salaryMax` | number | Salary range bounds. |
| `salaryPeriod` | string | `YEAR` or `MONTH`. |
| `salaryCurrency` | string | e.g. `EUR`. |
| `salaryType` | string | `GROSS` or `NET`. |
| `salaryText` | string | Human-readable salary. |
| `publishedAt` | string | Publication date (ISO 8601). |
| `description` | string | Full job description. |
| `isExecutive` | boolean | Executive role flag. |
| `scrapedAt` | string | Scrape timestamp (ISO 8601). |

### How much does it cost to scrape InfoJobs?

This actor uses **pay-per-event** pricing: **$0.004 per job scraped**, plus a tiny per-run start fee. Scraping 1,000 jobs costs about **$4**. The actor prints a cost cap at the start of every run and respects your `maxResults` limit exactly, so you always know the maximum spend in advance. Pay-per-usage (compute + proxy) is also available for very large jobs.

### Tips

- Use `sortBy = PUBLICATION_DATE` with `publishedSince = _24_HOURS` for daily new-job monitoring; schedule the run on Apify.
- Lower `maxResults` for a quick sample before a full export.
- Keep the default **Residential ES** proxy — InfoJobs uses Imperva Incapsula anti-bot, and Spanish residential IPs are the most reliable.
- Combine with our other job actors (LinkedIn, Indeed, Glassdoor, Google Jobs) to build a cross-board hiring dataset.

### FAQ, disclaimer & support

**Is scraping InfoJobs legal?** This actor collects only publicly available job-listing data. You are responsible for complying with InfoJobs' Terms of Service and applicable law (including GDPR) in how you use the data. It does not collect private or personal candidate data.

**Why are job-detail URLs not supported?** InfoJobs protects individual job pages with anti-bot challenges. The search results already contain the full data — including the complete description — so this actor reads from there for 100% reliability.

**Found a bug or need a field?** Open an issue on the actor's **Issues** tab. Custom scraping solutions are available on request.

# Actor input Schema

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

Free-text job search run on InfoJobs.net, Spain's largest job board (e.g. 'desarrollador', 'enfermera Barcelona', 'marketing manager'). Searched in Spanish against job titles and descriptions. Leave empty only if you set `province`, `category`, or `searchUrls` instead. This is NOT a job-detail URL — for a specific saved search use `searchUrls`.

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

Optional Spanish province slug to restrict results to one region (e.g. 'madrid', 'barcelona', 'valencia', 'sevilla'). Use lowercase, no accents, hyphens for multi-word provinces ('santa-cruz-de-tenerife'). Combine with `keyword` to narrow a search. Leave empty to search all of Spain.

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

Optional InfoJobs category slug to filter by sector (e.g. 'informatica-telecomunicaciones', 'comercial-ventas', 'sanidad-salud', 'administracion-empresas'). Use the slug exactly as it appears in an InfoJobs category URL. Works with or without a `keyword`. Leave empty to search across all categories.

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

How to order results. 'RELEVANCE' returns the best keyword matches first; 'PUBLICATION\_DATE' returns the newest postings first. Defaults to RELEVANCE. Use PUBLICATION\_DATE for monitoring fresh job openings.

## `publishedSince` (type: `string`):

Restrict results to jobs published within a recent time window. 'ANY' returns all matching jobs; the others limit to the last 24 hours, 7 days, or 15 days. Defaults to ANY. Use a shorter window with PUBLICATION\_DATE sort for daily monitoring.

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

Maximum number of job records to scrape across all searches combined (controls cost: charged $0.004 per job). InfoJobs returns 22 jobs per page, so the actor paginates until this cap or the result set is exhausted. Defaults to 100. Set lower for a quick sample, higher for a full export.

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

Optional list of full InfoJobs search-results URLs to scrape directly (e.g. 'https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=java\&province=madrid'). Use this to reproduce an exact filtered search you built on the InfoJobs site. Only list.xhtml search URLs are supported — job-detail and SEO URLs are anti-bot protected and will be skipped. Overrides the keyword/province/category fields when provided.

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

Proxy settings. Defaults to Apify Residential proxy in Spain (ES), which is required to reliably bypass InfoJobs' Incapsula anti-bot protection. Override only if you have a specific proxy need. Datacenter proxies are blocked more often by InfoJobs.

## Actor input object example

```json
{
  "keyword": "desarrollador",
  "province": "madrid",
  "category": "informatica-telecomunicaciones",
  "sortBy": "RELEVANCE",
  "publishedSince": "ANY",
  "maxResults": 100,
  "searchUrls": [
    "https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=java"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keyword": "desarrollador",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/infojobs-jobs-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 = {
    "keyword": "desarrollador",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/infojobs-jobs-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 '{
  "keyword": "desarrollador",
  "maxResults": 100
}' |
apify call khadinakbar/infojobs-jobs-scraper --silent --output-dataset

```

## MCP server setup

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