Teamtailor Job Scraper — Nordic & European Careers Sites
Pricing
$2.00 / 1,000 job postings
Teamtailor Job Scraper — Nordic & European Careers Sites
Search open jobs across 1,400+ Nordic and European employers hiring on Teamtailor by job title, city, country and date — no careers-site addresses needed. Or pass sites. Live data: full description, city, postal code, country, all locations, apply URL.
Pricing
$2.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Share
Teamtailor Job Scraper — Nordic & European Careers Sites 🚀
foXLabs hiring series: Greenhouse · Lever · Ashby · Workday · SmartRecruiters · Personio · Workable · BambooHR · All platforms in one search →
🎉 Search open jobs across 1,400+ Nordic and European employers that hire on Teamtailor — by job title, city, country and posting date — without knowing a single careers-site address. Or point it at the sites you track. No login, no API key, one row per open role with the full description. Built for sales & competitive-intelligence teams, recruiters and job-data pipelines focused on the Nordics and Europe.
🔍 What is the Teamtailor Job Board Scraper — and when should you use it?
Teamtailor powers the careers sites of thousands of Nordic and European scale-ups, but every company publishes its jobs on its own site with no search across companies. This actor does the searching for you. It carries an index of 1,448 Teamtailor careers sites (discovered from the public Common Crawl web archive; 1,448 had a live job feed in our last full check, October 2026), reads their feeds live during your run, and keeps the jobs whose title matches your keywords and filters — with city, postal code, country, all posting locations, posted date and the full description.
Already know your target companies? Add their careers hostname (career.kry.se) and get every open role.
Use it when you need: Nordic and European employers hiring for a function right now; a feed of new roles for a job title in a city; every open role at a target company; or a read on a competitor's hiring plans — from the JSON feed every Teamtailor careers site publishes at /jobs.json, no key.
Use something else when: the companies you care about don't run on Teamtailor. Every actor in the foXLabs hiring series emits the same core schema, so their outputs concatenate into one hiring-intent table: Greenhouse · Lever · Ashby · Workday · SmartRecruiters · Personio · Workable · BambooHR.
Need one search across every platform? Job Postings Database keeps a daily-refreshed index of 440,000+ open roles from ~33,000 Greenhouse, Lever, Ashby, SmartRecruiters, BambooHR, Personio and Teamtailor boards and answers a single query across all of them in seconds — every delivered role is re-checked live on its own board before it reaches you.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/teamtailor-job-board-scraper.
Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is per delivered role, never for errors.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want to find open jobs at Nordic and European employers that hire on Teamtailor using the Apify Actor `foxlabs/teamtailor-job-board-scraper`.Input: `searchQueries` is a list of job-title keywords (every word must appear in the title; "*" = every job).Optional filters: `location` (a city such as "Stockholm" or a country such as "Sweden" — country codes like SE are understood),`department`, `remoteOnly`, `employmentType`, `postedWithinDays` ("1" | "7" | "30" | "90").`queries` optionally adds careers sites (hostnames like "career.kry.se").`maxResultsPerQuery` caps jobs per keyword or site (default 200).Start with: {"searchQueries":["sales"],"location":"Stockholm","maxResultsPerQuery":50}Ask me which roles and cities I care about, run the Actor, then summarise the hiring companies as a table.
The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/teamtailor-job-board-scraper.md.
📋 Overview
Everything you need to turn Teamtailor's Nordic and European careers sites into one searchable hiring dataset — role details, locations and hiring signals — in one actor, with no login, cookies or API key.
Why teams pick this actor:
- 🔎 No hostnames needed — search 1,400+ live Teamtailor careers sites by job title; the companies come to you.
- 🌍 Nordic & European coverage — scale-ups US-centric job feeds miss.
- 📄 Full descriptions — straight from each company's job feed, HTML stripped.
- 📍 Precise locations — city, postal code, country code and every posting location.
- ⚡ Live, not a stale dump — every feed is read during your run.
- 🔗 Same schema across the series — join with the sibling ATS actors on
companyName/companyBoard. - 💰 Pay only for results — per-role pricing; a job found twice is charged once; empty searches and failed lookups are never billed.
- 🤖 Agent-ready — MCP + x402 agentic payments.
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~teamtailor-job-board-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries":["sales"],"location":"Stockholm","maxResultsPerQuery":50}'
🚀 Getting Started (3 steps)
- Type your job titles — one per line (
sales,developer), or*for every job. - Narrow it down (optional) — city or country, department, remote only, employment type, posting date; or add specific careers sites in
queries. - Run and export — a clean dataset as JSON, CSV or Excel.
📥 Input
{"searchQueries": ["sales", "account executive"],"location": "Sweden","postedWithinDays": "30","queries": ["career.kry.se"],"maxResultsPerQuery": 200}
| Field | Type | Description |
|---|---|---|
searchQueries | array | Job-title keywords, one per line. Every word must appear in the title (engineer also matches engineering). * = every job matching the filters. |
location | string | A city (Stockholm, Oslo) or country (Sweden — country codes such as SE are spelled out). German/English spellings of the same city both match. |
department | string | Text the department must contain (many feeds do not publish one). |
remoteOnly | boolean | Keep only remote jobs. |
employmentType | string | Text the employment type must contain (many feeds do not publish one). |
postedWithinDays | string | any, 1, 7, 30 or 90. |
queries | array | Optional Teamtailor careers hostnames or URLs (career.kry.se). Search filters do not apply to them. |
maxResultsPerQuery | integer | Caps jobs per keyword or site (default 200). |
maxConcurrency | integer | How many sites from queries to fetch at once. |
scanConcurrency | integer | How many feeds a keyword search reads at once (default 4). |
includeRaw | boolean | Attach the source's untouched record under raw (sites in queries). |
requestDelayMs | integer | Politeness delay between requests. |
proxyConfiguration | object | Optional. |
📤 Output
One row per open role, saved to the dataset.
| Field | Description |
|---|---|
companyName | Company name |
companyBoard | Careers hostname — join key |
jobId | Teamtailor posting ID |
jobTitle | Role title |
location / allLocations | Primary location / all posting locations |
city / postalCode / countryName | City, postal code, country code |
isRemote | Remote flag |
postedAt | Published date (ISO) |
description | Full description, HTML stripped |
applyUrl / sourceUrl | Apply link / public posting URL |
Every row also carries query, scrapedAt, and — when a search finds nothing or a lookup fails — an error.
{"query": "sales","companyName": "Volue","companyBoard": "volue.teamtailor.com","jobTitle": "Sales Account Executive","location": "Stockholm, SE","city": "Stockholm","postalCode": "111 57","countryName": "SE","allLocations": ["Stockholm, SE", "Oslo, NO", "Trondheim, NO"],"isRemote": false,"postedAt": "2026-09-16","description": "At Volue, our mission is to provide innovative services critical to society, unlocking a c…","applyUrl": "https://volue.teamtailor.com/jobs/8388163-sales-account-executive"}
💼 Use cases
1. Nordic hiring intent
Input: searchQueries: ["sales", "account executive"], location: "Sweden", weekly. Output: scale-ups hiring sales. Use: the best public read on Nordic scale-up hiring.
2. New-role feed
Input: your titles, a city, postedWithinDays: "7". Output: fresh postings with apply links. Use: job boards, alerts, market dashboards.
3. Competitor headcount tracking
Input: a peer's careers domain in queries. Output: role list over time. Use: watch which functions grow week over week.
4. Recruiter sourcing Input: a title and a country. Output: roles + full descriptions + apply links. Use: source across Nordic employers.
🔗 Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/teamtailor-job-board-scraper').call({ searchQueries: ['sales'], location: 'Stockholm', maxResultsPerQuery: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/teamtailor-job-board-scraper').call(run_input={'searchQueries': ['sales'], 'location': 'Stockholm', 'maxResultsPerQuery': 50})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): schedule or webhook → HTTP request to the actor API → handle the JSON dataset → push to a sheet, CRM or dashboard.
📊 Pricing
Pay-per-event:
| Event | Price | When |
|---|---|---|
| Job posting | $0.002 | per delivered role |
| Keyword search | $0.02 | from October 29, 2026: once per search line that delivers at least one job (a search reads every feed in the index) |
A job found twice is charged once; a search line that finds nothing, jobs that don't match your filters, and failed lookups are never billed. Companies you list in queries pay only per role. Example: one keyword returning 50 jobs costs $0.02 + 50 × $0.002 = $0.12. View current pricing.
❓ FAQ
Do I need an account, login or API key? No. This reads the JSON job feed every Teamtailor careers site publishes at /jobs.json — no key.
Do I need to know careers-site addresses? No. Search by job title; every row tells you the company and its careers hostname.
Which companies does the search cover? Teamtailor careers sites found in the public Common Crawl web archive — 1,448 sites, of which 1,448 had a live feed in our last full check (October 2026). A site that isn't in the index can still be read by adding its hostname to queries. A very large feed (over 10 MB, e.g. a staffing firm with thousands of roles) is skipped by the search and named in the run log; add it to queries to read it in full.
How current is the data? Every run reads the feeds live, so results are as fresh as the careers sites themselves.
Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.
What happens on a bad input or a search with no matches? You get a row with your query and an error — nothing is silently dropped, and you're not charged.
Is scraping this legal? It reads a public job feed the company publishes for syndication — job data, not personal data. See below.
🐛 Troubleshooting
- Fewer rows than expected — title matching is strict (every word must appear in the title); try fewer or shorter keywords, or loosen the filters.
- "No Teamtailor job feed at …" — use the careers site's hostname (custom domain or
*.teamtailor.com). - A company you expected is missing — its feed may be over 10 MB (see the run log) or not in the index; add it to
queries.
⚠️ Trademark
Independent, third-party tool. Not affiliated with, endorsed by or connected to Teamtailor AB. "Teamtailor" and related marks belong to their owners and are used here for identification only.
⚖️ Is it legal to scrape this data?
This actor reads only publicly published job-posting data — no private or personal user data. Your results can still contain personal data (e.g. a name in a description); personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. See Apify's blog post on the legality of web scraping.
🤝 Support & contact
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor's Issues tab
- 🧰 More clean B2B data actors: Fox Labs on Apify
Changelog
Index refresh — 2026-10-14
- Company index refreshed from the latest public web-archive snapshots: no new careers sites found, 143 that no longer exist removed (checked live on 2026-10-14); the index now holds 1,448 careers sites, 1,448 of them answering.
0.5.0 — 2026-10-14 — keyword search across Teamtailor (no hostname needed)
- New:
searchQueries— search open jobs by title across 1,591 indexed Teamtailor careers sites (1,443 live), withlocation,department,remoteOnly,employmentTypeandpostedWithinDaysfilters. Feeds are read live. - A job is delivered and charged once per run, whether a search or a site in
queriesfinds it. - Restart-safe: a run that Apify moves to another server resumes without writing or charging a row twice.
queries(careers hostnames / URLs) works exactly as before; it is now optional.
0.4.5 — 2026-10-08 — README: the Python example works with the current Apify client
- The README's Python example read the results with
run['defaultDatasetId']. With the current Apify client for Python (version 3)call()returns a run object, not a dict, and that line raisedTypeError: 'Run' object is not subscriptable— after the run itself had finished. The example now readsrun.default_dataset_id; with client version 1 or 2, keeprun['defaultDatasetId']. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2. - No code, output field or pricing change.
0.4.1 — 2026-09-06
- Added
postalCode. Postal code from the structured job location (100% of roles), for precise geo alongside city / country.
0.4 — 2026-09-06
- Enabled AI-agent payments (x402). Standby mode was removed because Apify's x402 agentic-payment eligibility requires it off; the actor now runs as a standard pay-per-event run that agents can discover, run and pay for over x402 (USDC on Base) or Skyfire without an Apify account. Batch and MCP usage are unchanged.
0.3 — 2026-09-05
- Output schema linked in
actor.json(outputfield) so the Store shows the Output tab. - Standby mode (real-time API). The actor now also runs as an always-on HTTP API:
GET /search?query=<query>&maxResults=Nreturns open roles as JSON, billed per role (pay-per-event). Batch runs are unchanged. Endpoint and OpenAPI schema appear in the Standby tab.
0.2 — 2026-09-05
- Real locations added. Location, city and country now come from the feed's schema.org JobPosting data (
jobLocation); the old code read the JSON Feedtagsarray, which current Teamtailor sites leave empty, so location was always blank. AddsallLocationsfor multi-site roles. - Dead columns removed.
department,team,employmentType,seniority,salary,updatedAt,tags,author(none present in the current feed) are no longer emitted.
0.1
- Initial release: roles from any Teamtailor careers site JSON feed (title, description, dates).