Emprego Sapo.Pt Scraper
Pricing
from $1.20 / 1,000 results
Emprego Sapo.Pt Scraper
Extract job listings from SAPO Emprego, Portugal's leading job board. Get titles, companies, locations, salaries, and contract types as structured JSON.
Pricing
from $1.20 / 1,000 results
Rating
0.0
(0)
Developer
Unfenced Group
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share

Extract job listings from emprego.sapo.pt at scale, in a clean, consistent structure ready for analysis, job boards, recruiting tools and market research. No API key required.
Why this scraper?
🎯 Built for Portugal
A dedicated Portuguese scraper, not a global tool with a country dropdown. Search, locations and currency (EUR) are tuned for emprego.sapo.pt.
📄 Complete job data
Full job title and description, direct listing URL and publish date for every record.
💶 Salary data
Salary information parsed from the listing where the employer publishes it, in EUR. Missing salaries are returned as null, never guessed.
🏢 Company details
Hiring company name plus the profile details the source publishes, such as logo and company page.
📍 Precise location
City, region and country plus latitude/longitude for mapping and radius analysis.
🔁 Repost & change detection
Every record carries isRepost and changeStatus, so daily feeds return genuinely new jobs instead of reposted duplicates.
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchQuery | string | "developer" | Search or filter by keywords. |
location | string | (empty) | Search or filter by location. |
category | string | (empty) | Search or filter by category. |
workModel | string | (empty) | Search or filter by workModel. |
workHours | string | (empty) | Search or filter by workHours. |
sortOrder | string | (empty) | sortOrder. |
daysOld | integer | 1 | Only return items published within the last N days. |
fetchDetails | boolean | false | ON: fetches full job description, salary, company info, and all details. OFF: returns basic listing info only (faster, lower cost). |
skipReposts | boolean | false | Enable skipReposts. |
startUrls | array | (empty) | Filter by startUrls. |
maxItems | integer | 100 | Maximum number of results (0 = no limit). |
Output schema
Every field below is present on every record. Fields the source does not publish for a given job are returned as null rather than omitted.
| Field | Type | Description |
|---|---|---|
id | string | Unique listing ID from the source. |
title | string | Job title |
pitch | string | Pitch. |
company | string | Hiring company |
companyUrl | string | Link to the company's page on the source. |
location | string | Location as displayed on the listing. |
district | string | District. |
municipality | string | Municipality. |
country | string | Country of the position. |
workHours | string | Work hours. |
workModel | string | Work model. |
description | string | Full job description in plain text. |
descriptionText | string | Full job description in plain text. |
descriptionMarkdown | string | Description markdown. |
industry | string | Industry as published. |
educationRequirements | string | Education requirements. |
experienceRequirements | string | Experience requirements. |
salaryMin | string | Minimum salary (null if not published by the employer). |
salaryMax | string | Maximum salary (null if not published by the employer). |
salaryCurrency | string | Currency code of the salary. |
salaryText | string | Raw salary text as displayed (null if not published). |
publishDate | string | Date posted |
publishDateISO | string | Publish date iso. |
expiresDate | string | Expires date. |
applyUrl | string | Direct application link. |
url | string | Direct link |
isHighlighted | boolean | Is highlighted. |
hasVideo | boolean | Has video. |
canonical | string | Canonical. |
source | string | Source. |
scrapedAt | string | ISO 8601 scrape timestamp |
contentHash | string | Stable hash of the listing content, used for repost and change detection. |
changeStatus | string | NEW, CHANGED or UNCHANGED compared to the previous time this job was seen. |
latitude | number | Latitude of the workplace. |
longitude | number | Longitude of the workplace. |
Example record
{"id": "5814335a-1448-40ad-8e77-a9b0c3669456","title": "Operador de Restauração (M/F) | Moita | Part-Time (19H-02H)","pitch": null,"company": "McDonald's Portugal","companyUrl": "https://emprego.sapo.pt/offers/company/mcdonalds-portugal","location": "Moita","district": "Setúbal","municipality": "Moita","country": "Portugal","workHours": "Part-Time","workModel": null,"description": "Operador de Restauração (M/F) | Moita | Part-Time (19H-02H)\n\nSonhador/a és, e sempre pronto para fazer mais e melhor estás. \nDe aventura gostas, por isso em novos desafios apostas.\nA palavra Equipa é …","descriptionText": "Operador de Restauração (M/F) | Moita | Part-Time (19H-02H)\n\nSonhador/a és, e sempre pronto para fazer mais e melhor estás. \nDe aventura gostas, por isso em novos desafios apostas.\nA palavra Equipa é …","descriptionMarkdown": "Operador de Restauração (M/F) | Moita | Part-Time (19H-02H)\n\nSonhador/a és, e sempre pronto para fazer mais e melhor estás. \nDe aventura gostas, por isso em novos desafios apostas.\nA palavra Equipa é …","industry": null,"educationRequirements": null,"experienceRequirements": null,"salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryText": null,"publishDate": "2026-06-05","publishDateISO": "2026-06-05T00:00:00.000Z","expiresDate": null,"applyUrl": null,"url": "https://emprego.sapo.pt/offers/operador-de-restauracao-mf-moita-part-time-19h-02h?id=5814335a-1448-40ad-8e77-a9b0c3669456","isHighlighted": true,"hasVideo": false,"canonical": "operador-de-restauracao-mf-moita-part-time-19h-02h","source": "emprego.sapo.pt","scrapedAt": "2026-06-06T06:07:09.041Z","contentHash": "5b70aabb37e1a652","changeStatus": "NEW","latitude": 38.6523995,"longitude": -8.9935314}
Examples
Search for administrativo roles in Porto:
{"searchQuery": "administrativo","location": "Porto","maxItems": 100}
Filter by contract type:
{"searchQuery": "administrativo","location": "Porto","maxItems": 100,"category": "FULL_TIME"}
Scrape a specific search URL:
{"startUrls": [{"url": "https://www.emprego.sapo.pt/"}],"maxItems": 200}
Daily feed (run on a schedule):
{"searchQuery": "administrativo","daysOld": 1,"skipReposts": true,"maxItems": 500}
Schedule this input to run once a day in the Apify Scheduler — each run returns only jobs posted in the last 24 hours.
💰 Pricing
$1.50 per 1,000 results — you only pay for successfully retrieved listings. Failed retries are never charged.
| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 1,000 | ~$1.50 |
| 10,000 | ~$15.00 |
| 100,000 | ~$150.00 |
Flat-rate alternatives typically charge $29–$49/month regardless of usage.
Subscription tiers lower the rate further, down to $0.90 per 1,000 at the highest tier. Use the Max results cap in the input to control your spend exactly.
Performance
| Run size | Typical time |
|---|---|
| 100 results | under 1 minute |
| 1,000 results | 2–4 minutes |
| 10,000 results | 20–35 minutes |
Known limitations
- Salary is only returned when the employer publishes it — many listings carry
nullsalary fields. - Company details vary per listing; the scraper returns what the source publishes and never invents data.
- Very large result sets are bounded by the source's own paging limits.
- Listings can be removed by the source at any time, so a small share of URLs may expire shortly after scraping.
Technical details
- Source: emprego.sapo.pt — Portugal job listings
- Coverage: everything the public search exposes, filterable via the input parameters above
- Retry: automatic retry on network errors with exponential backoff
Need a custom scraper?
Unfenced Group builds Apify actors for any website — for free.
If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.
Get in touch: www.unfencedgroup.nl