Working Nomads Jobs Scraper avatar

Working Nomads Jobs Scraper

Pricing

Pay per event

Go to Apify Store
Working Nomads Jobs Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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 /jobs or 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?

FieldTypeMeaning
jobIdstringStable 24-character hash derived from the canonical job URL
urlURLPublic Working Nomads job detail URL
titlestringJob title from the source feed
companyNamestringHiring company name
categorystringWorking Nomads category, such as Development or Design
locationstringRemote region, country, or location restrictions
publishedAtISO date-timeSource publication time normalized to UTC
tagsstring[]Source skill and role tags, split into an array
descriptionHtmlstring, optionalComplete source description HTML
descriptionTextstring, optionalComplete description converted to readable plain text
sourceUrlURLPublic feed URL used for the run
scrapedAtISO date-timeTime 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

  1. Open the Actor in Apify Console.
  2. Keep the prefilled public feed URL, or use https://www.workingnomads.com/jobs.
  3. Optionally add a keyword, categories, locations, or publication-date bounds.
  4. Choose whether descriptions should contain HTML, text, or both.
  5. Set maxItems to the maximum matching current jobs you want.
  6. Click Start.
  7. 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

InputTypeDefaultDetails
startUrlstringexposed jobs feedPublic Working Nomads /jobs or /api/exposed_jobs/ HTTPS URL
querystringnoneCase-insensitive substring across title, company, category, location, tags, and description
categoriesstring[]allMatches when the source category contains any supplied value
locationsstring[]allMatches when the source location contains any supplied value
publishedAfterISO date/date-timenoneInclusive lower publication boundary
publishedBeforeISO date/date-timenoneInclusive upper publication boundary
descriptionFormatboth, html, textbothControls only the two description output fields
maxItemsinteger, 1–10,00040Stops 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 jobsExample 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:

  1. schedule a focused run;
  2. export the dataset or receive a run webhook;
  3. upsert by jobId in a database;
  4. trigger enrichment only for previously unseen IDs;
  5. 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 os
from apify_client import ApifyClient
client = 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().items
print(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.
  • maxItems caps 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.

Choose another source when you need broader remote-job coverage:

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.