Remote Jobs Scraper — Pay Ranges & Region Eligibility avatar

Remote Jobs Scraper — Pay Ranges & Region Eligibility

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Remote Jobs Scraper — Pay Ranges & Region Eligibility

Remote Jobs Scraper — Pay Ranges & Region Eligibility

Remote roles read from employers' own Greenhouse boards, not from aggregators — so you see openings that never reach RemoteOK or Himalayas. Every row carries the employer's posted pay range (67% of remote roles) and a normalised answer to who may apply: country, region or state.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

mochi

mochi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

Share

Remote job listings taken straight from employers' own job boards, not from a jobs aggregator. Every row tells you three things a remote-jobs feed usually can't: what the employer actually pays, which countries a candidate may be based in, and whether the role is remote-only or also has an office.

Built for anyone assembling a remote-work product: job boards, newsletters, Slack/Discord job feeds, recruiting desks, remote-work researchers, and agents that need structured job data.


Why this is different from every other remote-jobs scraper

Almost every remote-jobs actor on the store reads a third-party aggregator — RemoteOK, Himalayas, Jobicy, Arbeitnow, Remotive, We Work Remotely. Those sites are useful, but they only carry roles a company chose to syndicate to them, and their salary numbers are frequently estimates.

This actor reads the employer's own Greenhouse job board instead. That has three consequences:

Aggregator-based scrapersThis actor
CoverageOnly jobs posted to that one siteEvery open remote role on the company's own board
FreshnessWhatever the aggregator last ingestedThe employer's live board
PayOften estimated, often missingThe range the employer published — 67% of remote roles carry one
EligibilityRaw location string, e.g. Remote - USAParsed: remoteScope, remoteCountries, remoteSubdivisions

Measured on 1,995 live remote postings across 25 company boards (2026-08-05): 67% disclosed a pay range, and the boards used 460 distinct spellings of the location field. Turning that mess into an answerable question is the work this actor does for you.


What it returns

One row per remote role. Selected fields:

Role company · title · jobUrl · department / departments · offices · jobId · requisitionId · firstPublished · updatedAt · daysSinceFirstPublished · language

Remote eligibility (the differentiator)

FieldMeaning
isRemoteThe role is remote in some form
remoteScopeworldwide · region · country · subdivision · unspecified
remoteCountriesISO-3166 alpha-2 codes, e.g. ["US","CA"]
remoteRegionsMacro-regions the posting named: EMEA, APAC, LATAM, NORAM, EUROPE, MENA, ANZ, AFRICA, AMER
remoteSubdivisionsStates/provinces when the role is narrower than a country, e.g. ["ON","BC","AB","NS"]
hasOnsiteOptionThe posting also lists a physical office (i.e. it is hybrid-capable)
remoteUnparsedAny part of the location string we would not guess at — we report it, we do not invent a country
locationThe employer's raw string, always preserved

Pay (parsed into numbers, not strings) hasPayRange · payMin · payMax · payCurrency · payCurrencySymbol · payPeriod (year/month/hour) · payPeriodInferred · payPeriodConflict · payIsOte · paySource (structured or prose) · payRangeRaw · payRangeCount · payRangeSuspect

payRangeCount > 1 means the posting quotes several bands (US pay zones are common) and payMin/payMax are the first of them.


Example row

{
"company": "Coinbase",
"title": "Accounting Manager, GL Operations & Integrations",
"location": "Remote - Canada",
"isRemote": true,
"remoteScope": "country",
"remoteCountries": ["CA"],
"remoteRegions": [],
"remoteSubdivisions": [],
"hasOnsiteOption": false,
"remoteUnparsed": [],
"department": "Accounting",
"hasPayRange": true,
"payMin": 170000,
"payMax": 170000,
"payCurrency": "CAD",
"payPeriod": "year",
"payPeriodInferred": false,
"payRangeSuspect": false,
"daysSinceFirstPublished": 12,
"jobUrl": "https://job-boards.greenhouse.io/coinbase/jobs/7139612"
}

Input

Everything is optional — run it with no input at all and it scans a built-in registry of 128 company job boards, verified live and ordered by how many remote roles each was carrying.

InputDefaultWhat it does
companies[] (use the registry)Company names, board tokens, or board URLs
eligibleInCountry""ISO code, e.g. US, GB, DE, IN, CA — keep only roles someone in that country can take
strictCountryMatchfalseRequire the country to be named outright (drops worldwide, macro-regions and bare "Remote")
maxResults20Rows to write, shared round-robin across boards
maxBoards40Upper bound on boards touched per run
onlyWithPayRangefalseKeep only roles that disclose pay
titleKeywords[]e.g. ["engineer","designer"]
departments[]e.g. ["engineering"]
postedWithinDays0Only roles first published in the last N days
includeDescriptionfalseAdds descriptionText
allowUnverifiedMatchesfalseSee "It refuses rather than guesses" below

Recipes

  • A fresh remote-jobs feed — schedule daily with postedWithinDays: 1.
  • Remote roles a German candidate can takeeligibleInCountry: "DE".
  • Remote pay benchmarkingonlyWithPayRange: true, titleKeywords: ["engineer"].
  • Watch specific employerscompanies: ["GitLab","Coinbase","Samsara"].

Country matching, precisely

eligibleInCountry: "GB" keeps a role when:

  1. the posting names the UK (Remote - UK, United Kingdom (Remote), Remote, United Kingdom), or
  2. it names a macro-region containing the UK (Remote-EMEA, Remote-Europe), or
  3. it is worldwide, or names no place at all (Remote, Distributed).

Set strictCountryMatch: true to keep only case 1. A posting whose location we could not read is never counted as a match under either mode — it is reported in remoteUnparsed instead.


It refuses rather than guesses

  • Ambiguous places stay ambiguous. Remote - CA could be California or Canada. We leave it unresolved rather than pick. Remote - Georgia resolves to the US state only when the posting carries another US signal.
  • A board we are not sure about is skipped, not returned. Resolving the company "Remote" hits the board token remote, which belongs to "General Assembly Remote Jobs". Unverified matches are reported by name, not silently returned as the company you asked for.
  • Bad-looking pay is flagged, not laundered. payRangeSuspect marks bands whose top is more than 20× the bottom — nearly always a typo in the employer's posting.
  • Every run prints its own accounting: postings inspected, remote found, written, over the cap, boards failed, companies unresolved. Also stored under the RUN_SUMMARY key.

  • Source is Greenhouse's documented public Job Board API (boards-api.greenhouse.io/v1/boards/…) — no key, no login, no paywall. Its robots.txt restricts only /embed/, and names no AI crawler; job-boards.greenhouse.io/robots.txt has every directive commented out.
  • Lever and Ashby are deliberately not supported. jobs.lever.co names ClaudeBot with Disallow: /; api.ashbyhq.com/robots.txt returns 401, so permission cannot be established. Narrow and clean beats broad and arguable.
  • Organisation-level data only. Company, role, location, department, pay band. No applicant, employee or recruiter identity is read or emitted — the endpoint exposes none. GDPR/PDPA-safe.

Limits, stated plainly

  • Greenhouse only. Companies on Workday, Lever, Ashby, SmartRecruiters or a bespoke careers page are out of scope for this actor.
  • Coverage is the built-in registry (128 boards, ~3,200 remote roles at build time) plus any company you name yourself. It is not "every remote job on the internet", and does not claim to be.
  • Pay disclosure varies enormously by employer: 100% at some (Affirm, Twilio, Grafana Labs), 2% at others (Stripe). The 67% figure is the population average across the sample, not a promise per company.
  • Greenhouse publishes no documented rate limit; very large maxBoards values are untested.

Output stability — for scheduled and automated use

If you are wiring this into a pipeline rather than clicking Run, this is the contract:

  • Fields are added, not removed or renamed. New columns may appear in a future version; the ones documented above keep their names and types.
  • Pay fields are numbers or null — never a string, never a formatted range.
  • RUN_SUMMARY in the key-value store is the completeness check. It carries boardsFetched, boardsFailed, unresolved, jobsSeen, remoteSeen, written, withPayRange, filtered, a payDisclosurePct for the run, and an unresolved array. Read it instead of trusting the row count — a short run because boards failed looks identical to a short run because nobody is hiring remotely, and only RUN_SUMMARY separates them.
  • Rows are written as they are scraped, not batched at the end. An aborted or timed-out run leaves the postings it already collected in the dataset, so a large maxBoards value that hits a time limit still returns usable data rather than nothing.
  • Found a field that changed on you? Open an issue on the Issues tab. Anything that would break a running pipeline gets a deprecation alias rather than a rename.

Use with AI agents (MCP)

This actor is callable through Apify's MCP server, so an agent can pull remote-eligible roles with pay ranges without you writing any integration code.

Want only this actor as a tool, with no store search in the way? Point the agent at https://mcp.apify.com/?actors=mochiboo/remote-jobs-ats-scraper and it loads as a single named tool — the agent calls it directly instead of searching for it and picking something else.

Every input is optional: with no companies it reads a bundled registry of 128 boards verified live at build time, ordered by remote-role density, so an agent calling it with {} gets a useful sample rather than a validation error.

Support & feedback

Hit a board that will not resolve, or a pay format that parses wrong? Open an issue on the Issues tab with the board token. If it saved you time, a store review genuinely helps; this actor is new and has none yet.