# Tecnoempleo Scraper (`solidcode/tecnoempleo-scraper`) Actor

\[💰 $1.2 / 1K] Scrape IT & tech jobs from Tecnoempleo, Spain's largest technology job board. Get title, company, province, remote/hybrid, tech stack, contract type, salary & posted date. Filter by keyword, location, category & more.

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

## Pricing

from $1.20 / 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.
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 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

## Tecnoempleo Scraper

Pull live IT and tech job listings from Tecnoempleo — Spain's largest technology job board (~2,700 active openings) — with the full technology stack, work arrangement, contract type, salary range, and posted date on every row. Search by keyword with Boolean operators, narrow by any of 52 Spanish provinces and 38 role categories, and optionally enrich each job with its full description and external apply link. Built for tech recruiters, IT staffing agencies, and labor-market analysts who need structured Spanish tech-hiring data without copy-pasting listings one page at a time.

### Why This Scraper?

- **Full technology stack on every job** — each listing returns its own `technologies` array (Java, Python, Azure, Kubernetes, React…), scoped to the role itself and never polluted by the site's sitewide "most-demanded tech" widget.
- **52 Spanish provinces + 38 professional-function categories** — filter Madrid and Barcelona down to Ourense or Teruel, and target precise roles from Programmer/Developer and DevOps to Cybersecurity, AI/Machine Learning, and IT Architect.
- **4 work-arrangement filters** — 100% Remote, Hybrid, On-site, or Unspecified, classified per job so you can build a remote-only or on-site-only pipeline in one run.
- **6 contract types + 6 work schedules** — filter by Permanent (Indefinido), Temporary, Internship (Prácticas), Work/Service, Freelance/Self-employed, or To-be-determined, and by Full-time, Half-day, hourly, mornings, afternoons, or rotating shift.
- **Boolean keyword search** — combine terms with `OR` / `AND` / `AND NOT` and wrap exact phrases in `"quotes"` to widen or tighten a search the way you would on the site itself.
- **Split salary output** — when a listing discloses pay, you get `salaryMin`, `salaryMax`, and `salaryCurrency` as clean numbers alongside the raw `salaryText`, ready for benchmarking without regex.
- **Optional per-job detail enrichment** — flip on `includeDetails` to add the full job description, minimum education level, and the external apply URL from each job's own page.
- **9 experience bands + a 24-hour recency window** — cap results at "No experience" through "More than 10 years", and pull only jobs posted in the last 24 hours — ideal for daily scheduled runs that catch just the newest postings.

### Use Cases

**Tech Recruitment & Sourcing**
- Build a live feed of remote Python or DevOps roles across all of Spain.
- Track which companies are hiring for a specific stack (e.g. `"machine learning" AND python`) in Madrid and Barcelona.
- Pull only last-24-hour postings each morning to reach candidates before competitors do.

**Salary Benchmarking**
- Collect disclosed salary ranges by role category and province for compensation reports.
- Compare pay bands for permanent versus freelance IT contracts.
- Track how remote roles are priced against on-site equivalents.

**Labor-Market Research**
- Measure demand for emerging technologies by counting jobs per stack over time.
- Map hiring concentration across the 52 provinces to spot regional tech hubs.
- Analyze the mix of contract types and experience requirements in the Spanish IT market.

**Lead Generation & Sales Intelligence**
- Identify companies actively hiring engineers as prospects for staffing, training, or tooling.
- Extract company names and profile links for outreach lists filtered by role category.
- Feed fresh hiring signals into your CRM for account-based marketing.

### Getting Started

#### Simple keyword search

```json
{
  "query": "python",
  "maxResults": 100
}
````

#### Keyword + province + remote-only

```json
{
  "query": "devops OR kubernetes",
  "provinces": ["263"],
  "workModality": ["1"],
  "maxResults": 200
}
```

#### Full filtered search with detail enrichment

```json
{
  "query": "\"machine learning\" AND python",
  "provinces": ["263", "240"],
  "professionalFunctions": ["53", "34"],
  "contractType": ["1"],
  "experience": "6",
  "includeDetails": true,
  "maxResults": 300
}
```

#### From your own search URLs

```json
{
  "startUrls": [
    "https://www.tecnoempleo.com/ofertas-trabajo/?te=java&pr=,263,&en_remoto=,1,"
  ],
  "includeDetails": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `query` | string | `"python"` | Job title, technology, or keyword. Combine terms with `OR` / `AND` / `AND NOT` and wrap exact phrases in `"quotes"`. Leave blank to collect all jobs matching the filters. |
| `startUrls` | array | `[]` | Advanced: paste tecnoempleo.com search URLs built in the site's own search page. When provided, the keyword and filters are ignored for those URLs. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `provinces` | array | `[]` | One or more of the 52 Spanish provinces (A Coruña, Madrid, Barcelona, Valencia…). Empty means the whole country. Multiple selections are combined as "any of". |
| `workModality` | array | `[]` | Work arrangement: 100% Remote, Hybrid, On-site, or Unspecified. Empty means any. |
| `professionalFunctions` | array | `[]` | Role categories such as Programmer/Developer, DevOps, Cybersecurity, AI/Machine Learning, IT Architect, and more. Empty means all categories. |
| `contractType` | array | `[]` | Employment type: Permanent (Indefinido), Temporary, Internship (Prácticas), Work/Service, Freelance/Self-employed, or To be determined. Empty means any. |
| `workday` | array | `[]` | Work schedule: Full-time, Half-day, By the hour, Mornings, Afternoons, or Rotating shift. Empty means any. |
| `experience` | string | `""` (Any) | Only jobs requiring at most this experience level, from No experience up to More than 10 years. |
| `postedSince` | string | `""` (Any time) | Limit to jobs posted recently. Today and Last 24 hours both map to the site's single 24-hour recency window. |

#### Output & Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeDetails` | boolean | `false` | Off for fast results. Turn on to also fetch each job's full description, minimum education, and external apply link from its own page (slower on large searches). |
| `maxResults` | integer | `100` | Hard cap on total jobs returned across all searches and URLs. Set to `0` for no cap (the site tops out around 2,700 active listings). |

### Output

Every job is one flat row. Fast list mode fills the core fields below; turning on `includeDetails` adds the description, education, apply link, numeric ID, and any fields absent from the listing card. In the example below, `contractType`, `workday`, `experience`, `education`, `description`, `applyUrl`, and `numericId` are populated only when `includeDetails` is `true`.

```json
{
  "jobId": "rf-8f3a2b1c",
  "numericId": "153604",
  "title": "Senior Python Developer",
  "url": "https://www.tecnoempleo.com/senior-python-developer/rf-8f3a2b1c",
  "company": "Acme Tech Solutions",
  "companyUrl": "https://www.tecnoempleo.com/empresa/acme-tech-solutions",
  "location": "Madrid",
  "province": "Madrid",
  "country": "ES",
  "workModality": "100% Remote",
  "technologies": ["Python", "Django", "PostgreSQL", "AWS", "Docker"],
  "professionalFunction": "Programmer / Developer",
  "contractType": "Permanent (Indefinido)",
  "workday": "Full-time",
  "experience": "3-5 years",
  "education": "Bachelor's degree",
  "salaryText": "€45.000 - 55.000 b/a",
  "salaryMin": 45000,
  "salaryMax": 55000,
  "salaryCurrency": "EUR",
  "publishDate": "02/07/2026",
  "publishDateISO": "2026-07-02",
  "description": "We are looking for a Senior Python Developer to join our platform team...",
  "applyUrl": "https://careers.acmetech.com/apply/12345",
  "isUrgent": false,
  "scrapedAt": "2026-07-03T09:14:00.000Z",
  "searchQuery": "python"
}
```

#### Core Fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | string | Stable Tecnoempleo job identifier (`rf-<code>`, matches the job URL), identical in fast and detail mode. |
| `numericId` | string | null | The site's short numeric job id (detail mode). |
| `title` | string | Job title. |
| `url` | string | Canonical job detail URL. |
| `technologies` | array | Technology and skill tags required for this role. |
| `professionalFunction` | string | Role category (Programmer/Developer, DevOps, Cybersecurity…). |
| `isUrgent` | boolean | Whether the listing is flagged "Urgente". |

#### Company & Location

| Field | Type | Description |
|-------|------|-------------|
| `company` | string | Hiring company name. |
| `companyUrl` | string | null | Company profile URL on Tecnoempleo, when shown. |
| `location` | string | null | Location text as shown on the listing. |
| `province` | string | null | Spanish province. |
| `country` | string | Country code (ES for Spain). |
| `workModality` | string | null | 100% Remote, Hybrid, On-site, or Unspecified. |

#### Employment Terms

| Field | Type | Description |
|-------|------|-------------|
| `contractType` | string | null | Employment type (detail mode). |
| `workday` | string | null | Work schedule (detail mode). |
| `experience` | string | null | Required experience band. |
| `education` | string | null | Minimum education level (detail mode). |

#### Compensation

| Field | Type | Description |
|-------|------|-------------|
| `salaryText` | string | null | Raw salary string as shown, when disclosed. |
| `salaryMin` | number | null | Parsed lower salary bound. |
| `salaryMax` | number | null | Parsed upper salary bound. |
| `salaryCurrency` | string | null | Currency code (EUR). |

#### Dates, Details & Provenance

| Field | Type | Description |
|-------|------|-------------|
| `publishDate` | string | null | Publication date in the site's format. |
| `publishDateISO` | string | null | Publication date normalized to ISO (YYYY-MM-DD). |
| `description` | string | null | Full job description text (detail mode). |
| `applyUrl` | string | null | External apply link (detail mode, when the listing links out). |
| `scrapedAt` | string | ISO timestamp of when the row was collected. |
| `searchQuery` | string | null | The keyword or filter set that produced this row. |

### Tips for Best Results

- Keep `includeDetails` off for fast, high-volume runs — the listing card already carries title, company, location, work arrangement, technologies, salary (when shown), and posted date. Turn it on only when you specifically need the full description, education level, or apply link, since each job then needs an extra page visit.
- Widen a search with Boolean `OR` — `python OR django OR flask` returns any job mentioning any of the terms, while `python AND aws` narrows to jobs that mention both.
- Select multiple provinces at once — they combine as "any of", so `["263", "240"]` (Madrid + Barcelona) returns roles in either without running two separate searches.
- Salary is disclosed on only a minority of Spanish tech listings, so `salaryMin` / `salaryMax` are often null — build benchmarking on the jobs that do publish pay rather than expecting it everywhere.
- Use `postedSince` set to Last 24 hours on a daily schedule to capture only new openings — pair it with a downstream dedup step to maintain a rolling feed.
- Combine a role category with a province to build a tight sourcing list — for example DevOps roles in Valencia, or Cybersecurity roles across Madrid and Bizkaia.
- Set `maxResults` to `0` only when you truly want the whole board; the site holds around 2,700 active listings and each returned row is billed at the per-result rate.

### Pricing

**From $1.20 per 1,000 results** — undercutting other Tecnoempleo extractors while returning a richer, ready-to-use flat schema. Bronze, Silver, and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|--------:|------------:|-------:|-------:|-----:|
| 100     | $0.14   | $0.135  | $0.13   | $0.12   |
| 1,000   | $1.40   | $1.35   | $1.30   | $1.20   |
| 10,000  | $14.00  | $13.50  | $13.00  | $12.00  |
| 100,000 | $140.00 | $135.00 | $130.00 | $120.00 |

A "result" is one job row pushed to your dataset. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This scraper collects publicly available job-listing data from Tecnoempleo for legitimate business purposes such as recruitment, market research, and analytics. You are responsible for using the collected data in compliance with Tecnoempleo's terms of service, applicable data-protection laws (including the GDPR), and any rules governing the processing of personal data. Do not use the data for spam, unsolicited contact, or any purpose that infringes the rights of listed companies or individuals. Always review and respect the target website's terms before running large-scale collections.

# Actor input Schema

## `query` (type: `string`):

Job title, technology, or keyword to search for (e.g. 'python', 'sap', 'kubernetes', 'devops'). You can combine terms with OR / AND / AND NOT and wrap exact phrases in "quotes". Leave blank to collect all jobs matching the filters below.

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

Only include jobs in these Spanish provinces. Leave empty to include the whole country.

## `workModality` (type: `array`):

Only include jobs with these work arrangements. Leave empty to include any.

## `professionalFunctions` (type: `array`):

Only include jobs in these role categories (e.g. Developer, DevOps, Cybersecurity, Systems). Leave empty to include all categories.

## `contractType` (type: `array`):

Only include jobs with these employment types. Leave empty to include any.

## `workday` (type: `array`):

Only include jobs with these work schedules. Leave empty to include any.

## `experience` (type: `string`):

Only include jobs requiring at most this experience level. Leave on 'Any' to include all.

## `postedSince` (type: `string`):

Only include jobs posted within the last 24 hours. Great for daily scheduled runs that pick up just the newest postings. Leave on 'Any time' to include all jobs. (The site offers a single recency window, so 'Today' and 'Last 24 hours' behave the same.)

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

Advanced: paste tecnoempleo.com search URLs built in the site's own search page (e.g. https://www.tecnoempleo.com/ofertas-trabajo/?te=python\&pr=,263,). Use this when you've already applied filters in the site UI. When provided, the keyword and filters above are ignored for these URLs. If a URL has no recognizable filters it falls back to a broad scan rather than failing.

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

Off by default for fast results. Each job card already includes the title, company, location, work arrangement, technologies, salary (when shown), and posted date. Turn this on to also fetch the full job description, minimum education, and the external apply link from each job's own page — this is slower, because every job needs an extra page visit, so expect longer runs on large searches.

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

Hard cap on the total number of jobs returned across all searches and URLs. Default 100 — increase for bigger runs, or set to 0 for no cap (the site tops out at roughly 2,700 active listings, and each result is billed at the per-result rate). The actor stops requesting new pages once this number is hit but keeps the full last page even if it slightly overshoots.

## Actor input object example

```json
{
  "query": "python",
  "provinces": [],
  "workModality": [],
  "professionalFunctions": [],
  "contractType": [],
  "workday": [],
  "experience": "",
  "postedSince": "",
  "startUrls": [],
  "includeDetails": false,
  "maxResults": 100
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of jobs with the most useful fields — title, company, province, work arrangement, salary, and link.

## `details` (type: `string`):

Full per-job rows with technologies, contract type, work schedule, experience, salary range, description, and apply link.

# 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 = {
    "query": "python",
    "provinces": [],
    "workModality": [],
    "professionalFunctions": [],
    "contractType": [],
    "workday": [],
    "experience": "",
    "postedSince": "",
    "startUrls": [],
    "includeDetails": false,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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 = {
    "query": "python",
    "provinces": [],
    "workModality": [],
    "professionalFunctions": [],
    "contractType": [],
    "workday": [],
    "experience": "",
    "postedSince": "",
    "startUrls": [],
    "includeDetails": False,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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 '{
  "query": "python",
  "provinces": [],
  "workModality": [],
  "professionalFunctions": [],
  "contractType": [],
  "workday": [],
  "experience": "",
  "postedSince": "",
  "startUrls": [],
  "includeDetails": false,
  "maxResults": 100
}' |
apify call solidcode/tecnoempleo-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tecnoempleo Scraper",
        "description": "[💰 $1.2 / 1K] Scrape IT & tech jobs from Tecnoempleo, Spain's largest technology job board. Get title, company, province, remote/hybrid, tech stack, contract type, salary & posted date. Filter by keyword, location, category & more.",
        "version": "1.0",
        "x-build-id": "EU4dF3n7hdoRTSnXz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~tecnoempleo-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-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/solidcode~tecnoempleo-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-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/solidcode~tecnoempleo-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-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": {
                    "query": {
                        "title": "Search Keyword",
                        "type": "string",
                        "description": "Job title, technology, or keyword to search for (e.g. 'python', 'sap', 'kubernetes', 'devops'). You can combine terms with OR / AND / AND NOT and wrap exact phrases in \"quotes\". Leave blank to collect all jobs matching the filters below."
                    },
                    "provinces": {
                        "title": "Provinces",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs in these Spanish provinces. Leave empty to include the whole country.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "231",
                                "232",
                                "233",
                                "234",
                                "235",
                                "236",
                                "237",
                                "238",
                                "239",
                                "240",
                                "241",
                                "242",
                                "243",
                                "244",
                                "245",
                                "246",
                                "247",
                                "248",
                                "249",
                                "250",
                                "251",
                                "252",
                                "253",
                                "254",
                                "255",
                                "256",
                                "257",
                                "258",
                                "259",
                                "260",
                                "261",
                                "262",
                                "263",
                                "264",
                                "265",
                                "266",
                                "267",
                                "268",
                                "269",
                                "270",
                                "271",
                                "272",
                                "273",
                                "274",
                                "275",
                                "276",
                                "277",
                                "278",
                                "279",
                                "280",
                                "281",
                                "282"
                            ],
                            "enumTitles": [
                                "A Coruña",
                                "Álava",
                                "Albacete",
                                "Alicante",
                                "Almería",
                                "Asturias",
                                "Ávila",
                                "Badajoz",
                                "Baleares",
                                "Barcelona",
                                "Bizkaia",
                                "Burgos",
                                "Cáceres",
                                "Cádiz",
                                "Cantabria",
                                "Castellón",
                                "Ceuta",
                                "Ciudad Real",
                                "Córdoba",
                                "Cuenca",
                                "Gipuzkoa",
                                "Girona",
                                "Granada",
                                "Guadalajara",
                                "Huelva",
                                "Huesca",
                                "Jaén",
                                "La Rioja",
                                "Las Palmas",
                                "León",
                                "Lugo",
                                "Lleida",
                                "Madrid",
                                "Málaga",
                                "Melilla",
                                "Murcia",
                                "Navarra",
                                "Ourense",
                                "Palencia",
                                "Pontevedra",
                                "Salamanca",
                                "Sta. Cruz de Tenerife",
                                "Segovia",
                                "Sevilla",
                                "Soria",
                                "Tarragona",
                                "Teruel",
                                "Toledo",
                                "Valencia",
                                "Valladolid",
                                "Zamora",
                                "Zaragoza"
                            ]
                        },
                        "default": []
                    },
                    "workModality": {
                        "title": "Work Arrangement",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs with these work arrangements. Leave empty to include any.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "3",
                                "2",
                                "4"
                            ],
                            "enumTitles": [
                                "100% Remote",
                                "Hybrid",
                                "On-site",
                                "Unspecified"
                            ]
                        },
                        "default": []
                    },
                    "professionalFunctions": {
                        "title": "Job Categories",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs in these role categories (e.g. Developer, DevOps, Cybersecurity, Systems). Leave empty to include all categories.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "12",
                                "37",
                                "32",
                                "27",
                                "7",
                                "34",
                                "40",
                                "1",
                                "53",
                                "51",
                                "25",
                                "20",
                                "10",
                                "28",
                                "43",
                                "39",
                                "41",
                                "44",
                                "8",
                                "19",
                                "45",
                                "46",
                                "30",
                                "2",
                                "3",
                                "4",
                                "9",
                                "42",
                                "21",
                                "29",
                                "15",
                                "48",
                                "24",
                                "18",
                                "47",
                                "49",
                                "50",
                                "52"
                            ],
                            "enumTitles": [
                                "Programmer / Developer",
                                "Analyst-Programmer",
                                "Analyst",
                                "Web Developer",
                                "Mobile Developer",
                                "DevOps",
                                "Cybersecurity",
                                "Big Data",
                                "AI / Machine Learning",
                                "IT Architect",
                                "Project Manager",
                                "Team Lead",
                                "Product Manager",
                                "Consultant",
                                "Systems Technician",
                                "Networks",
                                "Database / DBA",
                                "Tester / QA",
                                "Technical Support",
                                "Helpdesk",
                                "Administrator",
                                "Operator",
                                "Auditor",
                                "Software Technician",
                                "Hardware Technician",
                                "Electronics",
                                "Quality Systems",
                                "Maintenance Technician",
                                "Trainer",
                                "Sales",
                                "Marketing",
                                "SEO / Web Positioning",
                                "Graphic Design",
                                "R&D",
                                "Recruiter",
                                "Management Technician",
                                "Administrative",
                                "Engineers / Industry"
                            ]
                        },
                        "default": []
                    },
                    "contractType": {
                        "title": "Contract Type",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs with these employment types. Leave empty to include any.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "3",
                                "5",
                                "2",
                                "4",
                                "6"
                            ],
                            "enumTitles": [
                                "Permanent (Indefinido)",
                                "Temporary (Temporal)",
                                "Internship (Prácticas)",
                                "Work/Service (Obra/servicio)",
                                "Freelance / Self-employed",
                                "To be determined"
                            ]
                        },
                        "default": []
                    },
                    "workday": {
                        "title": "Work Schedule",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Only include jobs with these work schedules. Leave empty to include any.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5",
                                "6"
                            ],
                            "enumTitles": [
                                "Full-time (Completa)",
                                "Half-day (Media jornada)",
                                "By the hour",
                                "Mornings",
                                "Afternoons",
                                "Rotating shift"
                            ]
                        },
                        "default": []
                    },
                    "experience": {
                        "title": "Maximum Experience Required",
                        "enum": [
                            "",
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7",
                            "8"
                        ],
                        "type": "string",
                        "description": "Only include jobs requiring at most this experience level. Leave on 'Any' to include all.",
                        "default": ""
                    },
                    "postedSince": {
                        "title": "Date Posted",
                        "enum": [
                            "",
                            "today",
                            "24h"
                        ],
                        "type": "string",
                        "description": "Only include jobs posted within the last 24 hours. Great for daily scheduled runs that pick up just the newest postings. Leave on 'Any time' to include all jobs. (The site offers a single recency window, so 'Today' and 'Last 24 hours' behave the same.)",
                        "default": ""
                    },
                    "startUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "Advanced: paste tecnoempleo.com search URLs built in the site's own search page (e.g. https://www.tecnoempleo.com/ofertas-trabajo/?te=python&pr=,263,). Use this when you've already applied filters in the site UI. When provided, the keyword and filters above are ignored for these URLs. If a URL has no recognizable filters it falls back to a broad scan rather than failing.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeDetails": {
                        "title": "Fetch Full Job Details",
                        "type": "boolean",
                        "description": "Off by default for fast results. Each job card already includes the title, company, location, work arrangement, technologies, salary (when shown), and posted date. Turn this on to also fetch the full job description, minimum education, and the external apply link from each job's own page — this is slower, because every job needs an extra page visit, so expect longer runs on large searches.",
                        "default": false
                    },
                    "maxResults": {
                        "title": "Maximum Results",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on the total number of jobs returned across all searches and URLs. Default 100 — increase for bigger runs, or set to 0 for no cap (the site tops out at roughly 2,700 active listings, and each result is billed at the per-result rate). The actor stops requesting new pages once this number is hit but keeps the full last page even if it slightly overshoots.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
