SmartRecruiters Jobs Scraper - Any Company's Job Postings
Pricing
from $4.38 / 1,000 job returneds
SmartRecruiters Jobs Scraper - Any Company's Job Postings
For recruiters, talent intelligence and competitor hiring tracking: every public job of any company on SmartRecruiters - Bosch, Ubisoft, CERN and thousands more - one row per job with title, department, city, country, remote and hybrid flags and level. A wrong ID is never reported as 0 jobs.
Pricing
from $4.38 / 1,000 job returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
For recruiters, sales teams selling into hiring companies, and anyone building a jobs feed: every public job posting of any company that hires through SmartRecruiters — Bosch, Ubisoft, CERN, Delivery Hero, ServiceNow, Accor, Canva and thousands more — read straight from SmartRecruiters' own public Posting API. Up to 200 companies per run.
Measured on 2026-09-11: Ubisoft (Ubisoft2) 291 ads, Bosch (BoschGroup) 4,839. Bosch reads all 4,839 in 49 requests in about 17 seconds; with descriptions on, all 4,843 ads with their full text took 301 seconds on 512 MB of memory in a production run. Fill rates that day: title, function, industry, employmentType, experienceLevel, city and countryCode on 100% of both; region on 99% (Ubisoft) and 74% (Bosch); department 100% at Ubisoft and 0% at Bosch — the source, not the scraper.
A wrong company ID is never reported as "0 jobs". SmartRecruiters' API answers HTTP 200 with 0 postings for any company ID, including IDs that do not exist — IKEA, Atlassian, Zalando and a made-up ID all look exactly like a real company with no openings. This Actor checks: when a company returns 0, it looks the ID up on SmartRecruiters' careers site, where an ID that is not a SmartRecruiters company gets HTTP 404 (50 company IDs measured, 2026-09-11).
And it fixes the three filters that silently return nothing. SmartRecruiters only accepts lower-case country codes (de returned 780 Bosch jobs, the correct number; DE returned 0) and returns 0 when two countries are sent together. Its city filter is case-sensitive (Stuttgart 57, stuttgart 0) and its location parameter is silently ignored — so city and location are filtered here instead.
One row per job: title, department, function, industry, employment type, experience level, city, region, country, remote and hybrid flags, posting date and a link to the job page — plus, if you ask for it, the full job description. postedAt is when that ad was released and firstPostedAt is the earliest ad with the same reference and title, because SmartRecruiters' release date is a real publication date rather than a "last updated" stamp. Export as JSON, CSV or Excel.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by SmartRecruiters. All product names are trademarks of their respective owners.
A wrong company ID is never reported as "0 jobs"
SmartRecruiters' API answers HTTP 200 with 0 postings for any company ID - including IDs that do not exist. IKEA, Atlassian, Zalando and a made-up ID all come back exactly like a real company that simply has no openings. A scraper that trusts that answer tells you a company "is not hiring" when you only typed its ID wrong.
This Actor checks. When a company returns 0 postings, it looks the ID up on SmartRecruiters' careers site: an ID that is not a SmartRecruiters company gets HTTP 404 there (50 company IDs measured, 2026-09-11). Where the careers site answers but lists nothing, the row says so plainly - SmartRecruiters answers that way for real companies with no openings (Visa, Spotify) and also for generic words such as search, api or jobs, so this Actor does not claim the company exists.
rowType | ok | What it means | Charged? |
|---|---|---|---|
job | true | A real open job | Yes |
no-open-jobs | true | The company's SmartRecruiters careers site lists job slots, but the API has no public postings | No |
no-matching-jobs | true | The company has jobs, but none match your filters - the row says how many it has | No |
company-not-found | false | No SmartRecruiters company has this ID. The row tells you where to find the right one | No |
company-unverified | false | 0 postings, and it cannot be confirmed that the ID is a company (an empty careers page, or the check itself failed) | No |
posting-closed | false | A posting that was in the list but whose page no longer exists when its description was read - not returned as an open job | No |
incomplete | false | Not every page of the listing could be read; the jobs that were read are returned | No |
more-jobs-available | true | maxResultsPerCompany cut the list; says how many were left out | No |
duplicate-input | false | The same company was given twice (IDs are not case-sensitive); its jobs are returned once | No |
bad-input | false | Not a SmartRecruiters company, or not a country code (for example Germany or XX) | No |
unavailable | false | SmartRecruiters could not be reached after retries | No |
budget-reached / not-queried-time-limit | false | The run hit your maximum charge or its time limit before this company | No |
You are charged only for job rows.
One job, several ads - counted once when they really are the same ad
SmartRecruiters often publishes one job as several ads sharing a reference number - one ad per city, or a French and an English ad. With oneRowPerJob on (the default), ads with the same reference number and the same title become one row, taken from the company's default ad, with the other ads (city, language, date, ID) listed in otherAdsForSameJob - and you pay once. Ads whose title differs stay separate rows: companies reuse a reference number for differently titled postings (Delivery Hero, Equinox), and a translated ad ("Programmeur Outils" / "Tools Programmer") has a different title too. Turn the option off to get one row per ad.
Measured 2026-09-11:
| Company | Ads | Rows (one row per job) | Rows that merge more than one ad | Most ads in one row |
|---|---|---|---|---|
Ubisoft (Ubisoft2) | 291 | 280 | 11 | 2 |
Bosch (BoschGroup) | 4,839 | 4,808 | 21 | 10 |
postedAt is when that ad was released and firstPostedAt is the earliest ad with the same reference and title. SmartRecruiters' release date is the real publication date, not a "last updated" stamp: across Bosch's 1,209 oldest postings, none carries a date from the last 30 days. The "posted within days" filter uses each ad's own date, so a job re-posted in a new city this week is returned (from the new ad), and firstPostedAt tells you it is a re-post.
Measured fill rates (2026-09-11, full listings)
| Column | Ubisoft (291 ads) | Bosch (4,839 ads) |
|---|---|---|
title, function, industry, employmentType, experienceLevel, city, countryCode | 100% | 100% |
department | 100% | 0% |
region | 99% | 74% |
isRemote = true | 1 | 70 |
isHybrid = true | 4 | 756 |
| Ad languages / countries | 4 / 13 | 23 / 56 |
Bosch reads 4,839 ads in 49 requests in about 17 seconds. With includeDescription on, the whole of Bosch - 4,843 ads, each with its description - took 301 seconds on 512 MB of memory (production run, 2026-09-11). SmartRecruiters' listing is newest first, so a job published while a large company is being read shifts every page by one; when the count comes up short the listing is read a second time, newly found ads are put back in newest-first order, and if postings are still missing an incomplete row says how many.
department depends on the company - Bosch publishes none, so a department filter on Bosch returns a no-matching-jobs row that says so, instead of pretending no job qualifies. The function column is filled for every job.
Filters, and how SmartRecruiters really treats them
Every filter was checked against a count made locally from the company's full listing:
- Country is sent to SmartRecruiters, which only accepts lower-case two-letter codes (
dereturned 780 Bosch jobs, the correct number;DEreturned 0) and returns 0 when two countries are sent together. This Actor lower-cases the code, asks one country at a time, then merges. Values that are not ISO country codes (XX,EU,Germany) are never sent - they get abad-inputrow. - Keyword is SmartRecruiters' own full-text search over title, description and location. Several words match any of them (
game designer= 179 at Ubisoft, more thangameordesigneralone);"game designer"in quotes matches the phrase (29). - City and location are filtered here, not by SmartRecruiters: its
cityfilter is case-sensitive (Stuttgart57,stuttgart0) and itslocationparameter is silently ignored. - Title, department, remote only and posted within days are applied here, after reading.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
companies | array | (prefilled: Ubisoft2, CERN) | SmartRecruiters company IDs or careers.smartrecruiters.com / jobs.smartrecruiters.com links, up to 200. If empty, Ubisoft2 and CERN are used and every row says so in input |
keyword | string | (empty) | SmartRecruiters' full-text search (title, description, location). Quotes for an exact phrase |
countries | array | (empty) | Two-letter country codes such as DE, FR, US, GB. Each is searched separately |
titleContains | string | (empty) | Keep jobs whose title contains this text (case-insensitive) |
departmentContains | string | (empty) | Keep jobs whose department contains this text |
locationContains | string | (empty) | Matches city, region, country name and full location, for example Montreal or Bavaria |
remoteOnly | boolean | false | Only jobs SmartRecruiters flags as remote (hybrid has its own column) |
postedWithinDays | integer | 0 (off) | Only ads posted within N days, by each ad's own date. Ads without a date are left out, never assumed recent |
oneRowPerJob | boolean | true | Merge ads with the same reference number and the same title into one row |
includeDescription | boolean | false | Add the full description as plain text (one extra request per job, 8 in parallel) |
maxResultsPerCompany | integer | 1000 | Newest jobs kept per company; a more-jobs-available row counts the rest |
maxRetries | integer | 3 | Attempts per request for temporary errors (HTTP 429 / 5xx) |
Finding a company ID: open any of the company's job ads. The link looks like jobs.smartrecruiters.com/BoschGroup/744000... - BoschGroup is the ID. Companies with their own careers domain (such as jobs.bosch.com) still link their Apply button there.
Descriptions
With includeDescription on, descriptionStatus says what happened for each job:
ok- the description is indescriptionText(emptyif the posting has none)failed: ...- SmartRecruiters did not return it after retries; the job is still returned and charged, because everything else in the row is realnot-fetched-time-limit- the run was close to its time limit, so descriptions were skipped to return the jobs in time (still charged); companies after it get anot-queried-time-limitrow- A posting whose page says it no longer exists is not returned as a job - it becomes a free
posting-closedrow
Output columns
rowType, ok, note, input, companyId, companyName, jobId, jobRefNumber, title, department, function, industry, employmentType, employmentTypeId, experienceLevel, experienceLevelId, city, region, countryCode, countryName, fullLocation, isRemote, isHybrid, workplaceType, postedAt, firstPostedAt, jobAdLanguage, isDefaultJobAd, adsForSameJob, otherAdsForSameJob, jobUrl, descriptionText, descriptionStatus, searchedKeyword, searchedCountries, checkedAt
Every row - including note rows - has all 36 columns in the same order.
Things it refuses to invent or pass on
- No people's names. SmartRecruiters includes the name of the recruiter who created each ad; this Actor drops it. It also does not return the company-defined custom fields at all: they are set up by each company, and some carry people's names even in pick-list fields (one employer's "Head Officer" field names a person). E-mail addresses and phone numbers inside descriptions are replaced with
[email removed]/[phone removed]. countryNamecomes from the structured country code. Companies also type a free-text country field, and it can disagree: two Ubisoft jobs located in Montreal, Canada carry "France" there.workplaceTypeisremoteorhybridonly when SmartRecruiters' own flags say so. When neither flag is set it staysnull- not "onsite" - because many companies never set the flags.- Empty values are
null, never an empty string or a0.
How it is checked
- 60 automated checks, most of which run the real paging, retry, merge and charging code against recorded SmartRecruiters responses (page failures, a listing that shifts while being read, a company that does not exist, closed postings, budget and time limits)
- 72 deliberate defects injected into the source, plus 8 into the charging path; every one was caught by those checks
- Only public job postings are read. Nothing needs a login
- Every request has a 45-second timeout; temporary errors are retried with a growing pause
Support
Found a company that behaves oddly? Open an issue on the Issues tab with the company ID - it will be reproduced against the live API before anything is changed.