SmartRecruiters Jobs Scraper — Open Postings API avatar

SmartRecruiters Jobs Scraper — Open Postings API

Pricing

from $2.00 / 1,000 successful lookups

Go to Apify Store
SmartRecruiters Jobs Scraper — Open Postings API

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

Adrian Voss

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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.com is 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/Ubisoft and Ubisoft both 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.

FieldType / formatDescription
querytextThe company value you passed in, unchanged.
foundbooleantrue if the company resolved to at least one open posting. Gates billing.
statustextOK, NOT_FOUND (unknown id or no open roles), or BAD_FORMAT.
companytextThe SmartRecruiters company identifier, extracted from an id or a careers URL.
totalReportednumberSmartRecruiters' own whole-board total (totalFound).
totalJobCountnumberPostings on the fetched page, before filters — capped at the API's page limit.
jobCountnumberPostings left in this row after filters and delta filtering.
newJobsnumberPostings new since your last run. Empty unless onlyNewSinceLastRun is on.
firstRunbooleantrue on the baseline run for a watchlist. Empty unless delta mode is on.
jobsarrayAll matching postings, each with the fields below.
idtextSmartRecruiters' posting id.
titletextJob title.
departmenttextDepartment as the company labels it.
citytextCity for the role.
countrytextTwo-letter country code — e.g. au, pl.
locationtextCombined city, country string, convenient for filtering.
remotebooleantrue when SmartRecruiters' own remote flag is set, or the location or title reads as remote.
releasedDatedate (ISO 8601)When SmartRecruiters released the posting.
postedAtdate (ISO 8601)Posting date, aligned with the other jobs actors in this catalogue.
applyUrllinkDirect apply link for the role.
scrapedAtdate (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

  1. In the Apify Console. Open the actor page and click Start — the companies field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. 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"]}'
  3. 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.
  1. Paste one company per line — the bare identifier (SGS) or the full careers URL.
  2. Run the actor. Each company is looked up against SmartRecruiters' postings API, in parallel up to maxConcurrency.
  3. Read the dataset. Each row carries the postings, or found: false if nothing is open.
  4. Turn on expandRows for 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 jobCount over 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 locations with titleKeywords.
  • 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:

InputWhat it does
titleKeywordsKeep only roles whose title contains one of these — ["engineer","designer"]. Case-insensitive, partial words count.
excludeTitleKeywordsDrop roles whose title contains one of these — ["intern","contract"]. Applied after titleKeywords.
locationsKeep only roles whose city, country contains one of these — ["Berlin","de"].
remoteOnlyKeep only roles that read as remote.
postedAfterKeep 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

queryfoundstatuscompanytotalReportedjobCounttotalJobCountnewJobsfirstRunjobsidtitledepartmentcitycountrylocationremotereleasedDatepostedAtapplyUrlscrapedAt
SGStrueOKSGS4405100100<all jobs (full list)>744000146401720Safety Consultant – Process SafetyCertification, Consulting, Training and Other ServicesJubailsaJubail, safalse2026-08-31T06:42:35.692Z2026-08-31T06:42:35.692Zhttps://jobs.smartrecruiters.com/SGS/7440001464017202026-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 — SGS and sgs are different — and passing the URL extracts it correctly for you.
  • Don't read totalReported as your row count. It's the whole board; jobCount is what you actually got back after the page limit and your filters.
  • Case matters for watchlists too. SGS and sgs keep 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: 0 heartbeat — the row that proves the schedule ran.
  • Use one-row-per-company mode for a hiring signal. Read jobCount per company without pulling every posting into your table.

vs. alternatives

What it costsWhat you getTrade-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 rolesEvery 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 watchlistsReads 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 jobPer-posting billing across SmartRecruiters boardsCheaper 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 startLow per-row price with a higher fixed start feeThe 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 yourselfYour time + the id-versus-URL extraction, the page limit, retries, and normalizing city/country into something filterableThe same dataThis 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.