ATS Job Link Verifier — Greenhouse, Lever & Ashby
Pricing
$5.00 / 1,000 verified jobs
ATS Job Link Verifier — Greenhouse, Lever & Ashby
Verify saved Greenhouse, Lever and Ashby job links. Detect missing listings and title changes, with timestamped source evidence and CSV/HTML reports. Duplicates and unknown results have no event fee.
Pricing
$5.00 / 1,000 verified jobs
Rating
0.0
(0)
Developer
Kaito
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
ATS Job Link Verifier
Recheck saved Greenhouse, Lever and Ashby job links before displaying or recommending them. Get a timestamped finding, source URL, title comparison, and downloadable CSV/HTML evidence report.
Designed for job-board maintainers, recruitment data pipelines and job-search automations that already have a list of links. Use it to review saved listings, maintain a job feed, or check links before recommending them.
Results you can interpret
| Status | Meaning | Suggested next step |
|---|---|---|
listed | The exact posting ID appeared in the public source response. | Keep the link; inspect a title mismatch if reported. |
not_listed | The ID was absent from a complete, nonempty public board response, or Ashby explicitly marked it unlisted. | Flag the entry for review. Do not automatically assert the role was filled. |
unknown | The source failed, was empty/unverified, changed shape, or hit a limit. | Retry later or inspect manually. Preserve existing records. |
invalid_input | The URL format/provider or job metadata is unsupported. | Supply a supported job-detail URL. |
A public listing can remain visible after hiring stops. An unlisted posting can still accept applications through a direct link. The Actor does not verify actual hiring activity, employer legitimacy, applicant eligibility, remote-country restrictions, salary, or application success. Responses are observations, not an atomic database snapshot.
Input
{"jobs": [{"url": "https://job-boards.greenhouse.io/canonical/jobs/6448444","expectedTitle": "Associate Linux Support Engineer","label": "Saved vacancy"}],"maxBoards": 30,"maxRequests": 100,"maxDurationSecs": 120}
The example is a real public URL, not a promise that this posting will remain listed. Any current result is valid evidence for the example.
jobs accepts URL strings or objects with url, optional expectedTitle and optional label. Input order is preserved; inputIndex is zero-based. The optional title comparison ignores case, Unicode compatibility differences and repeated whitespace. It is exact text comparison, not a semantic or AI match.
Supported URL shapes
https://job-boards.greenhouse.io/BOARD/jobs/NUMERIC_IDhttps://boards.greenhouse.io/BOARD/jobs/NUMERIC_IDhttps://jobs.lever.co/BOARD/UUID(optional/apply)https://jobs.eu.lever.co/BOARD/UUID(optional/apply)https://jobs.ashbyhq.com/BOARD/UUID(optional/application)
Query strings and fragments are discarded. Custom employer domains, Greenhouse embed URLs, LinkedIn, Indeed, Workday, iCIMS and generic careers pages are not supported in this version. Unsupported URLs are never fetched.
How checks work
The Actor derives a board and job ID from each supported URL, then reads the provider's documented public API. It does not fetch arbitrary input URLs, follow source redirects, log into accounts, solve CAPTCHAs, apply to jobs, or collect applicant information.
Inputs from the same company board share a fetch. Lever boards are paginated in batches of 100. A missing ID is classified not_listed only after successful collection of the full board. A malformed response, repeated IDs, inconsistent Greenhouse total, failed page or collection cap makes missing IDs unknown. Validated presence on an earlier Lever page can still be reported as listed.
Boards can change during pagination. There is no transactional snapshot guarantee. Empty boards are unknown because an empty response does not reliably distinguish an inactive board from a mistyped company identifier.
Ashby's isListed: false produces not_listed with source_marks_unlisted, even if the posting is still publicly accessible. This is different from absence and is visible in reason.
Output
The default Dataset contains one evidence row per input, unless the spending limit stops delivery. Each row includes:
url,provider,board,jobId,inputIndex,label;status, machine-readablereason,checkedAtin UTC;title,location,expectedTitle, nullabletitleMatches;evidenceUrlpointing to the public board API;boardComplete,boardJobCount, nullablehttpStatus;- nullable
duplicateOf, pointing to the first equivalent input index.
The key-value store also receives:
SUMMARY: result counts, request count, transferred decoded bytes, duration and omissions;RESULTS.csv: flattened spreadsheet export with formula-like cells escaped;REPORT.html: self-contained, printable evidence report without remote assets or scripts.
Sources can change after the report is generated. API links in reports point to the live source, not an archived response. Full board payloads and job descriptions are not retained. Source metadata is limited to 1,000 characters per text field.
Limits and cost controls
| Setting | Default | Maximum |
|---|---|---|
| Input jobs | Required | 1,000 |
maxBoards | 30 | 50 |
maxBoardJobs | 5,000 | 10,000 |
maxRequests | 100 | 200 |
concurrency | 3 | 5 |
timeoutSecs | 20 | 30 |
maxDurationSecs | 120 | 300 |
Decoded responses are capped at 10 MiB each. Requests are paced to at most four starts per second across all sources, with no automatic retries. Rate limits stay unknown; rerun later. The source deadline excludes startup and storage/export time. Extra boards and interrupted checks produce explicit unknown rows.
Pricing and spending limits
The paid event is Verified job (job-verified). One unique URL with a listed or not_listed result creates one event. Duplicates, unsupported inputs and unknown results create no paid event. Check the Store pricing panel for the current event price and whether platform usage is charged separately.
There is no paid startup event or paid dataset-row event. Set your maximum run cost before starting. If the event budget is exhausted, the Actor stops delivering results before the next paid row. The CSV and HTML contain only delivered rows. SUMMARY.omittedDueToBudget and nextInputIndex show where delivery stopped.
Source checks happen before result delivery. An event spending limit does not bound the work spent reading sources; use maxRequests, maxBoards and maxDurationSecs as well. A budget below the price of one verified job stops the run before source requests.
Example finding
{"inputIndex": 0,"provider": "greenhouse","board": "canonical","jobId": "6448444","status": "listed","reason": "id_present_in_public_board","title": "Associate Linux Support Engineer","titleMatches": true,"boardComplete": true,"duplicateOf": null}
This is a shortened example from a successful check on 22 October 2026 (Asia/Almaty), not a guarantee about the current listing. Actual rows also include the source URL and UTC observation time.
Common questions
Does a missing listing mean the employer stopped hiring? No. not_listed describes public board visibility. Review the posting before deleting it from your own system.
Can I check a spreadsheet? Supply its supported job URLs as the jobs JSON array. Download RESULTS.csv when the run finishes; each output keeps the original input index.
Why did a link return unknown? Inspect reason. Source errors, empty boards, rate limits and incomplete collection are kept separate from absence. Retry later or inspect manually.
Can I resume a stopped run? Start a fresh run with the remaining input tail. Resurrection of an already-started run is rejected to prevent duplicate delivery and charges. After a storage or billing failure, inspect the existing Dataset and charging log before retrying.
Can I request another ATS? Open an issue on this Actor with the provider name and a public example URL. Do not include account passwords or applicant information.