SmartRecruiters Jobs Scraper - 4,300+ Company Boards avatar

SmartRecruiters Jobs Scraper - 4,300+ Company Boards

Pricing

from $1.00 / 1,000 job results

Go to Apify Store
SmartRecruiters Jobs Scraper - 4,300+ Company Boards

SmartRecruiters Jobs Scraper - 4,300+ Company Boards

Scrape live job postings from any SmartRecruiters career site, or search 4,300+ known SmartRecruiters employers in one run. Titles, locations, departments, apply links.

Pricing

from $1.00 / 1,000 job results

Rating

0.0

(0)

Developer

Sulle H

Sulle H

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Categories

Share

SmartRecruiters Jobs Scraper — One Board or 4,334 At Once

Most SmartRecruiters scrapers need you to already know which company you want. This one ships a registry of 4,334 live SmartRecruiters career sites (363,544 open postings at last count), so you can search across employers without naming any of them.

{ "keywords": ["data engineer"], "locations": ["berlin"], "maxJobs": 200 }

Or point it at specific companies, the usual way:

{ "companies": ["dominos", "visa", "bosch"] }

No login, no cookies, no proxies, no API key.

Why the registry matters here

SmartRecruiters is the applicant tracking system where "which companies actually use it?" is hardest to answer. Boards live at jobs.smartrecruiters.com/<company> and there is no public directory of them. This registry was built by harvesting the Wayback Machine and Common Crawl URL indexes and then validating every candidate slug against the live API, so every entry returned real postings when it was checked. A companion Actor re-validates the whole list on a schedule and drops boards that have gone dark.

Boards are scanned largest-first, so a capped run still returns the most data available.

What you get

FieldDescription
providerAlways smartrecruiters — the same schema the multi-ATS Actors below emit
company / companySlugEmployer name and its SmartRecruiters slug
jobIdSmartRecruiters posting id — stable, so it works as a dedupe key across runs
titleJob title
locationCity and country as published
departmentDepartment label
employmentTypeFull-time, part-time or contract, as the employer set it
remoteThe board's own remote flag, where set
postedAtRelease date, ISO 8601
applyUrlDirect link to the posting on the employer's board
scrapedAtWhen this row was read

What SmartRecruiters does not publish

Worth knowing before you build on it: the SmartRecruiters postings endpoint carries no description text. descriptionText comes back null on every row whatever includeDescription is set to, because descriptions sit behind a separate per-posting request the public listing API does not expose. Salary is likewise not a structured field.

If body text is the requirement, Greenhouse, Workable, Ashby and Breezy all publish it — the Career Site Job Feed covers those in the same output schema.

Pagination, done properly

The SmartRecruiters API caps a response at 100 postings no matter what limit you pass, and only offset reaches the rest. A scraper that ignores this reports a 24,000-posting employer as a 100-posting employer — which is exactly what happened while this registry was being built, and why board sizes here come from the API's own totalFound rather than from counting returned rows.

Input

OptionWhat it does
keywordsKeep only titles containing one of these. Case-insensitive.
excludeKeywordsDrop titles containing any of these, e.g. senior, intern.
locationsKeep only locations containing one of these.
remoteOnlyKeep only postings the board flags remote.
postedWithinDaysFreshness filter, 90 days by default.
companiesBoard slugs. Leave empty to search all 4,334.
maxBoardsHow many boards to scan, largest-first.
maxJobsHard cap on rows, so a run costs what you expect.
maxJobsPerCompanyStops one huge employer filling the entire run.

Finding a company slug

Open the careers page and read the URL: jobs.smartrecruiters.com/Bosch gives Bosch. Slugs appear case-sensitive in the URL; this Actor normalizes them either way. When a company frames its board into its own site, the slug is still in the page source.

Or skip the question entirely — run without companies and the companySlug column tells you who is out there.

Recipes

Find who is hiring for a skill. Set keywords, leave companies empty. One run scans the largest boards in the registry and returns matching roles across hundreds of employers.

Track a shortlist. Put ten slugs in companies, run daily, and diff the jobId set — new ids are openings, missing ids are roles that closed.

Build a market map. Departments and locations across the registry show where an industry is adding headcount, rather than where it says it is.

Use it as an API

Most people who rely on this Actor never open the Apify console after the first run — they call it from their own code and read the rows straight back. One request in, job rows out, no polling and no dataset id to chase:

curl -X POST "https://api.apify.com/v2/acts/starbright_overlap~smartrecruiters-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": ["engineer"], "maxJobs": 200}'
import requests
rows = requests.post(
"https://api.apify.com/v2/acts/starbright_overlap~smartrecruiters-jobs-scraper/run-sync-get-dataset-items",
params={"token": "YOUR_TOKEN"},
json={"keywords": ["engineer"], "maxJobs": 200},
timeout=300,
).json()
for r in rows:
print(r["company"], "—", r["title"], "—", r["applyUrl"])
const rows = await (await fetch(
'https://api.apify.com/v2/acts/starbright_overlap~smartrecruiters-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN',
{ method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"keywords": ["engineer"], "maxJobs": 200}) },
)).json();

Your token is at Settings → Integrations in the Apify console. Keep maxJobs set to what you actually need — it is the cap that decides what the call costs.

Running it on a schedule instead

If you want the rows to arrive without asking, add a Schedule from the Actor page (Actions → Schedule) and point a webhook at your endpoint. A daily schedule plus the postedWithinDays filter is the usual setup for a job board or an alerting pipeline.

Pricing

Pay per result — you are charged per job row delivered. A board that fails or returns nothing costs you nothing. Platform usage is included rather than billed on top, so the per-result price is the whole price.

Beyond SmartRecruiters

Companies move between applicant tracking systems, and most job-data projects need more than one:

  • Career Site Job Feed — the same engine across Workday, Greenhouse, SmartRecruiters, Workable, Lever, Ashby and Breezy: 27,000+ employer boards in one run, identical output schema.
  • New Job Alerts — the same coverage, but each run returns only what appeared since the previous run, so you are not diffing datasets yourself.

Rows from all of them share one schema, so you can union the datasets without a mapping layer.

Notes

  • A dead slug never aborts the run. Failures are collected into a FAILED_BOARDS record in the key-value store, with the reason for each.
  • companySlug:jobId is a stable key. It does not change while a posting is open, which makes it safe for detecting what opened and closed between runs.
  • No login, no proxies, no API key. SmartRecruiters publishes this endpoint openly. Private boards are invisible to every scraper, including this one.