Recruitee Job Snapshots & Changes avatar

Recruitee Job Snapshots & Changes

Pricing

from $0.45 / 1,000 job rows

Go to Apify Store
Recruitee Job Snapshots & Changes

Recruitee Job Snapshots & Changes

Turn known Recruitee company boards into job data. Save a snapshot or compare it with one you supply, with clear partial results and export-ready fields.

Pricing

from $0.45 / 1,000 job rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Categories

Share

Use this Recruitee jobs scraper to turn known company boards into job data. Enter a company slug or its Recruitee URL. Get job rows, a saved snapshot and a run summary. To see changes, supply a previous snapshot yourself.

Check the charge units and current price on the Actor page before you start. A company can have no published jobs. A small job cap or a source error can make results partial; check the summary before using removals.

Job cards and a supplied snapshot show added, updated and removed rows

The picture shows the workflow. It is an illustration, not a run result or an alert service.

Table of contents

What it does

The Actor reads published jobs from the public JSON feed of each company you name. It normalizes each valid job into the same 20 fields. It writes job rows to a Dataset and saves SNAPSHOT, RUN_SUMMARY and OUTPUT in the run's Key-value store.

In changes mode, it also writes CHANGES. This compares current rows with the previousSnapshot you send. The Actor does not find earlier runs, keep an automatic history, or send notifications. It does not discover companies or read private applicant records. It does not apply for jobs.

This is an independent data tool. It is not affiliated with Recruitee or the companies whose public boards it reads. The source feed is described in the Recruitee offers reference.

Data you get

Each row has a job ID, company, title, department, team, locations, workplace type, employment type, country, job and application links, source dates, salary and collection time. You can choose to include plain text descriptions and requirements. Missing optional values are null; their keys stay in the row.

The default Jobs table shows 11 common columns. JSON has all 20 fields, including allLocations and the salary object. Job rows are the only Dataset items. Summaries and changes are separate Key-value store records, so a summary cannot be mistaken for a job.

Quick start

  1. Open the Actor's Input tab. Enter a known slug such as channable. The filled-in example is a suggestion; companies has no runtime default.
  2. For a small first run, set Maximum jobs per company to 10 and leave descriptions off. Choose Save current jobs.
  3. Check the displayed price, run limits and selected build version. Start the run.
  4. Open the Dataset when the run finishes. Check RUN_SUMMARY in the Key-value store for each company's outcome. A successful platform run alone does not prove complete source coverage.
  5. In the Dataset, choose Export, select JSON, CSV or XLSX, then download. Select all fields if you need more than the Jobs table columns. Keep JSON for snapshots: CSV and XLSX turn nested fields into table cells.
  6. Save the whole SNAPSHOT record if you want to compare jobs later.

Small-run input:

{"companies":["channable"],"includeDescription":false,"maxJobsPerCompany":10,"mode":"snapshot"}

Job counts and source values can change between runs. See the Dataset export guide for the export controls and API formats.

Input

KeyTypeRuntime defaultUI prefillMeaning and limits
companiesarray of strings, requiredNone["channable"]1–4 known slugs or HTTPS URLs on company.recruitee.com. Duplicates share one fetch but still count as input entries.
includeDescriptionbooleanfalseNoneInclude plain text from source description and requirements. False writes descriptionText: null.
maxJobsPerCompanyinteger25None1–25 returned rows per unique company. A cap may cause partial results and suppress removals. It does not reduce the bytes fetched from the feed.
modestring"snapshot"Nonesnapshot saves current jobs. changes also compares with your supplied snapshot.
previousSnapshotobjectNone; required for changesNoneThe complete SNAPSHOT record, shaped as {"rows":[]}. Every nonempty row must have all 20 job fields. Total input limit: 256 KiB.

Slugs are normalized to lowercase. The Actor uses the company host from a canonical URL; it does not use URL paths as filters. Custom domains, private hosts, HTTP URLs, credentials in URLs, ports, query strings and fragments are not accepted. Even if a returned job page uses a company's custom domain, use its Recruitee slug as input.

There are no title, department, country, date, salary or remote-only input filters. Filter the exported rows in your own tool. There is no state ID or reset option. Start a new baseline with previousSnapshot: {"rows":[]}; do not send a Dataset export wrapped in a different shape.

Input examples

Minimal input uses the runtime defaults: descriptions off, cap 25 and snapshot mode.

{"companies":["channable"]}

A company URL is also accepted. Use its Recruitee host, not a custom careers domain:

{"companies":["https://channable.recruitee.com/"],"maxJobsPerCompany":10}

Advanced baseline with descriptions and an explicit empty previous snapshot:

{
"companies": ["channable"],
"includeDescription": true,
"maxJobsPerCompany": 10,
"mode": "changes",
"previousSnapshot": {"rows": []}
}

This empty baseline puts all current valid jobs in added. For a later comparison, replace that object with the entire saved SNAPSHOT record from your own run. Keep the same companies, description choice and cap: a change in these choices can change the comparison.

Output example

This is one real Dataset row collected on 1 October 2026 with descriptions off. It has all 20 keys. The listing can change after collection.

{
"_type": "job",
"_schemaVersion": "1.0",
"_source": "recruitee",
"company": "channable",
"jobId": "2751915",
"title": "Customer Success Manager Benelux - Dutch speaking",
"department": "Customer Success",
"team": null,
"location": "Utrecht, Utrecht, Netherlands",
"allLocations": [
"Utrecht, Utrecht, Netherlands"
],
"workplaceType": "hybrid",
"commitment": "Full-time",
"country": "NL",
"url": "https://jobs.channable.com/o/customer-success-manager-benelux-dutch-speaking-3",
"applyUrl": "https://jobs.channable.com/o/customer-success-manager-benelux-dutch-speaking-3/c/new",
"postedAt": "2026-09-18T13:27:28.000Z",
"updatedAt": "2026-10-01T14:29:22.000Z",
"salary": {
"min": 3750,
"max": 5250,
"period": "month",
"currency": "EUR"
},
"descriptionText": null,
"_scrapedAt": "2026-10-01T18:38:15.792Z"
}

Output

Job fields

KeyTypeValue and empty behavior
_typestringjob.
_schemaVersionstring1.0, the job-row format version.
_sourcestringrecruitee.
companystringNormalized company slug.
jobIdstringSource ID, or the canonical public job URL when the ID is absent. URL normalization removes duplicate slashes and a trailing slash; query strings and fragments are rejected. Used with company as the job key. Existing URL-based snapshot keys remain unchanged.
titlestringRequired source job title.
departmentstring or nullSource department; null when absent.
teamstring or nullSource team; null when absent. It is not copied from department.
locationstringRequired primary location from the source.
allLocationsarray of stringsDistinct normalized locations in source order; may be empty. City, state and country are joined when available; name is used when city is absent.
workplaceTypestringremote, hybrid or on-site. The source flags decide this; remote takes precedence over hybrid. Missing or unusable flags cause schema drift.
commitmentstringFull-time, Part-time, Contract, Freelance, Internship or Temporary. An unknown source employment code causes schema drift.
countrystringA valid source country_code becomes an uppercase two-letter code. If it is absent, the source country text is used. A malformed supplied code causes schema drift. This field is not always a country code.
urlstringPublic job page URL.
applyUrlstringPublic application page URL. The Actor does not submit applications.
postedAtstringSource publication date as a UTC ISO timestamp. Invalid or missing dates cause schema drift.
updatedAtstringSource update date as a UTC ISO timestamp.
salaryobject or nullSource salary only. Null if absent or all four values are empty. No estimates, currency conversion or annualization.
descriptionTextstring or nullPlain text description and requirements when requested. Null when disabled or absent.
_scrapedAtstringUTC ISO collection time. Excluded from change detection.

When salary is an object, all four keys are present:

KeyTypeMeaning
salary.minnumber or nullLower source amount. Decimal values are preserved.
salary.maxnumber or nullUpper source amount.
salary.periodstring or nullSource pay period, such as hour, month or year.
salary.currencystring or nullSource currency text, such as EUR.

Required fields are not silently filled with invented values. A bad source row can leave valid rows in the output while making its board incomplete.

Storage records and comparison

Record or fieldMeaning
DatasetCurrent job rows only; not an added-only feed.
SNAPSHOT.rowsCurrent job rows, in an object you can reuse as previousSnapshot. A partial snapshot is still partial; keep its summary with it.
CHANGESPresent in changes mode. Same object as OUTPUT.diff.
diff.addedCurrent job rows whose company/job ID was absent before.
diff.updatedObjects with before and after job rows for a changed company/job ID.
diff.removedPrevious rows absent now, only when the comparison is complete enough.
diff.removedSuppressedTrue when incomplete coverage prevents safe removal reporting.
diff.suppressionReasons[]Each object has company, outcome and reason. Explains why removals were suppressed.
OUTPUT.itemsCurrent rows, matching the Dataset after storage finishes.
OUTPUT.boardSummariesPer-company outcomes, defined below.
OUTPUT.diffThe comparison object or null in snapshot mode.
OUTPUT.RUN_SUMMARYFull run summary, including Cloud references.
OUTPUT.transportAttemptsSanitized request attempt details.
OUTPUT.terminalOutcomerunning during saving; final complete, partial, not_found, domain_empty, invalid_input, resource_limit, cancelled or technical_failure.
OUTPUT.exitCodeNull while saving; final 0, 1 or 2.
OUTPUT.errorOptional top-level failure object with code and message.
OUTPUT.references.datasetid, itemCount and itemsUrl for the written Dataset rows.
OUTPUT.references.keyValueStoreid, outputKey, summaryKey, snapshotKey, changesKey. Keys point to OUTPUT, RUN_SUMMARY, SNAPSHOT; changesKey is null without a diff.

The Actor writes OUTPUT last. Its final presence marks completed storage, but a forced stop can interrupt writes. Check the platform run status and summary together. The separate Key-value store records follow Apify Key-value store storage.

Summary fields

RUN_SUMMARY is a Key-value store record, and is also embedded in OUTPUT.

FieldType / exampleMeaning
summaryTypestring / "RUN_SUMMARY"Summary discriminator.
received, valid, duplicatesinteger / 1, 1, 0Counts of submitted input entries, valid entries and duplicate entries.
processed, resultsinteger / 1, 10Processed unique boards and returned valid job rows.
domain_empty, not_foundinteger / 0, 0Board counts with no published jobs, or with a missing board.
technical_failures, parser_schema_drift, unprocessedinteger / 0, 0, 0Board counts with technical failures, source format failures, or no completed processing.
retries, rate_limits, transport_attemptsinteger / 0, 0, 1Retry, rate-limit and request-attempt counts from the transport layer.
timings.startedAt, timings.finishedAt, timings.durationMsISO strings and number / "2026-10-01T18:38:15.321Z", "2026-10-01T18:38:16.245Z", 924Run work start/end times and elapsed milliseconds.
transportModestring / "direct_public_https"direct_public_https. No login or proxy is used.
sourceExhaustedboolean / trueWhether all relevant sources were read to completion. A cap or failure can make this false.
removedSuppressedboolean / falseWhether the run must suppress removals.
failedInputReferences[]array of objects / []inputIndex, inputRef, company, outcome, errorCode for failed inputs. Company and error code may be null.
inputOutcomes[]array of objects / index 0, inputRef "companies[0]", company "channable", outcome "complete", errorCode nullThe same five keys for each input, including the duplicate outcome.
counter_source, attemptLogRefstrings / "transport_layer", "inline_sanitized_transport_attempts"transport_layer and inline_sanitized_transport_attempts, respectively.
runId, datasetId, keyValueStoreIdstrings (runId may be null) / IDs returned for your runCloud storage/run identities. runId may be null in local execution.
itemsWritteninteger / 10Number of rows written to the Dataset.
boardSummaries, transportAttemptsarrays of objects / see fields belowThe nested structures below.
terminalOutcome, exitCodestring and integer (or null during saving) / "complete", 0Same meaning as the final OUTPUT fields.

Each boardSummaries[] object contains:

FieldType / exampleMeaning
company, inputIndexesstring and integer array / "channable", [0]Normalized company and zero-based input indexes that refer to it.
outcomestring / "complete"complete, partial, not_found, domain_empty, technical_failure, parser_schema_drift, duplicate_or_conflict, invalid_input or skipped.
completenessstring / "complete"complete, partial or unknown.
jobCountinteger / 10Returned valid jobs for this board.
errorCode, errorMessagestring or null / null, nullFailure code and safe explanation, or null.
retryCount, rateLimitCountinteger / 0, 0Retry and rate-limit counts.
sourceExhausted, removedSuppressedboolean / true, falseSource completeness and removal safety flags.

Each transportAttempts[] object contains attempt (integer, e.g. 1), status (HTTP integer or null, e.g. 200), classification (string, e.g. "SUCCESS"), retryScheduled (boolean, e.g. false), retryAfterMs (number or null, e.g. null) and durationMs (number, milliseconds, e.g. 196). Classifications are SUCCESS, TRANSIENT, RATE_LIMITED, TIMEOUT, CONNECTION_RESET, SOURCE_ACCESS, REDIRECT, BODY_LIMIT and CANCELLED.

Nested input reference types are: inputIndex integer (e.g. 0), inputRef string (e.g. "companies[0]"), company string or null, outcome string, and errorCode string or null. Diff lists are arrays of job rows; updated is an array of before/after objects. Empty lists are []. Each suppression reason has string company, outcome and reason. Storage reference IDs and record keys are strings, except null changesKey without a comparison; itemCount is an integer. Optional error.code and error.message are strings.

Errors use these codes: INVALID_INPUT, SOURCE_ACCESS, RATE_LIMITED, TIMEOUT, MALFORMED_RESPONSE, PARSE_OR_NORMALIZATION, RESOURCE_LIMIT, INTERNAL, AUTH_REQUIRED, UNEXPECTED_REDIRECT, RESPONSE_TOO_LARGE, CANCELLED, MAX_JOBS_LIMIT, SCHEMA_DRIFT, DUPLICATE_ID.

A rejected or cancelled input can exit with code 2. Storage/init failures exit with code 1. Mixed board failures can still exit with code 0; read outcomes. Only job rows enter the Dataset. No hidden history or reset state is used.

Pricing and limits

Set a run cost limit at or above the minimum shown on the Actor page. The minimum limit is not a fixed charge: you pay for the events used. The API example uses a limit of USD 0.10.

The start event counts once per GB of run memory, with at least one event. A 256 MiB run uses one start event. More memory can leave less of your cost limit for job rows. Before fetching jobs, this Actor checks that the remaining limit can cover the full requested cap for each unique company. If it cannot, the run ends with RESOURCE_LIMIT and empty job records. Increase the cost limit or lower the cap. This check uses the requested maximum, even if a board later has fewer jobs.

Check the price and charge units shown on this Actor's page before starting a run. Do not estimate a charge from a screenshot or a job's salary. A run can return zero jobs, and a started run can still use platform resources or have a displayed start charge.

WorkloadWhat to plan for
One known companyStart with a cap of 10. Review the summary and returned row count.
Up to four input entriesEach unique company has its own cap, at most 25 rows. Duplicates do not add job rows.
Repeated snapshotsEach run reads current sources again. Fewer returned rows do not necessarily mean fewer fetched bytes.
A longer company listSplit it into batches of at most four entries. This Actor has no single-run bulk mode for thousands of companies.
Empty, missing or blocked boardCheck the displayed start charge and resource rules; an empty Dataset does not promise a free run.

The numeric ceiling is 100 returned rows per run (4 × 25), not a promise that four boards have 100 jobs. A live bounded check returned 63 rows from four boards; it did not prove a 100-row source workload. Feed size, text size, retries and platform limits can end processing earlier. Descriptions can make exports and snapshots larger.

Use cases

Your taskFields or records to use
Keep a job list for known employerscompany, jobId, title, url, applyUrl.
See new or changed postingsCHANGES.added, updated.before, updated.after, and the removal safety flags. Supply your own previous snapshot.
Compare published pay rangessalary and its period/currency. A null salary is not zero pay.
Group jobs by place or work styleallLocations, country, workplaceType. Country can be source text.
Read job details in another toolEnable includeDescription; use descriptionText for description and requirements.
Audit missing resultsRUN_SUMMARY, boardSummaries, inputOutcomes and request attempts.

Scheduling and monitoring

Use an Apify schedule if you want repeated snapshot runs. Choose the Actor and input, choose a supported build version, set the interval and review run limits before saving the schedule. This Actor does not create a schedule for you. See the Apify schedules guide.

A schedule with fixed input does not update previousSnapshot for you. To compare each run with the last one, your own workflow must read the last complete SNAPSHOT, supply it to the next run and check the new summary. Keep the run ID and summary beside each saved snapshot. If coverage is partial, inspect it before replacing your baseline. Build a notification step in your own tool if needed; notifications are not Actor output.

API, MCP and integrations

The same input can be sent through the Apify API. Access to a private Actor requires the right account. The API example below targets Actor dWqxE4a9Si7dcyfav. Set APIFY_TOKEN in your environment and APIFY_BUILD to a build version available in its Versions tab. Do not put a token in the URL or share it in a support message.

Starting a run may incur charges. The command below is an example to run after checking the selected version and price. It does not change any schedule.

: "${APIFY_TOKEN:?Set APIFY_TOKEN in your environment}"
: "${APIFY_BUILD:?Set an available build version}"
curl --fail-with-body --silent --show-error -X POST "https://api.apify.com/v2/acts/dWqxE4a9Si7dcyfav/runs?build=${APIFY_BUILD}&memory=256&timeout=60&maxTotalChargeUsd=0.10" -H "Authorization: Bearer ${APIFY_TOKEN}" -H 'Content-Type: application/json' --data '{"companies":["channable"],"includeDescription":false,"maxJobsPerCompany":10,"mode":"snapshot"}'

The response gives a run id. Read /v2/actor-runs/{id} until its status is terminal, then use its defaultDatasetId to read /v2/datasets/{defaultDatasetId}/items?format=json. Here, {id} and {defaultDatasetId} mean the values returned for your run. Read the run's Key-value store summary too. Never treat the initial start response as finished output. See the API run reference.

Apify's MCP tools can run Actors and read results when the connected account can access them. This Actor has no custom MCP server and requires no new service. Pass the same input keys, inspect the run result, and handle snapshots in your workflow. See Apify MCP integrations. You can also use JSON/CSV/XLSX exports with a spreadsheet, data pipeline or automation tool; these connections are not configured by the Actor.

Source and partial results

Only known public Recruitee feeds are read. A board can change, block requests, return no published jobs, or serve malformed data. Redirects to another host, private addresses, login challenges and unsafe URLs are rejected. The Actor does not bypass access controls.

The input limit is 256 KiB, the feed response limit is 2 MiB per company, and combined description/requirements source text is limited to 100,000 bytes per job when enabled. Descriptions are not fetched as a separate job-page crawl. Validated source fields are normalized; there is no extra detail request to fill missing optional fields.

The Actor retries bounded transient failures and reports each attempt. A capped or failed board makes removal reporting unsafe. In changes mode, any incomplete board or invalid company input suppresses the run's removed list. Added and updated rows may still be useful, but they do not prove full coverage. A complete empty feed differs from a missing board or a technical failure.

Graceful cancellation saves completed work when storage remains available. A force kill, storage failure or automatic restart can interrupt this process; do not assume an exactly-once result or a resumable queue. Check the final run and records before using the output.

Troubleshooting

What you seeLikely reasonSafe next step
Input rejected before a run startsMissing companies, more than four entries, wrong type, or cap outside 1–25Correct the input and try a small snapshot.
INVALID_INPUTAn unsafe/noncanonical URL, or an invalid previous snapshotUse a Recruitee slug and the whole saved SNAPSHOT record.
domain_empty, zero jobsThe public feed has no published offersVerify the board and check again later. Do not replace this with a source error.
not_foundBoard or feed returns not foundCheck the slug; a custom domain is not a supported input.
MAX_JOBS_LIMIT, partialMore valid jobs exist than the selected cap allowsRaise the cap up to 25. If it is still partial, keep removal suppression.
SCHEMA_DRIFT or parser_schema_driftA required source value has changed or is invalidCheck the summary and report the safe error code and run ID.
RATE_LIMITED, TIMEOUT, SOURCE_ACCESSSource rate limit, slow response or access failureInspect attempts and try later with fewer boards. Do not bypass source access.
RESPONSE_TOO_LARGE or RESOURCE_LIMITFeed or text exceeds a boundCheck the summary. A smaller row cap does not reduce the full feed body.
No removals despite differencesIncomplete coverage caused removedSuppressedInspect suppressionReasons; do not infer that old jobs were removed.
New changes after switching description modeYour old and new row content differsCompare with the same input options and a matching baseline.
Platform run succeeds but data is partialBoard outcomes are separate from platform statusRead RUN_SUMMARY, not just the run status.

FAQ

Do I need to know the company? Yes. Supply its Recruitee slug or canonical board URL. There is no company discovery mode.

Can I use a custom careers domain? No. Use the company's Recruitee slug even if its job pages use a custom domain.

Does the Actor remember the last run? No. Every run saves a current snapshot. You supply the previous one when comparing.

Will it email new jobs? No. Use your own workflow for notifications.

What does null mean? A missing optional source value, or descriptions turned off. All 20 keys remain present. It does not mean an error by itself.

Can I compare snapshots with different settings? You can, but changing companies, caps or descriptions can create differences unrelated to edits in the source. Keep the same options for useful comparisons.

Why can removed be empty? Incomplete coverage suppresses removals for safety. Read removedSuppressed and its reasons before making decisions.

Can I export to Excel? Yes. Choose XLSX in Dataset Export. Keep JSON when you need the exact nested snapshot shape.

Does a zero-row run cost nothing? Check the displayed price and platform rules. A started run can still use resources or carry a start charge.

If another employer uses a different ATS, use a tool for that source:

These are separate Actors from the same publisher. Review each one's input, output and price; this Actor does not run them for you.

Support

Open the Issues tab on this Actor's Apify page. Include the run ID, the safe company slug, the relevant error code, and what you expected. If needed, share a small input with secrets removed. Do not send your API token, cookies, private applicant data or a full private account payload.

Source job data belongs to its publishers. Check your use of public data and keep private information out of shared exports. This tool reads public jobs and does not provide applicant records. Support does not include a promised response time, source uptime or a notification service.