Career-Site Jobs — Paste a Domain avatar

Career-Site Jobs — Paste a Domain

Pricing

from $0.80 / 1,000 jobs

Go to Apify Store
Career-Site Jobs — Paste a Domain

Career-Site Jobs — Paste a Domain

Never pay for a domain we couldn't resolve. Paste a company domain — we find its Greenhouse, Lever, Ashby or Workday board and return every live opening. Nine ATS platforms, one box — no board tokens needed.

Pricing

from $0.80 / 1,000 jobs

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

29 minutes ago

Last modified

Share

Never pay for a domain we couldn't resolve. Paste a company domain — we find its Greenhouse, Lever, Ashby or Workday board and return every live opening. Nine ATS platforms, one box — no board tokens needed.

From $0.80/1,000 jobs — all-inclusive pay per event, no start fee, charged only on delivery. Issues answered in about 3 hours.

Every row carries charged and missReason, so you can reconcile the invoice from the dataset itself without opening the console. Only rows with charged: true were billed.


Output — a real row

{
"source": "greenhouse",
"sourceJobId": "6136160004",
"jobUrl": "https://job-boards.greenhouse.io/vercel/jobs/6136160004",
"applyUrl": "https://job-boards.greenhouse.io/vercel/jobs/6136160004",
"title": "Account Executive, Commercial",
"company": "Vercel",
"companyDomain": "vercel.com",
"location": { "raw": "Hybrid - London", "city": "Hybrid - London", "region": null, "country": null },
"isRemote": null,
"employmentType": null,
"department": "Account Executive",
"salary": null,
"postedAt": "2026-08-06T16:50:10.000Z",
"updatedAt": "2026-08-18T22:06:19.000Z",
"scrapedAt": "2026-08-27T10:00:00.000Z",
"descriptionText": "About Vercel:\n\n Vercel is the agentic infrastructure company. We free people and agents to ship what's next…",
"descriptionHtml": "<div class=\"content-intro\"><h2>About Vercel:</h2>…",
"atsPlatform": "greenhouse",
"atsBoardToken": "vercel",
"resolvedVia": "careers-link",
"dedupeKey": "greenhouse:vercel:6136160004",
"charged": true,
"missReason": null
}

Plus one company row per domaindomain, companyName, atsPlatform, boardUrl, openRoleCount, sharedRoleCount (openings already delivered — and charged once — under another company in the same run), totalOpenRoles, resolved, resolvedVia — and one summary row with delivered, stoppedBy, resumeCursor and chargedEvents.

See a whole run's output before you spend anything: real dataset from a verified run — six live openings from vercel.com and linear.app, their two company rows, and the run summary, exactly as this actor returned them.

fieldnotes
title · company · companyDomaincompany is filled when the board publishes it
location{raw,city,region,country} · isRemoteas the board states it — never inferred
employmentType · department
salary{min,max,currency,period,isEstimate}null unless the company published a range
postedAt · updatedAt · scrapedAtISO 8601; null when the board only gives relative text
descriptionText · descriptionHtmlfull description where the board's API includes it
jobUrl · applyUrlthe company's own posting, not a re-hosted copy
atsPlatform · atsBoardToken · resolvedViahow we found the board
charged · missReason · dedupeKeythe reconciliation trio

Agent / API paste-block

Actor: steadyfetch/company-jobs-by-domain
Required: domains (array of company domains, careers URLs, board URLs or names)
Optional: atsFilter (array: greenhouse | lever | ashby | workday | workable |
smartrecruiters | rippling | personio | teamtailor)
remoteOnly (boolean, default false — keep only openings the board
marks remote; filtered openings are never charged)
postedWithinDays (integer 1-30 — keep only openings posted that recently;
filtered openings are never charged)
maxItems (integer, default 1000 — hard cap for the whole run)
maxItemsPerCompany (integer, default 200)
maxRunSeconds (integer, default 900 — clean stop, never a timeout kill)
Charges: job once per delivered opening
company-checked once per company with a definitive answer (including a
verified zero-openings result)
Build spec: https://apify.com/steadyfetch/company-jobs-by-domain/api
Token: https://console.apify.com/settings/integrations
curl -X POST "https://api.apify.com/v2/acts/steadyfetch~company-jobs-by-domain/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"domains":["stripe.com","linear.app"],"maxItemsPerCompany":50}'

Hiring platforms

Greenhouse · Lever · Ashby · Workday · Workable · SmartRecruiters · Rippling · Personio · Teamtailor. Each is read from that platform's own public job-board API, so the data is whatever the company published, unchanged.

How a domain becomes a board (resolvedVia tells you which one happened):

resolvedViawhat it means
board-urlyou pasted the board URL — no lookup needed
careers-linkthe company's own careers page links its board
token-patternthe domain name matched a board token and that board returned live openings
name-probesame, from a company name instead of a domain

A board found by guessing the token only counts when real openings come back. An empty board reached by guesswork is not a match, so it is never charged.

What you are never charged for

situationmissReasonrun status
No hiring board found for the domainUNRESOLVED_DOMAINSUCCEEDED — the row lists every platform checked
The board rate-limited or dropped usTHROTTLEDSUCCEEDED — re-runnable, and the row says so
The board answered with an access challengeCHALLENGEDSUCCEEDED — re-runnable
The board was unavailable this runSOURCE_UNAVAILABLESUCCEEDED — re-runnable
The board answered and listed nothingCLEAN_EMPTYSUCCEEDED
A domain, URL or name we could not readUSER_INPUTSUCCEEDED — the row names the fix
Your own maxItems / maxRunSeconds / cost capSTOPPED_AT_LIMITSUCCEEDED — summary row + resumeCursor

The one exception: COMPANY_NO_OPENINGS charges the company-checked event and no job rows. Confirming a company is not hiring is a real answer, and it is the answer that costs you the least.

We never guess. A rate limit is reported as a rate limit, not as "this company has no board" — a temporary problem is never dressed up as a permanent verdict.

This actor may fail when a hiring platform changes things. The two you are most likely to see are UNRESOLVED_DOMAIN (we checked every platform and found no board) and THROTTLED (a board rate-limited us). Both ship as a row with charged: false, the run still SUCCEEDS, and the row says whether re-running can help.

Filters you can set, and what they cost you

remoteOnly and postedWithinDays narrow what is delivered, and an opening they leave out is never charged. They lean on what each board actually publishes: Greenhouse and Workday publish no remote flag at all, and a few boards publish no posting date. An opening we cannot check against your filter is left out too — and the company's own row says how many, so a filter can never read as "this company has no openings". A board emptied by your filters keeps missReason: null for exactly that reason.

Limits are hard limits

maxItems, maxItemsPerCompany and maxRunSeconds stop the run exactly where you set them. The run still finishes successfully, the summary row names which limit bound, and resumeCursor lists the companies that were not reached — so you continue from there instead of paying to re-walk what you already have.

And they hold across a restart. If the platform moves your run to another server mid-way — or you resurrect it yourself — the run reads back what it already delivered and picks up from there: no duplicate rows, no second charge for an opening you already have, and your row cap still means what it says. Resurrecting a run that already finished costs nothing and returns the same dataset.

FAQ

The company isn't on any ATS — what now? The company row lists every platform that was checked. If you know the board URL, paste it directly (https://jobs.lever.co/acme) and we skip the lookup entirely.

Can I search jobs across boards instead of by company? Not with this actor — it answers "is this company hiring, and for what". A job board URL (LinkedIn, Indeed, Glassdoor) is rejected with a guidance row rather than treated as an employer.

How do I chain this after a company-list scraper? Feed the domains array from any actor that outputs company domains. Same-company duplicates across input shapes are delivered once and charged once — the later company's row reports them in sharedRoleCount instead of claiming them again.

Why is company sometimes empty? Several board APIs do not publish the employer name in their listing payload. We leave the field null rather than invent one; companyDomain and the company row always identify it.

Does {} cost anything? No. With no domains it returns uncharged sample rows so you can see the exact output shape before spending anything.


Steadyfetch jobs suite

One actor per source, one job each, the same row shape — so a pipeline built on one source takes the next without a rewrite. All-inclusive pay per event, no start fee, charged only on delivery.

SourceActor
IndeedIndeed Jobs — Stops at Your Limit
A company's own career site (paste a domain)this actor
Glassdoor, with the employer ratingGlassdoor Jobs + Employer Rating
Several boards at once, de-duplicatedMulti-Board Jobs — No Duplicates

The rest of the steadyfetch shelf — same contract everywhere: all-inclusive pay per event, no start fee, charged only on delivery.

FamilyActors
Ad creative intelligenceFacebook · Google Ads video · TikTok · LinkedIn · Google Ads text & OCR
Trends & keywordsGoogle Trends · Trends Now · Breakout keywords · Autocomplete keywords · Keyword volume & CPC · Social trends
YouTube transcriptsYouTube videos · YouTube channels
InstagramReel transcripts · Profile posts
JobsIndeed · Career sites by domain · Glassdoor · Multi-board
AmazonProducts · Search · Bestsellers · Sellers
Any media fileSpeech to Text · any link or file

Unlinked names are publishing shortly on the same account — search steadyfetch on Apify Store.