InfoJobs Scraper — Ofertas de Trabajo y Empleo España
Pricing
from $2.00 / 1,000 job results
InfoJobs Scraper — Ofertas de Trabajo y Empleo España
Scrape ofertas de trabajo y empleo from InfoJobs.net, Spain's largest job board. Keyword, province, contract, jornada and teletrabajo filters; AI skill tags, structured salary (min/max), postedAt and apply URL. Delta mode for alert bots. For recruiters, job boards and Spanish market analysis.
Pricing
from $2.00 / 1,000 job results
Rating
0.0
(0)
Developer
Nomad.Dev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
3
Monthly active users
6 days ago
Last modified
Categories
Share
Scrape current ofertas de trabajo y empleo from InfoJobs.net, the biggest job board in Spain, with keyword and province filtering — every posting enriched with AI-extracted skill tags and structured salary data.
What InfoJobs data does this scraper extract?
Each result is one flat JSON record per job posting:
| Field | Meaning |
|---|---|
title | Job title as posted |
company | Hiring company / organisation |
location | Location / duty station (may include remote hints) |
teleworking | Work mode shown on the card — Presencial, Híbrido or Teletrabajo (null when the card omits it) |
contractType | Contract-type label (e.g. Contrato indefinido, Contrato de duración determinada) |
workday | Workday / jornada label (e.g. Jornada completa, Jornada parcial) |
url | Direct link to the posting |
postedAt | Posting date/time, computed server-side as ISO-8601 (YYYY-MM-DD, or a full timestamp when the source text is minute/hour-precision, e.g. "Hace 14m") from InfoJobs' relative Spanish text. null when that text doesn't match a known pattern. |
postedAtText | The original relative Spanish text as shown by the source (e.g. "Hace 2h", "Hace 6d"), kept verbatim for transparency (never rewritten, never dropped) |
salary | Salary text where the source provides it |
salaryMin / salaryMax | Numeric pay bounds parsed from the salary text (equal for a single figure; null when no salary is published) |
salaryCurrency | Currency code for the salary bounds (defaults to EUR) |
salaryPeriod | Pay period — year, month, week, day or hour |
skills | AI-extracted skill tags (max 8) — concrete skills, technologies and tools from the title/description, canonicalised to English industry terms (e.g. Python, SAP, Customer service). Included in the result price; null if disabled via extractSkills: false or unavailable |
snippet | Short description excerpt |
isNew | true for postings new to delta mode (onlyNewSinceLastRun); absent on ordinary runs |
id | Stable source-side identifier |
source | Always "infojobs" — handy when merging datasets from several job scrapers |
Transparent posting dates: InfoJobs shows only relative Spanish text (Hace 2h, Hace 6d). We keep that text verbatim in postedAtText and expose the computed ISO date in postedAt — unparseable dates are never silently dropped, so you can always audit how each date was derived.
How to scrape InfoJobs with this Actor
- Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
- Adjust the input (keyword, filters,
maxItems) or keep the defaults. - 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 ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/infojobs-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~infojobs-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"maxItems": 50}'
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keyword | string | "" | Free-text search query (e.g. "data engineer", "marketing"). Leave empty to return the latest postings across all categories. |
province | string (select) | "" | Restrict results to a single Spanish province (e.g. Madrid, Barcelona). Leave as "All provinces" to search nationwide. |
teleworking | string | "" | Keep only Presencial, Híbrido or Teletrabajo listings (accent/case-insensitive match on the card's work-mode label). |
contractType | string | "" | Keep only listings matching a contract-type label (Indefinido, De duración determinada, Fijo discontinuo, …). |
workday | string | "" | Keep only listings matching a jornada label (Completa, Parcial, Intensiva, Indiferente). |
postedSince | integer | 0 | Only return listings posted within this many days. See "Freshness filtering" below. Set 0 to disable. |
titleExclude | array of strings | [] | Skip listings whose title contains any of these case-insensitive terms. |
companyExclude | array of strings | [] | Skip listings whose company name contains any of these case-insensitive terms. |
extractSkills | boolean | true | Add an AI-extracted skills tag array to each posting (included in the result price). Set false to skip. |
onlyNewSinceLastRun | boolean | false | Delta / monitoring mode: return only postings not seen in a previous run and stamp each with isNew: true. See "Delta mode" below. |
maxItems | integer | 15 | Maximum number of postings to return. InfoJobs returns roughly 10–15 cards per page; set 0 for no additional cap. |
timeoutSecs | integer | 25 | How long to wait for InfoJobs to respond before giving up, in seconds. (Advanced) |
cacheTtlSeconds | integer | 1800 | Reuses the last fetch for this many seconds so rapid re-runs don't hit InfoJobs again. Set 0 to always fetch live. (Advanced) |
Freshness filtering (postedSince)
InfoJobs shows posting dates as relative Spanish text on the search page, not an ISO date — typically a compact badge like "Hace 14m" (minutes), "Hace 2h" (hours) or "Hace 6d" (days), occasionally a spelled-out form like "Hace 2 semanas" or "Hace 3 meses". This text is parsed into an approximate age in days both to evaluate postedSince and to compute the ISO postedAt field in the output; the original, unmodified text is always kept in postedAtText. Listings whose date text doesn't match a known pattern are always kept by the postedSince filter, since their age can't be judged — postedAt is null for those.
Delta mode (onlyNewSinceLastRun)
For recurring runs (e.g. a daily job-alert bot), set onlyNewSinceLastRun: true. The Actor remembers every offer ID it has already returned in a named key-value store and, on the next run, emits only postings it hasn't seen before, each stamped with isNew: true. This gives you a clean incremental feed with no client-side de-dup. Keep the rest of your input stable across scheduled runs so the seen-set stays comparable; the store holds up to 50,000 IDs (oldest evicted first).
Output example
{"id": "9982314","title": "Desarrollador/a Full Stack","company": "Indra","location": "Madrid, Spain, Híbrido","teleworking": "Híbrido","contractType": "Contrato indefinido","workday": "Jornada completa","url": "https://www.infojobs.net/madrid/desarrollador-full-stack/of-i9982314","postedAt": "2026-07-04T10:00:00+00:00","postedAtText": "Hace 2h","salary": "35.000€ - 45.000€ Bruto/año","salaryMin": 35000,"salaryMax": 45000,"salaryCurrency": "EUR","salaryPeriod": "year","skills": ["JavaScript", "React", "Node.js", "SQL"],"snippet": "Buscamos desarrollador/a full stack...","source": "infojobs"}
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
Pay per event: $0.005 per Actor start and $0.0025 per job returned (less on higher Apify plans). 100 jobs ≈ $0.26. No subscription, no rental — you pay only for what you fetch.
Use cases
- Spanish job boards and alert bots (empleo en España)
- Recruiting agencies sourcing Spain-based talent
- Salary benchmarking for the Spanish market
- Regional labour-market dashboards
FAQ
Is it legal to scrape InfoJobs? 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?
Every run fetches live listings. Results are cached for cacheTtlSeconds (default 30 min, set 0 to always hit the source live).
How many jobs can I get?
maxItems caps the run (set 0 where supported for no cap). Most sources paginate from newest to oldest.
Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.
Is this Actor useful to you? A short review on the Actor's Reviews tab helps other users find it — it takes a minute and is genuinely appreciated.
Related Actors
- Europe Jobs Scraper — 14 Sources in One
- Web Developer Jobs Scraper — 10 Boards in One
- Tecnoempleo Scraper — Spain IT & Tech Jobs
- EURES Job Scraper — EU Job Mobility Portal
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.