SmartRecruiters Jobs Scraper: Job Board Snapshots & Changes avatar

SmartRecruiters Jobs Scraper: Job Board Snapshots & Changes

Pricing

from $0.72 / 1,000 job posting rows

Go to Apify Store
SmartRecruiters Jobs Scraper: Job Board Snapshots & Changes

SmartRecruiters Jobs Scraper: Job Board Snapshots & Changes

Read open jobs from SmartRecruiters company boards and compare each run with your last snapshot to see new, changed and removed postings. No login or API key.

Pricing

from $0.72 / 1,000 job posting rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

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.

Add a company ID such as smartrecruiters, press Start, and open the Dataset. A first run with one small company takes a few seconds. You do not need a SmartRecruiters login, an API key or a proxy.

Input, job rows and change list in three steps

Table of contents

What this Actor does

The Actor reads the public SmartRecruiters Posting API for each company you list. It returns one dataset row for each open posting. For each company it also tells you if the read was complete, stopped by your limit, or partial.

You can then compare two runs. Save the SNAPSHOT record of one run and pass it as previousSnapshot to the next run. Each row gets a changeType: new, updated, unchanged or removed.

Good fit

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

What data you can get

Each row has 64 fields. The main groups are:

  • Identity: source, sourceId, companyIdentifier, postingId, uuid, jobId, jobAdId, refNumber.
  • Job: title, companyName, releasedDate, visibility, active.
  • Place: locationCity, locationRegion, locationCountry, fullLocation, remote, hybrid, latitude, longitude, address, postalCode.
  • Classification: industry, department, function, typeOfEmployment, experienceLevel, language (a code such as en) and languageName, most with an ID field.
  • Links and text: detailUrl, postingUrl, applyUrl, referralUrl, and four description sections as HTML and as plain text. Some fields exist only when includeDetails is on.
  • Status and diff: companyStatus, scanComplete, detailStatus, changeType, event, changedFields, closedAt, contentHash.
  • Provenance: fetchedAt, observedAt, sourceListUrl, sourceDetailUrl, warnings.

The run also writes four records to the key-value store: OUTPUT (one entry per company), RUN_SUMMARY (counters and warnings), SNAPSHOT (feed this into the next run) and CHANGES (only when you passed previousSnapshot).

Quick start

  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. Keep the other fields as they are. The defaults read up to 10 jobs per company with full details.
  4. Click Start.
  5. Open the Output tab, then Job rows. Check title, fullLocation and postingUrl of the first row.

Expected result: one row per posting, up to your limit. Open the key-value store record RUN_SUMMARY to confirm outcome is succeeded.

Full input reference

FieldPlain nameTypeRequiredDefaultAllowed valuesEffectRecommendation
companiesCompaniesarray of textNo["smartrecruiters"]1 to 25 items. Each item is a company ID or a https://jobs.smartrecruiters.com/{id} or https://careers.smartrecruiters.com/{id} URL.Boards to read. Items are trimmed. Duplicates are merged without regard to case. A bad item stops the run with an input error that names it.Start with 1 to 3 companies.
maxJobsPerCompanyMax jobs per companyintegerNo101 to 1000Stops reading a company after this many postings. A company stopped by this limit has status capped and never produces removals.Use 10 to test. Use 1000 to read a whole board.
includeDetailsInclude posting detailsbooleanNotruetrue, falsetrue makes one extra request per posting and fills links, descriptions and compensation. false is much faster but those fields are null.Keep true unless you only need titles and locations.
descriptionFormatDescription formattextNobothboth, html, textChooses which description fields are filled when details are on. The unchosen fields stay null.both for exports. text for search or AI input.
previousSnapshotPrevious snapshotarray of objectsNonot setUp to 20000 entries. Use the entries array from a past SNAPSHOT record.Turns on changeType and removed rows and writes the CHANGES record.Pass the last run's SNAPSHOT.entries unchanged.
outputModeOutput modetextNoallall, changes (full is accepted as all)all returns every current posting. changes returns only new, updated and removed rows and needs previousSnapshot.changes for daily monitors.
timeoutSecsRun deadline (seconds)integerNo90030 to 3600After this time the Actor stops, saves what it has, and marks unfinished companies partial.Raise it for 1000 jobs with details.

An empty input uses the defaults. Invalid input fails the run with RUN_SUMMARY.outcome set to input_error, no rows and no requests.

Interacting settings

WhenFieldsBehavior
Details offincludeDetails: false with descriptionFormatdescriptionFormat has no effect. Link, description, address and compensation fields are null.
Changes onlyoutputMode: "changes" without previousSnapshotInput error.
Details switched between runsincludeDetails differs from the run that made the snapshotOld and new hashes are not comparable. Rows keep changeType: "unchanged" and show updateComparable: false. Keep this setting the same between runs.
Cap reachedmaxJobsPerCompany smaller than the boardStatus capped. Postings after the cap are not read, so no removed rows are made for that company.

Input examples

Quick check, one company

{
"companies": ["smartrecruiters"],
"maxJobsPerCompany": 5,
"includeDetails": true
}

Expected behavior: reads one board and up to 5 postings with details. Expected output: one row per posting with title, fullLocation, postingUrl, companyStatus. See the output example, which comes from this input.

Several boards, plain text descriptions

{
"companies": ["smartrecruiters", "McDonaldsCorporation", "https://jobs.smartrecruiters.com/Sodexo"],
"maxJobsPerCompany": 200,
"descriptionFormat": "text",
"timeoutSecs": 600
}

Expected behavior: reads three boards in order. Each is complete if it has 200 postings or fewer, otherwise capped.

Daily monitor, only changes

{
"companies": ["McDonaldsCorporation"],
"maxJobsPerCompany": 1000,
"outputMode": "changes",
"previousSnapshot": [
{
"companyIdentifier": "McDonaldsCorporation",
"postingId": "744000120624847",
"title": "Franchisee UK & Ireland",
"releasedDate": "2026-04-14T07:57:07.974Z",
"contentHash": "cad217196c635e815cf322e6b27c09ba1127e68403ea25737c4dcbca07c68fa5",
"hashBasis": "detail"
}
]
}

Expected behavior: rows for new, updated and removed postings only. Normally you paste the whole entries array of the last SNAPSHOT; one entry is shown here to keep the example short. Removed rows are made only if the company ended complete.

Output example

This row is from a real run of the current source on the public API with the first example input (the Cloud build is refreshed before release). The four description pairs are shortened here; the real values are full text.

{
"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",
"fetchedAt": "2026-10-02T05:04:11.375Z",
"observedAt": "2026-10-02T05:04:11.375Z",
"sourceListUrl": "https://api.smartrecruiters.com/v1/companies/smartrecruiters/postings?limit=25&offset=0",
"sourceDetailUrl": "https://api.smartrecruiters.com/v1/companies/smartrecruiters/postings/744000148454651",
"warnings": []
}

null means the source has no value or the field needs details. changeType is null because no previousSnapshot was given. An empty string means the source section is empty. event is NEW for every row when no previousSnapshot was given. A removed row only has the keys source, sourceId, event (CLOSED), observedAt, scanComplete, closedAt, companyIdentifier, postingId, title, releasedDate, changeType, contentHash, hashBasis, companyStatus and fetchedAt.

Full output field reference

All 64 job row fields. Types are JSON types.

FieldMeaningTypeCan be empty?Example
sourceAlways smartrecruiters.stringno"smartrecruiters"
sourceIdsmartrecruiters:{companyIdentifier}:{postingId}.stringno"smartrecruiters:smartrecruiters:744000148454651"
companyIdentifierCanonical SmartRecruiters company identifier from the API (not your spelling).stringno"smartrecruiters"
postingIdStable ID of the job inside the company. With companyIdentifier it is the row key.stringno"744000148454651"
uuidPosting UUID from the source.string or nullyes (null)"f4a3d5b9-5fa9-48af-ba55-30669c9c3e81"
jobIdJob ID from the detail record. Null when details are off or unavailable.string or nullyes (null)"77d771c2-3c32-4eec-b9a1-9b7cd6684a16"
jobAdIdID of the job ad.string or nullyes (null)"f9fbb59b-d9db-4c26-a4c9-959f920b370a"
refNumberEmployer reference number, if set.string or nullyes (null)"REF2025N"
titleJob title from the source with surrounding spaces removed.string or nullyes (null)"Data Operations Consultant"
companyNameDisplay name of the company.string or nullyes (null)"SmartRecruiters Inc"
releasedDateWhen the posting was released (ISO 8601 text).string or nullyes (null)"2026-09-09T09:43:26.403Z"
visibilityPosting visibility from the source, for example PUBLIC.string or nullyes (null)"PUBLIC"
activeWhether the posting is active. Detail only.boolean or nullyes (null)true
locationCityCity from the posting location.string or nullyes (null)"Poland"
locationRegionRegion or state from the posting location.string or nullyes (null)"Remote"
locationCountryCountry code from the posting location.string or nullyes (null)"pl"
fullLocationReadable location line.string or nullyes (null)"Poland, Remote, Poland"
remoteTrue when the posting is remote.boolean or nullyes (null)true
hybridTrue when the posting is hybrid.boolean or nullyes (null)false
latitudeLatitude as text. Often null.string or nullyes (null)null
longitudeLongitude as text. Often null.string or nullyes (null)null
addressStreet address. Detail only, often null.string or nullyes (null)null
postalCodePostal code. Detail only, often null.string or nullyes (null)null
industryIndustry label.string or nullyes (null)"Computer Software"
industryIdIndustry ID as text.string or nullyes (null)"computer_software"
departmentDepartment label. Null when the employer left it empty.string or nullyes (null)"Technical Services"
departmentIdDepartment ID as text.string or nullyes (null)"5408931"
functionJob function label.string or nullyes (null)"Information Technology"
functionIdJob function ID as text.string or nullyes (null)"information_technology"
typeOfEmploymentEmployment type label, for example Full-time.string or nullyes (null)"Contract"
typeOfEmploymentIdEmployment type ID as text.string or nullyes (null)"contract"
experienceLevelExperience level label.string or nullyes (null)"Associate"
experienceLevelIdExperience level ID as text.string or nullyes (null)"associate"
languageLanguage code, for example en or en-GB.string or nullyes (null)"en"
languageNameReadable language name from the source, for example English.string or nullyes (null)"English"
detailUrlPublic API URL of the posting detail record. Always set.stringno"https://api.smartrecruiters.com/v1/companies/smartrecrui…
postingUrlPublic 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).string or nullyes (null)"https://jobs.smartrecruiters.com/smartrecruiters/7440001…
applyUrlApply link. Detail only: null when includeDetails is false.string or nullyes (null)"https://jobs.smartrecruiters.com/smartrecruiters/7440001…
referralUrlPublic referral link from the detail record. Null without details.string or nullyes (null)"https://jobs.smartrecruiters.com/external-referrals/comp…
companyDescriptionHtmlCompany section as raw HTML. Detail only.string or nullyes (null)"<p>SmartRecruiters is the Recruiting AI Company that tra…
jobDescriptionHtmlJob section as raw HTML. Detail only.string or nullyes (null)"<p><strong>Contract Type: 12-Month Fixed-Term Contract</…
qualificationsHtmlQualifications section as raw HTML. Can be an empty string.string or nullyes (null)"<p><strong>Qualifications</strong></p><p>At least 2 year…
additionalInformationHtmlAdditional information section as raw HTML. Can be an empty string.string or nullyes (null)"<p>SmartRecruiters is proud to be an Equal Employment Op…
companyDescriptionTextPlain-text version of the company section.string or nullyes (null)"SmartRecruiters is the Recruiting AI Company that transf…
jobDescriptionTextPlain-text version of the job section.string or nullyes (null)"Contract Type: 12-Month Fixed-Term Contract\n\nWe're loo…
qualificationsTextPlain-text version of the qualifications section.string or nullyes (null)"Qualifications\n\nAt least 2 years of experience with ET…
additionalInformationTextPlain-text version of the additional information section.string or nullyes (null)"SmartRecruiters is proud to be an Equal Employment Oppor…
compensationPay object when the employer publishes it, otherwise null.object or nullyes (null)null
companyStatusHow completely the company was read: complete, capped, partial, empty_or_unknown or error.stringno"complete"
scanCompleteTrue when the company was read completely (companyStatus complete).booleannotrue
detailStatusok, unavailable, error or skipped for this posting.stringno"ok"
detailHttpStatusHTTP status of the detail request. Null when skipped.integer or nullyes (null)200
eventNEW, UPDATED, UNCHANGED or CLOSED, derived from changeType. Without previousSnapshot every row is NEW.stringno"NEW"
closedAtTime a removed row was detected. Null for all other rows.string or nullyes (null)null
changeTypenew, updated, unchanged or removed. Null when no previousSnapshot was given.string or nullyes (null)null
changedFieldsNames of changed fields when they can be named (title, releasedDate).array or nullyes (null)null
updateComparableFalse when the old and new snapshot used different hash bases, so an update could not be tested.boolean or nullyes (null)null
contentHashSHA-256 of the normalized posting content. Used for diffs.stringno"1e423cdd2467f140c1efe305e2c673e18a318f42853330a1cedcd085…
hashBasislist or detail: which data the hash was built from.stringno"detail"
fetchedAtWhen the Actor read this row. Never counts as a change.stringno"2026-10-02T05:04:11.375Z"
observedAtSame value as fetchedAt. Never counts as a change.stringno"2026-10-02T05:04:11.375Z"
sourceListUrlPublic API list page the row came from.stringno"https://api.smartrecruiters.com/v1/companies/smartrecrui…
sourceDetailUrlPublic API detail URL. Null when details were not read.string or nullyes (null)"https://api.smartrecruiters.com/v1/companies/smartrecrui…
warningsRow-level notes, for example detail_unavailable.arrayno[]

Key-value store records

RecordContent
OUTPUTcompanies[]: input, identifier, canonicalIdentifier, status, reasons, totalFound, rowsEmitted, pages, detailsOk, detailsUnavailable, detailsError, detailsSkipped, duplicatesDropped, startedAt, finishedAt.
RUN_SUMMARYoutcome (succeeded, partial, failed, aborted, deadline, charge_limit, input_error), message, durationMs, normalized input, inputErrors, counters (rows, requests, retries, bytes, HTTP status counts, changeCounts), removalsSuppressed, warnings.
SNAPSHOTentries[] with companyIdentifier, postingId, title, releasedDate, contentHash, hashBasis, plus per-company status. Pass entries as previousSnapshot.
CHANGESOnly with previousSnapshot: counts, and keys of added, updated, removed, plus removalsSuppressed.

Company status values

companyStatusMeaning
completeAll postings were read and the count matched the source.
cappedStopped at maxJobsPerCompany while more exist.
partialA page or a detail failed, the count changed during the run, or the deadline came. Rows read so far are kept.
empty_or_unknownThe source returned 0 postings. The API cannot tell a company with no jobs from a wrong ID.
errorThe board could not be read.

Pricing and cost examples

The Actor uses pay per event pricing. You pay only for these two events. Apify platform usage (compute, storage) is included.

EventPrice (USD)When it is charged
Actor start0.002Once per run (memory up to 1 GB, which covers every allowed setting).
Job posting row0.00072For each row stored in the dataset, including removed rows.

Price examples:

Rows stored in the runPrice (USD)
0 (for example a daily monitor run with no changes, or an empty board)0.002
100.0092
1000.074
1,0000.722
2,000 (largest tested run)1.442

Rows are never charged twice in one run, and companies that return nothing add no row charge. A run with invalid input fails before any request but still costs the start event. To cap the cost of one run, set a maximum cost per run in the run options (API parameter maxTotalChargeUsd); the Actor then stops with RUN_SUMMARY.outcome set to charge_limit.

Cost drivers (run time and memory), measured on Apify in October 2026:

ScenarioInputRowsRequests to SmartRecruitersRun timePeak memory
Small1 company, cap 5, details12about 2 sunder 50 MB
Medium1 board of 161 jobs, details16116340 s60 MB
Large2 boards, 1124 jobs, details11241137235 s159 MB
Largest tested2 companies, cap 1000 each, details20002020269 s179 MB
List only5 companies, cap 1000, no details32843516 s88 MB

With details on, the Actor makes one request per row plus one list request per 100 rows. Without details it is much faster; the price per row is the same.

Use cases

Buyer jobInput pathOutputKey fields
Watch the hiring of target employerscompanies, outputMode: "changes", previousSnapshotNew, updated and removed postingschangeType, title, postingUrl
Build a job list for a research or job boardcompanies, maxJobsPerCompanyAll current postingstitle, fullLocation, department, applyUrl
Prepare text for search or AI toolsdescriptionFormat: "text"Plain-text job sectionsjobDescriptionText, qualificationsText
Check a known board is read completelyany runStatus per companycompanyStatus, OUTPUT, RUN_SUMMARY

Scheduling and monitoring

The Actor does not schedule itself. To run it every day or week, open the Actor, choose Schedules, and create a schedule that starts it with your input. A schedule is plain Apify; see the Apify schedules guide.

To monitor changes, each run must receive the SNAPSHOT.entries of the run before. Two ways: copy it into the input by hand, or have your own code read the last run's SNAPSHOT record through the API and start the next run with it. The Actor does not store history for you.

What to expect: the first run has no previousSnapshot, so every row is NEW and changeType is null. Pass its SNAPSHOT.entries to the next run. If nothing changed on the board, every posting is unchanged. With outputMode set to changes the dataset is then empty, RUN_SUMMARY.counters.changeCounts shows for example {"unchanged": 4}, and the run costs only the start event.

API, MCP and integrations

  • API: start a run and read results with the Apify API. Keep your token in an environment variable, never in code.
curl -s -X POST "https://api.apify.com/v2/acts/81TefPThmCXMKxPXw/runs?waitForFinish=60" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies":["smartrecruiters"],"maxJobsPerCompany":5}'

Read the rows with GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json and the snapshot with GET https://api.apify.com/v2/key-value-stores/{defaultKeyValueStoreId}/records/SNAPSHOT.

  • Export: on the Dataset tab choose JSON, CSV or Excel, and pick the fields. See the dataset storage guide.
  • Webhooks and no-code tools: use an Apify webhook or integration on run success, then read RUN_SUMMARY.counters.changeCounts or the changeType of rows.
  • MCP and AI agents: we did not test an MCP setup for this Actor. If you use Apify's MCP server, check that it can see this Actor in your account.
  • Official source: the data comes from the public SmartRecruiters Posting API.

Limits and expected partial results

Tested on Apify with the Actor's own runs (build 0.1.1):

  • 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.
  • If you set a maximum total charge and the run reaches it, the Actor stops, RUN_SUMMARY.outcome is charge_limit, the company that was cut and all unread companies are partial with reason charge_limit (rowsEmitted counts only stored rows), and SNAPSHOT.incomplete is true. Do not use that snapshot as previousSnapshot.
  • The source can change while you read it. Job counts on live boards move.

Troubleshooting

The run failed with input_error

Symptom: no rows, RUN_SUMMARY.outcome is input_error. Likely reason: a company item is not an ID or a SmartRecruiters board URL, or outputMode is changes without previousSnapshot. Check RUN_SUMMARY.inputErrors. Action: fix the named item and start again.

The dataset is empty but the run succeeded

Symptom: 0 rows. Likely reason: the company has no public postings, or the ID is wrong. The API answers the same way for both, so the status is empty_or_unknown, not "not found". Check the ID on the company career page.

Symptom: applyUrl and descriptions are null. Reason: includeDetails is false, or descriptionFormat excludes that form. Action: turn details on.

A company shows partial or capped

capped means your maxJobsPerCompany was reached. Raise it. partial means a page or detail failed, or the deadline came. Read OUTPUT[].reasons, raise timeoutSecs if needed, and run again. Do not trust removed rows for that company.

Rows show updateComparable: false

The old snapshot was made with different details settings. Run once more with the same settings, and feed that new snapshot next time.

FAQ

Do I need a SmartRecruiters account or API key?

No. The Actor uses the public Posting API without login. It cannot read internal or private jobs.

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.

Does it send alerts?

No. Schedule runs and connect Apify integrations to the dataset or RUN_SUMMARY.

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.

None yet.

Support

For a bug, a question or a feature request, use the Issues tab on this Actor's Store page. Add the run ID, the input mode and non-sensitive error text. Never post tokens, cookies or private data. This is an independent tool and is not affiliated with SmartRecruiters. It reads only data that the public Posting API returns.