Teamtailor Jobs Lookup — Live Postings by Company
Pricing
from $2.00 / 1,000 successful lookups
Teamtailor Jobs Lookup — Live Postings by Company
Look up any company's live Teamtailor job board and get every open role — title, location, apply link. Filter by job title, location, remote, or posted date, or get only the postings that are new since your last run. Charged once per company checked, however many roles it has open.
Pricing
from $2.00 / 1,000 successful lookups
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 hours ago
Last modified
Categories
Share
You paste a list of companies. For each one, this actor looks up their live Teamtailor job board and returns every open role — title, location, and apply link — as one row per posting (or one row per company, your choice). No API key, no HTML scraping: it reads Teamtailor's own public job feed directly. Optional filters narrow the roles you get back by title, location, or posting date, and an optional delta mode returns only the postings that appeared since your last run, so you can put a company list on a schedule and get a hiring alert instead of a full re-dump every time.
Who it's for
The accountable_eel catalogue sells company intelligence columns for outbound. Each actor takes a list of domains or company identifiers and returns one flat, stably-named row per input — firmographics, registry IDs, tech stack, email route, hiring activity — the shape a Clay table, an n8n workflow, or an AI agent can consume without post-processing. Pricing is pay-per-event and per-company: a few tenths of a cent for a row that was actually found, and nothing for a miss, so a list that doesn't enrich costs you next to nothing. Here, the "identifier" is a Teamtailor subdomain token or careers URL, and the "row" is a job posting — useful for sourcing candidates, watching a competitor's hiring, or tracking headcount signal across a target list. Teamtailor is the dominant ATS across the Nordics and much of continental Europe, a segment the portfolio's other six ATS actors (Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Personio) don't cover.
Why this one
- Direct from Teamtailor's own job feed. No HTML scraping to break when a careers page gets
redesigned — this reads
<subdomain>.teamtailor.com/jobs.json, the same public JSON Feed (jsonfeed.org spec, with an embedded schema.orgJobPostingper item) that every Teamtailor board publishes, no login required. - You pay per company, not per job. A board with 23 open roles and a board with 2 both cost
one
item-lookupcharge. A company with no board, or zero open roles, is a free miss. - Real filters, not a wall of raw fields. Title keyword include/exclude, location, remote-only, and posted-after-date all combine, so you can ask for exactly the roles you want.
- A delta mode for watching hiring over time. Turn on
onlyNewSinceLastRun, put the actor on a schedule, and every run after the first returns only postings you haven't seen — a quiet week still gets a row, so you can tell "nothing new" from "the run broke." - Flexible input. A bare Teamtailor subdomain token or the full careers URL both work — no need to go find the raw subdomain first.
What you get
One row per open job posting by default (toggle "One row per job posting" off in the Input tab to
get one row per company instead, with the full job list nested in jobs). Every row carries these
fields, whether or not you've turned on filters or delta mode — the columns never move:
| Field | Type / format | Description |
|---|---|---|
query | text | The company value you passed in, unchanged. |
found | boolean | true if the company has a Teamtailor board with at least one open role, false otherwise. |
status | text | OK, NOT_FOUND (no board, or no open roles), or BAD_FORMAT (input didn't look like a subdomain or URL). |
boardToken | text | The Teamtailor subdomain, extracted from whatever you pasted (bare token or careers URL). |
jobCount | number | How many roles matched, after your filters (and after delta filtering, if onlyNewSinceLastRun is on). |
totalJobCount | number | How many roles were on the board before any filtering — lets you see what a filter dropped. |
newJobs | number | How many roles are new since your last scheduled run. Empty unless onlyNewSinceLastRun is on. |
firstRun | boolean | true if this was the baseline run for this watchlist. Empty unless onlyNewSinceLastRun is on. |
jobs | array | The full list of matching jobs, each with the fields below. Present in every row; it's what gets expanded into separate rows in "one row per job" mode. |
title | text | Job title. |
location | text | City and country as Teamtailor's structured JobPosting.jobLocation lists it (e.g. "Munich, DE"); multiple locations join with ; . |
remote | boolean | true if the location or title reads as remote (matches "remote", "anywhere", "work from home", "wfh", "distributed" in the location, or the word "remote" in the title). |
postedAt | date (ISO) | When Teamtailor published the posting. |
applyUrl | link | Direct apply link for the role. |
scrapedAt | date (ISO) | When this actor fetched the row. |
A company with no Teamtailor board, or with a board but zero open roles, still comes back as one
row with found: false and a status/message explaining why — and that row is never charged.
Price
$4 per 1,000 companies, plus a $0.00005 start fee. Misses (found:false) are never charged.
However many roles a found company has open, it's one charge: a board with 23 postings costs the
same as one with 2. Misses (found: false) — no board, or a BAD_FORMAT input — are never
charged, no matter how many companies are in the list.
How to use
- In the Apify Console. Open the actor page and click Start — the
companiesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~teamtailor-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["tmgchicago"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Paste one company per line — a bare Teamtailor subdomain like tmgchicago, or the full careers URL
(https://tmgchicago.teamtailor.com/jobs or just https://tmgchicago.teamtailor.com). The
subdomain is extracted automatically either way, so you don't need to go look up the raw feed URL.
To narrow the roles you get back, open the 🎯 Job filters section of the Input tab. All of these are optional and combine with AND across fields, OR within a field:
| Input | What it does |
|---|---|
titleKeywords | Keep only roles whose title contains at least one of these — ["engineer","designer"]. Case-insensitive, partial words count. |
excludeTitleKeywords | Drop roles whose title contains one of these — ["intern","contract"]. Applied after titleKeywords. |
locations | Keep only roles whose location contains one of these — ["Berlin","United States"]. |
remoteOnly | Keep only roles that read as remote. |
postedAfter | Keep only roles first published on or after this date — "2026-06-01". |
Leave every filter empty and you get every open role. jobCount (matched) and totalJobCount
(before filtering) both come back on every row, so a filtered result is never ambiguous — and a
company whose roles all get filtered out still returns a found: true row with jobCount: 0,
charged like any other found company, because it answered the question you asked.
For a standing watchlist, turn on onlyNewSinceLastRun in the 🔁 Watch for new jobs
section and put the actor on a schedule. The first run baselines (returns everything matching your
filters, firstRun: true); every run after that returns only postings it hasn't shown you before,
counted in newJobs. A quiet run still returns a row per company (jobCount: 0, newJobs: 0) so
you can tell "nothing new" from "the run failed" — and every company checked is still charged
once. Two schedules with different filter values keep separate seen-lists automatically.
Input
{"companies": ["tmgchicago"]}
One company per line — paste the Teamtailor subdomain token or the full careers page URL. Accepted formats: cigames, https://cigames.teamtailor.com/jobs, https://parcellab.teamtailor.com.
Sample output
| query | found | status | boardToken | jobCount | totalJobCount | newJobs | firstRun | jobs | title | location | remote | postedAt | applyUrl | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tmgchicago | true | OK | tmgchicago | 23 | 23 | <all matching jobs (full list)> | CNC Field Service Technician - (Remote Work) | Valparaiso, US | true | 2026-08-20T10:48:48-05:00 | https://tmgchicago.teamtailor.com/jobs/8250011-cnc-field-service-technician-remote-work | 2026-08-31T07:00:53.752Z |
In "one row per company" mode (turn off "One row per job posting"), the same run returns a single
row per company with the full job list nested under jobs and title/location/remote/
postedAt/applyUrl empty at the parent level.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~teamtailor-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["tmgchicago"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~teamtailor-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"companies":["tmgchicago"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~teamtailor-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"companies":["{{company}}"]}, mapping the row's company into the companies array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Teamtailor Jobs Lookup | Apify" — the agent will find and run this actor.
Tips
- Combine filters to build a watchlist query, not just a keyword search. plustitleKeywords: ["engineer"]
locations: ["Stockholm"]gets you Stockholm-based engineering roles only, in one pass, instead of filtering a full dump afterward. - Put delta mode on a weekly schedule for competitor tracking.
onlyNewSinceLastRunplus a fixed company list turns this into a hiring-alert feed. - Switch to one-row-per-company mode when you just want a headcount number. Turn off "One row
per job posting" and read
jobCountper company for a fast hiring-momentum signal across a long company list. - Don't combine delta mode with "Only keep rows containing." That filter runs on the finished
row and can drop the
newJobs: 0heartbeat row — the one row that tells you the schedule is still alive on a quiet week.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (teamtailor-jobs-lookup) | Charged per company whose board is found, nothing for a company with no Teamtailor board | Every open posting for a company's Teamtailor board — title, location, apply URL — filtered by role keyword, location or posting date, with onlyNewSinceLastRun for deltas | Teamtailor only. No dedicated Teamtailor actor previously existed in the Apify Store. |
| Teamtailor's own feed | Free | The same JSON | It is the same JSON. This handles the subdomain-token guessing, filtering, deltas, retries, and the MIME-type quirk of Teamtailor's feed (application/feed+json, which a naive crawler silently drops), and hands you a flat table. |
| Clay | Credits, on top of a seat | A whole enrichment workspace | If you want one place that does everything and you're not counting rows, that's Clay. This is one column, priced per column, callable from Clay via its HTTP step. |
FAQ
Why does found say false, or a row come back empty?
Either the input didn't look like a Teamtailor subdomain or URL (status: BAD_FORMAT), the
company doesn't have a Teamtailor board, or it currently has zero open roles (status: NOT_FOUND
either way). Check the message column for the specific reason.
Was I charged for that row?
Only if found is true. A company with no board, or no current openings, is free — check
status to confirm which case it was.
I got charged for a company that returned jobCount: 0 — why?
Because its board exists and has open roles — they just didn't match your filters, or weren't new
since your last delta run. totalJobCount shows how many were actually on the board before
filtering. That's a real answer to the question you asked, so it's billed like any other found
company. A company with no board at all, or nothing open, comes back found: false and is never
charged.
How does the delta / "new since last run" state work, and can I reset it?
It lives in a named key-value store, teamtailor-jobs-lookup-state, inside your own Apify account
— nobody else can see it. Delete that store to reset every watchlist and re-baseline on the next
run. Changing your filters also starts a fresh watchlist automatically.
Why is there no departments field, and no updatedAt?
Teamtailor's job feed doesn't expose a department, category, or employment-type field anywhere —
not on the feed item, not inside the embedded JobPosting data — and there's no second endpoint
to source one from either, unlike some other ATS platforms. Rather than ship a column that would
be permanently blank, there isn't one. Likewise, the feed carries exactly one date per posting
(datePosted, or the feed's own date_published when the structured data is missing) — there is
no separate last-modified timestamp to report as updatedAt, so postedAt is the only date field.
Does this actor hit rate limits on large company lists? It calls Teamtailor's public job feed once per company, with its own timeout and retry handling. The feed is unauthenticated and public — this actor doesn't need proxies to reach it. Very large company lists still take proportionally longer to run, since each company is a separate request.
Is this GDPR-safe to run against companies in the EU? The data returned is what each company has already published publicly on its own careers page — job titles, locations, apply links. No personal data about applicants or employees is collected. As with any lookup, you're responsible for how you use the output downstream.
Can I run this on a schedule?
Yes — set up an Apify schedule against this actor with your company list as input. Combine it with
onlyNewSinceLastRun for a hiring-alert feed, or leave it off to get a fresh full dump every run.
Can an AI agent call this directly? Yes — it's registered with the Apify MCP server. An agent with that MCP connected can find and run "Teamtailor Jobs Lookup" by name and get dataset rows back without you writing any integration code; see Use it from Clay, n8n, Make, or an AI agent.
Related actors
- Greenhouse Jobs Lookup — the same lookup, filters, and delta mode for companies on Greenhouse.
- Lever Jobs Lookup — the same lookup, filters, and delta mode for companies on Lever.
- Workable Jobs Lookup — the same lookup, filters, and delta mode for companies on Workable.