Tecnoempleo Jobs Scraper: Spain IT Jobs + Only New avatar

Tecnoempleo Jobs Scraper: Spain IT Jobs + Only New

Pricing

from $0.05 / 1,000 job results

Go to Apify Store
Tecnoempleo Jobs Scraper: Spain IT Jobs + Only New

Tecnoempleo Jobs Scraper: Spain IT Jobs + Only New

$0.1/1K jobs | Extract Spanish IT and developer jobs from Tecnoempleo in bulk with the full description, company, city, work type and date. Filter by search words, location, work arrangement and posting age. No login or API key. Not affiliated with Tecnoempleo.

Pricing

from $0.05 / 1,000 job results

Rating

0.0

(0)

Developer

Nomad.Devs

Nomad.Devs

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

4

Monthly active users

2 days ago

Last modified

Categories

Share

Tecnoempleo Jobs Scraper (No Login) + Full Descriptions

$0.1/1K jobs | Extract Spanish IT and developer jobs from Tecnoempleo in bulk with the full description, company, city, work type and date. Filter by search words, location, work arrangement and posting age. No login or API key. Not affiliated with Tecnoempleo.

Tecnoempleo IT Jobs Bulk Scraper

Our scraper collects current IT and developer jobs from Tecnoempleo, one of Spain's specialist tech job boards, and lets you filter by search words, location, work arrangement, employment type and posting age. Every row carries the complete original description in text and HTML, so you never have to open the posting to read it. It is ideal for Spanish tech-job alerts, developer sourcing, hiring-market analytics and job boards.

Key Benefits

  • No login or API key: nothing to connect, no cookies and no proxies to configure.
  • Low pricing: $0.10 per 1,000 jobs, with lower rates on Scale and Business plans ($0.075 and $0.05 per 1,000), plus a $0.00005 start fee per run.
  • Full descriptions only: a posting is kept only once its complete description has been read, so no row is a teaser.
  • Fresh data: the postings come from a store refreshed from Tecnoempleo every hour, newest first.
  • Beyond the RSS feed: Tecnoempleo's own feed stops at about 80 items, while this Actor reads the stored catalogue.
  • Work type and employment type in the row: work type was filled on 8 of 10 postings and employment type on 6 of 10 in our test run.

How It Works

  1. Provide your search. Every filter is optional:
    • (optional) Search queries (e.g., python, java, devops). A posting matches when its title or description contains every word of a query, as whole words, ignoring case; it matches when any query matches.
    • (optional) Locations (e.g., Madrid, Barcelona, ES). City, region, country name or ISO code, matched without regard to accents or case against each posting's location.
    • (optional) Work arrangement: remote (100%), hybrid or onsite. A posting that states no arrangement is left out when you choose one.
    • (optional) Employment type: Full-time, Part-time, Contract or Internship. A posting that states none is left out when you choose one.
    • (optional) Posted within (e.g., 24h, 3d, 2w). Default is any.
  2. Set how many jobs you want with maxItems.
  3. Click Start. The form opens with python and 20 jobs, so a first run returns real rows in seconds (our test run took about 6 seconds).

Run the same search again and you get only postings you have not received yet; set dedupe.enabled to false to see everything again.

More settings:

  • maxItems - Maximum postings to return, newest first. Default is 80; 0 means no limit.
  • Old inputs still run: keyword, province and remote are mapped onto queries, locations and locationTypes. category, titleExclude and companyExclude are no longer supported and are ignored; the run's RUN-SUMMARY lists what was mapped or ignored under input.notes. Filter by title or company in your own code: rows carry title and company.

This Actor has no repeat-delivery suppression. A scheduled run returns the newest jobs again every time, so set postedWithin (for example 24h) to the length of your schedule to receive mostly new postings.

Salary is filled only when the employer publishes it: 1 of 10 postings in our test run. Leave the salary out of any filter you build on top of this data.

Data You'll Receive

  • Job details: title, complete description (text and HTML), city, posting date.
  • Company: employer name.
  • Terms: work type and employment type when the posting states them, salary text (for example 80000-90000 EUR/year) when the employer publishes it; unknown facts are null.
  • Links and identity: the Tecnoempleo URL, plus a stable id and source for deduplication.
  • Hiring contacts: the field exists in every row; Tecnoempleo lists none, so it is an empty list.

Sample output data

Here is an example job from this Actor (long text shortened for display):

{
"schemaVersion": "nomad-agent-job-row-v4",
"source": "tecnoempleo",
"id": "rf-0b30184732af33460545",
"url": "https://www.tecnoempleo.com/ai-implementation-lead-michael-page/ia-generativa-llms/rf-0b30184732af33460545",
"title": "AI Implementation Lead",
"company": "Michael Page",
"locations": [
"Sevilla"
],
"applicantLocations": null,
"postedAt": "2026-10-09",
"deadline": null,
"description": "Perfil buscado\n\n• Diseñar y desarrollar la arquitectura de IA corporativa que centralizará y estructurará el conocimiento de la organización.\n• Liderar la definición técnica y ejecución de las primeras iniciativas de alto impacto, identificando oportunidades r… [truncated for display]",
"descriptionHtml": "\r\n\t\t\t\t\t\tPerfil buscado\r<br/>\r<br/>• Diseñar y desarrollar la arquitectura de IA corporativa que centralizará y estructurará el conocimiento de la organización.\r<br/>• Liderar la definición técnica y ejecución de las primeras iniciativas de alto impacto, identi… [truncated for display]",
"workType": "hybrid",
"salary": "80000-90000 EUR/year",
"employmentTypes": [
"Full-time"
],
"hiringContacts": []
}

Tecnoempleo Jobs API

Results are stored in a dataset that you can export as CSV, JSON or Excel, or read through the Apify API. Schedule it, or connect it to Make, n8n, Zapier or an MCP client to push new jobs wherever you need them. Each run also writes a RUN-SUMMARY record to its key-value store with the run status (such as succeeded, partial, empty or failed) and its crawl, detail and output counters.

Support and Feedback

We improve these scrapers from your feedback. If something breaks or you need a filter:

  • Open an issue on the Actor's Issues tab.
  • If this Actor saved you time, a short review on the Store helps other people find it.

Run evidence

Start with one input and output

An Apify account is required. Use your Apify API token when calling the API; Console runs do not need that token pasted into the input. No user API-key field is required by this input schema.

Free-tier event rates checked 2026-10-04: actor-start $0.00005; result $0.0001.

Cost: Total = Actor event charges + platform usage if separately billed + any BYO-provider charges. See “Current costs” for your event rates, plan tiers and a calculation. A sample does not promise future billable volume.

Input and output below were read from the same successful run Obgf0UMTCMjzb380K (2026-10-03, immutable build WsqKCJYE0HnjAYMu6). This is an observed example, not a guarantee that repeating it returns this row.

Input JSON

{
"remote": "any",
"includeDescription": true,
"titleExclude": [],
"companyExclude": [],
"postedWithin": "any",
"maxItems": 80,
"cacheTtlSeconds": 1800
}

Matching output excerpt

Long strings and arrays are shortened for display; this is not a complete dataset fixture.

{
"schemaVersion": "nomad-agent-job-row-v3",
"source": "tecnoempleo",
"id": "rf-05fe1b9ab2d4730c014d",
"url": "https://www.tecnoempleo.com/net-developer-electronic-trading-cas-training/net-core-aspnet/rf-05fe1b9ab2d4730c014d",
"title": ".NET Developer – Electronic Trading",
"company": "CAS TRAINING",
"locations": [
"Madrid"
],
"postedAt": "2026-10-03",
"deadline": null,
"description": "Senior .NET Developer – Electronic Trading\n📍 Modalidad: 100% remoto\n💰 Tarifa máxima: 38000 a 42000 mil brutos anuales\n🌐 Inglés: Nivel avanzado imprescindible\n¿Eres Senior .NET Developer y te apetece trabajar en un proyecto greenfield, con arquitectura moderna y dentro de un entorno de Electronic Trading?\nEstamos incorporando 4 Senior Developers para particip… [truncated for display]",
"descriptionHtml": "\r\n\t\t\t\t\t\tSenior .NET Developer – Electronic Trading<br/>📍 Modalidad: 100% remoto<br/>💰 Tarifa máxima: 38000 a 42000 mil brutos anuales<br/>🌐 Inglés: Nivel avanzado imprescindible<br/><br/><br/>¿Eres Senior .NET Developer y te apetece trabajar en un proyecto greenfield, con arquitectura moderna y dentro de un entorno de Electronic Trading?<br/><br/>Estamos inc… [truncated for display]",
"workType": "remote",
"salary": "33000-42000 EUR/year",
"employmentTypes": [
"Full-time"
],
"hiringContacts": []
}

Scrape current IT and developer vacancies from Tecnoempleo.com, Spain's dedicated tech job board.

Claude / Codex skill to describe and setup this actor: SKILL.md

Tecnoempleo is one of Spain's largest specialist IT job boards, carrying developer, DevOps, data, QA and technical-management roles from Spanish employers and consultancies. This Actor returns its vacancies — thousands of them, far beyond the ~80-item cap of the site's RSS feed — as clean, deduplicated JSON, so you can filter Spanish tech empleo by search words, location, work arrangement and employment type and pipe it straight into your own tools. No login, no proxies.

Postings come from a store we refresh from Tecnoempleo every hour. Each one is kept only once its complete description has been read from the posting page, so every row carries the full text, never a teaser. If the store is briefly unavailable, the run returns no rows and its RUN-SUMMARY record says so; you are billed only the start.

What Tecnoempleo data does this scraper extract?

Published postings follow nomad-agent-job-row-v4: 16 fields carrying source identity, title and company, the city, the regions an applicant may live in, dates, the complete plain-text body and the source's markup, work type, salary, employment types and hiring contacts. Unavailable scalar facts are null; no physical location is []. There is no recordType, no custom object and no extra columns. See the Output example section for every field.

How to scrape Tecnoempleo with this Actor

  1. Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
  2. Adjust the input (queries, locations, locationTypes, employmentTypes, maxItems) or keep the defaults.
  3. Run it and export the dataset as JSON, CSV or Excel, or read it over the API.

Run it from your own code:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nomad-agent/tecnoempleo-scraper").call(run_input={"maxItems": 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], "—", item["company"], item["url"])

Or a single HTTP call that runs the Actor and returns items in one response:

curl -X POST \
"https://api.apify.com/v2/acts/nomad-agent~tecnoempleo-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"maxItems": 50}'

Input

FieldTypeDefaultNotes
queriesarray[]Match postings whose title or description contains every word of a query, as whole words, ignoring case. A posting matches when any query matches. Empty: no filter.
locationsarray[]City, region, country name or two-letter ISO country code, matched accent- and case-insensitively. EU and Europe expand to their countries. Empty: no filter.
locationTypesarray[]remote, hybrid or onsite. A posting whose page states no arrangement is left out when this is set. Empty: no filter.
employmentTypesarray[]Full-time, Part-time, Contract or Internship. A posting that states none is left out when this is set. Empty: no filter.
postedWithinstringanyKeep only jobs published inside this window. Use any for no date filter, or a duration — 1h, 24h, 3d, 2w, 6m. Jobs the source published no date for are kept rather than dropped. Based on the posting date shown by Tecnoempleo. Replaces postedSince, still accepted for existing integrations.
maxItemsinteger80Maximum postings to return, newest first. The store holds the whole live catalogue, well beyond the RSS feed's ~80-item cap. Set 0 for no limit.

Output example

Every row follows nomad-agent-job-row-v4, the one shape shared by this fleet's job Actors. A row carries every field; null means the source did not publish that fact, and locations: [] means the posting names no physical place; applicantLocations (where an applicant may live) is null when the posting states none, which is always the case for Tecnoempleo. Nothing is guessed.

{
"schemaVersion": "nomad-agent-job-row-v4",
"source": "tecnoempleo",
"id": "rf-07d4125d3256f330754d",
"url": "https://www.tecnoempleo.com/programadores-junior-senior-java-seltime/springboot-angular/rf-07d4125d3256f330754d",
"title": "Programadores junior/senior Java",
"company": "Seltime",
"locations": ["Madrid"],
"applicantLocations": null,
"postedAt": "2026-09-18",
"deadline": null,
"description": "The complete posting body as plain text, exactly as the source published it — never truncated.",
"descriptionHtml": "<p>The complete posting body as the source's own markup.</p>",
"workType": null,
"salary": "21000-33000 EUR/year",
"employmentTypes": ["Full-time"],
"hiringContacts": []
}
FieldMeaning
schemaVersionAlways "nomad-agent-job-row-v4".
sourceAlways "tecnoempleo". Together with id it identifies the posting.
idTecnoempleo's own posting id, rf- plus 20 hex characters. Stable across runs and unchanged from earlier versions of this Actor.
urlCanonical public URL of the posting on Tecnoempleo.
titleJob title exactly as published.
companyEmployer name as published; null when the posting names none.
locationsThe posting's city, e.g. ["Madrid"]. [] when the page published no city (a fully remote posting without one). Work arrangement is never a place; it is in workType.
applicantLocationsRegions where the posting says an applicant may live; null when it states none (Tecnoempleo states none today), [] when it states no restriction. Never merged into locations.
postedAtThe posting date as the source publishes it, normally a calendar date (YYYY-MM-DD); null when the source published none.
deadlineApplication deadline when the posting states one (rare), else null.
descriptionThe complete posting body as plain text — never truncated, never summarised.
descriptionHtmlThe posting body as the source's own markup.
workTyperemote, hybrid or onsite when the page states exactly one arrangement, else null. Never defaulted.
salaryThe salary the employer published, as text: the stored range written out with its currency and period (21000-33000 EUR/year, 900-1200 EUR/month; one number when both bounds are equal, min …/max … when only one is published). null when no salary is published. These are the published numbers only, not a net/gross judgement.
employmentTypesFull-time, Part-time, Contract and/or Internship as stated by the posting, else null.
hiringContactsNamed people the posting lists as contacts; [] when none (Tecnoempleo lists none today).

A run that matches nothing, or whose store is briefly unavailable, returns an empty dataset: a dataset row is always a posting. The run's RUN-SUMMARY record (key-value store) says whether it was empty or degraded.

Integrations

Export results as JSON, CSV or Excel; connect via Make, Zapier or n8n; call directly with run-sync-get-dataset-items; or plug into AI agents through the Apify MCP server.

Pricing

Check this Actor’s Pricing tab for the current charges for your Apify plan.

Pay per event, with actor-start and job-result events. You are not billed for results that were not returned; no subscription is required.

Use cases

  • Spanish tech-job boards and alert bots
  • Sourcing developers in Spain
  • Tracking which companies are actively hiring IT talent in Spain
  • Filtering the live feed for specific tech keywords via the queries input

FAQ

Is it legal to scrape Tecnoempleo? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.

Do I need an account on the target site? No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.

How fresh is the data? The store is refreshed from Tecnoempleo every hour, and a posting appears once its full description has been read. Results are newest first.

How many jobs can I get? maxItems caps the run (set 0 where supported for no cap). Most sources paginate from newest to oldest.

Which roles does Tecnoempleo cover? Primarily IT and engineering — backend/frontend developers, DevOps, data, QA, IT support and technical management — mostly across Spain, with a growing share of remote-friendly listings.

Can I get only remote jobs? Set locationTypes to ["remote"] (100% en remoto), hybrid or onsite. You can also filter by locations, or read the parsed locations array in each posting.

Can I get salaries and full descriptions? Every posting carries its complete description; there is nothing to enable. salary is text such as 27000-30000 EUR/year, filled only when the employer discloses pay (about one posting in six).

Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.

Getting fewer results than you expected? A run that matches nothing returns an empty dataset (its RUN-SUMMARY says why). Relax queries, locations, locationTypes, employmentTypes or postedWithin and re-run. A filter on arrangement or employment type leaves out postings that state none.

Changes

  • October 2026: applicantLocations added (row v4). Rows are now nomad-agent-job-row-v4: one new field, applicantLocations, lists where an applicant may live as the source states it (null when the source states nothing, [] when it states no restriction). locations is unchanged and still the physical place only; for a remote job open to some regions it is often [] while applicantLocations lists the regions. Input, other fields and pricing are unchanged. Integrations that validate rows against the v3 schema must allow the new field and the new schemaVersion.

  • October 2026 — shared search filters (breaking input change). The input is now the one filter set every job Actor uses: queries, locations, locationTypes, employmentTypes, plus postedWithin and maxItems. Removed from the form: keyword, province, remote, category, titleExclude, companyExclude, includeDescription and cacheTtlSeconds. Old API calls still run: keyword, province and remote are mapped, category, titleExclude and companyExclude are ignored, and RUN-SUMMARY says so under input.notes when they carried a value. includeDescription and cacheTtlSeconds never changed anything and are not reported (except includeDescription: false, a request that is not honoured). Matching differs: queries match whole words in the title and description, where keyword also matched the company and technology tags as substrings. There is no title, company or category filter any more. Output rows are unchanged.

  • October 2026 — new row format (breaking). Rows are now nomad-agent-job-row-v3 (15 fields) instead of nomad-agent-job-row-v1. Removed: recordType (a dataset row is always a posting; the diagnostic row is gone, RUN-SUMMARY reports empty and degraded runs), custom and the deprecated aliases category, location (now locations), salaryMin, salaryMax, salaryCurrency, salaryPeriod (now one salary text), snippet (use description) and technologies. Added: employmentTypes, hiringContacts, and workType filled from the posting's stated arrangement. id keeps its rf- form, so integrations keyed on (source, id) are unaffected. Input, pricing and the keyword/province/category/remote filters are unchanged (keyword and category still match the posting's technology tags and categories).

  • 2026-09 — postings come from a store refreshed hourly. Inputs and output fields are unchanged. Runs no longer crawl Tecnoempleo themselves, so they are faster and every row carries the complete description. technologies now lists all of a posting's tags, not just the first three the listing card shows, and category comes from the posting page. descriptionHtml is filled with the posting's own markup. includeDescription and cacheTtlSeconds are accepted and no longer change anything.

Found it useful?

Leave a rating on the Reviews tab — it takes ten seconds, and it is the single biggest thing that helps other people in Spain's tech-hiring niche find this Actor.


From the maker of Oink — an open-source, AI-powered job-search bot for Telegram that runs on these Actors. Try the free bot, get a managed instance at oinkjobsearch.com, or browse the full catalog of 50+ Actors.

Fast setup and source code

Public repository · Agent setup skill.

Use the Actor’s current input form for filters, or start with its documented API example. Select the latest build. Read the dataset together with the run summary: a successful status alone does not show that every source was reached.

Restrictive filters or repeat-delivery suppression can produce zero results.

Observed output example

Selected fields from a real source record inspected on 2026-10-03; consult the output schema for the full contract. Values change with the source.

{
"schemaVersion": "nomad-agent-job-row-v3",
"source": "tecnoempleo",
"id": "rf-000111fd524293cc894f",
"url": "https://www.tecnoempleo.com/programador-sap-abap-evolutivos-serem/sap/rf-000111fd524293cc894f",
"title": "Programador SAP ABAP - Evolutivos",
"company": "Serem",
"locations": [
"Madrid"
],
"postedAt": "2026-10-02",
"deadline": null,
"description": "Buscamos un Programador SAP ABAP con alrededor de 4 años de experiencia para incorporarse a un equipo especializado en mantenimiento y evolución de soluciones SAP.\nLa posición estará orientada al desarrollo de evolutivos y mejoras sobre sistemas críticos de negocio, participando también en el análisis, implantación y resolución de incidencias.\nFunciones principales\n- Desarrollo y mantenimiento de programas en SAP ABAP.\n- Análisis y desarrollo de evolutivos sobre soluciones SAP.\n- Participación en la implantación de mejoras.\n- Resolución de incidencias y soporte sobre las soluciones existentes.\n- Mantenimiento evolutivo y correctivo de aplicaciones SAP.\n- Colaboración con el equipo en la mejora continua de los sistemas.\nRequisitos\n- Al menos 4 años de experiencia en desarrollo SAP ABAP.\n- Experiencia en proyectos de mantenimiento y desarrollo de evolutivos.\n- Experiencia en desarrollo y mantenimiento de programas SAP ABAP.\n- Capacidad de análisis y resolución de incidencias.\nCondiciones\n- Perfil: Programador SAP ABAP.\n- Especialización: Desarrollo y evolutivos.\n- Tecnología: SAP ABAP.\n- Experiencia: +4 años.",
"workType": null,
"salary": null,
"employmentTypes": [
"Full-time"
],
"hiringContacts": []
}

Current costs

Current Actor event rates, checked 2026-10-16. USD; use the Pricing tab for your plan and later changes.

EventFreeBronzeSilverGoldPlatinumDiamond
Actor start (actor-start)$0.00005$0.00005$0.00005$0.00005$0.00005$0.00005
Job result (result)$0.0001$0.0001$0.000075$0.00005$0.00005$0.00005

For example, 1 × actor-start, 100 × result totals $0.01005 in Actor event charges on Free. This is an arithmetic example, before any waiver; actual charged events depend on the run and selected options. It is not a promise of output or a charge for simply setting an item cap.

Your total is the charged Actor events, plus platform usage only if this Actor’s Pricing tab bills it separately, plus any external provider you use with your own key. Do not add platform usage twice when it is included. Apify credits and plan discounts affect your invoice. Set a run cost limit in Console before starting.


Independent tool. We built and run this Actor ourselves. It is not affiliated with or endorsed by Tecnoempleo, and the name is used only to say which site the data comes from.