Working Nomads Scraper - Remote Jobs Data API (No API Key)
Pricing
from $6.15 / 1,000 results
Working Nomads Scraper - Remote Jobs Data API (No API Key)
Scrape remote jobs from Working Nomads: title, company, salary, skills, category, location, apply URL and full description, as JSON, CSV or Excel. Filter by keyword, category, tag, company, salary and date. Digital nomad and work-from-home job listings API. No API key, no login.
Pricing
from $6.15 / 1,000 results
Rating
5.0
(2)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Working Nomads Scraper - Remote Jobs Data API
Scrape remote job listings from Working Nomads without an API key or login. This Working Nomads scraper turns the curated global remote-jobs board into clean, structured remote jobs data you can export to JSON, CSV or Excel, or pull straight from an API. It is built for recruiters, job-board aggregators, sales teams, market researchers and anyone who needs work-from-home and digital-nomad job listings at scale.
Every job comes back normalized: job title, company, category, skill tags, location and region, posted date, apply URL and the full description as both clean text and HTML, plus derived fields you would otherwise have to compute yourself (parsed salary, seniority, job type, age in days). Turn on detail fetching and each job is enriched from the employer apply page with a structured salary, employment type, application deadline and company logo.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
What you can do with it
- Remote jobs data feed / API. Pull the latest remote job listings from Working Nomads into your own database, ATS, spreadsheet or app, on demand or on a schedule.
- Job-board aggregation. Add curated digital-nomad and work-from-home jobs to a jobs aggregator with normalized fields and stable IDs.
- Sales and recruiting leads. Find companies hiring remotely by category, skill, location or salary, then reach out with the direct apply link.
- Market and salary research. Track which skills, categories and regions are hiring, and analyze the salaries that employers publish.
- Lead enrichment. Match hiring companies to your CRM using the company name, logo and apply domain.
Highest-value keywords covered
Working Nomads scraper, Working Nomads API, remote jobs data, remote job listings API, work from home jobs scraper, digital nomad jobs, remote job board scraper, job board scraper, job postings API, no API key.
Table of contents
- What it does
- How it compares
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor fetches the global Working Nomads remote-jobs feed, applies the filters you pass as input, and writes one normalized record per job to the run's dataset. On top of the raw feed fields it derives extra fields so you can sort and filter without extra parsing: id, region, ageDays, seniority inferred from the title, jobType / employmentType detected from the listing text, and a best-effort salary parse (salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText).
When detail fetching is on, each job's apply page is opened to upgrade the url to its clean canonical apply link, add the applyDomain, the job imageUrl and companyLogo, and, when the employer's page publishes a schema.org JobPosting, a structured salary (salarySource: "structured"), a normalized employmentType and an application deadline (validThrough).
Missing source values are returned as null, never invented. Dates are normalized to ISO 8601. The Working Nomads feed has no server-side search, so every filter is applied by the actor after the feed is fetched.
How it compares
A strict superset of the other Working Nomads and remote-jobs scrapers on Apify: it accepts all of their inputs (plus more) and returns all of their output fields (plus more).
| Capability | This actor | parseforge/workingnomads-scraper | benthepythondev/workingnomads-jobs-scraper | nivlekk / pixflor remote-jobs-aggregator |
|---|---|---|---|---|
Stable job id | ✅ | ❌ | ✅ | ✅ |
| Keyword / search filter | ✅ | ❌ | ✅ | ✅ |
| Category filter | ✅ | ✅ | ✅ | ✅ (via tag) |
| Tag / skill filter | ✅ | ✅ | ❌ | ✅ |
| Company filter | ✅ | ❌ | ❌ | ✅ |
| Employment / job type filter | ✅ | ❌ | ❌ | ✅ |
| Seniority filter | ✅ | ❌ | ❌ | ❌ |
| Min-salary / salary-only filter | ✅ | ❌ | ❌ | ✅ |
| Posted-within-days filter | ✅ | ❌ | ❌ | ✅ |
| Sort by newest / salary | ✅ | ❌ | ❌ | ✅ |
| Full description (text + HTML) | ✅ | ❌ | text only | text only |
| Parsed salary (min/max/currency) | ✅ | ❌ | ❌ | ✅ |
| Structured salary from apply page | ✅ | ❌ | ❌ | ❌ |
| Company logo | ✅ | ❌ | ❌ | logo only |
| Region + apply domain | ✅ | ❌ | ❌ | ❌ |
| Direct canonical apply URL | ✅ | ❌ | ✅ | ✅ |
| No API key or login | ✅ | ✅ | ✅ | ✅ |
Field names are also aliased for drop-in compatibility: company, skills, categories, isRemote, publishedAt / publishedDate, descriptionText, scrapedAt and locationRestrictions are all returned alongside our primary field names, and the inputs search / searchQuery, jobType, maxItems / maxResults are accepted as aliases.
Quickstart
Open the actor, paste this into the input, and press Run. It returns 10 remote Development jobs, with detail pages fetched.
{"maxJobs": 10,"category": "Development","withDetails": true}
Every input field is optional. With an empty input the actor returns the newest remote jobs across every category (default maxJobs is 10).
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
maxJobs | integer | no | 10 | Maximum number of jobs to collect. Aliases: maxItems, maxResults. Free Apify plans are capped at 10 per run. |
withDetails | boolean | no | true | When on, the actor opens each job's apply page to upgrade the url to its clean canonical link and add applyDomain, imageUrl, companyLogo, a structured salary, employmentType and validThrough. Turn off for faster feed-only runs. |
keyword | string | no | (empty) | Free-text term matched against title, company, category, tags and description (case-insensitive). Aliases: search, searchQuery. |
category | enum | no | (any) | Keep only jobs in this category (Administration, Consulting, Customer Success, Design, Development, Education, Finance, Healthcare, Human Resources, Legal, Management, Marketing, Sales, System Administration, Writing). |
tag | string | no | (empty) | Keep only jobs that include this tag/skill (case-insensitive). Example: react, project management, copywriting. |
location | string | no | (empty) | Keep only jobs whose location text contains this term. Example: Latin America, Europe, anywhere. |
company | string | no | (empty) | Keep only jobs whose hiring company name contains this text. |
employmentType | string | no | (empty) | Keep only jobs whose detected employment/job type contains this text. Alias: jobType. Example: Full-time, Contract, Freelance. |
seniority | string | no | (empty) | Keep only jobs whose detected seniority contains this text. Example: Senior, Junior, Lead. |
minSalary | integer | no | (none) | Keep only jobs whose detected salary (max, else min) is at least this amount. |
withSalaryOnly | boolean | no | false | Keep only jobs that state a salary. |
postedWithinDays | integer | no | (none) | Keep only jobs posted within this many days. Example: 7. |
sortBy | enum | no | (feed order) | Order before the cap is applied: newest, oldest or salary. |
proxyConfiguration | object | no | (none) | Standard Apify proxy configuration. Not required; the source is not bot protected. |
Filters combine with logical AND. Leave them empty to collect the newest remote jobs across every category.
Output reference
One dataset item per job. Types: string, boolean, integer, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
id | string | Stable Working Nomads job ID. |
title | string | Job title. |
companyName / company | string | Hiring company name. |
category / categories | string / string[] | Working Nomads category. |
location / locationRestrictions | string | Location or timezone text as published, for example CET (+/- 3 hours), anywhere. |
region | string | Coarse world region derived from the location, for example Worldwide, Europe, Asia-Pacific, or null. |
remote / isRemote | boolean | Always true; every Working Nomads listing is remote. |
tags / skills | string[] | Skill and topic tags for the job, or null. |
url | string | Canonical apply/listing URL (upgraded from the apply page when withDetails is on). |
applyUrl | string | Apply URL for the job. |
applyDomain | string | Host of the apply URL, for example jobs.ashbyhq.com (detail fetch only). |
imageUrl | string | Job or company image from the apply page, or null. |
companyLogo | string | Company logo from the apply page's JobPosting data, or null. |
source | string | Always Working Nomads. |
postedAt / publishedAt / publishedDate | string | Publish date/time in ISO 8601, or null. |
ageDays | integer | Whole days since the job was posted, or null. |
validThrough | string | Application deadline in ISO 8601 from the apply page, or null. |
seniority | string | Seniority inferred from the title: Internship, Junior, Mid, Senior, Lead, Principal, or null. |
jobType / employmentType | string | Employment type: Full-time, Part-time, Contract, Freelance, Internship, Temporary, or null. Upgraded from the apply page's JobPosting when available. |
salaryMin | integer | Parsed minimum salary, or null. |
salaryMax | integer | Parsed maximum salary, or null. |
salaryCurrency | string | Currency code (USD, EUR, GBP, CAD, AUD), or null. |
salaryPeriod | string | Pay period: year, month, week, day or hour, or null. |
salaryText | string | The salary snippet, or null. |
salarySource | string | structured when read from the apply page's JobPosting, parsed when read from the listing text, or null. |
descriptionHtml | string | Full job description as raw HTML. |
description / descriptionText | string | Full job description as clean plain text. |
excerpt | string | First ~200 characters of the clean description. |
observedAt / scrapedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
Real record from a live run (descriptionHtml and description trimmed for readability; the actor returns the full text):
{"id": "1833624","imageUrl": "https://app.ashbyhq.com/api/images/org-theme-logo/…","companyLogo": "https://app.ashbyhq.com/api/images/org-theme-logo/…","title": "Software engineer","companyName": "Sticker Mule","company": "Sticker Mule","category": "Development","categories": ["Development"],"location": "Global","region": "Worldwide","remote": true,"isRemote": true,"tags": ["react", "typescript", "golang", "graphql", "english"],"skills": ["react", "typescript", "golang", "graphql", "english"],"url": "https://jobs.ashbyhq.com/stickermule/6db27241-…?utm_source=workingnomads","applyUrl": "https://jobs.ashbyhq.com/stickermule/6db27241-…?utm_source=workingnomads","applyDomain": "jobs.ashbyhq.com","source": "Working Nomads","postedAt": "2026-09-04T07:55:38.000Z","ageDays": 0,"validThrough": null,"seniority": null,"jobType": "Full-time","employmentType": "Full-time","salaryMin": 150000,"salaryMax": 250000,"salaryCurrency": "USD","salaryPeriod": "year","salaryText": "USD 150000-250000/year","salarySource": "structured","description": "Sticker Mule is building the Internet's most lucrative commerce platform…","excerpt": "Sticker Mule is building the Internet's most lucrative commerce platform by combining…","observedAt": "2026-09-04T12:39:54.203Z","error": null}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~working-nomads-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"category":"Development","keyword":"python","maxJobs":25,"withDetails":true}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~working-nomads-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"tag":"react","location":"anywhere","maxJobs":100}'
Apify CLI:
apify call scrapers_lat/working-nomads-scraper \--input '{"category":"Marketing","maxJobs":50}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per job record returned (
resultevent). WhenwithDetailsis on and a detail page is fetched successfully, an additivedetailsevent is also charged for the enrichment. See the pricing tab for current prices. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. Thedetailsevent is only charged after a job row is delivered and only when its apply page was fetched successfully. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxJobs. - Feed scope. Working Nomads publishes a single global remote-jobs feed. All filters are applied by the actor after the feed is fetched.
FAQ and troubleshooting
Do I need an API key or login for Working Nomads? No. The actor reads only publicly available data and needs no API key, login or cookies.
How many jobs can I get? Working Nomads publishes a curated feed of the latest remote jobs (typically a few dozen at a time). The actor returns every job in the current feed that matches your filters. Run it on a schedule to capture new jobs as they are posted.
A run returned 0 records. Why?
The filter combination matched nothing in the current feed. Loosen filters (remove category or location, or widen keyword). Zero-result runs are not charged.
Why is salaryMin null on some jobs?
Many Working Nomads listings do not state pay. Salary fields are parsed from the listing text, or read as structured data from the employer's apply page when withDetails is on, and stay null otherwise, never invented.
What does withDetails change?
With it on, the actor opens each job's apply page to upgrade the url to its canonical apply link and add applyDomain, imageUrl, companyLogo, a structured salary, employmentType and validThrough. Turn it off for faster feed-only runs.
Are all jobs remote?
Yes. Every Working Nomads listing is remote, so remote / isRemote is always true. Use location or region to filter by area.
Is this an official Working Nomads tool? No. This actor is independent and has no affiliation with Working Nomads. It reads only data that is publicly available on the site.
Related scrapers
- Y Combinator Companies Scraper: startups and hiring companies from the YC directory.
- Yellow Pages Australia Scraper: Australian business listings with contact details.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Working Nomads. Accesses only publicly available data.
