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

InfoJobs Jobs Scraper extracts Spanish job offers from InfoJobs.net by keyword, province, town or search URL: title, company, location, contract, workday, remote work, posting date, salary range and the job description, for recruiting, salary benchmarking and job market research.

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

## Pricing

from $1.50 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

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

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

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

# README

### 🚀 InfoJobs Jobs Scraper

Extract job offers from **InfoJobs.net**, Spain's biggest job board. The **InfoJobs Jobs Scraper** turns a keyword, a Spanish province or town, or any InfoJobs search URL into structured job data: title, company, location, contract type, workday, teleworking, posting date, the **salary range with currency, period and gross/net**, and the **job description**.

### ✨ Features

- 💼 **Complete job data**: title, job URL, company name, company page and logo, town, contract type (`Contrato indefinido`, `De duración determinada`…), workday (`Jornada completa`, `Jornada parcial - mañana`…) and posting date.
- 💶 **Salaries you can filter on**: `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` (year, month, hour) and `salaryType` (gross or net), as the employer entered them.
- 🏠 **Remote work**: `remoteWork` is `onsite`, `hybrid` or `remote`.
- 📝 **Descriptions included**: the job description comes with every job, no extra cost per job.
- 🔍 **Search or paste URLs**: use keyword + province or town, or paste any InfoJobs search page with its filters (category, contract type, workday, teleworking, salary, date posted, sort). A pasted page 3 starts at page 3.
- 📚 **No page limit**: export every job of a search, up to the full ~65,000 jobs on the site. Each job is saved once, even across overlapping searches, and paid placements that don't match your search are left out.

### 🛠️ How It Works

1. **Describe the search**: enter a job title or keyword and a Spanish province (`Madrid`, `Barcelona`, `Valencia`) or town (`Getafe`, `Vigo`), or paste InfoJobs search URLs.
2. **Set Max results**: how many jobs to save (default 50).
3. **Run the scraper**: download the jobs as JSON, CSV or Excel, or pull them through the API. Schedule it with a "last 24 hours" search URL to build a daily job feed.

### ⚙️ Input

| Field                    | Description                                                                                                          |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------- |
| **Job title or keyword** | What to search for, e.g. `administrativo`, `camarero`, `python`, `enfermero`. Empty = every job in the location.     |
| **Location**             | A Spanish province (`Madrid`, `Barcelona`, `Vizcaya`) or a town as InfoJobs writes it (`Getafe`). Empty = all Spain. |
| **InfoJobs search URLs** | Optional. Search results pages from infojobs.net with any filters. Replaces keyword and location.                    |
| **Max results**          | Maximum number of jobs to save across all searches (default 50).                                                     |
| **Proxy configuration**  | Spanish residential proxies by default. Leave as is unless you have a reason to change it.                           |

Example input:

```json
{
    "keyword": "python",
    "location": "Madrid",
    "maxItems": 200
}
```

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

Pay only for the jobs you get, with no monthly fee:

| Event       | Price                         | When it's charged   |
| ----------- | ----------------------------- | ------------------- |
| Actor start | **$0.00005**                  | Once per run        |
| Job         | **$0.0015** ($1.50 per 1,000) | For every job saved |

For example, 1,000 jobs with descriptions and salaries cost about **$1.50**. Set a maximum cost per run in Apify and the scraper stops when it reaches it.

### 📊 Sample Output Data

One job (description shortened here):

```json
{
    "id": "dab111e3cf405690539bd10d2e3234",
    "title": "Programador/a Jr. Data (Business Intelligence, Big Data, Cloud, SQL o Python) indispensable Cert. Discapacidad 33%",
    "url": "https://www.infojobs.net/madrid/programador-jr.-data-business-intelligence-big-data-cloud-sql-python-indispensable-cert.-discapacidad-33/of-idab111e3cf405690539bd10d2e3234",
    "companyName": "Bluetab, an IBM Company",
    "companyUrl": "https://bluetab.ofertas-trabajo.infojobs.net",
    "companyLogoUrl": "https://multimedia-logos.infojobs.net/image/upload/7e/7e67ebc1-5ecd-4313-9a34-683b083ff74a",
    "location": "Madrid",
    "remoteWork": "hybrid",
    "contractType": "Contrato indefinido",
    "workday": "Jornada completa",
    "datePosted": "2026-10-06T06:43:23Z",
    "salaryMin": 24000,
    "salaryMax": 30000,
    "salaryCurrency": "EUR",
    "salaryPeriod": "year",
    "salaryType": "gross",
    "description": "Bluetab, an IBM Company.\n¿IBM Company? Sí. Formamos parte del gigante tecnológico IBM, siendo an IBM Company. ¡Excelente noticia! Si esto suena interesante, sigue leyendo.\n\nAdemás, somos ¡Great Place to Work & Best Wo…",
    "isPromoted": false,
    "isExecutive": false,
    "scrapedAt": "2026-10-10T10:02:10.721Z"
}
```

### ℹ️ Good to Know

- About 70% of InfoJobs offers state a salary. Offers without one leave the salary fields empty; an offer with only a minimum fills `salaryMin` only.
- Descriptions are the text InfoJobs shows in its results, up to 4,000 characters. The few longer ads end at that length.
- `location` is the town the employer entered; a few employers enter a postcode instead.
- `isPromoted` marks jobs the employer paid to promote. They are saved where they appear in the normal results, not from the ad slots on top of each page.
- The run's status message explains any shortfall, e.g. a URL that asks for a page past the last one.
- This scraper covers infojobs.net (Spain). Job pages and candidate data are not scraped.

### ❓ FAQ

**Is it legal to scrape InfoJobs?**
The scraper collects only publicly visible job offers. You are responsible for using the data lawfully (e.g. GDPR) and for respecting the site's terms.

**Can I use the site's own filters?**
Yes. Set the filters on infojobs.net (category, contract type, workday, teleworking, salary, date posted, newest first), copy the URL of the results page and paste it into **InfoJobs search URLs**.

**How do I get only new jobs every day?**
Filter by "Últimas 24 horas" on infojobs.net, paste that search URL, and schedule the scraper to run daily.

### 🛟 Support

Missing a field or a filter? Open an issue in the **Issues** tab. Feedback and feature requests are welcome.

# Actor input Schema

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

What to search for on infojobs.net, e.g. `administrativo`, `camarero`, `python`, `enfermero`. Leave empty to get every job in the location.

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

A Spanish province (`Madrid`, `Barcelona`, `Valencia`, `Vizcaya`) or a town as InfoJobs writes it (`Getafe`, `Alcobendas`, `Vigo`). Leave empty for all of Spain.

## `startUrls` (type: `array`):

Paste infojobs.net search results URLs instead of using the fields above, with any filters applied (category, contract type, workday, teleworking, salary, date posted, sort), e.g. `https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword=python&provinceIds=33&sinceDate=_7_DAYS&sortBy=PUBLICATION_DATE`. A URL with `page=3` starts at page 3. When set, keyword and location are ignored.

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

Maximum number of jobs to save across all searches.

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

Proxy used to reach infojobs.net. Spanish residential proxies work best and are the default.

## Actor input object example

```json
{
  "keyword": "administrativo",
  "location": "Madrid",
  "maxItems": 50,
  "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": "administrativo",
    "location": "Madrid",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "ES"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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": "administrativo",
    "location": "Madrid",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "ES",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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": "administrativo",
  "location": "Madrid",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ES"
  }
}' |
apify call piotrv1001/infojobs-jobs-scraper --silent --output-dataset

```

## MCP server setup

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