Remote Jobs Scraper: Worldwide vs US-only Filter, 6 Boards
Pricing
from $4.80 / 1,000 results
Remote Jobs Scraper: Worldwide vs US-only Filter, 6 Boards
Remote jobs from six boards, each tagged worldwide, region-restricted or hybrid, with the employer's sentence as proof. Set eligibleFrom to your country to keep only jobs you can apply to. Duplicates removed, only-new mode, no API key. English only.
Pricing
from $4.80 / 1,000 results
Rating
5.0
(1)
Developer
Ben
Maintained by CommunityActor stats
0
Bookmarked
1K
Total users
101
Monthly active users
2 days ago
Last modified
Categories
Features
Share

Which remote jobs can I apply to from my country? This Actor reads six remote job boards and sorts every job as worldwide, restricted to a country or region, or unclear, using the employer's own sentence. remote_scope is that label, eligible_locations lists the places named, and eligibility_evidence quotes the sentence. Set eligibleFrom to your country to filter.

A restricted job, as the Actor returns it (the board says "Worldwide", the employer's text says otherwise):
{"title": "Senior Backend Engineer","location": "Worldwide","remote_scope": "restricted","eligible_locations": ["United States"],"eligibility_evidence": "Applicants must be eligible to live and work in the US","work_arrangement": "remote"}
| Who you are | What you get |
|---|---|
| Job seeker | Run with "eligibleFrom": ["Germany"] and get worldwide jobs plus jobs open to Germany, Europe or EMEA, each with the sentence to check before you apply. |
| Job board or newsletter | Import one deduplicated feed across six boards, with remote_scope to separate worldwide roles from region-locked ones, and onlyNew for a daily digest. |
Merged duplicate title/company pairs become one row, and work_arrangement flags hybrid jobs. The Actor reads Arbeitnow, Jobicy, Himalayas, RemoteOK, Remotive and Working Nomads.
Four inputs to copy
Paste one into the Input tab (JSON view) and press Start. All four read the same six boards.
1. Jobs I can apply to from Germany (use any country name or ISO-2 code, such as DE, IN, BR):
{ "eligibleFrom": ["DE"], "excludeHybrid": true, "maxTotalJobs": 50 }
2. Worldwide or open to the United States (usOnly adds the US to eligibleFrom):
{ "usOnly": true, "searchQueries": ["python developer"], "maxTotalJobs": 50 }
3. Paid at least $80,000 a year, posted this week (jobs with no usable salary are kept unless you add salaryOnly):
{ "minSalaryUsd": 80000, "postedWithinDays": 7, "maxTotalJobs": 50 }
4. Only jobs I haven't seen yet (schedule it daily; the first run stores a baseline, later runs return new jobs only):
{ "searchQueries": ["react"], "onlyNew": true, "monitorId": "daily-react", "postedWithinDays": 14, "maxTotalJobs": 30 }
One real row from a run on October 29, 2026 with the employer's sentence as proof:
| Field | Value |
|---|---|
title / company | Head of Technology / Sanctuary Computer |
platform | remoteok |
location (board) | empty |
remote_scope | worldwide |
eligibility_evidence | "…engineering standard, and builds the culture that holds it. You can be based anywhere" |
Kept by eligibleFrom: ["DE"]? | Yes. A restricted job such as "Resident in Spain for the last 5 consecutive years" is dropped. |
How do I find remote jobs that are really open worldwide?
A worldwide remote job is one whose posting names no country, region or time-zone limit on who may apply. Many jobs a board files under "Worldwide" or "Global" are not: the employer's own text asks for US work authorization, residence in one country, or office days. This Actor reads that text for every job and fills three fields. remote_scope is worldwide, restricted or unknown. eligible_locations lists the countries or regions named. eligibility_evidence quotes the sentence that decided it, so you can check it yourself. When the board's label and the employer's sentence disagree, the sentence wins. Set eligibleFrom to your country and the run keeps worldwide jobs plus jobs open to you. In a run of 80 engineering jobs on October 29, 2026, 4 were worldwide, 44 restricted and 32 named no place.
Two rows from that run, as the Actor returned them:
[{"title": "Quality Assurance Rater - Spanish speakers in Spain","company": "TELUS Digital","platform": "workingnomads","location": "Global","remote_scope": "restricted","eligible_locations": ["Spain"],"eligibility_evidence": "…r with excellent communication skills in Spanish & English. Resident in Spain for the last 5 consecutive years","work_arrangement": "remote"},{"title": "Head of Technology","company": "Sanctuary Computer","platform": "remoteok","location": "","remote_scope": "worldwide","eligible_locations": [],"eligibility_evidence": "…engineering standard, and builds the culture that holds it. You can be based anywhere","work_arrangement": "remote"}]
The board files the first job under "Global", but the employer asks for five years of residence in Spain. The second job has no location on the board, and the employer's text opens it to anyone.
| Board filter | What it misses | What this Actor returns |
|---|---|---|
| "Worldwide" or "Global" location label | Jobs whose text requires residence or work authorization in one country | remote_scope: restricted, the country in eligible_locations, the sentence in eligibility_evidence |
| Board-level US-only filter | Time-zone limits ("CET +/- 3 hours") and region limits (EMEA, LATAM) | The time zone mapped to a region such as Europe or North America, matched against eligibleFrom |
| "Remote" tag | Hybrid jobs that ask for office days | work_arrangement: hybrid, dropped with excludeHybrid |
Who can actually apply
Each row says who can apply, read from the board's location field and from the employer's own sentence in the description:
remote_scope:worldwide,restricted(a country, region or time zone is named) orunknown(the listing names none)eligible_locations: the countries and regions named, for example["United States", "Canada"]or["EMEA"]. A time zone requirement such as "CET +/- 3 hours" becomesEurope, "EST and CST" becomesNorth Americaeligibility_evidence: the sentence it came from, such as "Applicants must be eligible to live and work in the US", so you can check it yourselfwork_arrangement:hybridwhen the text asks for office days ("hybrid work model", "3 days a week in the office"), elseremotevisa_sponsorship:truewhen the employer says it sponsors a visa ("visa sponsorship available", "we will sponsor"),falsewhen it says it does not ("unable to sponsor", "without sponsorship"),nullwhen the text says nothing;visa_sponsorship_evidencequotes the sentence
The employer's sentence wins over the board's label: a job filed under "Worldwide" whose text says "must be authorized to work in the United States" is restricted to the United States. A worldwide claim in the text only fills an empty location field. Pay ranges "for candidates located in California" are not read as a requirement.
Set eligibleFrom to the countries or regions you can work from (Germany, India, Brazil, Europe, EMEA, LATAM) and the run keeps worldwide jobs plus jobs whose named places include you: a job for Europe or EMEA passes for Germany, a job for the United States does not. Jobs with unknown scope are dropped unless includeUnclearEligibility is on. excludeHybrid drops hybrid rows, and visaSponsorshipOnly keeps only jobs that say they sponsor a visa.
![Ten real rows for "eligibleFrom": ["Germany"]: five jobs kept (worldwide, Germany, EU) and five dropped (US, Canada, UK, North America, no place named), each with the employer sentence that decided it](https://images.apifyusercontent.com/pvjNIo50Y49w-csjALdpn_WiqRIIJsM60Ju8rTVH6dM/w:1800/cb:1/aHR0cHM6Ly9hcGkuYXBpZnkuY29tL3YyL2tleS12YWx1ZS1zdG9yZXMvYkJ6UDRzY3hrMEc1SHV6WnUvcmVjb3Jkcy9yZW1vdGUtam9icy1hZ2dyZWdhdG9yLW91dHB1dC0xLnBuZw.webp)
Limits: the reading is pattern-based and in English. City names outside the US are not mapped to a country (an Arbeitnow job in "Berlin" stays unknown), "+ 35 other countries" lists only the countries it names, and a requirement written in an unusual way can be missed. In a sample of 179 jobs from all six boards on October 26, 2026, 117 were restricted, 10 worldwide and 52 unknown; for 37 of them the answer came from the employer's sentence rather than the location field, and 2 were hybrid.
Need this as a managed weekly feed?
We run it for you: fresh remote job listings, filtered to your roles and regions, deduplicated and delivered weekly as CSV or JSON (other formats on request). You get a free sample before paying. Tell us what you need →
Use it for a one-off export or switch on onlyNew for a scheduled hiring feed. Export JSON, CSV, or Excel; call it through the API; send rows to Google Sheets; or connect the dataset to n8n, Make, Zapier, Slack, and email.
Try it: New remote Python jobs, daily (only-new alert, set it up)
n8n templates: email alerts and Google Sheets + Slack workflows
Pricing: $15 per 1,000 jobs on the Free plan until November 9, 2026 ($13.50 Bronze, $12.75 Silver, $12 Gold, $11.25 Platinum, $10.50 Diamond). From November 9, 2026: $6 per 1,000 jobs on Free, $5.40 Bronze, $5.10 Silver, $4.80 on Gold, Platinum and Diamond. The run-start event costs $0.00005 per GB of allocated memory, with a minimum of one event. Salary fields come at no extra charge in the current build. A 20-job run at 512 MB costs about $0.30 on Free, $0.12 from November 9. No output means no result charge, but the start event still applies. See Older builds if you pin a build.
What does this remote jobs scraper do?
Job APIs rarely agree on names. One calls the employer company_name; another nests it inside a company object. Dates, employment types, locations, and salary fields differ too. This Actor handles those differences and returns one dataset.
The selected boards run concurrently. If one is unavailable, the working sources can still return data and the log identifies the failed board. If every selected source fails, the run fails instead of reporting a successful empty update. No source login or API key is required.
Fields in each job row
- title, company, location, and work type
- salary when published by the source
- normalized job type, plus inferred seniority
- the full description supplied by the source, normalized to plain text, and tags
- source board, application URL, and posting date
sources, every board that lists the same title and company, each with its own URLjob_id, a stable fingerprint for downstream deduplicationscraped_at,is_new,monitor_id, andfirst_seen_atremote_scope,eligible_locations,eligibility_evidenceandwork_arrangement: who can actually apply, see abovevisa_sponsorshipandvisa_sponsorship_evidence: whether the employer sponsors a visa, see abovesalary_usd_yearly_minandsalary_usd_yearly_max: the salary as whole US dollars per year, so pay from different boards can be sorted and compared
Search and exclusion filters inspect the complete description returned by each source, without a 1,000-character cutoff. HTML formatting is removed and entities are decoded. If a source supplies only an excerpt or no description, the Actor preserves that limitation.
A missing salary or date stays null. Salary currency and period are included when the feed supplies them; amounts without units must not be assumed to be annual USD. Feed salaries are not independently verified offers.
The USD-per-year fields convert hourly (×2,080), daily (×260), weekly (×52) and monthly (×12) pay, and EUR, GBP, CAD, AUD and twelve other currencies at fixed rates of October 2026. They stay null when the currency is not stated (RemoteOK's fields are taken as US dollars per year, as that board publishes them) or the pay is per task or project. "$50-$75 /hour" becomes 104000 and 156000.
Questions people ask
How do I find remote jobs I can apply to from Germany? Run with "eligibleFrom": ["Germany"]. You get worldwide jobs plus jobs that name Germany, Europe or EMEA. Add "excludeHybrid": true to drop jobs that want office days.
What about jobs that don't say where they are open? They have remote_scope: unknown and are dropped by default. Set "includeUnclearEligibility": true to keep them, and read eligibility_evidence or the location field yourself.
How reliable is the tagging? It reads the board's location field and the employer's own sentences by pattern, in English only. A requirement worded in an unusual way can be missed and non-US city names are not mapped to a country, so check eligibility_evidence before you apply.
🤖 For AI agents
Use it for "find remote jobs I can apply to from
{"eligibleFrom": ["Germany"], "postedWithinDays": 7, "maxTotalJobs": 20}
The run returns one dataset row per job. Read title, company, location, salary_usd_yearly_min, remote_scope, eligibility_evidence, url and platform; remote_scope says who can apply. Add "onlyNew": true with a monitorId to get only jobs not returned before on later runs, so a scheduled agent never reads the same job twice. You are charged per job row saved (prices are in the Pricing line above), plus one Actor Start per run. A run with no matching jobs writes no row and has no result charge, and if every selected board fails the run fails instead of reporting an empty success. No credentials besides your Apify token.
Input

| Field | What it controls |
|---|---|
searchQueries | One or more searches, e.g. python developer, react. A job is kept when it matches any of them; inside one search all terms must appear in the job record. A job found by two searches is saved once. Leave empty for all available jobs. |
searchKeywords | One search (older single field, still accepted and searched together with searchQueries). |
platforms | Any combination of arbeitnow, jobicy, himalayas, remoteok, remotive, and workingnomads. |
maxJobsPerPlatform | Up to 500 matches per board (default 25). Arbeitnow, Jobicy and Himalayas are paged; RemoteOK (about 100), Remotive and Working Nomads return what their one feed holds. |
maxTotalJobs | Final cap from 1 to 2,000 (default 20). Setting 0 removes this final cap, not the per-source limits. |
excludeKeywords | Drop rows containing any supplied term. |
companyKeywords | Keep employers whose name contains at least one term. |
locationKeywords | Keep locations containing terms such as Europe, Germany, or Worldwide. |
eligibleFrom | Countries or regions you can work from, as names or ISO-2 codes (Germany, DE, IN, Europe). Keeps worldwide jobs and jobs whose stated eligibility includes you. Empty means no filter. |
usOnly | Preset: adds the United States to eligibleFrom, so you get worldwide jobs plus jobs open to the US. |
minSalaryUsd | Drops jobs whose published pay tops out below this yearly USD amount (hourly and monthly pay are converted). Jobs with no usable salary are kept; add salaryOnly to drop them. |
includeUnclearEligibility | With eligibleFrom, also keep jobs that name no country, region or worldwide hiring. Off by default. |
excludeHybrid | Drop jobs whose text asks for office days. |
visaSponsorshipOnly | Keep only jobs whose text says the employer sponsors a visa. |
jobTypes | Filter normalized full-time, part-time, contract, freelance, or internship roles. |
seniorityLevels | Filter inferred entry, senior, lead, manager, executive, or unspecified roles. |
salaryOnly | Keep only rows with source-provided salary data. |
postedWithinDays | Keep recent postings; 0 disables the date filter. |
onlyNew | Save a baseline and return only unseen jobs on later runs. |
monitorId | Stable name for one saved search, for example daily-python-europe. |
firstRunMode | emitAll returns the bounded baseline; seedOnly stores it without rows. |
resetState | Clear only the selected monitor before this run. Turn it off afterward. |
debugMode | Print source and row details for troubleshooting. |
One-off search example
{"searchQueries": ["python developer", "data engineer"],"platforms": ["arbeitnow","jobicy","himalayas","remoteok","remotive","workingnomads"],"locationKeywords": ["Europe", "Worldwide"],"excludeKeywords": ["unpaid"],"maxJobsPerPlatform": 20,"maxTotalJobs": 50}
Scheduled only-new monitor
{"searchQueries": ["python developer"],"platforms": ["arbeitnow","jobicy","himalayas","remoteok","remotive","workingnomads"],"seniorityLevels": ["senior", "lead"],"postedWithinDays": 14,"onlyNew": true,"monitorId": "daily-senior-python","firstRunMode": "seedOnly","maxJobsPerPlatform": 20,"maxTotalJobs": 30}
Run the second input once to seed today's matches. Later runs return only jobs the monitor hasn't emitted before.
Output
Selected fields from a real Remotive row checked on September 5, 2026:
{"title": "Senior Independent Software Developer","company": "A.Team","location": "Americas, Europe, Israel","salary": "$90 - $150 /hour","salary_usd_yearly_min": 187200,"salary_usd_yearly_max": 312000,"visa_sponsorship": null,"visa_sponsorship_evidence": null,"platform": "remotive","work_type": "Remote","job_type": "Contract","seniority": "senior","url": "https://remotive.com/remote-jobs/software-development/senior-independent-software-developer-1919265","sources": [{"platform": "remotive","url": "https://remotive.com/remote-jobs/software-development/senior-independent-software-developer-1919265"}],"posted_date": "2026-08-16T10:09:34","scraped_at": "2026-09-05T12:31:54.674449","job_id": "26a0ba3158eb37351b76d822","is_new": false,"monitor_id": null,"first_seen_at": null,"index": 4}
This is a dated example, not confirmation that the vacancy remains open.
When the same title and company appear on several boards, the run keeps one row. platform, url and job_id belong to the first board that returned it, so existing integrations see the same fields as before. sources lists every board with its own URL; two or more entries mean the company posted the role in several places, which is a useful sign of how hard it is hiring.
job_id stays stable when a source adds tracking parameters to its URL. A repost with a different published date can appear as a fresh opening.
How only-new monitoring works
The Actor stores monitor fingerprints in a named key-value store inside the run user's Apify account. It doesn't mix state between different Apify users.
Give each saved search a stable monitorId. If you leave it empty, the Actor derives one from the query, selected boards, and filters. Changing that configuration creates a new automatic scope.
On the first run:
emitAllreturns up tomaxTotalJobscurrent matches and records the full fetched baseline.seedOnlyrecords the baseline and returns an empty dataset.
Later runs remove fingerprints already stored for that monitor. Rows beyond maxTotalJobs remain eligible for the next run rather than disappearing. State keeps up to 5,000 fingerprints from the previous 90 days.
If the run reaches its maximum charge, the Actor reports the number of jobs actually saved and remembers only those exported jobs. Unexported matches remain eligible for the next monitor run, including when the spending limit interrupts the first baseline export. Increasing a result limit does not increase the run's maximum charge.
Don't overlap runs using the same monitorId; schedule the next run after the previous one can finish. To start over, run once with resetState: true, then switch it back off.
Get a daily alert of new remote jobs
The ready-made Task New remote Python jobs, daily already holds this input. Open it, change the keyword if you want, and save it to your account:
{"searchQueries": ["python"],"platforms": ["arbeitnow","jobicy","himalayas","remoteok","remotive","workingnomads"],"postedWithinDays": 2,"onlyNew": true,"monitorId": "python-daily","firstRunMode": "emitAll","maxJobsPerPlatform": 3,"maxTotalJobs": 10}
The first run returns today's matches. Every later run returns only jobs this monitorId hasn't returned before, so a run with nothing new ends with an empty dataset and no result charge.
- Run the Task once and look at the dataset.
- Schedule it: Schedules → Create new → Add → your Task, cron
0 8 * * *(every day at 8:00), then Enable. - Slack: on the Task's Integrations tab, add the Slack integration, pick the channel and trigger it on a succeeded run.
- Google Sheets: on the same tab, Add integration → Google Sheets Import & Export, started on a succeeded run, with
{{resource.defaultDatasetId}}as the dataset to append.
Use one monitorId per saved search, and change it (or run once with resetState: true) to start the list over.
Daily alert with n8n
The checked-in n8n template follows a weekday schedule, calls the synchronous dataset endpoint, and builds a digest from only-new rows. Keep the Apify token in an n8n Header Auth credential rather than pasting it into exported workflow JSON.
A practical setup looks like this:
- Import a workflow from the n8n templates.
- Attach an Apify Header Auth credential to the Actor request node.
- Choose one stable
monitorIdand test withfirstRunMode: seedOnly. - Connect the output to email, Slack, a Google Sheet, or your own webhook.
- Activate the schedule only after the first manual run succeeds.
Use cases
- Recruiters can watch several remote boards without rereading the same jobs each morning.
- Hiring-signal teams can track companies, regions, role levels, and salary-bearing openings.
- Job-board operators can import normalized records while keeping source URLs and attribution.
- Analysts can measure remote hiring volume and skill demand over time.
- Career tools can feed current openings into matching, alerting, or research systems.
Source notes
RemoteOK asks API users to credit and link to remoteok.com. Remotive asks for the same credit and says its jobs must not be republished onto Jooble, Neuvoo, Google Jobs, or LinkedIn Jobs. Check each source's current terms before building a public redistribution product.
RemoteOK's free feed may trail current postings by roughly 24 hours. Jobicy can enforce a low request rate. These are bounded current-feed requests, not full-board or historical crawls; a matching job outside the fetched window will not appear. Arbeitnow rows must have the source's remote flag. A failed board produces a warning, while failure of every selected board stops the run.
The September 5, 2026 update repairs RemoteOK dates and Himalayas company, salary and application fields. Previously missing or incorrectly fingerprinted jobs can appear once as new after that correction; existing monitor state is not reset.
FAQ
Do I need API keys for the six boards? No. The Actor uses their public endpoints.
Can I filter by location now? Yes. eligibleFrom filters by where you can work from, using the eligibility read from the listing (see Who can actually apply). locationKeywords matches the raw location text supplied by each source.
Why is a "Remote" job marked restricted? The employer's text names a country, region or time zone, for example "open to candidates based in the US and Canada". eligibility_evidence quotes it.
How is seniority determined? The Actor checks the title and tags for terms such as junior, senior, staff, lead, manager, director, and VP. Roles without a clear signal receive unspecified.
Why did an only-new run return zero rows? No unseen job passed the same query and filters. That empty update is expected and doesn't create per-result charges.
Will changing my search reuse old state? An explicit monitorId keeps its own scope. Automatic IDs change when the search or filters change.
Can I monitor several searches? Yes. Give each saved Task a different monitorId.
What if I accidentally reset a monitor? The next run treats it as new. Use seedOnly if you want to rebuild the baseline without sending the current jobs downstream.
Which jobs sponsor a visa? Set "visaSponsorshipOnly": true. Only jobs whose text says so pass; most listings say nothing either way, so expect a short list. Check visa_sponsorship_evidence before you apply.
Why is salary empty on many rows? Arbeitnow doesn't expose salary in its API, and many employers leave pay blank elsewhere. Use salaryOnly when missing salaries aren't useful.
Can I call it through Python, JavaScript, Make, or Zapier? Yes. Use the Actor API or a saved Task. The default dataset endpoint returns the normalized rows.
Is the data legal to use? The Actor calls public job APIs rather than bypassing browser controls. Follow source terms, preserve required attribution, and handle any personal data under applicable privacy and employment rules.
Older builds
Older pinned builds can still charge a legacy $0.01 salary-extracted event ($0.003 from November 9, 2026) when a row has a salary. The latest build never charges it, so use latest unless you pinned an older build on purpose.
Works with
How do I find remote jobs I can actually take from my country? Set eligibleFrom to your country here to search six boards, then check one company's own board with Greenhouse Jobs Scraper. Both return remote_scope (worldwide, region or country) read from the employer's own text, plus a hybrid flag, so the two outputs use the same eligibility fields.
Which one should I use?
- Need Germany only? Use Arbeitsagentur Jobs Scraper: it reads the Federal Employment Agency's official German vacancies, with radius search.
- Need relocation or visa jobs? Use Relocate.me Jobs Scraper: it lists tech jobs abroad that offer relocation help or visa sponsorship.
- Need one company's own openings? Use Greenhouse Jobs Scraper: it reads postings straight from a company's own career board, with the employer's full text.
- Need just Remotive? Use Remotive Jobs Intelligence: it covers the Remotive board only, with extra fields on each job.
🔗 You might also like
- Tech Stack and Email Provider Detector — for company research: paste the hiring companies' domains and see their tech stack and email provider.
Keywords: remote jobs scraper, RemoteOK scraper, Remotive scraper, Himalayas jobs scraper, remote jobs API, only new job alerts, hiring signals, job monitor, Arbeitnow API, Jobicy API, Himalayas jobs, RemoteOK API, Remotive API, Working Nomads jobs, recruitment data, n8n job alerts, remote hiring feed, job listings export, scheduled job scraper, Slack job alerts, Google Sheets jobs, visa sponsorship jobs, remote salary in USD.