# InfoJobs Scraper - Spain Job Listings (`benthepythondev/infojobs-jobs-scraper`) Actor

Scrape InfoJobs Spain search results with job title, company, location, work mode, date, contract, schedule, salary, description and listing URL.

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

## Pricing

from $2.00 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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, Companies and Salary Data

Extract public job listings from **InfoJobs Spain** as structured, analysis-ready data. Search by a role or skill, or paste a filtered InfoJobs results URL, and receive job titles, hiring companies, locations, work modes, posting age, contract details, schedules, salary text, descriptions, and direct listing links. The Actor is built for recruiters, job boards, market researchers, sales teams, and anyone monitoring Spanish hiring demand.

InfoJobs renders its public search results on the server, so this Actor can collect them without a login or heavyweight browser. Runs are fast, inexpensive, and appropriate for scheduled monitoring. Export the default dataset to JSON, CSV, Excel, XML, or RSS, access it through the Apify API, or connect it to Make, Zapier, n8n, Google Sheets, and your own data warehouse.

### What can the InfoJobs Scraper do?

- Search InfoJobs by job title, skill, employer, or keyword
- Accept full filtered search URLs for precise targeting
- Follow result pages until the requested job limit is reached
- Return job title, employer, location, and work arrangement
- Extract contract type, schedule, salary text, and card description
- Identify featured listings and public company profile URLs
- Deduplicate jobs by source ID or canonical URL
- Run once or on a recurring Apify schedule

### Data extracted

Each result is one public InfoJobs job card and can include:

- `job_id` - source identifier derived from the listing card
- `title` - advertised role title
- `company` - hiring company name
- `location` - city, province, or location shown by InfoJobs
- `work_mode` - on-site, hybrid, or telework label when shown
- `remote` - normalized boolean based on the public work-mode label
- `posted_text` - public relative posting age such as `Hace 3d`
- `contract` - advertised contract type
- `schedule` - full-time, part-time, or other schedule label
- `salary` - salary information exactly as displayed
- `description` - public search-card description
- `featured` - whether the card is marked as highlighted
- `url` - direct InfoJobs listing URL
- `company_url` - public employer profile URL when available
- `search_url`, source, and scrape timestamp

The Actor does not infer a salary, seniority level, or company detail when InfoJobs does not display one. Missing fields remain null so downstream users can distinguish source data from assumptions.

### Input

| Field | Description | Default |
|---|---|---|
| `searchUrls` | Full InfoJobs result URLs containing your filters | empty |
| `keyword` | Role, skill, company, or search phrase | `python` |
| `maxResults` | Maximum unique jobs returned per search | `10` |

When both `searchUrls` and `keyword` are provided, the Actor processes both. For precise country-site filters, configure the search on InfoJobs and paste the resulting URL.

#### Example input

```json
{
  "searchUrls": [
    "https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=data%20engineer"
  ],
  "keyword": "",
  "maxResults": 100
}
````

### Example output

```json
{
  "job_id": "92bb2097484f6096ca817d1fb7e7d6",
  "title": "Desarrollador/a Python (Flask/FastAPI)",
  "company": "Sopra Steria",
  "location": "Alicante/Alacant",
  "work_mode": "Híbrido",
  "remote": true,
  "posted_text": "Hace 3d",
  "contract": "Contrato indefinido",
  "schedule": "Jornada completa",
  "salary": "Salario no disponible",
  "description": "Porque trabajar en Sopra Steria...",
  "featured": true,
  "url": "https://www.infojobs.net/alicante-alacant/...",
  "company_url": "https://soprasteria.ofertas-trabajo.infojobs.net",
  "source": "InfoJobs"
}
```

This example shows the output structure. Actual listings and values change continuously with the public InfoJobs search results.

### Use cases

#### Spanish job-board aggregation

Collect listings for a focused occupation or region and merge them with other ATS and job-board sources. Use `job_id` or `url` as the deduplication key and keep the source field so users can open the original listing.

#### Recruiting and talent intelligence

Track which companies are hiring for specific skills, where the demand is located, and which roles are advertised as hybrid or remote. Schedule recurring runs and compare newly observed IDs with the previous dataset.

#### Sales and account research

Hiring signals can indicate budget, team expansion, and technology investment. Combine company names and advertised skills with permitted business-enrichment sources before prioritizing outreach. A public job listing is a market signal, not consent for indiscriminate messaging.

#### Salary and labor-market monitoring

Filter rows where `salary` contains a disclosed range, then analyze the source-provided text by role or location. Do not treat `Salario no disponible` as zero, and normalize different pay periods before comparing values.

#### Remote and hybrid alerts

Run a saved InfoJobs search daily, keep rows with a remote or hybrid work-mode label, and send only newly observed job IDs to Slack, email, Telegram, or a spreadsheet workflow.

### Pricing

The Actor uses transparent pay-per-event pricing: a very small one-time Actor start event and **$0.002 per job result** written to the default dataset. The result price is positioned inside the current competitor range while keeping repeated monitoring affordable. The default run returns no more than ten jobs, and `maxResults` gives you direct spending control.

### Reliability and data quality

The engine reads server-rendered public search cards and does not depend on a logged-in account. It retries temporary failures, paginates conservatively, suppresses duplicate IDs, and raises an explicit error if no job is returned. This makes scheduled failures visible instead of silently producing a misleading empty dataset.

InfoJobs can change card labels or page structure. If a field suddenly becomes empty, open an Actor issue with the run ID and a public search URL. Avoid including private credentials or personal data in support messages.

### Responsible use

Use this Actor only for lawful collection and processing of publicly available job data. Respect InfoJobs terms, robots and rate expectations, copyright, database rights, and applicable privacy and employment laws. Do not use job or company data for discrimination, spam, harassment, or deceptive recruitment.

### FAQ

**Do I need an InfoJobs account?**\
No. The Actor reads public search-result cards.

**Can I apply location and contract filters?**\
Yes. Apply the filters on InfoJobs and paste the resulting URL into `searchUrls`.

**Does it open every job-detail page?**\
No. It extracts rich fields from search cards, which keeps runs faster and more reliable. The direct job URL is included for downstream detail work.

**Can I scrape more than one search?**\
Yes. Add several URLs. `maxResults` applies to each search target.

**How do I detect remote jobs?**\
Use both `work_mode` and the normalized `remote` boolean. Hybrid listings are also marked true because they include a remote component.

**How should I remove duplicates?**\
Use `job_id`, falling back to `url`, as your stable key.

**Can I schedule the scraper?**\
Yes. Apify schedules are useful for daily job alerts and labor-market snapshots.

### Support and feedback

If the Actor saves useful time in your recruiting, research, or alert workflow, please leave a short Apify Store review. Reviews help other users evaluate the Actor and help prioritize future maintenance. For extraction problems, open an issue with the run ID and a public InfoJobs search URL so the failure can be reproduced without exposing private data.

### You might also like

- [StepStone Scraper](https://apify.com/benthepythondev/stepstone-scraper) for European job listings
- [Remote Jobs Aggregator](https://apify.com/benthepythondev/remote-jobs-aggregator) for multi-source remote roles
- [Greenhouse Jobs Scraper](https://apify.com/benthepythondev/greenhouse-jobs-scraper) for Greenhouse ATS boards
- [Lever Jobs Scraper](https://apify.com/benthepythondev/lever-jobs-scraper) for Lever-hosted career pages

***

**Keywords:** InfoJobs scraper, InfoJobs jobs scraper, Spain jobs API, scrape InfoJobs, Spanish job listings, InfoJobs salary data, Spain recruiting data, remote jobs Spain, hiring intelligence Spain, InfoJobs export, Spain job board scraper.

# Actor input Schema

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

Paste InfoJobs search-result URLs after applying location, remote, contract, salary, or date filters. Leave empty to use the keyword.

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

Role, skill, or keyword used when no search URL is supplied.

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

Maximum number of unique job listings returned for each URL or keyword search.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=python"
  ],
  "keyword": "python",
  "maxResults": 10
}
```

# 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 = {
    "searchUrls": [
        "https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=python"
    ],
    "keyword": "python",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = {
    "searchUrls": ["https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=python"],
    "keyword": "python",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/infojobs-jobs-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/jobsearch/search-results/list.xhtml?keyword=python"
  ],
  "keyword": "python",
  "maxResults": 10
}' |
apify call benthepythondev/infojobs-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "InfoJobs Scraper - Spain Job Listings",
        "description": "Scrape InfoJobs Spain search results with job title, company, location, work mode, date, contract, schedule, salary, description and listing URL.",
        "version": "1.0",
        "x-build-id": "SZmy9hIgB542maoFv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~infojobs-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-infojobs-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/benthepythondev~infojobs-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-infojobs-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/benthepythondev~infojobs-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-infojobs-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchUrls": {
                        "title": "InfoJobs search URLs",
                        "type": "array",
                        "description": "Paste InfoJobs search-result URLs after applying location, remote, contract, salary, or date filters. Leave empty to use the keyword.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Job keyword",
                        "type": "string",
                        "description": "Role, skill, or keyword used when no search URL is supplied.",
                        "default": "python"
                    },
                    "maxResults": {
                        "title": "Maximum jobs per search",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of unique job listings returned for each URL or keyword search.",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
