# SmartRecruiters jobs scraper and job change monitor

> SmartRecruiters jobs scraper for companies you name. Get open jobs with stable IDs. Compare with your last snapshot to see new, changed and gone jobs.

URL: https://cliqtomedia.com/actors/smartrecruiters-jobs-monitor-scraper/

Category: Jobs & hiring · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/smartrecruiters-jobs-monitor-scraper?fpr=cliqto

Name the SmartRecruiters companies you follow. You get their open jobs as clean rows. Give it your last snapshot to see new, changed and removed jobs.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify 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.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `BoschGroup` in Companies. Each start is one run.
3. **Download the results.** When 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.

## 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.

## Price

Pay per event. Apify bills you, not us.

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

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

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/smartrecruiters-jobs-monitor-scraper?fpr=cliqto

## 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.

## Data fields

- `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

- `companies` (array): SmartRecruiters company identifiers (e.g. McDonaldsCorporation) or board URLs such as https://jobs.smartrecruiters.com/McDonaldsCorporation. Identifiers are case-insensitive; duplicates are merged.
- `maxJobsPerCompany` (integer): Stop reading a company after this many postings. A company stopped by this cap is reported as capped and never produces removals.
- `includeDetails` (boolean): Fetch the detail record of every posting (descriptions, apply URL, compensation). One extra request per posting; off = list fields only.
- `descriptionFormat` (string): Which description representation to output when details are included.
- `previousSnapshot` (array): The SNAPSHOT.entries array saved by an earlier run. Enables changeType (new/updated/unchanged) and removed rows. Removals are only reported for companies read completely in this run.
- `outputMode` (string): all = every current posting; changes = only new, updated and removed postings (requires previousSnapshot).
- `timeoutSecs` (integer): Stop gracefully after this time; unfinished companies are reported as partial.

## Step by step on Apify

1. Find the company ID. Open the company career page. If the address is `https://jobs.smartrecruiters.com/McDonaldsCorporation`, the ID is `McDonaldsCorporation`. IDs are not case sensitive.
2. Open the Input tab and add the ID to Companies. You can also paste the board URL.
3. For a quick test, keep the prefilled `BoschGroup` company and limit of 3 jobs, with full details. Replace the company ID when you want to read another employer.
4. Click Start.
5. Open the Output tab, then Job rows. Check `title`, `fullLocation` and `postingUrl` of 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

- 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



- 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 `previousSnapshot` over 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 `detailStatus` and marks the company `partial`. Such a posting is never reported as removed.
- `removed` rows are made only for companies that ended `complete`. Capped, partial, error and empty companies list `removalsSuppressed` in `RUN_SUMMARY` instead.
- With `includeDetails: false`, `postingUrl` is built from the company ID and posting ID (warning `posting_url_derived`, no title slug). `applyUrl`, `referralUrl` and descriptions are `null`. Turn details on if you need them.

## Sample result

```json
{
  "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`

```python
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)
```

```bash
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}'
```

```python
# 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)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Reach out when the company is ready](https://cliqtomedia.com/actors/use-cases/buying-signals/): Know when a company hires, raises money or wins a contract. Reach out at the right moment.

## Similar tools

- [Wellfound Jobs Scraper](https://cliqtomedia.com/actors/wellfound-jobs-scraper/)
- [Ashby Jobs Scraper](https://cliqtomedia.com/actors/ashby-jobs-scraper/)
- [Lever Job Scraper](https://cliqtomedia.com/actors/lever-jobs-scraper/)
- [Greenhouse Jobs Monitor & Scraper](https://cliqtomedia.com/actors/greenhouse-jobs-monitor-scraper/)
- [Recruitee Job Snapshots & Changes](https://cliqtomedia.com/actors/recruitee-jobs-monitor-scraper/)
- [BambooHR Jobs Monitor & Scraper](https://cliqtomedia.com/actors/bamboohr-jobs-monitor-scraper/)
