Greenhouse Stale Jobs Checker & Job Board Audit
Pricing
from $1.00 / 1,000 checked records
Greenhouse Stale Jobs Checker & Job Board Audit
Compare Greenhouse jobs with your CSV/JSON catalog. Flag stale fields and duplicates, preserve protected edits, and review missing postings before making changes. Built for job boards and aggregators. $0.04 per complete board; platform usage included.
Pricing
from $1.00 / 1,000 checked records
Rating
0.0
(0)
Developer
Apisolutions
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Extract Greenhouse jobs and reconcile your catalogue
Greenhouse Stale Jobs Checker & Job Board Audit checks your job catalogue against the public Greenhouse boards you specify. Find stale titles, locations and job links, flag duplicate local records, and get correction previews that preserve your protected fields.
Paste a board list to get a current job inventory. Add your existing catalogue as CSV or JSON to see what needs attention. You receive a downloadable table and structured JSON with source evidence. The Actor leaves changes to your catalogue under your control.
Built for job-board operators, job aggregators and teams maintaining authorised career-site catalogues. Developers and automation agents can submit the same input through Apify's API and process the same action codes and patch previews.
Ready to check your own data? Choose Run on my Greenhouse boards. You can skip the example preview.
Get started with live boards
- Select Run on my Greenhouse boards and supply Greenhouse board tokens or supported HTTPS board-root URLs.
- Confirm that you own or are authorised to maintain the catalogue and have permission for the intended source use.
sourceAccessConfirmedmust explicitly betrue. - Optionally paste your current records into Catalogue CSV or Catalogue JSON. Use one format at a time.
- Choose the fields to compare and whether to include new-job candidates. Set the maximum charge to cover your intended checks: $0.04 per complete board.
- Run at 512 MiB and 300 seconds. Review the dataset and
OUTPUTsummary, including unknown or skipped boards.
Example board-list input:
{"mode": "live","boards": ["figma", "https://job-boards.greenhouse.io/webflow/"],"sourceAccessConfirmed": true}
API inputs that omit mode retain live behaviour and require explicit source consent. Empty or invalid live input never falls back to the sample.
These names demonstrate syntax; check your own source-use permissions. Live counts change. Without a supplied catalogue, current source postings become DISCOVERED rows.
If a live run asks for source permission
Live checks require both a board list and explicit permission confirmation. If the run reports sourceAccessConfirmed, open its Input, confirm you own or are authorised to maintain the catalogue and have permission for the intended source use, then tick Confirm permission for live boards and catalogue. In JSON, the field must be the boolean true, not the text "true".
For demonstration data instead, choose Preview example results (demo data) and leave board/catalogue fields empty. The Actor never changes an invalid live request into a demo or enables your consent automatically. Rejected input produces no job rows or board charge.
Preview example results
Choose Preview example results (demo data) to see seven labelled examples: matching fields, a title correction, a protected edit, duplicates, a missing-posting review and a new-job candidate. The preview is optional and has no per-board fee.
These are demonstration jobs, not live listings. The preview does not fetch Greenhouse jobs or check current source availability. Leave your board and catalogue fields empty; select Run on my Greenhouse boards before entering your own data.
For an API preview, send {"mode": "sample"}. Every example row is marked isSample: true and includes a sample notice. Platform usage is included in the configured pricing.
Add your existing job inventory
Each record needs localId, board and jobId. Keep IDs as strings. The join uses the public posting ID within its board, not Greenhouse's internal job ID.
This authored example uses the local examplecompany fixture, not a live demonstration source:
{"boards": ["examplecompany"],"sourceAccessConfirmed": true,"inventory": [{"localId": "refresh","board": "examplecompany","jobId": "2","title": "Engineer","jobUrl": "https://local.example.org/apply?campaign=ours","protectedFields": ["jobUrl"]}]}
In that fixture, the source title is Senior Engineer. The result proposes the title update while preserving the local application link. This is a field excerpt from the saved fixture result:
{"action": "REFRESH","localId": "refresh","jobId": "2","currentTitle": "Engineer","sourceTitle": "Senior Engineer","protectedChanges": ["jobUrl"],"patch": [{"op": "test", "path": "/localId", "value": "refresh"},{"op": "test", "path": "/board", "value": "examplecompany"},{"op": "test", "path": "/jobId", "value": "2"},{"op": "test", "path": "/title", "value": "Engineer"},{"op": "replace", "path": "/title", "value": "Senior Engineer"}]}
Patches target the original inventory object and check identity and old values before replacements. They are output data; the Actor never executes them against your system. Omitted fields are not compared or added. Explicit JSON null means an expected null; an optional blank CSV cell means unknown.
CSV headers are localId,board,jobId plus optional title,location,jobUrl,protectedFields. Quoted commas and newlines are supported. Multiple protected fields use |, such as title|jobUrl. Local IDs must be unique; different IDs sharing a posting key are reported as duplicates.
Use your existing CSV column names
You can keep your export's headers. In Input → CSV columns (optional), enter the exact column name for each field that differs. For example, enter Record ID in Local record ID column, Board in Greenhouse board token column, and Posting ID in Greenhouse posting ID column. Blank controls use the standard names above. Names are case-sensitive; no identity is guessed or generated.
Map the optional title, location, application-link and protected-field columns you want to use. If your export contains other columns, explicitly enable Ignore unmapped CSV columns after checking they are unnecessary. Their values are not compared or copied into preview records. No rows are silently skipped. CSV supports up to 100 unique, nonempty headers of 200 characters each, within the existing 2 MiB input limit.
For an optional check before fetching live jobs:
- In What would you like to run?, select Preview my CSV import (no source check).
- Supply your board list, confirm permission to use your catalogue, paste your CSV, and fill any column controls needed.
- Run, then open Output → CSV import preview or Run summary. Review
columnMapping,ignoredColumns, and the first fivepreviewRecords. All rows are validated even though only five are displayed. An error identifies the affected field and CSV record's ending line without copying its values into the log. - When the mapping is correct, start a new run with Run on my Greenhouse boards, using the same CSV and column controls. A complete board costs $0.04.
Import preview has no board fee, makes no Greenhouse requests, and emits no charge events. Platform usage is included and still has an underlying resource cost. It validates input structure, not whether a posting exists or the mapping matches your intended meaning. It produces no reconciliation dataset rows. It does not turn invalid live input into a preview.
API inputs use mode: "import-preview" to preview. The seven optional controls are csvLocalIdColumn, csvBoardColumn, csvJobIdColumn, csvTitleColumn, csvLocationColumn, csvJobUrlColumn and csvProtectedFieldsColumn; csvIgnoreExtraColumns defaults to false. These controls apply only to CSV. JSON records keep the original schema. The following import-preview example is authored data, not a live source check:
{"mode": "import-preview","boards": ["examplecompany"],"sourceAccessConfirmed": true,"inventoryCsv": "Record ID,Board,Posting ID,Job Title,Apply Link,Protected,Notes\nrefresh,examplecompany,2,Engineer,https://local.example.org/apply?campaign=ours,jobUrl,Not imported\nmissing,examplecompany,6,Previous posting,,,Not imported\n","csvLocalIdColumn": "Record ID","csvBoardColumn": "Board","csvJobIdColumn": "Posting ID","csvTitleColumn": "Job Title","csvJobUrlColumn": "Apply Link","csvProtectedFieldsColumn": "Protected","csvIgnoreExtraColumns": true}
Patch paths always refer to the canonical mapped record (localId, board, jobId, title, location, jobUrl), not your CSV's original header names. Protected-field cell values also keep the canonical names, such as title|jobUrl. No patch or CSV change is applied automatically.
Understand your results
| Action | Meaning |
|---|---|
KEEP | The selected, supplied values match |
REFRESH | An unprotected field needs a proposed update |
PROTECTED_DIFFERENCE | Differences occur only in protected fields |
DUPLICATE_LOCAL | Several local records share the board/posting key; no patch |
REVIEW_UNLISTING | A local posting is absent from a complete source board; review it |
DISCOVERED | A source posting has no matching local record |
UNKNOWN | Retrieval, completeness or a limit prevented reliable comparison |
INVALID | A board-list entry is unsupported |
Missing postings are review items. They are not proof that a role was filled and never generate delete or deactivate instructions. Unavailable or incomplete boards leave your inventory untouched.
The default dataset is the flat table, available through Apify's output views and exports. Use JSON for nested arrays and patches. Rows include rowKey, boardToken, jobId, current/source values, action codes and boardResultKey.
In the run's key-value store, BOARD-{token} holds a board evidence packet with source URL, observation time and response hash. Hashes identify observations; they are not Greenhouse signatures. OUTPUT reports board outcomes, limits and separate eligible, attempted, confirmed-charged and charge-unknown totals. A complete empty board needs no artificial job row: its packet is the useful result.
A run may deliver useful data and end PARTIAL, SPENDING_LIMIT or TIME_LIMIT. Completed results remain available. A successful cloud process alone does not mean every requested board completed.
Pricing: $0.04 per complete board
The example preview has no per-board fee.
One board-reconciled event costs US$0.04, with platform usage included. It covers a unique board's complete saved packet and committed rows. There is no job-row fee or start fee.
The optional CSV import preview also emits no charge events; it only validates your input and shows its mapping.
| Complete delivered boards | Board-event price |
|---|---|
| 1 | $0.04 |
| 2 | $0.08 |
| 25 | $1.00 |
Valid empty boards and complete checks requiring no corrections qualify. Failed, invalid, oversized, incomplete or undelivered boards do not. Duplicate board inputs share one check and event. Each independently requested run is a fresh check.
The Actor reserves $0.04 before starting a board and respects a stricter spending limit. Below $0.04, source work stops. Ambiguous charge responses remain unknown and are not retried by the application; unknown is not a confirmed zero charge.
Scope and limits
Up to 25 board inputs, 500 source jobs and 500 output rows per board, and 5,000 rows per run. Complete packets are limited to 512 KiB; input and source bodies to 2 MiB. Limit violations produce explicit uncharged diagnostics, never a silently truncated complete board.
Only the official public Greenhouse Job Board API is used. Selected fields are posting ID, title, location, public job URL and source update timestamp. Public accessibility is not an unrestricted redistribution licence.
Does it monitor jobs or update my database?
Your supplied catalogue is the baseline for each run. There is no cross-run monitoring database, automatic catalogue write, notification service or preconfigured schedule. Checkpoints support conservative current-run recovery; they are not job history.
Does it collect descriptions, applicants or other ATS data?
No. It checks specified public Greenhouse boards. It excludes descriptions, salary enrichment, applicants, private Harvest data, other ATS sources, company discovery and hosted-page scraping.
Why is a board unknown?
A 404 is unavailable, not verified empty. Denied access, redirects, inconsistent totals, malformed jobs and exceeded limits also prevent completeness. Transient failures receive at most one bounded retry. Check OUTPUT.boards and reasonCodes before acting.
Local source usage
The source package includes a local CLI with dry-run billing. From its directory, using Python 3.12:
python3.12 -m venv .venv. .venv/bin/activatepython -m pip install -r requirements.lockpython -m pytest -qpython -m reconciler --input examples/catalogue.json --transport fixture --fixture-dir fixtures/boards --output-dir artifacts/my-demo --billing dry-run
The authored demo includes a failed board: expect eight rows, PARTIAL, exit 3, and one hypothetical event. Input errors exit 2; complete local runs exit 0. Local mode uses no Apify credentials or real billing. Its CSV writer neutralises formula prefixes while preserving original JSON values. Detailed engineering instructions and test evidence accompany the local source package.
To preview the mapped CSV example locally without any source request:
$python -m reconciler --input examples/csv-import.json --preview-import --transport fixture --output-dir artifacts/import-preview --billing dry-run
Read IMPORT_PREVIEW.json or OUTPUT.json; expect IMPORT_PREVIEW_COMPLETED, no source requests and no hypothetical charge. Use a fresh output directory for a subsequent live reconciliation.