# Tecnoempleo Scraper — Spain IT Job Listings & Tech Salaries (`studio-amba/tecnoempleo-scraper`) Actor

Scrape IT job listings from Tecnoempleo.com, Spain's leading tech job board. Search by keyword and province. Extract titles, companies, salaries, remote flags, tech stack tags, and full descriptions. No login or cookies required.

- **URL**: https://apify.com/studio-amba/tecnoempleo-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result 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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

### What does Tecnoempleo Scraper do?

**Tecnoempleo Scraper** extracts IT job listings from [Tecnoempleo.com](https://www.tecnoempleo.com), Spain's leading tech-focused job board. The scraper searches for jobs by keyword and province, then returns structured data including job titles, companies, salaries in EUR, locations, remote-work flags, job categories, tech stack tags, and full descriptions.

Run it on the Apify platform to get **API access, scheduling, proxy rotation, webhook integrations, and monitoring** out of the box. No login or cookies required — all data is extracted from publicly available job listings.

### Why use Tecnoempleo Scraper?

- **Spanish IT market research**: Analyze demand for specific tech roles, frameworks, and salary levels across Spain.
- **Recruitment intelligence**: Monitor competitor hiring patterns and track new IT openings by technology stack.
- **Salary benchmarking**: Collect salary data from tech job postings to understand market rates for developers, DevOps, data, and architecture roles in Spain.
- **Tech job aggregation**: Feed Spanish IT listings into your own job board, aggregator, or HR platform.
- **Talent market analysis**: Understand which cities and technologies have the highest demand (Java, Python, .NET, AWS, DevOps, and more).
- **Lead generation**: Identify actively hiring Spanish tech companies for B2B sales outreach.
- **Remote work tracking**: Filter for 100% remote IT roles across the Spanish market.

### How to scrape Tecnoempleo data

1. Go to the Tecnoempleo Scraper page on Apify Store.
2. Click **Try for free** to open the Actor in Apify Console.
3. Enter your search keyword (e.g. "java", "python", "devops", or Spanish terms like "desarrollador").
4. Optionally set a location (Madrid, Barcelona, Valencia, etc.).
5. Set the maximum number of results you want.
6. Click **Start** and wait for the run to finish.
7. Download your data as JSON, CSV, Excel, or connect it to your workflow via API.

That's it — no coding required. The scraper handles pagination, proxy rotation, and data extraction automatically.

### Input

| Field | Type | Description | Default |
|-------|------|-------------|---------|
| `searchQuery` | String | Job search keyword (e.g. "java", "python", "devops", "desarrollador") | `desarrollador` |
| `location` | String | Spanish province or city (Madrid, Barcelona, Valencia, etc.) | All Spain |
| `maxResults` | Integer | Maximum number of listings to scrape (1–10,000) | `50` |
| `fetchDetails` | Boolean | Visit detail pages for the full description, precise location/remote data, and additional tech tags | `true` |
| `proxyConfiguration` | Object | Proxy settings — Tecnoempleo serves plain HTML with no anti-bot protection, so the default Apify proxy works | Apify Proxy |

#### Example input

```json
{
    "searchQuery": "java",
    "location": "Madrid",
    "maxResults": 50,
    "fetchDetails": true,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
````

### Output

The scraper outputs structured JSON data for each job listing. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "title": "Tech Lead ó Analista Fullstack Java",
    "company": "Digital Talent Agency",
    "location": "Madrid, Madrid",
    "remote": false,
    "category": "Analista",
    "techTags": ["microservicios", "spring", "java", "angular", "hibernate", "jpa", "jenkins"],
    "salary": "36.000€ - 45.000€ b/a",
    "employmentType": "FULL_TIME",
    "postedDate": "2026-07-24",
    "description": "Zemsania busca incorporar un/a ANALISTA PROGRAMADOR/a JAVA FULLSTACK para un proyecto estable...",
    "url": "https://www.tecnoempleo.com/tech-lead-o-analista-fullstack-java-digital-talent/microservicios-spring/rf-dbc7104c92f54317c74f",
    "sourceId": "rf-dbc7104c92f54317c74f",
    "scrapedAt": "2026-07-25T09:53:22.318Z"
}
```

### Data fields

| Field | Description |
|-------|-------------|
| `title` | Job position title |
| `company` | Hiring company name |
| `location` | Job location (city/province) or remote label as shown on the site |
| `remote` | `true` if the job is 100% remote |
| `category` | Tecnoempleo's job category (e.g. Programador, Analista Programador, Big Data, DevOps) |
| `techTags` | Technologies/skills tagged on the listing (e.g. Java, React, AWS, Kubernetes) |
| `salary` | Salary range as displayed on the site, when published |
| `employmentType` | Employment type from the job's structured data (e.g. FULL\_TIME) |
| `postedDate` | Date the job was posted (ISO 8601 when available) |
| `description` | Full job description text (with `fetchDetails` enabled) |
| `url` | Direct link to the job listing on Tecnoempleo |
| `sourceId` | Tecnoempleo's internal reference ID for the offer (`rf-xxxxx`) |
| `scrapedAt` | ISO 8601 timestamp of data collection |

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

The Tecnoempleo Scraper reads the server-rendered search pages and detail pages (including their JSON-LD `JobPosting` structured data) over plain HTTP — no browser — so runs are fast and cheap. Typical costs:

- **50 listings** (with full details): ~$0.02-0.05 in platform credits
- **100 listings** (with full details): ~$0.05-0.10 in platform credits
- **1,000 listings** (with full details): ~$0.30-0.80 in platform credits

Costs depend on the number of pages loaded and whether `fetchDetails` is enabled. Disabling `fetchDetails` is faster and cheaper when you only need basic listing data (title, company, location, salary, category).

### Tips and advanced options

- **Use tech keywords** for the most targeted results: "java", "python", "devops", "angular", "aws", "big-data", "ciberseguridad" all map directly to Tecnoempleo's own category tags.
- **Keep `fetchDetails` on** for full job descriptions, precise remote/location data, and the complete tech stack tag list. Turn it off when you only need listing basics and want the fastest possible run.
- **Set `maxResults`** to control costs. Start small (10-50) to verify the output, then scale up.
- **Location filtering** supports Spanish provinces and cities: Madrid, Barcelona, Valencia, Sevilla, Bilbao, Málaga, Zaragoza, and more.
- **Schedule runs** to track new listings daily or weekly using Apify's built-in scheduler.
- **Combine with other scrapers** to build a comprehensive Spanish job market dataset. Check our InfoJobs Scraper for general Spain-wide listings, or NoFluffJobs Scraper for European IT jobs.

### Related Scrapers

- **[InfoJobs Scraper](https://apify.com/studio-amba/infojobs-scraper)** — General Spain job listings across all industries, useful for cross-referencing IT demand against the broader Spanish job market.
- **[NoFluffJobs Scraper](https://apify.com/studio-amba/nofluffjobs-scraper)** — European tech job listings, a good complement for comparing Spanish IT salaries against other EU markets.

### About Tecnoempleo

Tecnoempleo.com is Spain's leading job board dedicated exclusively to IT and technology roles. It is the go-to platform for Spanish developers, DevOps engineers, data specialists, and IT architects to find work, and for tech companies and recruitment agencies to hire specialized talent. Unlike general job boards, every listing on Tecnoempleo is tagged with the specific technologies, frameworks, and tools required, making it a rich source of structured tech-market signal.

### FAQ and support

#### Is it legal to scrape Tecnoempleo?

This scraper extracts only publicly available job listing data that any visitor can see without logging in. It does not access private data, bypass authentication, or violate GDPR. Always review the website's Terms of Service before large-scale scraping and ensure your use case complies with applicable laws.

#### The scraper returns 0 results

- Make sure your search query matches actual job listings on Tecnoempleo (try broad tech terms like "java", "python", "developer").
- Try removing the location filter to search all of Spain.
- The site may temporarily block automated access — try again after a few minutes or enable residential proxies.

#### Can I get custom modifications?

Yes. If you need additional fields, different output formats, or integration with your systems, open an issue in the **Issues** tab or contact us for a custom solution.

#### How often should I run this scraper?

Tecnoempleo updates listings continuously throughout the workday. For most use cases, running once daily or weekly is sufficient. Use Apify's scheduler to automate recurring runs.

### Support and maintenance

This Actor is actively maintained by [Studio Amba](https://apify.com/studio-amba). We monitor health daily and fix breaking changes within 24 hours.

- **Found a bug?** Open an issue on the [Issues tab](https://console.apify.com/actors) — we reply within one business day.
- **Need a schema change?** Request it in the issues tab; most field additions ship within a week.
- **Need a custom integration?** Reach out via [studioamba.dev](https://studioamba.dev) for tailored scraping solutions.

# Actor input Schema

## `searchQuery` (type: `string`):

Job search keyword (e.g. 'java', 'python', 'devops', 'desarrollador'). Leave empty to search for general developer roles.

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

Spanish province or city (e.g. 'Madrid', 'Barcelona'). Leave empty for all Spain.

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

Maximum number of job listings to scrape.

## `fetchDetails` (type: `boolean`):

Visit each job's detail page to extract the full description, precise remote/location data, and additional tech tags (via the site's JSON-LD JobPosting schema). Slower but much richer output.

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

Proxy settings. Tecnoempleo.com serves plain server-rendered HTML with no anti-bot protection, but residential proxies are prefilled by default to avoid rate-limiting on high-volume runs.

## Actor input object example

```json
{
  "searchQuery": "desarrollador",
  "maxResults": 50,
  "fetchDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "desarrollador",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/tecnoempleo-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 = {
    "searchQuery": "desarrollador",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/tecnoempleo-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 '{
  "searchQuery": "desarrollador",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/tecnoempleo-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tecnoempleo Scraper — Spain IT Job Listings & Tech Salaries",
        "description": "Scrape IT job listings from Tecnoempleo.com, Spain's leading tech job board. Search by keyword and province. Extract titles, companies, salaries, remote flags, tech stack tags, and full descriptions. No login or cookies required.",
        "version": "0.1",
        "x-build-id": "fcc2fujlRLl3oMZ4C"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/studio-amba~tecnoempleo-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-studio-amba-tecnoempleo-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/studio-amba~tecnoempleo-scraper/runs": {
            "post": {
                "operationId": "runs-sync-studio-amba-tecnoempleo-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/studio-amba~tecnoempleo-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-studio-amba-tecnoempleo-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": {
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Job search keyword (e.g. 'java', 'python', 'devops', 'desarrollador'). Leave empty to search for general developer roles."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Spanish province or city (e.g. 'Madrid', 'Barcelona'). Leave empty for all Spain."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of job listings to scrape.",
                        "default": 50
                    },
                    "fetchDetails": {
                        "title": "Fetch Full Details",
                        "type": "boolean",
                        "description": "Visit each job's detail page to extract the full description, precise remote/location data, and additional tech tags (via the site's JSON-LD JobPosting schema). Slower but much richer output.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. Tecnoempleo.com serves plain server-rendered HTML with no anti-bot protection, but residential proxies are prefilled by default to avoid rate-limiting on high-volume runs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
