# Tecnoempleo Scraper - Spain IT & Tech Jobs, Salaries (`opendata_es/tecnoempleo-it-jobs-scraper`) Actor

Scrape IT and tech job offers from Tecnoempleo.com (Spain) by technology, provinces, remote/hybrid/on-site and contract: company, salary in EUR, tech-stack tags, full description, top-skills ranking and daily new-job alerts. No proxy needed.

- **URL**: https://apify.com/opendata_es/tecnoempleo-it-jobs-scraper.md
- **Developed by:** [c.d.s Studio](https://apify.com/opendata_es) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Tecnoempleo Scraper – Spain IT & Tech Jobs, Salaries and Tech Stack

Extract **IT and tech job offers from [Tecnoempleo.com](https://www.tecnoempleo.com)**, Spain's leading job board for developers, data, DevOps, cybersecurity, SAP and telecoms. Search by **technology or role**, **provinces**, **100 % remote / hybrid / on-site** and **contract type**, and get the company, **salary range in EUR**, **tech-stack tags**, role, publication date and the **full description**.

Every run also returns a **ranking of the most requested technologies** for your search – instant labour-market intelligence.

> *Scraper de ofertas de empleo de informática de Tecnoempleo: busca por tecnología, provincia, teletrabajo y contrato, con salario, stack tecnológico, descripción completa y alertas diarias de nuevas ofertas.*

### Why this Tecnoempleo scraper?

- 🧑‍💻 **Tech stack per offer** – `skills: ["Java", "Spring Boot", "Kafka"]`, plus a top-25 skills ranking in the run summary.
- 💶 **Salary as numbers** – `salaryMinEur`, `salaryMaxEur`; filter with `minSalary`.
- 🏠 **Work mode normalised** to `remote`, `hybrid`, `onsite`.
- 🗺️ **Several provinces in one run** (`["Madrid", "Barcelona", "Valencia"]`).
- 🎯 **Must-have skills filter** – e.g. only offers tagged with both `aws` and `kubernetes`.
- 🔔 **New-jobs-only mode + webhook** for daily alerts to Slack, Telegram, Zapier, Make or n8n.
- ⚡ **Fast, no browser, no proxy.** 100 offers with full details in well under a minute.
- 💸 **Pay only for the offers you get.**

### Use cases

- **IT recruiters and staffing agencies**: find companies hiring for a stack and reach them (lead generation).
- **Developers**: daily alert of remote Python / React / DevOps jobs above your salary target.
- **Salary benchmarking** for tech roles in Spain.
- **Skills-demand research**: which technologies Spanish companies ask for, by province.
- **Job aggregators and AI agents** that need clean Spanish IT job data.

### Input

| Field | Example | Notes |
|---|---|---|
| `keyword` | `python`, `data engineer`, `sap` | Technology or role. Empty = all IT offers. |
| `provinces` | `["Madrid", "Barcelona"]` | Empty = all of Spain. |
| `workModes` | `["remote", "hybrid"]` | remote / hybrid / onsite. |
| `contractTypes` | `["permanent"]` | permanent / temporary / freelance / internship. |
| `minSalary` | `40000` | Offers whose published salary reaches this amount. |
| `requiredSkills` | `["aws", "kubernetes"]` | All must be tagged. |
| `excludeWords` | `["prácticas"]` | Drop by title / company. |
| `maxItems` | `100` | 0 = all. |
| `includeDetails` | `true` | Full description, city, province, structured salary. |
| `onlyNewJobs` | `true` | Only offers unseen in previous runs. |
| `alertWebhookUrl` | `https://hooks.slack.com/...` | POST with new offers. |

#### Example – remote Python jobs paying 40k+

```json
{
  "keyword": "python",
  "workModes": ["remote"],
  "minSalary": 40000,
  "maxItems": 50
}
```

#### Example – daily alert of new DevOps jobs in Madrid and Barcelona

```json
{
  "keyword": "devops",
  "provinces": ["Madrid", "Barcelona"],
  "onlyNewJobs": true,
  "alertWebhookUrl": "https://hooks.zapier.com/hooks/catch/123/abc"
}
```

### Output

```json
{
  "rank": 1,
  "jobId": "rf-478e15e942b7f396ba44",
  "title": "Desarrollador/a Python sobre GCP",
  "company": "Arelance",
  "companyUrl": "https://www.tecnoempleo.com/arelance-trabajo",
  "workMode": "remote",
  "location": null,
  "city": "Madrid",
  "province": "Madrid",
  "role": "Analista Programador",
  "salaryText": "33.000€ - 39.000€ b/a",
  "salaryMinEur": 33000,
  "salaryMaxEur": 39000,
  "salaryPeriod": "YEAR",
  "skills": ["python", "gcp", "cloud"],
  "postedDate": "2026-10-20",
  "employmentType": "FULL_TIME",
  "description": "En Arelance sabemos que las personas son el activo más importante ...",
  "newSinceLastRun": true,
  "url": "https://www.tecnoempleo.com/desarrollador-python-sobre-gcp-arelance/cloud-git/rf-478e15e942b7f396ba44",
  "source": "tecnoempleo.com",
  "scrapedAt": "2026-10-21T07:00:05+00:00"
}
```

The run summary (`OUTPUT` record) contains the total offers on the site, offers returned, new offers, split by work mode, average top salary and the **top 25 technologies**:

```json
{ "totalOnSite": 58, "jobsReturned": 58, "byWorkMode": { "remote": 41, "hybrid": 12, "onsite": 5 },
  "topSkills": [ { "skill": "java", "jobs": 48 }, { "skill": "spring boot", "jobs": 12 } ] }
```

### Pricing (pay per event)

| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Job offer | $0.0008 per offer |
| Job offer detail (full description) | $0.0004 per offer |

**100 offers with full details ≈ $0.13.** A daily new-jobs alert usually costs about a cent.

### FAQ

**Do I need a proxy or a Tecnoempleo account?** No.

**Why do remote offers appear when I filter a province?** Tecnoempleo lists fully remote offers open to candidates in that province. Use `workModes: ["onsite", "hybrid"]` to exclude them.

**Is it legal?** The actor reads publicly available job listings at a polite rate without logging in. Respect Tecnoempleo's terms and data-protection law when you reuse the data.

### Related actors

- [Infoempleo Jobs Scraper](https://apify.com/opendata_es/infoempleo-jobs-scraper) – all sectors, Spain.
- [Mercadona Scraper](https://apify.com/opendata_es/mercadona-products-prices) – Spanish supermarket prices with EAN.
- [Spain Public Tenders](https://apify.com/opendata_es/spain-public-tenders) – public procurement in Spain.

Keywords: tecnoempleo scraper, IT jobs spain, tech jobs scraper, empleo informática, ofertas programador, remote developer jobs spain, salary data, tech skills demand, recruitment leads.

# Actor input Schema

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

Technology or role, e.g. 'python', 'java', 'react', 'devops', 'sap', 'data engineer', 'ciberseguridad'. Empty = every IT offer.

## `provinces` (type: `array`):

Spanish provinces, e.g. 'Madrid', 'Barcelona', 'Valencia', 'Bizkaia', 'Las Palmas'. Empty = all of Spain. Note: Tecnoempleo also lists fully remote offers open to those provinces.

## `workModes` (type: `array`):

Any combination of remote, hybrid and onsite. Empty = all.

## `contractTypes` (type: `array`):

Empty = all.

## `minSalary` (type: `integer`):

Keep only offers that publish a salary whose top reaches this amount (0 = no filter).

## `requiredSkills` (type: `array`):

Keep only offers tagged with ALL of these technologies (e.g. 'aws', 'kubernetes').

## `excludeWords` (type: `array`):

Drop offers whose title or company contains any of these words.

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

Maximum offers to return (0 = all).

## `includeDetails` (type: `boolean`):

Open every offer: full description, city and province, publication date, employment type and salary from the offer's structured data.

## `onlyNewJobs` (type: `boolean`):

Return only offers not seen in previous runs of the same search. Schedule it daily for job alerts.

## `alertWebhookUrl` (type: `string`):

Optional URL that receives a JSON POST with the new offers (Slack, Zapier, Make, n8n, Telegram bot...).

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

Not required.

## `concurrency` (type: `integer`):

Parallel offer pages (1-8).

## Actor input object example

```json
{
  "keyword": "python",
  "minSalary": 0,
  "maxItems": 100,
  "includeDetails": true,
  "onlyNewJobs": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "concurrency": 4
}
```

# Actor output Schema

## `jobs` (type: `string`):

Every offer of the run: id, title, company, location, work mode, role, salary range, tech skills, posted date, full description, new flag and link.

## `summary` (type: `string`):

Search URL, total offers on the site, offers returned, new offers, split by work mode, average top salary and the 25 most requested technologies.

# 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": "python"
};

// Run the Actor and wait for it to finish
const run = await client.actor("opendata_es/tecnoempleo-it-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": "python" }

# Run the Actor and wait for it to finish
run = client.actor("opendata_es/tecnoempleo-it-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": "python"
}' |
apify call opendata_es/tecnoempleo-it-jobs-scraper --silent --output-dataset

```

## MCP server setup

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