Greenhouse Jobs Scraper & Monitor avatar

Greenhouse Jobs Scraper & Monitor

Pricing

from $0.19 / 1,000 greenhouse job results

Go to Apify Store
Greenhouse Jobs Scraper & Monitor

Greenhouse Jobs Scraper & Monitor

Export live jobs from known public Greenhouse boards. Get job details or compare snapshots for new, updated and verified removed posts, with coverage reports.

Pricing

from $0.19 / 1,000 greenhouse job results

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Export current jobs from public Greenhouse boards, fetch exact job details, or compare your own snapshots to find new, updated and removed posts. Use this Actor for a job feed or recruiting signals from companies you already know.

Add a board token or a supported board URL. The Actor uses the public Greenhouse Job Board API. It needs no login, browser or proxy. It saves job rows and a separate report about coverage. A run can return no rows after filters or when nothing changed. Start and saved-row charges are explained below.

Greenhouse jobs: public board input, current job rows and explicit snapshot changes

Contents

What it does

  • Snapshot: read current matching jobs from one or more known boards.
  • Details: read exact board/job pairs. Public form questions and structured pay ranges are optional.
  • Monitor: compare current board state with a SNAPSHOT from a prior run that you supply. Get change status, changed fields and stable IDs.

Good fit: export a company's job board, add current roles to your own job feed, or compare hiring changes between two successful scans.

Not a fit: discover all Greenhouse companies, search a global job index, read private or closed-job history, apply for jobs, enrich contacts, or read another ATS. A job disappearance has no employer-confirmed closure time or reason. Source changes and access limits can make a run incomplete.

Quick start

  1. Open Input in a new form.
  2. Keep the UI example: snapshot, board proton, and output limits of 100. You can run this form without typing.
  3. Click Start. For a small check, use 512 MiB memory and a 300-second timeout.
  4. Open Dataset → Jobs and verified changes. Check title, location and absoluteUrl.
  5. Open Key-value store → RUN_SUMMARY. Check runComplete and each input's state before using the result as a complete snapshot.
{"mode":"snapshot","boards":["proton"],"maxJobsPerBoard":100,"maxJobsTotal":100}

This example reads current Proton jobs without descriptions. The public board had 57 jobs during the check on 9 October 2026. Counts and job values can change. A repeat snapshot returns current rows again; it does not use hidden monitor state.

Use cases

Your taskSettingsUseful fields
Export one known boardmode: snapshot, boardsstableId, title, location, absoluteUrl
Read job descriptionsincludeContent: truecontentHtml, contentText
Read public form/pay detailsmode: details, jobs, detail flagsquestions, payRanges
Find recruiting changesmode: monitor, prior baselineKeyValueStoreIdchangeStatus, changedFields, observedRemovedAt

Input

These are all supported input fields. There are no nested input objects. Array items are strings. Null, empty target arrays, empty filter arrays and unknown fields are invalid. Remove an optional filter to disable it.

FieldType / allowed valuesRuntime default when omittedUI prefill / effect
modestring: snapshot, details, monitorsnapshotsnapshot; required by the Console schema
boardsarray, 1–100 tokens or supported board URLs['figma'] in snapshot/monitor, an existing API fallback['proton']; do not send in details mode
jobsarray, 1–500 exact targetsnone; required for detailsnone; proton/4953086101; do not send in board modes
baselineKeyValueStoreIdstring, 5–80 letters, digits, _ or -nonemonitor only; read prior store, never modify it
monitorOutputchanges_only or allchanges_onlyno prefill; all includes unchanged comparable jobs
includeContentbooleanfalseno prefill; HTML and plain text; larger board response
includeQuestionsbooleanfalseno prefill; public question schema, no answers
includePayTransparencybooleanfalseno prefill; employer-published structured pay data
titleKeywordsarray, 1–20 strings, ≤200 characters eachno filtermatch title substrings
contentKeywordssame array boundsno filtermatch description text; use includeContent: true
locationssame array boundsno filtermatch location.name substrings
departmentssame array boundsno filtermatch department names
officessame array boundsno filtermatch office names
firstPublishedAfterISO date or instantno filterinclusive source first-published time
updatedAfterISO date or instantno filterinclusive source update time
maxJobsPerBoardinteger, 1–5,0005,000100; output cap per board
maxJobsTotalinteger, 1–10,00010,000100; total output cap, including monitor changes

The UI prefill, runtime defaults and Restore example input are separate. The existing API fallback for {} remains Figma; the new UI example explicitly sends Proton. Send your own boards for production work. The jobs field has no fallback.

Accepted board URL hosts: boards.greenhouse.io, job-boards.greenhouse.io, boards.eu.greenhouse.io, and job-boards.eu.greenhouse.io. Use HTTPS, no user name, password or custom port. Board URLs have /{token}; job URLs have /{token}/jobs/{numericId}. Legacy /embed/job_app?for={token} is accepted for boards. General employer career URLs and private hosts are rejected. URLs select a token; the Actor makes requests only to the fixed public API host.

Tokens use 2–80 letters, digits, _ or -. Canonical board tokens are lowercase. Duplicate board aliases or exact job targets are processed once. Output follows the first board input order, then numeric job ID order.

Filters are case-insensitive substrings, not regular expressions. Values within one filter use OR; different filters use AND. Filters run before snapshot output limits. Missing source dates cannot pass a date filter. A date-only value means midnight UTC. Impossible calendar dates are rejected.

Questions and pay share one detail request when both flags are on. They may cause many requests in board modes. A description filter with content off has no description text to match. Keep content settings equal between monitor snapshots. Limits do not reduce the size of the source board response: the Actor reads and validates the whole board before it filters output.

Multi-board example:

{"mode":"snapshot","boards":["figma","https://job-boards.eu.greenhouse.io/proton"],"includeContent":true,"titleKeywords":["engineer"],"maxJobsPerBoard":100,"maxJobsTotal":200}

Exact details and monitoring

For one public job, use its board token and current job-post ID:

{"mode":"details","jobs":["proton/4953086101"],"includeContent":true,"includeQuestions":true,"includePayTransparency":true}

This ID was on the board during the October check; verify it is still published before reuse. Pay appears only if the employer exposes structured ranges. Public questions describe form fields, not applicant answers.

For monitoring, first run:

{"mode":"monitor","boards":["proton"]}

The run creates a baseline and returns changeStatus: baseline, not invented new jobs. Read RUN_SUMMARY.currentSnapshotKeyValueStoreId. On the next run, pass that actual store ID in baselineKeyValueStoreId. Keep the board and content/detail settings equal. Omit monitorOutput for changes only, or set it to all to include unchanged jobs.

The Actor reads the full board state before filters. matchTransition: entered or left explains filter changes. Leaving a filter is not a job removal. A removal is emitted only when both snapshots for that board are complete and compatible. Missing, partial, blocked, drifted and capped boards cannot authorize removals. A cap on final change rows marks the new snapshot non-comparable.

Every run uses its own snapshot store. Several runs can compare against the same prior store without changing it. Keep or name a store if you need it beyond your account's retention period. A missing, inaccessible, damaged or incompatible baseline stops comparison; no replacement is silently created.

A scan runs once. Scheduled monitoring needs a caller to keep the returned KVS ID and pass it to the next run. A schedule alone does not update the explicit baseline ID. This Actor does not create schedules or webhooks for you.

Output

Each Dataset item is one current job or a verified removal tombstone. All listed keys are emitted. Null means unavailable, not requested, or not relevant to the mode. Empty arrays mean no exposed values. Unknown top-level source keys are not copied.

FieldTypeMeaning / empty behavior
schemaVersioninteger1
recordTypestringjob
stableIdstring{lowercaseBoardToken}:{jobId}; board-scoped identity
boardTokenstringcanonical board token
boardRegionstringus, eu, unknown; from input/source URL, not worker location
jobIdstringGreenhouse job-post ID, decimal text
internalJobIdstring/nullseparate internal job ID; not a substitute for jobId
requisitionIdstring/nullsource requisition value
titlestringsource title, bounded to 2,000 characters
locationobject/null{name: string} when exposed; not a geocoded location
departmentsobject arraysource department objects, sorted by ID/name, ≤500; may be empty
officesobject arraysource office objects, sorted by ID/name, ≤500; may be empty
metadataobject array/nullsource metadata objects, ≤500; null preserved
languagestring/nullsource language
absoluteUrlstringemployer/source job and apply page link; output only
greenhouseUrlstringcanonical Greenhouse job page URL
firstPublishedAtUTC ISO string/nullsource first_published, when valid
updatedAtUTC ISO string/nullsource updated_at, when valid
contentHtmlstring/nullJSON-decoded source HTML; ≤1,000,000 characters; opt-in
contentTextstring/nulldeterministic HTML-to-text conversion; scripts/styles/images omitted
questionsobject/nullopt-in exposed questions, location_questions, compliance, demographic_questions; original nested schema
payRangesobject array/nullopt-in source pay_transparency or pay_input_ranges, ≤50; source keys/units retained, no estimate
retrievedAtUTC ISO stringobservation time; excluded from material hash
changeStatusstring/nullbaseline, new, updated, unchanged, removed; null outside monitor
matchTransitionstring/nullentered, left, none; null outside monitor
changedFieldsstring arraysorted changed material top-level fields; empty when none
previousHashstring/nullprior SHA-256 material hash in comparable monitor rows
currentHashstring/nullcurrent SHA-256 material hash; null for removal
observedRemovedAtUTC ISO string/nullobserved absence time; not employer closure time
sourceEvidenceobjectAPI host, kind: list/detail, content/question/pay request booleans; removal adds compared snapshot checksum

Department/office objects may include id, name, parent_id, child_ids, and office location, as returned by Greenhouse. Metadata may include id, name, value, and value_type. No absent nested field is invented. Questions can contain labels, required flags and form field descriptions. Pay objects retain employer keys such as min, max, currency, title or blurb; check the source schema before interpreting their units. HTML can contain encoded entities after JSON decoding; plain text is a separate conversion, not a rewritten job description.

A removed row keeps prior public job fields and previousHash; it has currentHash: null. Its retained source timestamps describe the prior job. It does not claim a current active posting. Retrieval time and diagnostics do not create a material change.

A trimmed row from the same Proton snapshot example:

{"schemaVersion":1,"recordType":"job","stableId":"proton:4953086101","boardToken":"proton","jobId":"4953086101","title":"Backend Engineer (VPN)","location":{"name":"Geneva; Barcelona; Vilnius"},"absoluteUrl":"https://job-boards.eu.greenhouse.io/proton/jobs/4953086101","changeStatus":null,"changedFields":[],"contentHtml":null}

The example shows selected fields; the Dataset also contains all reference fields above. Source values can change after this check.

Surface / outcomeWhat to check
Datasetcurrent jobs and verified removals; export only after checking summary
Output tablinks to job rows, RUN_SUMMARY and SNAPSHOT
RUN_SUMMARYcoverage per target, counts, retries/bytes/requests, limits, baseline status, emitted/charged rows and runComplete
SNAPSHOTversioned pre-filter jobs and hashes per board, config fingerprint, checksum, comparable flag and run lineage; absent in details or failed baseline checks
Valid empty / no matchempty Dataset; EMPTY, or complete source with zero matches; read summary
Not foundNOT_FOUND; zero rows for that target; not evidence of all jobs closing
Partial / technical failureuseful rows may remain; summary exposes PARTIAL, DRIFTED, FAILED or UNPROCESSED; never assume full coverage

RUN_SUMMARY.inputs[] has original, normalizedTarget, state, sourceCount, matchedCount, emittedCount, omittedCount, retryCount, complete, warnings, errorCode. The run summary also has baselineStatus and currentSnapshotKeyValueStoreId. Platform SUCCEEDED alone does not prove source completeness.

Pricing and limits

Applied PPE pricing: the platform charges apify-actor-start when a run starts, plus one job-result event per saved job or verified change. The start price is USD 0.0014 per GB of allocated memory, rounded up, with a minimum of one event: USD 0.0014 at 256–1,024 MiB and USD 0.0028 at 2,048 MiB. Row prices:

PlanPer saved row1,000 rows
FREEUSD 0.000240USD 0.24
BRONZEUSD 0.000230USD 0.23
SILVERUSD 0.000210USD 0.21
GOLD / PLATINUM / DIAMONDUSD 0.000190USD 0.19

The developer pays the Actor's platform usage costs under PPE; they are not an extra buyer usage fee for this Actor. Descriptions, questions, pay, summary and snapshot do not add a separate paid event. They can require more work.

Valid empty, fully filtered and unchanged changes-only monitor runs still have the start charge and zero row charges. Invalid input also incurs the platform start charge; it produces no row charges. Partial or failed runs can have a start charge and charges for useful rows already saved. There is no charge for skipped/unaccepted rows or summary records.

At 512 MiB and the FREE row price, zero rows cost USD 0.0014, 10 rows cost USD 0.0038, 57 rows cost USD 0.01508, and 1,000 rows cost USD 0.2414. These examples use the applied start price, not a discount. Counts depend on current source and filters.

Set Apify's run maxTotalChargeUsd to limit total event charge, including start. Allow at least the memory-scaled start amount. The job limits are row counts, not a money cap. The Actor stops before output that cannot be charged and reports an incomplete result. Storage can still contain a diagnostic partial snapshot; it cannot authorize future removals.

Bounds: 100 board inputs; 500 exact jobs; 5,000 matching output rows per board; 10,000 per run. Source requests use four boards and at most eight concurrent detail GETs. List bodies are capped at 64 MiB and detail bodies at 2 MiB. A GET is tried at most three times for network/408/429/5xx problems; retry waits are bounded. Redirects are not followed. Memory supports 256–2,048 MiB; default is 512 MiB.

The internal source deadline is at most 900 seconds. A shorter platform timeout reserves 15 seconds for saving; a longer timeout does not extend the internal deadline. The UI demo is checked at 300 seconds. A complete board read requires a valid source shape and source count agreement. Caps or detail failures mark work incomplete. Long source descriptions are bounded; descriptions and structured details are not guaranteed for every employer.

API and exports

Use Apify's Actor run API for cliqtomedia~greenhouse-jobs-monitor-scraper. Supply the same JSON input, a suitable timeout/memory and a total charge cap. Read Dataset items with the returned defaultDatasetId, and summary/snapshot with defaultKeyValueStoreId. Keep your Apify token private.

Apify Dataset supports JSON, CSV and Excel export. For CSV, choose flat fields such as stableId, title, location.name, boardToken, absoluteUrl, changeStatus. Keep JSON when you need nested questions or metadata. A downstream caller can use stableId to join scans; it must pass the actual baseline KVS ID for monitoring.

Source documentation: Greenhouse Job Board API. Platform: Apify run API, Dataset export.

Troubleshooting and FAQ

No rows: is the board empty?

Read the per-input state and counts. EMPTY is a verified zero-job board. A complete board with zero matched rows means filters removed all jobs. An unchanged changes-only monitor run can have zero rows. NOT_FOUND and technical failures mean different things; do not call them empty.

How do I retry an incomplete scan?

Check limits, errorCode, retries and baseline status. Raise a row limit only if you need the omitted work. Retry transient failures with a bounded input. Do not repeatedly retry invalid URLs, 404s, incompatible baselines or schema drift. A timeout does not prove a job closed.

Can this read all Greenhouse companies or another ATS?

No. Supply known public Greenhouse board tokens or supported URLs. Related ATS products are separate Actors.

Why does the second monitor run have no jobs?

With changes_only, unchanged jobs are counted in summary but are not emitted. Use monitorOutput: all for unchanged rows. The UI snapshot demo can be repeated without a prior baseline.

Can a schedule keep my baseline for me?

No. Arrange a caller that reads currentSnapshotKeyValueStoreId and passes it to the next scan. The Actor never overwrites a prior run's store or creates a schedule itself.

Do pay ranges and questions always exist?

No. They are employer-published public fields. The Actor does not infer salary or read private candidate data.

Are the results complete forever?

No. Check each run's evidence. Source fields, job counts, access limits and network conditions can change. A job can disappear between scans. Removed means observed absent from compatible complete snapshots, not employer-confirmed closed.

For help, open the Issues tab on this Actor's Store page. Include the run ID, UTC time, mode, redacted input and relevant RUN_SUMMARY entry. Never send access tokens, cookies, authorization headers or applicant answers.

Greenhouse is a trademark of its owner. This Actor is not affiliated with or endorsed by Greenhouse Software, Inc. You are responsible for downstream use and retention of public job content.