# InfoJobs Job Scraper (`parsebird/infojobs-job-scraper`) Actor

Scrape job listings from InfoJobs.net: titles, descriptions, companies, cities, contract types, work schedules, and posting dates.

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

## Pricing

from $1.79 / 1,000 job scrapeds

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 Job Scraper — Extract Job Listings from InfoJobs.net

Scrape job listings from [InfoJobs](https://www.infojobs.net/), one of Spain's largest job portals. Extract job titles, full descriptions, companies, cities, contract types, work schedules, teleworking status, and posting dates from any InfoJobs search results page. Export as JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Paste any InfoJobs search URL — keyword, city, province, or category — and get structured job data with full descriptions, contract type, workday, and teleworking status, ready for analysis, monitoring, or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/infojobs-job-scraper — scrapes InfoJobs.net job listings (Spain). $0.00229/result on the Free plan ($2.29/1000), $0.00219/result on Bronze ($2.19/1000), $0.00199/result on Silver ($1.99/1000), $0.00179/result on Gold ($1.79/1000). Call via ApifyClient: client.actor("parsebird/infojobs-job-scraper").call(run_input={"searchUrls": ["https://www.infojobs.net/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY"], "maxItems": 30}). Inputs: searchUrls (array of strings, required — one or more InfoJobs search URLs), maxItems (integer, default 30 — maximum job listings to collect across all search URLs), proxyConfiguration (object, default {"useApifyProxy": false}). Output: dataset with searchUrl, scrapedAt, and a nested offer object containing code, title, description, city, link, contractType, workday, teleworking, publishedAt, companyName, companyLogo, companyLink, states, upsellings, executive. API docs: https://docs.apify.com/api/v2 Token: https://console.apify.com/settings/integrations
```

### What does InfoJobs Job Scraper do?

**InfoJobs Job Scraper** is an [Apify Actor](https://apify.com/actors) that extracts job listings directly from [InfoJobs.net](https://www.infojobs.net/) search results — the same structured data InfoJobs renders on its own search pages, without needing an official API.

- 🔗 **URL-based search** — build any search on InfoJobs.net (keyword, city, province, category, contract type, sort order) and paste the resulting URL into the Actor
- 📄 **Multiple search URLs per run** — combine several searches (e.g. different cities or keywords) into a single Actor run
- 📃 **Automatic pagination** — the Actor pages through results on your behalf until it reaches `maxItems` or runs out of listings
- 📝 **Full descriptions included** — job descriptions are pulled straight from the search results, no extra detail-page requests required
- ⏱️ **Scheduling & API access** — run on autopilot with [Apify Schedules](https://docs.apify.com/platform/schedules) and pull results via the [Apify API](https://docs.apify.com/api/v2) or client libraries
- 📊 **Multiple export formats** — download as JSON, CSV, Excel, XML, HTML, or RSS

### What data can you extract from InfoJobs.net?

| Field | Description |
|-------|-------------|
| `offer.code` | InfoJobs listing identifier |
| `offer.title` | Job title |
| `offer.description` | Full job description text |
| `offer.city` | City where the job is located |
| `offer.link` | Job ad URL (relative to infojobs.net) |
| `offer.contractType` | Contract type (e.g. "Contrato indefinido") |
| `offer.workday` | Work schedule (e.g. "Jornada completa") |
| `offer.teleworking` | Teleworking status (e.g. "Presencial", "Híbrido") |
| `offer.publishedAt` | Posting date (ISO 8601) |
| `offer.companyName` | Employer name |
| `offer.companyLogo` | Company logo URL, when available |
| `offer.companyLink` | Link to the company's InfoJobs profile |
| `offer.states` | Listing state flags (e.g. "REUSED") |
| `offer.upsellings` | Promotion flags applied to the listing (e.g. "PROMOTED") |
| `offer.executive` | Whether the listing is flagged as an executive role |
| `searchUrl` | The search URL this job was collected from |
| `scrapedAt` | Timestamp when the job was scraped |

### How to scrape InfoJobs.net

1. Go to [InfoJobs.net](https://www.infojobs.net/ofertas-trabajo) and build a search using keyword, location, and any other filters you need
2. Copy the resulting URL from your browser's address bar
3. Go to **InfoJobs Job Scraper** on [Apify Store](https://apify.com/parsebird/infojobs-job-scraper) and click **Try for free**
4. Paste your URL(s) into the **Search URLs** field — add more than one to combine several searches
5. Set **Maximum Items** — start low (e.g. 30) for a quick test, increase for larger datasets
6. Click **Start** and wait for the run to finish
7. Export your data as JSON, CSV, or Excel, or access it via the [Apify API](https://docs.apify.com/api/v2)

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchUrls` | array | **Yes** | — | List of InfoJobs search URLs to scrape |
| `maxItems` | integer | No | `30` | Maximum number of job listings to scrape across all search URLs |
| `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Proxy settings for the run |

### Output example

```json
[
  {
    "searchUrl": "https://www.infojobs.net/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY",
    "scrapedAt": "2026-08-15T11:24:53.443Z",
    "offer": {
      "code": "3212c87c30495fb6601d9cdb28b382",
      "title": "PERSONAL LAVADERO VEHICULOS CON EXPERIENCIA PREVIA EN EL PUESTO",
      "description": "seleccionamos persona para lavadero de vehiculos en concesionario, con experiencia previa en el puesto...",
      "city": "Úbeda",
      "link": "//www.infojobs.net/ubeda/personal-lavadero-vehiculos-con-experiencia-previa-el-puesto/of-i3212c87c30495fb6601d9cdb28b382?applicationOrigin=search-new&page=1&sortBy=RELEVANCE",
      "contractType": "Contrato indefinido",
      "workday": "Jornada completa",
      "teleworking": "Presencial",
      "publishedAt": "2026-08-10T07:47:08Z",
      "companyName": "Grupo Ávolo",
      "companyLink": "https://avolo.ofertas-trabajo.infojobs.net",
      "states": ["REUSED"],
      "upsellings": ["BUMP_WEEKLY", "PROMOTED"],
      "executive": false
    }
  }
]
```

Download results in JSON, CSV, Excel, XML, HTML, or RSS, or access via the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- 📊 **Recruitment intelligence** — build fresh hiring datasets by keyword, city, or category across Spain
- 🎯 **Sales prospecting** — find companies actively hiring on InfoJobs and enrich outreach lists with role and contract context
- 📈 **Labor market research** — track contract type mix, teleworking rates, and posting volume across regions
- 📅 **Job market monitoring** — schedule recurring runs to track new postings for a given search
- 🔌 **Pipeline integration** — feed job data into Google Sheets, Slack, Zapier, Make, or custom systems via [Apify Integrations](https://docs.apify.com/platform/integrations)

### How it works

1. The Actor fetches each URL in `searchUrls`, starting from the page number already encoded in the URL (or page 1 if none is set)
2. It parses the job listings embedded in InfoJobs' own search results page — the same data InfoJobs renders for visitors
3. When more listings are needed, the Actor increments the page number and fetches the next page, continuing until `maxItems` is reached, the search runs out of results, or the last available page is hit
4. Every job is pushed to the dataset as it's collected, so partial results are available even if a run is stopped early

### How to use via API — Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/infojobs-job-scraper").call(run_input={
    "searchUrls": [
        "https://www.infojobs.net/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY"
    ],
    "maxItems": 50,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    offer = item["offer"]
    print(f"{offer['title']} at {offer['companyName']} — {offer['city']}")
```

### How to use via API — JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('parsebird/infojobs-job-scraper').call({
    searchUrls: [
        'https://www.infojobs.net/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY'
    ],
    maxItems: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(({ offer }) => {
    console.log(`${offer.title} at ${offer.companyName} — ${offer.city}`);
});
```

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

InfoJobs Job Scraper uses [pay-per-event pricing](https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event) — you pay a fixed price per job scraped. Platform usage (compute, proxy) is not charged separately.

**How much does it cost to scrape 1,000 InfoJobs jobs?**

$2.29 on the Free plan, $2.19 on Bronze, $1.99 on Silver, or $1.79 on Gold. New users get a free trial with platform credit to try the Actor before committing.

**How much does it cost to scrape 100 InfoJobs jobs?**

Around $0.23 on the Free plan — enough for a quick export covering one or two search URLs.

### Pricing

| Event | Price per event | Price per 1,000 |
|-------|------------------|------------------|
| `job-scraped` | $0.00229 (Free) / $0.00219 (Bronze) / $0.00199 (Silver) / $0.00179 (Gold) | **$2.29 / $2.19 / $1.99 / $1.79** |

Each job pushed to the dataset counts as one event.

### Is it legal to scrape InfoJobs.net?

This Actor extracts publicly available data from [InfoJobs](https://www.infojobs.net/) — the same job listing data any visitor can see on the search results pages. No login or authentication is used.

Web scraping of publicly available data is generally legal in the United States and the European Union, as established by the [hiQ Labs v. LinkedIn ruling](https://en.wikipedia.org/wiki/HiQ_Labs_v._LinkedIn). For more information, see Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Users are responsible for ensuring their use of extracted data complies with applicable laws and InfoJobs' Terms of Service in their jurisdiction.

### Related Actors

Looking for more job scraping and data extraction tools? Check out these ParseBird actors:

- [JobsDB Job Scraper](https://apify.com/parsebird/jobsdb-job-scraper) — Scrape job listings from JobsDB.com across Thailand and Hong Kong
- [Naukri Jobs Scraper](https://apify.com/parsebird/naukri-jobs-scraper) — Scrape job listings, salaries, and company reviews from Naukri.com across India
- [Bayt Jobs Scraper](https://apify.com/parsebird/bayt-jobs-scraper) — Scrape Middle East job listings from Bayt.com
- [Fotocasa Scraper](https://apify.com/parsebird/fotocasa-scraper) — Extract Spanish real estate listings from Fotocasa.es

Browse all [ParseBird actors on Apify Store](https://apify.com/parsebird).

### FAQ

**Do I need to build a search URL myself?**
Yes. Go to [InfoJobs.net](https://www.infojobs.net/ofertas-trabajo), set up your search (keyword, location, filters), then copy the URL from your browser and paste it into `searchUrls`.

**Can I combine multiple searches in one run?**
Yes. Add multiple URLs to `searchUrls` — the Actor scrapes them in order until `maxItems` is reached across all of them combined.

**Does the Actor fetch individual job pages for full descriptions?**
No. InfoJobs' search results already include the full job description text, so the Actor collects everything in `offer.description` without extra detail-page requests, keeping runs fast and cheap.

**What happens if a search URL returns no results?**
The Actor finishes successfully with an empty dataset for that URL and logs a warning — this isn't treated as an error, and any other search URLs in the run still proceed.

**Why does `offer.link` start with `//` instead of `https://`?**
That's the protocol-relative URL format InfoJobs uses internally. Prefix it with `https:` (e.g. `https://www.infojobs.net/...`) to get a clickable link.

**Can I schedule recurring runs?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any interval, and re-use the same search URL to track new postings over time.

**Can I access the data via API?**
Yes. Use the [Apify API](https://docs.apify.com/api/v2) or the official [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) client libraries to run the Actor and retrieve results programmatically.

**What export formats are supported?**
JSON, CSV, Excel (XLSX), XML, HTML, and RSS. Download directly from the Apify Console or via the API.

**Is there a free trial?**
Yes. New Apify users get free platform credit to try InfoJobs Job Scraper before committing to a paid plan.

**I found an issue or have a feature request.**
Open an issue on the [Issues tab](https://apify.com/parsebird/infojobs-job-scraper/issues) or contact ParseBird via the Apify Console.

# Actor input Schema

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

List of InfoJobs search URLs to scrape. Build a search on <a href='https://www.infojobs.net/ofertas-trabajo' target='_blank'>infojobs.net</a> with the filters you want (keyword, location, contract type, etc.) and paste the resulting URL here.

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

Maximum number of job listings to scrape across all search URLs combined.

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

Proxy settings for the run. Using Apify Proxy is recommended for larger runs to avoid rate limiting.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.infojobs.net/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY"
    ],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/infojobs-job-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/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY"],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/infojobs-job-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 '{
  "searchUrls": [
    "https://www.infojobs.net/ofertas-trabajo/espana?keyword=puesto&segmentId=&page=1&sortBy=RELEVANCE&onlyForeignCountry=false&countryIds=17&sinceDate=ANY"
  ],
  "maxItems": 30
}' |
apify call parsebird/infojobs-job-scraper --silent --output-dataset

```

## MCP server setup

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