SmartRecruiters Jobs Scraper - Any Company's Job Postings avatar

SmartRecruiters Jobs Scraper - Any Company's Job Postings

Pricing

from $4.38 / 1,000 job returneds

Go to Apify Store
SmartRecruiters Jobs Scraper - Any Company's Job Postings

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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 existIKEA, 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.

rowTypeokWhat it meansCharged?
jobtrueA real open jobYes
no-open-jobstrueThe company's SmartRecruiters careers site lists job slots, but the API has no public postingsNo
no-matching-jobstrueThe company has jobs, but none match your filters - the row says how many it hasNo
company-not-foundfalseNo SmartRecruiters company has this ID. The row tells you where to find the right oneNo
company-unverifiedfalse0 postings, and it cannot be confirmed that the ID is a company (an empty careers page, or the check itself failed)No
posting-closedfalseA posting that was in the list but whose page no longer exists when its description was read - not returned as an open jobNo
incompletefalseNot every page of the listing could be read; the jobs that were read are returnedNo
more-jobs-availabletruemaxResultsPerCompany cut the list; says how many were left outNo
duplicate-inputfalseThe same company was given twice (IDs are not case-sensitive); its jobs are returned onceNo
bad-inputfalseNot a SmartRecruiters company, or not a country code (for example Germany or XX)No
unavailablefalseSmartRecruiters could not be reached after retriesNo
budget-reached / not-queried-time-limitfalseThe run hit your maximum charge or its time limit before this companyNo

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:

CompanyAdsRows (one row per job)Rows that merge more than one adMost ads in one row
Ubisoft (Ubisoft2)291280112
Bosch (BoschGroup)4,8394,8082110

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)

ColumnUbisoft (291 ads)Bosch (4,839 ads)
title, function, industry, employmentType, experienceLevel, city, countryCode100%100%
department100%0%
region99%74%
isRemote = true170
isHybrid = true4756
Ad languages / countries4 / 1323 / 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 (de returned 780 Bosch jobs, the correct number; DE returned 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 a bad-input row.
  • Keyword is SmartRecruiters' own full-text search over title, description and location. Several words match any of them (game designer = 179 at Ubisoft, more than game or designer alone); "game designer" in quotes matches the phrase (29).
  • City and location are filtered here, not by SmartRecruiters: its city filter is case-sensitive (Stuttgart 57, stuttgart 0) and its location parameter is silently ignored.
  • Title, department, remote only and posted within days are applied here, after reading.

Input

FieldTypeDefaultWhat it does
companiesarray(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
keywordstring(empty)SmartRecruiters' full-text search (title, description, location). Quotes for an exact phrase
countriesarray(empty)Two-letter country codes such as DE, FR, US, GB. Each is searched separately
titleContainsstring(empty)Keep jobs whose title contains this text (case-insensitive)
departmentContainsstring(empty)Keep jobs whose department contains this text
locationContainsstring(empty)Matches city, region, country name and full location, for example Montreal or Bavaria
remoteOnlybooleanfalseOnly jobs SmartRecruiters flags as remote (hybrid has its own column)
postedWithinDaysinteger0 (off)Only ads posted within N days, by each ad's own date. Ads without a date are left out, never assumed recent
oneRowPerJobbooleantrueMerge ads with the same reference number and the same title into one row
includeDescriptionbooleanfalseAdd the full description as plain text (one extra request per job, 8 in parallel)
maxResultsPerCompanyinteger1000Newest jobs kept per company; a more-jobs-available row counts the rest
maxRetriesinteger3Attempts 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 in descriptionText (empty if 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 real
  • not-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 a not-queried-time-limit row
  • A posting whose page says it no longer exists is not returned as a job - it becomes a free posting-closed row

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].
  • countryName comes 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.
  • workplaceType is remote or hybrid only when SmartRecruiters' own flags say so. When neither flag is set it stays null - not "onsite" - because many companies never set the flags.
  • Empty values are null, never an empty string or a 0.

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.