How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
BoschGroupin Companies. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Get the current public job postings of SmartRecruiters companies you name, as clean rows with stable IDs. Run it again with your last snapshot and see which jobs are new, changed or gone.
Good for
- Track the open jobs of a known list of employers on SmartRecruiters.
- Export job titles, locations, departments and apply links to JSON, CSV or Excel.
- Find out when a posting is added, edited or taken down, without building your own diff.
Not a good fit
- It does not search all SmartRecruiters companies. You must know the company ID.
- It reads only public postings. It cannot see internal or private jobs, candidates or applications.
- It does not send alerts. You can schedule runs and use Apify integrations to react to the output.
- It is an independent tool. It is not made by, or affiliated with, SmartRecruiters.
Who uses it
Sales and account teams
Watch hiring at large target employers.
Job board owners
Export titles, places and apply links to your board.
AI and search builders
Get plain job text for search or AI tools.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Job posting row | $0.00072 | One job posting row, or one removed-posting row, stored in the dataset. |
Examples
- One job: about $0.0027.
- 1,000 jobs: about $0.72.
- Every day 100 jobs, for 30 days: about $2.22 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 6,900 jobs.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a SmartRecruiters API key?
No. The tool uses the public Posting API without login.
Can I search jobs across every company?
No. You choose the companies. Filter the rows afterwards.
Does it send job alerts?
No. Schedule runs and connect Apify integrations to the output.
Can I switch from another SmartRecruiters Actor?
For the main job fields, yes. They use the same names as a popular monitor Actor.
How do I find a company ID?
Open the career page. The ID is the first part of the path after jobs.smartrecruiters.com/. It is not case sensitive; rows show the exact spelling from the source.
Can it search jobs by keyword or country across all companies?
No. You choose the companies. Filter the dataset afterwards by fullLocation, locationCountry, department or typeOfEmployment.
Is the result complete?
Check companyStatus. complete means the count matched the source at read time. Other values tell you why not. A posting can still be opened or closed right after the run.
How does change detection work?
The Actor hashes the normalized content of each posting and compares it with your previousSnapshot by company and posting ID. A new fetchedAt or observedAt is never a change. Title and release date changes are named in changedFields; other changes give updated with an empty list.
Can I use it in place of another SmartRecruiters monitor Actor?
For the main job fields, yes: it uses the same field names and values as a popular SmartRecruiters monitor Actor (source, sourceId, postingId, title, location, postingUrl, applyUrl, detailUrl, referralUrl, language, description HTML, event, observedAt, scanComplete). In a test on 5 postings all of those matched. Differences: empty fields are null or "" here and are left out there; event values other than NEW were not observed on the other Actor; it has no previousSnapshot input. This Actor also adds fields such as plain-text descriptions and contentHash. Test with your own data before you switch.
Details
Step by step on Apify
- Find the company ID. Open the company career page. If the address is
https://jobs.smartrecruiters.com/McDonaldsCorporation, the ID isMcDonaldsCorporation. IDs are not case sensitive. - Open the Input tab and add the ID to Companies. You can also paste the board URL.
- For a quick test, keep the prefilled
BoschGroupcompany and limit of 3 jobs, with full details. Replace the company ID when you want to read another employer. - Click Start.
- Open the Output tab, then Job rows. Check
title,fullLocationandpostingUrlof the first row.
Use cases
| Task | Input | You get | Key fields |
|---|---|---|---|
| Watch the hiring of target employers | companies, outputMode: "changes", previousSnapshot | New, updated and removed postings | changeType, title, postingUrl |
| Build a job list for a research or job board | companies, maxJobsPerCompany | All current postings | title, fullLocation, department, applyUrl |
| Prepare text for search or AI tools | descriptionFormat: "text" | Plain-text job sections | jobDescriptionText, qualificationsText |
| Check a known board is read completely | any run | Status per company | companyStatus, OUTPUT, RUN_SUMMARY |
Tips for better results
- The company ID is the first part after jobs.smartrecruiters.com/ in the link.
- Turn off details for a fast list. Turn it on for text and apply links.
- Set memory yourself: 512 MB for about 1,100 rows with details.
Limits and good to know
- Up to 1000 jobs per company is proven. A board with 4814 postings was read up to the cap and marked
capped - With details, 2000 rows in one run took 269 s at 1024 MB. List-only runs returned 3284 rows in 16 s
- Memory: choose 512 MB for up to about 1100 rows with details, and 1024 MB for about 2000. The Apify default for new runs can be higher; set memory yourself
- Allowed by the input form but not tested: more than 2000 rows with details in one run, 25 companies in one run, and a
previousSnapshotover 2000 entries. Use smaller batches first - The Actor reads about 4 detail requests per second. No rate limit was hit in tests
- A detail that fails (for example, a posting that disappeared between the list and the detail read) keeps the row with list fields only, sets
detailStatusand marks the companypartial. Such a posting is never reported as removed removedrows are made only for companies that endedcomplete. Capped, partial, error and empty companies listremovalsSuppressedinRUN_SUMMARYinstead- With
includeDetails: false,postingUrlis built from the company ID and posting ID (warningposting_url_derived, no title slug).applyUrl,referralUrland descriptions arenull. Turn details on if you need them
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"source": "smartrecruiters",
"sourceId": "smartrecruiters:smartrecruiters:744000148454651",
"companyIdentifier": "smartrecruiters",
"postingId": "744000148454651",
"uuid": "f4a3d5b9-5fa9-48af-ba55-30669c9c3e81",
"jobId": "77d771c2-3c32-4eec-b9a1-9b7cd6684a16",
"jobAdId": "f9fbb59b-d9db-4c26-a4c9-959f920b370a",
"refNumber": "REF2025N",
"title": "Data Operations Consultant",
"companyName": "SmartRecruiters Inc",
"releasedDate": "2026-09-09T09:43:26.403Z",
"visibility": "PUBLIC",
"active": true,
"locationCity": "Poland",
"locationRegion": "Remote",
"locationCountry": "pl",
"fullLocation": "Poland, Remote, Poland",
"remote": true,
"hybrid": false,
"latitude": null,
"longitude": null,
"address": null,
"postalCode": null,
"industry": "Computer Software",
"industryId": "computer_software",
"department": "Technical Services",
"departmentId": "5408931",
"function": "Information Technology",
"functionId": "information_technology",
"typeOfEmployment": "Contract",
"typeOfEmploymentId": "contract",
"experienceLevel": "Associate",
"experienceLevelId": "associate",
"language": "en",
"languageName": "English",
"detailUrl": "https://api.smartrecruiters.com/v1/companies/smartrecruiters/postings/744000148454651",
"postingUrl": "https://jobs.smartrecruiters.com/smartrecruiters/744000148454651-data-operations-consultant-",
"applyUrl": "https://jobs.smartrecruiters.com/smartrecruiters/744000148454651-data-operations-consultant-?oga=true",
"referralUrl": "https://jobs.smartrecruiters.com/external-referrals/company/smartrecruiters/publication/f4a3d5b9-5fa9-48af-ba55-30669c9c3e81?dcr_ci=smartrecruiters",
"companyDescriptionHtml": "<p>SmartRecruiters is the Recruiting AI Company that transfo…",
"jobDescriptionHtml": "<p><strong>Contract Type: 12-Month Fixed-Term Contract</stro…",
"qualificationsHtml": "<p><strong>Qualifications</strong></p><p>At least 2 years of…",
"additionalInformationHtml": "<p>SmartRecruiters is proud to be an Equal Employment Opport…",
"companyDescriptionText": "SmartRecruiters is the Recruiting AI Company that transforms…",
"jobDescriptionText": "Contract Type: 12-Month Fixed-Term Contract\n\nWe're looking f…",
"qualificationsText": "Qualifications\n\nAt least 2 years of experience with ETL tool…",
"additionalInformationText": "SmartRecruiters is proud to be an Equal Employment Opportuni…",
"compensation": null,
"companyStatus": "complete",
"scanComplete": true,
"detailStatus": "ok",
"detailHttpStatus": 200,
"event": "NEW",
"closedAt": null,
"changeType": null,
"changedFields": null,
"updateComparable": null,
"contentHash": "1e423cdd2467f140c1efe305e2c673e18a318f42853330a1cedcd085dee9195f",
"hashBasis": "detail"
}Use it from code
Actor ID: cliqtomedia/smartrecruiters-jobs-monitor-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/smartrecruiters-jobs-monitor-scraper").call(run_input={
"companies": [
"BoschGroup"
],
"maxJobsPerCompany": 3
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~smartrecruiters-jobs-monitor-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["BoschGroup"], "maxJobsPerCompany": 3}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/smartrecruiters-jobs-monitor-scraper")
result = tool.invoke({"run_input": {"companies": ["BoschGroup"], "maxJobsPerCompany": 3}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
source | string | Always smartrecruiters. |
sourceId | string | smartrecruiters:{companyIdentifier}:{postingId}. |
companyIdentifier | string | Canonical SmartRecruiters company identifier from the API (not your spelling). |
postingId | string | Stable ID of the job inside the company. With companyIdentifier it is the row key. |
uuid | string | Posting UUID from the source. |
jobId | string | Job ID from the detail record. Null when details are off or unavailable. |
jobAdId | string | ID of the job ad. |
refNumber | string | Employer reference number, if set. |
title | string | Job title from the source with surrounding spaces removed. |
companyName | string | Display name of the company. |
releasedDate | string | When the posting was released (ISO 8601 text). |
visibility | string | Posting visibility from the source, for example PUBLIC. |
active | boolean | Whether the posting is active. Detail only. |
locationCity | string | City from the posting location. |
locationRegion | string | Region or state from the posting location. |
locationCountry | string | Country code from the posting location. |
fullLocation | string | Readable location line. |
remote | boolean | True when the posting is remote. |
hybrid | boolean | True when the posting is hybrid. |
latitude | string | Latitude as text. Often null. |
longitude | string | Longitude as text. Often null. |
address | string | Street address. Detail only, often null. |
postalCode | string | Postal code. Detail only, often null. |
industry | string | Industry label. |
industryId | string | Industry ID as text. |
department | string | Department label. Null when the employer left it empty. |
departmentId | string | Department ID as text. |
function | string | Job function label. |
functionId | string | Job function ID as text. |
typeOfEmployment | string | Employment type label, for example Full-time. |
typeOfEmploymentId | string | Employment type ID as text. |
experienceLevel | string | Experience level label. |
experienceLevelId | string | Experience level ID as text. |
language | string | Language code, for example en or en-GB. |
languageName | string | Readable language name from the source, for example English. |
detailUrl | string | Public API URL of the posting detail record. Always set. |
postingUrl | string | Public job page. With details it is the posting URL from the source; in list-only runs it is derived from the company ID and posting ID (warning posting_url_derived). |
applyUrl | string | Apply link. Detail only: null when includeDetails is false. |
referralUrl | string | Public referral link from the detail record. Null without details. |
companyDescriptionHtml | string | Company section as raw HTML. Detail only. |
Input settings (7)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Companies | companies | array | ["BoschGroup"] |
| Max jobs per company | maxJobsPerCompany | integer | 3 |
| Include posting details | includeDetails | boolean | true |
| Description format | descriptionFormat | string | "both" |
| Previous snapshot | previousSnapshot | array | |
| Output mode | outputMode | string | "all" |
| Run deadline (seconds) | timeoutSecs | integer | 900 |
Use cases with this tool
Each guide shows all the steps and the other tools.
