SmartRecruiters Jobs Scraper & API - Every Role avatar

SmartRecruiters Jobs Scraper & API - Every Role

Pricing

from $0.96 / 1,000 jobs

Go to Apify Store
SmartRecruiters Jobs Scraper & API - Every Role

SmartRecruiters Jobs Scraper & API - Every Role

Read every published posting from a SmartRecruiters careers site, the ATS large global employers run: title, department, function, location, remote flag, employment type, posting date, apply link and description on request. Boards with hundreds of roles are paged through in full. JSON, CSV or API.

Pricing

from $0.96 / 1,000 jobs

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

SmartRecruiters Jobs Scraper & API - Every Role

This SmartRecruiters jobs scraper turns any SmartRecruiters careers page into clean JSON, CSV or Excel: title, department, team, location, remote flag, employment type, posting date, apply link and (optionally) the full description. Paste the careers URL, press Start, done. No login, no API keys, no proxies, no code.

Built to be complete and fair:

  • Deduplicated, billed once. Duplicates inside a run are removed. Give your search a memory name and every later run returns only the jobs that appeared since; jobs you already received are skipped and never charged again. Schedule it daily or weekly and you have a change feed.
  • Filters run before billing. Keywords (must contain / must not contain), locations, remote only, employment type and an exact posting-date window. You only pay for jobs that pass.
  • Exact caps, fair share. Per-company and per-run caps are honored exactly (the top competitor's 3-star review is "I set maximum 500 but got 200"). When several companies share a cap, each gets a fair share and unused budget flows to the companies with more jobs.
  • Honest about what you get. Every run ends with a run-summary item: jobs per board, how many were filtered or already known, exactly what was charged, and how often each field was populated.

The same engine also reads Greenhouse, Lever, Ashby and Workable boards, so you can mix careers pages from other ATS platforms into the same run. Sibling listings for those platforms are linked at the bottom.

30-second start

  1. Under Companies / careers pages, paste one careers URL per line, for example https://careers.smartrecruiters.com/ServiceNow (any of these forms work: careers.smartrecruiters.com/
  2. Optional: tick Include full job descriptions, add keyword / location / date filters.
  3. Give it a Memory name if you will run it again and only want new jobs.
  4. Start. Download JSON, CSV or Excel from the Dataset tab, or read it through the API.

Nothing is charged until a job that passed your filters is delivered. Prices and worked examples are in the cost section below.

What you get from SmartRecruiters

Every job record has the same fields whatever the ATS. Where a platform does not publish a field you get null; the Actor never guesses. This table is the exact contract:

FieldSmartRecruitersGreenhouseLeverAshbyWorkable
title, url, applyUrl, jobIdyesyesyesyesyes
departmentsyesyesyesyesyes
teamyes (function)noyesyesyes (function)
location and allLocationsone per postingyes (+ offices)yesyes (+ secondary)yes
remote flagyesonly when the location says Remoteyesyesyes
employmentTypeyesnoyesyesyes
compensationnonowhen publishedstructured rangesno
publishedAtyesyesyesyesyes
updatedAtnoyesnonono
descriptionHtml and descriptionTextyes (one extra request per job)yesyesyesyes
companyNameyesyesno (token only)no (token only)yes

Measured fill rates from a live run at build time (share of delivered jobs where the field was populated):

Field populatedSmartRecruitersGreenhouseLeverAshbyWorkable
companyName100%100%0%0%100%
departments76%100%100%100%100%
team100%0%100%100%57%
location100%100%100%100%100%
remote100%8%100%100%100%
employmentType100%0%100%100%100%
compensation0%0%0%100%0%
publishedAt100%100%100%100%100%
description100%100%100%100%100%

Output

One item per job, plus status items when a company could not be read and one run-summary item at the end. Nested values (departments, allLocations, compensation) for developers; flat fields for spreadsheets.

FieldMeaning
provider, company, companyNameWhich ATS, the board token you gave, and the company name when the platform publishes it.
jobId, url, applyUrlStable id (always a string) and links.
title, departments, team, location, allLocations, countryThe role and where it is.
remote, workplaceType, employmentType, compensationWork arrangement and pay, exactly as the platform publishes them (null when it does not).
publishedAt, updatedAtISO timestamps from the platform.
descriptionHtml, descriptionTextFull description when requested.
changeType, isDuplicate, firstSeenAt, lastSeenAt, contentHash, scrapedAtDedup and provenance. changeType is NEW, UPDATED or DUPLICATE.

Sample item from a live run:

{
"type": "job",
"provider": "smartrecruiters",
"company": "ServiceNow",
"companyName": "ServiceNow",
"jobId": "744000146426043",
"title": "Research Engineer/Scientist",
"departments": [
"Product"
],
"team": "Engineering",
"location": "Hyderabad, in",
"allLocations": [
"Hyderabad, in"
],
"country": "in",
"remote": false,
"workplaceType": null,
"employmentType": "Full-time",
"compensation": null,
"publishedAt": "2026-08-31T09:08:04.205Z",
"updatedAt": null,
"url": "https://jobs.smartrecruiters.com/ServiceNow/744000146426043-research-engineer-scientist",
"applyUrl": "https://jobs.smartrecruiters.com/ServiceNow/744000146426043-research-engineer-scientist?oga=true",
"descriptionHtml": "<h3>Company Description</h3><p>It all started when engineer Fred Luddy wrote code that automated a tedious task for his coworker, Phyllis. She cried tears of jo...",
"descriptionText": "Company Description\nIt all started when engineer Fred Luddy wrote code that automated a tedious task for his coworker, Phyllis. She cried tears of joy. That moment inspired Fred to build a company tha...",
"changeType": "NEW",
"isDuplicate": false,
"firstSeenAt": "2026-08-31T11:22:17.996Z",
"lastSeenAt": "2026-08-31T11:22:17.996Z",
"contentHash": "abf2173aa5f9522c6daee24bbc455b572350f00a",
"scrapedAt": "2026-08-31T11:22:17.996Z"
}

The run-summary item reports per board: jobsOnBoard, matchedFilters, knownFromMemory, deliveredNew, deliveredDuplicates, withDescription, plus totals, filteredOut counts, charges, fillRates and a plain-language hint whenever a run delivers nothing.

How much does it cost to scrape SmartRecruiters jobs?

Pay per event, no Actor start fee, no monthly minimum. Two events are charged:

EventCharged whenPrice per 1,000Silver (10% off)Gold (20% off)
Job (job-result)A new, unique job is delivered to the dataset$1.20$1.08$0.96
Job description (job-description)That job also arrives with its full description$0.50$0.45$0.40

A complete record (job plus description) therefore costs $1.70 per 1,000 jobs at the base price. The Silver and Gold columns are the Apify Store subscription discounts, applied automatically to both result events; there is no start event to discount.

Worked examples at the base price: 200 new jobs across 3 companies = $0.24. The same 200 with descriptions = $0.34. A weekly re-run that finds 12 new jobs among 200 known ones = $0.014. A re-run that finds nothing new = $0.00.

Always free: duplicates across runs (under the same memory name), jobs removed by your filters, unknown companies, empty boards, status items and the run-summary.

Input reference

InputWhat it does
Companies / careers pagesOne entry per company: careers URL, provider:token, or bare token. Case, http/https, www. and trailing paths do not matter. EU-hosted Greenhouse and Lever boards are detected from eu. URLs. SmartRecruiters identifiers are case-sensitive.
ATS for bare company namesWhich platform a plain token belongs to. Preset to SmartRecruiters in this listing. URLs always win.
Include full job descriptionsAdds descriptionHtml and descriptionText. SmartRecruiters needs one extra request per job for this, which is why it is priced separately.
Must contain / Must not contain / Fields to checkCase-insensitive keyword filters over title, departments, team, location and (Greenhouse, Lever, Ashby, Workable) the description text.
LocationsSubstring match over the job's location, every listed office and the country, e.g. London, Remote, United States.
Remote jobs onlyKeeps jobs the ATS explicitly marks remote. Greenhouse has no remote flag, so Greenhouse jobs match only when the location text says "Remote".
Employment typesSubstring match over the platform's employment type, e.g. Full, Contract, Intern. Greenhouse does not publish it.
Posted within / Posted after / Posted beforeExact window on publishedAt (the date the platform reports the job was first published).
Memory nameThe key that makes repeat runs return only new jobs. Stored in a named key-value store in your account (ats-jobs-memory-v2-<name>).
Also return already-known jobsRe-sends known jobs flagged isDuplicate: true with changeType DUPLICATE or UPDATED (the posting changed since you last received it). Free.
Reset this memory firstForgets everything under the memory name before running.
Max new jobs per company / totalExact caps on new, charged jobs. Known duplicates do not count towards them.

Using the API

Same input as the form.

curl -X POST "https://api.apify.com/v2/acts/automation_craft~smartrecruiters-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"companies": ["https://careers.smartrecruiters.com/ServiceNow"],
"includeDescription": true,
"postedWithinDays": "30",
"dedupMemoryName": "smartrecruiters-watch",
"maxJobsTotal": 500
}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/smartrecruiters-jobs-scraper').call({
companies: ['https://careers.smartrecruiters.com/ServiceNow'],
includeKeywords: ['engineer'],
keywordFields: ['title'],
dedupMemoryName: 'engineering-watch',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const jobs = items.filter((i) => i.type === 'job');
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation_craft/smartrecruiters-jobs-scraper").call(run_input={
"companies": ["https://careers.smartrecruiters.com/ServiceNow"], "remoteOnly": True, "maxJobsTotal": 200})
jobs = [i for i in client.dataset(run["defaultDatasetId"]).iterate_items() if i.get("type") == "job"]

Scheduling: create a Schedule in Apify (daily or weekly) with a memory name set; each run then delivers only the jobs that appeared since the previous run, and a run that finds nothing new costs nothing.

What this Actor does NOT do

  • It does not scrape job boards such as LinkedIn, Indeed or Naukri. It reads company career boards hosted on Greenhouse, Lever, Ashby, Workable and SmartRecruiters.
  • It does not discover companies for you. You supply the careers pages; it gets every open job they list.
  • It does not return fields the platform does not publish (see the coverage table), applicant data, or anything behind a login.
  • It cannot see unlisted or internal-only postings.

FAQ

Is the SmartRecruiters Posting API public?

The published postings of a careers site are served from a public endpoint that needs no key, and that is what this Actor reads. No login, no cookies, no SmartRecruiters account.

Why is the SmartRecruiters company identifier case sensitive?

SmartRecruiters treats the identifier in the URL as case sensitive, so ServiceNow resolves and servicenow does not. Paste the full careers URL if you are unsure, and the identifier is taken from it exactly as written.

How do I get full descriptions from SmartRecruiters?

Tick Include full job descriptions. SmartRecruiters needs one extra request per job for this, which is why it is a separate event charged only for jobs that actually got a description. Keyword filters on description text are not available for SmartRecruiters, because descriptions are fetched after selection.

Can it handle boards with hundreds of postings?

Yes. Large boards are paged through in full, and the per-company and per-run caps are honored exactly if you want to bound a run.

How do I track only the new SmartRecruiters postings?

Set a Memory name and schedule the run. Only postings you have not received under that name are delivered and charged; a run that finds nothing new is free.

Where do I find a company's SmartRecruiters careers URL?

It is https://careers.smartrecruiters.com/<Company>. A job URL of the form jobs.smartrecruiters.com/<Company>/<jobId> is recognised too, and the company identifier is read from it.

Why does this Actor run with limited permissions?

Least privilege: it only needs to read public careers pages and write its own storages, so it runs with limited permissions and cannot touch the rest of your account. The cross-run memory is a named key-value store (ats-jobs-memory-v2-<name>) that the Actor creates and owns itself.

Fair use

This Actor reads the same public, unauthenticated job-board endpoints the companies' own careers pages use, at a polite request rate. It collects no personal data and never logs in. You are responsible for complying with applicable laws and the target sites' terms in your jurisdiction and use case.

Support

Something missing or wrong? Open an issue on the Actor's Issues tab. Fixes usually ship within a day.

More data tools by Automation Craft