
Google Ads Scraper
scrape.ly/store/querystone/google-ads-scraperLead generationSEO tools
4 monthly users

Scrape tecnoempleo.com, Spain's IT job board: title, company, location, remote/hybrid, salary range, skills, contract, experience, applicants and full description. Search by keyword, province and filters or paste tecnoempleo.com URLs.
Get every IT job from tecnoempleo.com, Spain's job board for developers, sysadmins, data and cybersecurity people, as clean structured data: title, company, city, remote or hybrid, salary range, skills, contract, experience, number of applicants and the full description. Search by keyword, province and the site's own filters, or paste any tecnoempleo.com link. No login, no browser, results in seconds.
salaryMin, salaryMax, currency and period (year, month, hour) parsed from the site's salary line, no string parsing on your side.python, java, sap, devops), or paste tecnoempleo.com URLs (search pages, company pages or job pages).| Field | What it does |
|---|---|
searchQueries | Keywords, one search each (python, java, data engineer). |
provinces | Spanish provinces (Madrid, Barcelona, Valencia...), combined into one search. |
startUrls | tecnoempleo.com search, company or job links. |
maxResults | Total jobs to save (0 = no limit). |
workArrangement | remote, hybrid, onsite, unspecified. |
professionalFunctions, experienceLevels, educationLevels, workSchedules, contractTypes | The site's own filters. |
postedSince | A date (2026-10-01) or a span (7 days). |
postedToday, urgentOnly | Last 24 hours only; urgent jobs only. |
includeDetails | Open each job page for the full sheet (default on). |
incrementalMode, stateKey | Save only new or changed jobs on scheduled runs. |
{
"searchQueries": ["python", "java"],
"provinces": ["Madrid", "Barcelona"],
"workArrangement": ["remote", "hybrid"],
"maxResults": 100,
"includeDetails": true
}
| Field | Example |
|---|---|
title | Desarrollador/a Python sobre GCP |
company, companyId, companyUrl, companyLogo | Arelance, 154451, profile link, logo |
location, province, otherProvinces, workArrangement | Madrid, Madrid, [], HYBRID |
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod | 33.000 € - 39.000 € Bruto/año, 33000, 39000, EUR, YEAR |
category, functions, technologies | Analista Programador - Programador, [...], [python, gcp, cloud] |
contractType, workSchedule, experienceLevel, educationLevel, languages | Indefinido, Jornada completa, 3-5 años, FP2/Grado Superior |
vacancies, applicants, perks, professionalLevel | 2, 61, Formación, Empleado |
description, descriptionHtml, descriptionMarkdown, summary | Full text, HTML, Markdown and the list snippet |
publishDate, isUrgent, isHighlighted, url, applyUrl | 2026-10-21, false, false, job link |
Example (from a real run, description shortened):
{
"jobId": "478e15e942b7f396ba44",
"url": "https://www.tecnoempleo.com/desarrollador-python-sobre-gcp-arelance/cloud-git/rf-478e15e942b7f396ba44",
"title": "Desarrollador/a Python sobre GCP",
"company": "Arelance",
"companyId": "154451",
"companyUrl": "https://www.tecnoempleo.com/arelance-trabajo",
"companyLogo": "https://www.tecnoempleo.com/logotipos/154451.png",
"location": "100% En remoto",
"workArrangement": "REMOTE",
"country": "España",
"category": "Analista Programador - Programador",
"technologies": ["python", "gcp", "cloud", "git", "backend"],
"description": "En Arelance sabemos que las personas son el activo más importante dentro de una empresa…",
"salaryText": "33.000 € - 39.000 € Bruto/año",
"salaryMin": 33000,
"salaryMax": 39000,
"salaryCurrency": "EUR",
"salaryPeriod": "YEAR",
"employmentType": "FULL_TIME",
"contractType": "Indefinido",
"workSchedule": "Jornada completa",
"experienceLevel": "3-5 años",
"educationLevel": "FP2/Grado Superior",
"professionalLevel": "Empleado",
"vacancies": 2,
"applicants": 61,
"residenceRequired": "España",
"isUrgent": false,
"publishDate": "2026-10-21",
"directApply": true,
"detailFetched": true,
"source": "tecnoempleo.com"
}
You pay $1.20 per 1,000 jobs saved ($0.0012 per job), plus the small platform usage of the run (compute and proxy traffic). Example: 1,000 jobs with full details cost about $1.20 in job fees plus a few cents of usage. Empty searches and pages that fail cost nothing in job fees.
Is it legal to scrape tecnoempleo.com? The actor reads public job listings that anyone can see without an account. Make sure your use of the data follows the site's terms and data-protection law (GDPR) where you work.
Do I need a login or my own proxy? No. The actor uses the platform's datacenter proxies by default and switches to Spanish residential proxies on its own if the site ever refuses them.
How many results can I get? As many as the site lists: set Max results to 0 for every matching job. The whole site lists about 1,800 jobs at a time.
Why is a field empty? Employers fill different parts of the job sheet. Salary, languages, vacancies and perks are only present when the employer added them. With "Load job details" off, only the fields from the search results are filled.
Can I schedule it or use the API? Yes. Schedule daily runs with "Only new and changed jobs" on, and read the dataset through the API or export it to JSON, CSV or Excel.
Can I scrape one company? Yes, paste its tecnoempleo.com profile link (for example https://www.tecnoempleo.com/arelance-trabajo).
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch keywords
Technologies, job titles or company names to search for, one per line, for example python, java, sap, devops or data engineer. Each keyword is a separate search. Leave empty and pick provinces or filters to get every job that matches them.
provincesarrayOptionalProvinces
Spanish provinces, for example Madrid, Barcelona, Valencia, Bizkaia or Málaga (accents optional; Vizcaya, Guipúzcoa, Tenerife and similar names also work). Several provinces are combined into one search (jobs in any of them). Leave empty for all of Spain, including remote jobs.
startUrlsarrayOptionalTecnoempleo URLs
tecnoempleo.com links: search pages (tecnoempleo.com/ofertas-trabajo/?te=python&pr=,263, or tecnoempleo.com/ofertas-trabajo/python-madrid), company pages (tecnoempleo.com/-trabajo or tecnoempleo.com//re-) or single job pages (…/rf-). Use tecnoempleo.com/ofertas-trabajo/ for every job on the site.
maxResultsintegerOptionaldefault 20Max results
Maximum number of jobs to save in total, across all keywords and URLs. Use 0 for no limit (every matching job; the whole site lists about 1,800 jobs).
workArrangementarrayOptionalWork arrangement
Only jobs with these work arrangements. Leave empty for all.
professionalFunctionsarrayOptionalProfessional functions
Only jobs in these role categories (the site's own list, for example Programador, DevOps, Big Data, Ciberseguridad).
experienceLevelsarrayOptionalExperience
Only jobs that ask for this much experience.
educationLevelsarrayOptionalMinimum education
Only jobs with this minimum education.
workSchedulesarrayOptionalWork schedule
Only jobs with this working day.
contractTypesarrayOptionalContract type
Only jobs with this contract type.
postedSincestringOptionalPosted since
Only jobs posted on or after this date: a date like 2026-10-01 or a span like 7 days, 2 weeks or 1 month. Leave empty for any date. Pasted job links are always saved.
postedTodaybooleanOptionaldefault falseOnly jobs from the last 24 hours
Use the site's own 'today' filter (jobs published in the last 24 hours).
urgentOnlybooleanOptionaldefault falseOnly urgent jobs
Only jobs the employer marked as urgent.
includeDetailsbooleanOptionaldefault trueLoad job details
Open each job page for the full description (text, HTML and Markdown), skills, contract type, schedule, experience, education, languages, vacancies, number of applicants, perks, other provinces and the employer id. Turn off for a faster list with title, company, location, salary, date, function, skills and a short summary.
incrementalModebooleanOptionaldefault falseOnly new and changed jobs
For scheduled runs: save only jobs that are new or whose title, company, location, salary or summary changed since an earlier run with the same state key. Each saved job says whether it is NEW or UPDATED.
stateKeystringOptionalState key
Name for the memory of jobs already seen, used by 'Only new and changed jobs'. Use the same key on every scheduled run of one search. Leave empty to derive it from the keywords, provinces, filters and URLs.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for tecnoempleo.com and are the cheapest. If the site refuses them, the run switches to Spanish residential proxies automatically.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| jobId | string | null | Tecnoempleo's job reference (the code after rf- in the job URL). |
| url | string | null | Job page on tecnoempleo.com. |
| title | string | null | Job title. |
| company | string | null | Hiring company or recruiter. |
| companyId | string | null | Tecnoempleo's employer id. |
| companyUrl | string | null | The employer's page on tecnoempleo.com. |
| companyLogo | string | null | Logo image URL. |
| location | string | null | City of the job, or the work arrangement text (for example 100% remoto) for remote jobs. |
| province | string | null | Spanish province of the job (job page details). |
| otherProvinces | array | null | Further provinces the job is open in (job page details). |
| hasMoreLocations | boolean | null | True when the job is offered in several provinces. |
| locationText | string | null | Location and work arrangement exactly as the site shows it, for example León (Híbrido). |
| country | string | null | Country name in Spanish (España for almost every job). |
| countryCode | string | null | ISO country code. |
| workArrangement | string | null | REMOTE, HYBRID or ONSITE (null when the job does not say). |
| category | string | null | Professional functions joined with ' - ', for example Analista Programador - Programador. |
| functions | array | null | Professional functions (role categories) of the job. |
| technologies | array | null | Technologies and skills the job is tagged with. |
| summary | string | null | Short description shown in the search results. |
| description | string | null | Full job description as plain text (job page details). |
| descriptionHtml | string | null | Full job description as HTML (job page details). |
| descriptionMarkdown | string | null | Full job description as Markdown (job page details). |
| salaryText | string | null | Salary as the site shows it, for example 33.000 € - 39.000 € Bruto/año. |
| salaryMin | number | null | Lower end of the salary range. |
| salaryMax | number | null | Upper end of the salary range. |
| salaryCurrency | string | null | Salary currency (EUR). |
| salaryPeriod | string | null | YEAR, MONTH or HOUR. |
| employmentType | string | null | FULL_TIME, PART_TIME and similar (job page details). |
| contractType | string | null | Indefinido, Temporal, Freelance/Autónomo, Prácticas and similar (job page details). |
| workSchedule | string | null | Jornada completa, media jornada, por horas and similar. |
| experienceLevel | string | null | Experience the job asks for, for example 3-5 años (job page details). |
| educationLevel | string | null | Minimum education, for example FP2/Grado Superior (job page details). |
| languages | string | null | Languages and level the job asks for (job page details). |
| professionalLevel | string | null | Empleado, Mando intermedio, Dirección and similar (job page details). |
| vacancies | number | null | Number of open positions (job page details). |
| applicants | number | null | CVs already sent to the job (job page details). |
| perks | string | null | Incentives the employer lists (job page details). |
| residenceRequired | string | null | Country where candidates must live (job page details). |
| isUrgent | boolean | null | The employer marked the job as urgent. |
| isHighlighted | boolean | null | Featured job in the search results. |
| isUpdated | boolean | null | The search results mark the job as recently updated. |
| publishDate | string | null | Publication date (YYYY-MM-DD). |
| publishDateISO | string | null | Publication date as an ISO timestamp. |
| directApply | boolean | null | Candidates apply on tecnoempleo.com. |
| applyUrl | string | null | Where to apply (the job page). |
| extractedEmails | array | null | E-mail addresses found in the description. |
| extractedPhones | array | null | Phone numbers found in the description. |
| extractedUrls | array | null | Links found in the description. |
| detailFetched | boolean | null | True when the job page was read for this row. |
| detailError | string | null | Why the job page could not be read (the row keeps the search result data). |
| changeType | string | null | NEW or UPDATED in incremental mode. |
| searchQuery | string | null | The keyword that found the job. |
| searchLabel | string | null | The search, company or URL that found the job. |
| position | number | null | Position in the search results. |
| source | string | null | tecnoempleo.com |
| scrapedAt | string | null | When the row was saved (UTC). |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One saved job listing. | $0.0012 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/tecnoempleo-scraper').call({
"searchQueries": [
"python"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/tecnoempleo-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/tecnoempleo-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
No examples yet
The developer hasn't published example inputs for this actor.

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.