Working Nomads Jobs Scraper
Pricing
Pay per event
Working Nomads Jobs Scraper
Extract current Working Nomads remote jobs with company, category, location, tags, publication date, and full description HTML or text.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Extract the current public Working Nomads remote-job feed into clean, integration-ready dataset rows. Each accepted job includes its canonical URL, title, company, category, location, publication time, tags, and the full description as HTML, plain text, or both.
The Actor uses Working Nomads' anonymous JSON feed directly. It needs no login, browser, proxy, cookie, or user-supplied credential.
What does Working Nomads Jobs Scraper do?
The Actor fetches the jobs currently exposed by Working Nomads, validates each source record, removes duplicate URLs, applies your filters locally, and saves matching jobs to the default Apify dataset.
Use it to:
- refresh a remote-job aggregator;
- monitor companies hiring remotely;
- identify recruiting or hiring signals;
- build regional job alerts;
- feed labor-market analysis;
- export normalized jobs to Sheets, a warehouse, or an ATS workflow.
This Actor deliberately describes its scope as current exposed jobs. It does not claim a complete historical archive or pagination that the public feed does not expose.
Who is it for?
Job aggregators
Schedule recurring runs and merge records by the stable jobId or canonical url.
Recruiters and sourcing teams
Filter by role keywords, employer names, categories, or regions to spot relevant openings.
Sales and lead-generation teams
Treat a new job as a hiring signal, then enrich the company in a downstream workflow.
Labor-market analysts
Capture periodic feed snapshots and analyze role, category, location, and skill-tag changes over time.
Automation developers
Consume typed JSON through the dataset API, webhooks, Zapier, Make, n8n, or Apify integrations.
Why use this Actor?
- HTTP-first: no browser overhead for a public JSON source.
- Useful descriptions: preserve source HTML, get normalized text, or return both.
- Consistent filters: the same local filtering applies whether input starts with
/jobsor the feed URL. - Stable deduplication: deterministic IDs derive from canonical job URLs.
- Fail-closed inputs: unsupported domains, paths, dates, and modes fail instead of silently broadening scope.
- Integration-ready output: primary records go to the default dataset with a table view and API link.
- Cost control: a 256 MB default and no automatic proxy fallback keep runs lightweight.
What Working Nomads data is extracted?
| Field | Type | Meaning |
|---|---|---|
jobId | string | Stable 24-character hash derived from the canonical job URL |
url | URL | Public Working Nomads job detail URL |
title | string | Job title from the source feed |
companyName | string | Hiring company name |
category | string | Working Nomads category, such as Development or Design |
location | string | Remote region, country, or location restrictions |
publishedAt | ISO date-time | Source publication time normalized to UTC |
tags | string[] | Source skill and role tags, split into an array |
descriptionHtml | string, optional | Complete source description HTML |
descriptionText | string, optional | Complete description converted to readable plain text |
sourceUrl | URL | Public feed URL used for the run |
scrapedAt | ISO date-time | Time this Actor normalized the feed |
Description fields depend on descriptionFormat. All identity, company, category, location, publication, tag, and provenance fields remain available in every mode.
How to scrape Working Nomads jobs
- Open the Actor in Apify Console.
- Keep the prefilled public feed URL, or use
https://www.workingnomads.com/jobs. - Optionally add a keyword, categories, locations, or publication-date bounds.
- Choose whether descriptions should contain HTML, text, or both.
- Set
maxItemsto the maximum matching current jobs you want. - Click Start.
- Open Dataset to preview, download, or integrate the resulting rows.
A minimal run needs no fields:
{}
A focused development search:
{"categories": ["Development"],"locations": ["Europe", "North America"],"descriptionFormat": "text","maxItems": 20}
Input parameters
| Input | Type | Default | Details |
|---|---|---|---|
startUrl | string | exposed jobs feed | Public Working Nomads /jobs or /api/exposed_jobs/ HTTPS URL |
query | string | none | Case-insensitive substring across title, company, category, location, tags, and description |
categories | string[] | all | Matches when the source category contains any supplied value |
locations | string[] | all | Matches when the source location contains any supplied value |
publishedAfter | ISO date/date-time | none | Inclusive lower publication boundary |
publishedBefore | ISO date/date-time | none | Inclusive upper publication boundary |
descriptionFormat | both, html, text | both | Controls only the two description output fields |
maxItems | integer, 1–10,000 | 40 | Stops after this many matching, unique jobs |
Filters are ANDed across filter groups. Values inside categories and locations use OR logic. For example, categories: ["Development"] plus locations: ["Europe", "Canada"] requires Development and either regional term.
Output example
A current source record normalizes to this shape (description shortened here only for readability):
{"jobId": "9b4c1913268511c41d78924f","url": "https://www.workingnomads.com/job/go/1750002/","title": "Senior UI & UX / Graphic Designer","companyName": "Lemon.io","category": "Design","location": "Europe, North America, Latin America, APAC","publishedAt": "2026-07-24T11:53:58.000Z","tags": ["ux designer", "graphic design", "figma", "creative", "english"],"descriptionHtml": "<p>Are you a talented Senior Designer ...</p>","descriptionText": "Are you a talented Senior Designer ...","sourceUrl": "https://www.workingnomads.com/api/exposed_jobs/","scrapedAt": "2026-07-26T04:30:00.000Z"}
Production dataset rows contain the full selected description representation, not the shortened README snippet.
Filtering recipes
Find one company's current jobs
{"query": "Lemon.io","maxItems": 40}
Build a Europe-friendly feed
{"locations": ["Europe", "EU"],"descriptionFormat": "text","maxItems": 40}
Capture a publication window
{"publishedAfter": "2026-07-01","publishedBefore": "2026-07-31T23:59:59Z","maxItems": 40}
Date filters operate on source publication timestamps. A valid query can naturally return zero items when the current feed has no match.
How much does it cost to scrape Working Nomads jobs?
Pricing uses a $0.005 run-start fee plus one charged event for each validated matching job saved. The FREE-tier item rate is $0.000074738 per job; volume tiers decrease progressively for BRONZE through DIAMOND users.
At the FREE-tier rate:
| Saved jobs | Example Actor charge |
|---|---|
| 1 | $0.005 + 1 × $0.000074738 |
| 10 | $0.005 + 10 × $0.000074738 |
| 40 | $0.005 + 40 × $0.000074738 |
The public source currently exposes a bounded feed, so normal runs are small. Apify may separately display platform-usage details according to your plan. Failed, malformed, duplicate, and filtered-out source records are not charged as item events.
Scheduling and change detection
For monitoring, schedule the Actor hourly or daily and use jobId as the deduplication key downstream. The Actor itself outputs the current matching snapshot; it does not keep a hidden cross-run history.
A common workflow is:
- schedule a focused run;
- export the dataset or receive a run webhook;
- upsert by
jobIdin a database; - trigger enrichment only for previously unseen IDs;
- alert recruiters or analysts.
This preserves a history under your control while keeping each Actor run deterministic.
Integrations and exports
Default dataset results can be downloaded as JSON, CSV, Excel, XML, RSS, or JSONL. You can also connect runs to:
- Google Sheets for shared job lists;
- Slack or email for hiring alerts;
- Make, Zapier, or n8n for no-code workflows;
- BigQuery, Snowflake, or a database for historical analysis;
- an ATS or CRM through a custom webhook consumer;
- another Apify Actor for company enrichment.
Use url or jobId rather than title alone when merging snapshots; the same title may appear for multiple regions.
Run through the Apify API
Replace YOUR_APIFY_TOKEN with your Apify token. Keep tokens in environment variables or secret stores rather than source code.
cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~working-nomads-jobs-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"categories":["Development"],"maxItems":20}'
To wait and receive dataset items directly:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~working-nomads-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"query":"Lemon.io","descriptionFormat":"text","maxItems":10}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/working-nomads-jobs-scraper').call({locations: ['Europe'],descriptionFormat: 'text',maxItems: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/working-nomads-jobs-scraper').call(run_input={'categories': ['Development'],'descriptionFormat': 'both','maxItems': 20,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with Apify MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/working-nomads-jobs-scraper"
Claude Desktop, Cursor, and VS Code can use this JSON configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/working-nomads-jobs-scraper"}}}
Example prompts:
- “Run Working Nomads Jobs Scraper for current Development jobs in Europe and return plain-text descriptions.”
- “Find jobs mentioning React in the current Working Nomads feed and summarize the required skills.”
- “Fetch current Canada-friendly jobs and prepare rows for my recruiting spreadsheet.”
Reliability and failure behavior
The Actor validates HTTP status, JSON content type, payload shape, required fields, source URLs, and publication dates. A malformed source record is skipped with a warning; a source-level failure makes the run fail visibly.
Transient network errors and HTTP 408, 425, 429, and 5xx responses receive bounded retries with backoff. Deterministic bad requests are not retried repeatedly.
No automatic proxy or browser fallback is enabled. The source is currently anonymous, and adding an unneeded fallback would increase cost without improving verified coverage.
Limitations
- Results are limited to records currently returned by the public Working Nomads exposed-jobs feed.
- No historical archive or unverified pagination is promised.
- Working Nomads may add, remove, or alter records between scheduled runs.
- Keyword matching is a case-insensitive substring search, not semantic ranking.
- Category and location values reflect source wording and can change over time.
- A zero-item dataset can be correct when no current record matches every filter.
maxItemscaps accepted matches; it cannot expand the source feed.
Responsible use and legality
This Actor accesses publicly available job-listing data without bypassing authentication. You are responsible for ensuring that your collection, storage, and downstream use comply with Working Nomads' terms, applicable laws, and the rights of job posters and applicants.
Avoid republishing descriptions in misleading contexts. Respect attribution and deletion requirements where applicable. Do not use job data to make unlawful employment decisions or infer protected personal characteristics.
Troubleshooting
Why did the run return zero jobs?
Relax one filter at a time. Category, location, keyword, and date groups are combined with AND logic, and the source only exposes a current bounded feed.
Why was my startUrl rejected?
Only HTTPS Working Nomads /jobs and /api/exposed_jobs/ URLs are supported. Other paths or domains fail closed because they are outside the verified product scope.
Why is one description field missing?
Check descriptionFormat. html omits descriptionText, text omits descriptionHtml, and both includes both.
What should I do after a source HTTP failure?
Inspect the run log and source availability. The Actor already retries transient failures, so repeated immediate retries are usually less useful than waiting for the public feed to recover.
Can I request more than the current feed contains?
You may set a larger maxItems, but the Actor cannot manufacture historical or paginated records that Working Nomads does not expose through the verified public endpoint.
Related Automation Lab Actors
Choose another source when you need broader remote-job coverage:
- Jobgether Remote Jobs Scraper — Jobgether listings and source-specific fields.
- Remote Rocketship Jobs Scraper — another remote-work source for cross-board coverage.
- Himalayas Remote Jobs Scraper — Himalayas listings for a complementary feed.
Run source-specific Actors separately, then merge downstream by canonical URL and employer rather than assuming records are identical across boards.
FAQ
Does this Actor need a Working Nomads account?
No. It uses the anonymous public exposed-jobs feed.
Does it use residential proxies?
No. Direct HTTP is the verified route, and no proxy mode is exposed.
Are descriptions complete?
Yes. Dataset rows contain the complete source description in the representation selected by descriptionFormat; only the README example is shortened.
How are duplicates handled?
Within each run, jobs are deduplicated using a stable ID derived from the canonical Working Nomads job URL.
Can I use the /jobs page as input?
Yes. The Actor validates that URL and resolves it to the same public structured feed before applying local filters.
Is this a real-time stream?
No. Each run is a snapshot of what the public feed returns at fetch time. Schedule recurring runs for monitoring.