Teamtailor Jobs Scraper: Nordic & EU Career Sites
Pricing
from $0.74 / 1,000 job scrapeds
Teamtailor Jobs Scraper: Nordic & EU Career Sites
Scrape any Teamtailor careers site. role title, department, location, remote status, employment type and full description. No login, no proxy, no browser.
Pricing
from $0.74 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Arman Hossain
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share

Teamtailor Jobs Scraper pulls every open role from any Teamtailor career site, title, department, location, remote status, employment type, publish date, apply link and the full plain-text description.
Teamtailor powers the careers pages of 13,000+ employers, with unusually deep coverage of Nordic and wider European companies that never appear on US-centric boards. This Actor reads the public career site directly: no browser, no proxies, no login, no API token.
Agent skill: SKILL.md
https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/teamtailor-jobs-scraper.md
What you get
| Output field | Meaning |
|---|---|
company | Company name as Teamtailor publishes it |
jobId | Teamtailor's numeric job ID, stable across runs |
title | Job title |
department | Team the role sits in, when the career site shows one |
location | Location as displayed, falling back to the feed's structured address |
remoteStatus | Hybrid, Fully Remote, On-site, when the employer filled the field in |
employmentType | Schema.org value, e.g. FULL_TIME, PART_TIME, CONTRACTOR |
publishedAt | Publish timestamp with timezone offset |
applyUrl | Direct link to the job page |
bodyPlain | Full description as clean plain text, HTML stripped, entities decoded |
scrapedAt | Run timestamp |
A RUN_SUMMARY record in the key-value store holds per-run counts, the filters used, and any career site that failed.
Common use cases
- Map Nordic tech hiring. Teamtailor's customer base is the best single source for Swedish, Norwegian, Danish and Finnish employers.
- Build a Europe-focused job aggregator. One scheduled run refreshes every listing you syndicate.
- Track employer-brand pages for a competitor set. Department plus publish date shows where headcount is going.
- Recruiting intelligence. See which teams a competitor is opening and in which cities.
- Lead generation. A company hiring for a role is a company buying for it.
Quick start
Two career sites, everything they have:
{"companies": ["polestar", "instabee"]}
Engineering roles in Stockholm, capped:
{"companies": ["polestar", "https://career.teamtailor.com/jobs"],"searchTerms": ["engineer", "developer"],"locationFilter": ["stockholm"],"maxJobsPerCompany": 50,"fetchJobDetails": true}
Fast, lightweight sweep for change detection:
{"companies": ["nordicwellness"],"fetchJobDetails": false}
Input
| Field | Type | Default | Notes |
|---|---|---|---|
companies | array | - | Required. Teamtailor subdomains (polestar) or full career-site URLs. Mixed input is fine, URLs are normalised automatically. |
searchTerms | array | [] | Keep only titles containing one of these terms (case-insensitive). Empty = all. |
locationFilter | array | [] | Keep only locations containing one of these terms. Empty = all. |
maxJobsPerCompany | integer | 0 | Cap saved jobs per company after filtering, and stop listing pagination early. 0 = no limit. |
fetchJobDetails | boolean | true | Fetch each saved job's own page for employment type and remote status. One extra request per saved job. |
Both filters combine with AND: a job must match at least one term in each non-empty filter. Set maxJobsPerCompany before turning fetchJobDetails on for a large board, the cap is applied first, so it also caps the number of detail requests.
Output example
{"company": "Polestar","jobId": 8176726,"title": "Product Quality Expert","department": "Quality & Logistics","location": "Shanghai, China","remoteStatus": null,"employmentType": "FULL_TIME","publishedAt": "2026-08-06T03:51:46+02:00","applyUrl": "https://polestar.teamtailor.com/jobs/8176726-product-quality-expert","bodyPlain": "We are Polestar. We are detail obsessed, performance focused …","scrapedAt": "2026-08-06T12:00:00.000Z"}
Finding a career-site subdomain
Open a company's careers page and look at the URL:
| URL you see | Subdomain |
|---|---|
polestar.teamtailor.com | polestar |
polestar.teamtailor.com/jobs | polestar |
career.teamtailor.com/jobs/8124573-… | career |
You can paste the whole URL, the Actor extracts the subdomain itself. Some employers front their career site with a custom domain (jobb.nordicwellness.se); pass the *.teamtailor.com subdomain and the Actor follows the redirect to the branded domain automatically.
API example
curl -X POST "https://api.apify.com/v2/acts/arman-bd~teamtailor-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"companies": ["polestar"],"searchTerms": ["engineer"],"maxJobsPerCompany": 25}'
JavaScript example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('arman-bd/teamtailor-jobs-scraper').call({companies: ['polestar', 'instabee'],searchTerms: ['engineer'],locationFilter: ['stockholm'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const job of items) console.log(`${job.company}, ${job.title} (${job.location})`);
Notes
- Bad career sites don't kill the run. An unknown subdomain returns HTTP 404 and is recorded in
RUN_SUMMARY.failures; the Actor only errors out if every site fails. - Transient errors are retried. 429 and 5xx get three attempts with exponential backoff.
- Boards larger than 100 roles are still complete. Teamtailor's JSON feed is capped at 100 items server-side and exposes no cursor, so the paginated career listing is what enumerates the board; the feed is merged in for descriptions and structured addresses. A 104-role site returns 104 rows, not 100.
- Descriptions come from whichever source has them. Jobs inside the feed take their body from it for free; jobs past the 100-item cap take it from their own page when
fetchJobDetailsis on. - Remote status is read from the listing first. The job page labels the field in English only, so on localised career sites the listing card is the reliable source.
- Descriptions are decoded twice. Recruiters paste already-encoded markup into Teamtailor's editor, so entities are decoded before tags are stripped and again afterwards. You get real text, not
<p>. - Large payloads. Career sites with long, image-heavy descriptions push the feed past 7 MB. It is fetched once per company and indexed by job ID, so memory stays flat regardless of how many companies you pass.
- Public data only. No authentication, no personal data, no access-control bypass.
FAQ
Do I need a Teamtailor API token? No. Teamtailor's official API does require one, but the public career site does not, and that is what this Actor reads.
Do I need a proxy? No. Proxy configuration is not required to run this Actor.
Why is department null? Departments are optional and some career sites use a custom listing layout that omits them. Location always comes through, from the feed's structured address if not from the card.
Why is remoteStatus null? The field is optional in Teamtailor and most employers leave it unset. When it is set, it appears as Hybrid, Fully Remote or On-site.
Does it include salary? Only if the company writes it into the description, Teamtailor's public data has no structured salary field, and this Actor does not invent one.
How many companies can I pass at once? There is no hard cap. Each company costs one feed request plus one listing request per 20 jobs, so dozens per run is normal. Turn fetchJobDetails off to make large sweeps much cheaper.
Can I get only new or changed jobs? Run on a schedule and diff on jobId plus publishedAt.
Can I integrate it with something else? Yes, Apify API, client libraries, webhooks, scheduled runs, dataset exports (JSON/CSV/Excel) or MCP. Output is structured JSON.