SmartRecruiters Jobs Scraper — Open Postings API
Pricing
from $2.00 / 1,000 successful lookups
SmartRecruiters Jobs Scraper — Open Postings API
Look up any company's live SmartRecruiters careers page and get its open roles — title, department, city, remote flag, apply link. Filter by title, location, remote, or posted date, or get only postings 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
1
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
SmartRecruiters Jobs Lookup
Paste a list of companies and get every open role on each one's SmartRecruiters board — title, department, city, country, remote flag, posted date and a direct apply link. This calls SmartRecruiters' own public postings API directly: no API key, and no scraping of the rendered careers page.
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-domain: 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. Where an official source exists — VIES, GLEIF, SEC EDGAR, Brønnøysund, PRH, RDAP — it is queried directly instead of scraped. No seat licence, no monthly minimum, no credit system to decode. Here the "identifier" is a SmartRecruiters company id or careers URL, and the "row" is a job posting.
Why this one
- You pay per company, not per job. A board with 4,324 open roles and a board with 2 both cost one lookup. Competing SmartRecruiters actors bill per posting, which makes a large employer dramatically more expensive.
- Direct from SmartRecruiters' own API.
api.smartrecruiters.comis the same source their careers pages read — no HTML selectors to break on a redesign. - Real filters, not a raw dump. Title keyword include/exclude, location, remote-only and posted-after all combine, so you ask for the roles you want instead of filtering afterwards.
- A delta mode for watching hiring. Turn on
onlyNewSinceLastRun, put it on a schedule, and each run returns only postings you haven't seen — with a heartbeat row on a quiet week. - URL or bare id.
careers.smartrecruiters.com/UbisoftandUbisoftboth work, so you don't have to guess the exact casing yourself.
What you get
One row per open posting by default, or one row per company with the roles nested in jobs.
The columns never move, whether or not filters or delta mode are on.
| Field | Type / format | Description |
|---|---|---|
query | text | The company value you passed in, unchanged. |
found | boolean | true if the company resolved to at least one open posting. Gates billing. |
status | text | OK, NOT_FOUND (unknown id or no open roles), or BAD_FORMAT. |
company | text | The SmartRecruiters company identifier, extracted from an id or a careers URL. |
totalReported | number | SmartRecruiters' own whole-board total (totalFound). |
totalJobCount | number | Postings on the fetched page, before filters — capped at the API's page limit. |
jobCount | number | Postings left in this row after filters and delta filtering. |
newJobs | number | Postings new since your last run. Empty unless onlyNewSinceLastRun is on. |
firstRun | boolean | true on the baseline run for a watchlist. Empty unless delta mode is on. |
jobs | array | All matching postings, each with the fields below. |
id | text | SmartRecruiters' posting id. |
title | text | Job title. |
department | text | Department as the company labels it. |
city | text | City for the role. |
country | text | Two-letter country code — e.g. au, pl. |
location | text | Combined city, country string, convenient for filtering. |
remote | boolean | true when SmartRecruiters' own remote flag is set, or the location or title reads as remote. |
releasedDate | date (ISO 8601) | When SmartRecruiters released the posting. |
postedAt | date (ISO 8601) | Posting date, aligned with the other jobs actors in this catalogue. |
applyUrl | link | Direct apply link for the role. |
scrapedAt | date (ISO 8601) | When this actor fetched the row. |
Two counts, two different things. totalReported is the whole board — SGS reports over
4,000. totalJobCount is how many postings were on the single fetched page. This actor reads
one page, so on a large employer totalReported will be far bigger than totalJobCount. That's
expected, not a bug.
Price
$4 per 1,000 companies, plus a $0.00005 start fee. Misses (found:false) are never charged.
You're billed once per company that resolves to at least one open posting, however many roles that company has. A company that isn't on SmartRecruiters, or has nothing open, costs nothing. Run 1,000 companies and, at the live FREE-tier price, that's roughly $4 if every one is found — less as some miss, and less again on paid Apify plans. Because billing is per company rather than per posting, a list of large employers costs the same here as a list of small ones.
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~smartrecruiters-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["SGS"]}'
- 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 — the bare identifier (
SGS) or the full careers URL. - Run the actor. Each company is looked up against SmartRecruiters' postings API, in parallel
up to
maxConcurrency. - Read the dataset. Each row carries the postings, or
found: falseif nothing is open. - Turn on
expandRowsfor one row per posting, or leave it off to keep roles nested per company.
Common ways teams use this:
- Track hiring velocity at target companies by re-running on a schedule and diffing
jobCountover time. - Build a sourcing pipeline that pulls fresh roles with department, location and apply URL for a watchlist of employers.
- Feed a sales-intelligence dashboard with headcount-growth signal by department or country.
- Research who's hiring in an industry, and where, by combining
locationswithtitleKeywords. - Confirm a company still uses SmartRecruiters before building an integration around it.
Input
{"companies": ["SGS"]}
One company per line — the SmartRecruiters company ID (case-sensitive) or the full careers.smartrecruiters.com/
To narrow what comes back, open the 🎯 Job filters section. All are optional, and they combine with AND across fields, OR within a field:
| Input | What it does |
|---|---|
titleKeywords | Keep only roles whose title contains 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 city, country contains one of these — ["Berlin","de"]. |
remoteOnly | Keep only roles that read as remote. |
postedAfter | Keep only roles released on or after this date — "2026-06-01". Inclusive. |
Filters run on the fetched page, so they narrow what's already in hand rather than reaching
postings beyond the API's page limit. A company whose roles all get filtered out still returns a
found: true row with jobCount: 0 — a real answer to the question you asked, billed like any
other found company.
For a standing watchlist, turn on onlyNewSinceLastRun. The first run baselines and sets
firstRun: true; every run after returns only postings it hasn't shown you, counted in
newJobs. A quiet run still returns a heartbeat row so you can tell "nothing new" from "the run
broke". The seen-list lives in a key-value store named smartrecruiters-jobs-lookup-state in
your own account; changing a filter starts a fresh watchlist automatically.
Sample output
| query | found | status | company | totalReported | jobCount | totalJobCount | newJobs | firstRun | jobs | id | title | department | city | country | location | remote | releasedDate | postedAt | applyUrl | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SGS | true | OK | SGS | 4405 | 100 | 100 | <all jobs (full list)> | 744000146401720 | Safety Consultant – Process Safety | Certification, Consulting, Training and Other Services | Jubail | sa | Jubail, sa | false | 2026-08-31T06:42:35.692Z | 2026-08-31T06:42:35.692Z | https://jobs.smartrecruiters.com/SGS/744000146401720 | 2026-08-31T06:50:14.038Z |
That table lists every available column. With expandRows on, a real row reads like this:
{"query": "SGS","found": true,"status": "OK","company": "SGS","totalReported": 4324,"totalJobCount": 100,"jobCount": 100,"id": "744000145188849","title": "Coal Technician - Bowen Basin Onsite Laboratories","department": "Laboratory & Testing","city": "Middlemount","country": "au","location": "Middlemount, au","remote": false,"releasedDate": "2026-08-24T05:49:06.063Z","applyUrl": "https://jobs.smartrecruiters.com/SGS/744000145188849","scrapedAt": "2026-08-24T06:01:11.918Z"}
A company that isn't on SmartRecruiters, or has nothing open, comes back as a miss and is never charged:
{"query": "not-a-real-company","found": false,"status": "NOT_FOUND","scrapedAt": "2026-08-24T06:01:11.918Z"}
Miss rows are still written so you can see exactly which companies failed rather than diffing
your input list against the output. Turn on onlyFound to drop them.
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~smartrecruiters-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["SGS"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~smartrecruiters-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"companies":["SGS"]} (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~smartrecruiters-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 "SmartRecruiters Jobs Lookup | Apify" — the agent will find and run this actor.
Tips
- Paste the careers URL rather than guessing the id. The identifier is case-sensitive —
SGSandsgsare different — and passing the URL extracts it correctly for you. - Don't read
totalReportedas your row count. It's the whole board;jobCountis what you actually got back after the page limit and your filters. - Case matters for watchlists too.
SGSandsgskeep separate delta seen-lists, so a casing change silently re-baselines. - Don't combine delta mode with "Only keep rows containing." That filter runs on the
finished row and can drop the
newJobs: 0heartbeat — the row that proves the schedule ran. - Use one-row-per-company mode for a hiring signal. Read
jobCountper company without pulling every posting into your table.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (smartrecruiters-jobs-lookup) | $4 per 1,000 companies found (less on paid tiers), $0.00005 actor start, nothing for a company with no open roles | Every open posting on a company's board — title, department, city, country, remote, apply URL — filtered by keyword, location or date, with a delta mode for watchlists | Reads one page per company, so a board with thousands of roles is truncated at the API's page limit. totalReported tells you when that happened. |
| jobo.world/smartrecruiters-jobs-scraper-api (43 users) | $0.004 per job | Per-posting billing across SmartRecruiters boards | Cheaper on a tiny board, far more expensive on a large one — SGS alone would run about $17 at this rate, versus one company charge here. |
| memo23/smartrecruiters-scraper (19 users) | $0.0009 per result, $0.025 start | Low per-row price with a higher fixed start fee | The cheapest per posting of the three if you genuinely want every role and your boards are large. Different shape: per-posting, not per-company. |
| Doing it yourself | Your time + the id-versus-URL extraction, the page limit, retries, and normalizing city/country into something filterable | The same data | This actor absorbs the identifier extraction, the filters, the delta state and the retries, and hands you a flat table. |
Competitor prices are their published FREE-tier list prices as of August 2026 and are not tracked here — check the actor's own page before relying on the comparison.
FAQ
What counts as "not found"? Either the company identifier doesn't exist on SmartRecruiters,
or it exists but currently has zero open postings. Both come back found: false and are never
charged.
Is the company identifier case-sensitive? Yes — it must match exactly what SmartRecruiters
uses in the company's own careers.smartrecruiters.com/<Id> URL. Passing the full careers URL
avoids guessing the casing, since the id is extracted for you.
Does totalReported always match jobCount? No, and it isn't meant to. totalReported is
SmartRecruiters' whole-board count, totalJobCount is what was on the single fetched page, and
jobCount is what survived your filters and delta. On a board bigger than one page,
totalReported will be much bigger.
Why was I charged for a company that returned 0 jobs? Because its page had open postings —
they just didn't match your filters, or weren't new since your last run. A company with nothing
on SmartRecruiters at all is found: false and free.
Does the delta state cost anything or leak between users? It lives in a named key-value store inside your own Apify account, so nobody else can see it, and it holds only posting ids per company. Delete that store to reset every watchlist.
Does this only cover companies using SmartRecruiters? Yes. A company on Greenhouse, Lever,
Workday or another ATS won't resolve here — use ats-jobs-unified-lookup if your list is mixed.
Do closed or filled positions show up? No. The API returns currently open postings only; filled or withdrawn roles drop out of the response.
Does it require authentication? No — this hits SmartRecruiters' public postings API, the same data source their own careers pages are built from, with no login or API key.
Can I get more than one page of postings for a huge employer?
Not currently. The actor reads the first page the API returns, which is where the page limit
bites on boards with thousands of roles. totalReported always tells you the true board size, so
you can see when you've hit that ceiling rather than silently believing you got everything.
What's the difference between releasedDate and postedAt?
They carry the same moment. releasedDate is SmartRecruiters' own field name; postedAt is the
catalogue-wide name used by every jobs actor here, so a query written against one ATS actor keeps
working against another.
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 "SmartRecruiters Jobs Lookup" by name and get dataset rows back with no integration code.
Do I need a proxy?
No. SmartRecruiters' postings API is public and unauthenticated, and this actor reaches it
without one. proxyConfiguration is exposed if your own network policy requires routing through
Apify Proxy, but it isn't needed to make the lookup work.
Is this GDPR-safe to run against EU companies? Everything returned is already published on each company's own careers page — titles, departments, locations, apply links. No personal data about applicants or employees is collected. You remain responsible for how you use the output downstream.
Related actors
- ATS Jobs Unified Lookup — check a company across SmartRecruiters, Greenhouse, Lever, Ashby and more in one call when you don't know which ATS they use.
- Greenhouse Jobs Lookup — the same lookup, filters and delta mode for companies on Greenhouse.
- Workable Jobs Lookup — the same lookup for companies on Workable.