# Working Nomads Jobs Scraper (`parsebird/workingnomads-jobs-scraper`) Actor

Scrape remote jobs from Working Nomads with any search URL. Get title, company, category, location, job type, experience level, salary, tags, apply link and full description. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/workingnomads-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.39 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Working Nomads Jobs Scraper

Working Nomads Jobs Scraper extracts remote job listings from [Working Nomads](https://www.workingnomads.com) for any search URL, with company, category, location, job type, experience level, salary, tags, apply link and the full description.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Paste any Working Nomads search, keyword or category page and get every matching remote job (the whole board is about 5,000 jobs) with 20+ fields, including annual salary in USD and the direct apply link, filtered exactly like the site.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Working Nomads Jobs Scraper (Apify actor parsebird/workingnomads-jobs-scraper) scrapes remote job listings from workingnomads.com. Call it with the Apify API client: client.actor("parsebird/workingnomads-jobs-scraper").call(run_input={"searchUrl": "https://www.workingnomads.com/jobs?tag=python&location=europe", "maxItems": 100}). Inputs: searchUrl (string, required; any Working Nomads jobs URL — /jobs with query params tag, category, location, positionType, experienceLevel, postedDate, salary, salaryMax, strictLocation, sort; pages like /remote-development-jobs, /remote-python-jobs-usa, /remote-senior-marketing-jobs, /remote-jobs-that-pay-100k; or a single job /jobs/<slug>); maxItems (integer 1-10000, default 50); includeDescription (boolean, default true); proxyConfiguration (object, optional, not needed). Output: one row per job with searchUrl, jobId, title, detailUrl, company, companySlug, category, date (ISO posting time), location, locations (array), type (Full-time/Part-time/Contract), experienceLevel, salary, salaryShort, annualSalaryUsd, tags, promoted, applyType (url/email), applyUrl, applyEmail, description, descriptionHtml, scrapedAt. API docs: https://apify.com/parsebird/workingnomads-jobs-scraper/api. Get a token: https://console.apify.com/settings/integrations
```

### What is Working Nomads Jobs Scraper?

**Working Nomads Jobs Scraper** turns any [Working Nomads](https://www.workingnomads.com/jobs) search into structured data. Working Nomads lists fully remote jobs worldwide for digital nomads and remote workers, across development, design, marketing, sales, customer success, management and more. Paste a search URL and the scraper returns **every matching job with company, category, location, job type, experience level, salary, tags, apply link and the full job description**, in the same order the site shows them.

It works as a **Working Nomads API** alternative: no login, no browser, no proxy needed. The easiest way to try it is to keep the example URL, click **Start**, and download your remote job data as JSON, CSV or Excel a few seconds later.

### What can Working Nomads Jobs Scraper do?

- 🔎 **Any search URL**: keywords, categories, locations, job types, experience levels, posted date, salary range and sort order, exactly as you set them on the site.
- 📄 **SEO pages and single jobs**: `/remote-development-jobs`, `/remote-python-jobs-usa`, `/remote-senior-marketing-jobs`, `/remote-jobs-that-pay-100k`, or one job at `/jobs/<job-slug>`.
- 💰 **Salary data**: the salary text from the listing plus `annualSalaryUsd`, a yearly USD figure you can sort and filter on.
- 📝 **Full descriptions**: plain text for analysis and the original HTML for re-publishing.
- ⭐ **Featured jobs**: `promoted` flags the jobs Working Nomads features at the top of results.
- ⚡ **Fast**: the whole board (about 5,500 jobs) scrapes in under a minute.

As an Apify Actor it also gives you [scheduling](https://docs.apify.com/platform/schedules) for daily job alerts, a [REST API](https://docs.apify.com/api/v2), [integrations](https://apify.com/integrations) with Google Sheets, Zapier, Make, Slack and webhooks, and exports to JSON, CSV, Excel, XML and HTML.

### What data can you extract from Working Nomads?

| Field | Description |
|-------|-------------|
| `jobId`, `title`, `detailUrl` | Working Nomads job ID, job title and job page |
| `company`, `companySlug` | Hiring company |
| `category` | Development, Design, Marketing, Sales, Management, ... |
| `date` | Posting date and time (ISO 8601) |
| `location`, `locations` | Location text as shown (e.g. "EMEA, CET +/- 3 hours") and the list of regions or countries |
| `type` | Full-time, Part-time or Contract |
| `experienceLevel` | Entry Level, Mid Level or Senior Level |
| `salary`, `salaryShort`, `annualSalaryUsd` | Salary as listed and normalized yearly USD amount |
| `tags` | Skills and keywords, e.g. `python`, `llm`, `react` |
| `promoted` | `true` for featured jobs |
| `applyType`, `applyUrl`, `applyEmail` | How to apply: external link or email |
| `description`, `descriptionHtml` | Full job description as text and HTML |
| `searchUrl`, `scrapedAt` | The search that found the job and when it was scraped |

### How to scrape Working Nomads

1. Open [workingnomads.com/jobs](https://www.workingnomads.com/jobs) and set your filters: keywords, category, location, job type, experience level, posted date or salary.
2. Copy the URL from your browser's address bar, e.g. `https://www.workingnomads.com/jobs?tag=python&location=europe&positionType=contract`.
3. Open [Working Nomads Jobs Scraper](https://apify.com/parsebird/workingnomads-jobs-scraper) and click **Try for free**.
4. Paste the URL into **Search URL** and set **Max jobs**.
5. Click **Start**.
6. Download the jobs as JSON, CSV or Excel from the **Storage** tab, or read them through the [API](https://apify.com/parsebird/workingnomads-jobs-scraper/api).

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchUrl` | string | **Yes** | — | Working Nomads jobs URL (search, SEO page or single job) |
| `maxItems` | integer | No | `50` | Maximum jobs to return (1–10,000) |
| `includeDescription` | boolean | No | `true` | Add `description` (text) and `descriptionHtml` |
| `proxyConfiguration` | object | No | no proxy | Optional; Working Nomads does not need a proxy |

**Supported URL filters**

| URL parameter | Example | Meaning |
|---------------|---------|---------|
| `tag` | `tag=python,machine-learning` | Keywords (OR); `machine-learning AND python` requires both |
| `category` | `category=development,design` | Job categories |
| `location` | `location=europe,usa` | Regions (Anywhere, North America, Latin America, Europe, Middle East, Africa, APAC) or countries |
| `strictLocation` | `strictLocation=true` | Only jobs listed for exactly that location, not "Anywhere" |
| `positionType` | `positionType=full-time,contract` | Full-time, part-time, contract |
| `experienceLevel` | `experienceLevel=senior` | `entry-level`, `mid-level`, `senior` |
| `postedDate` | `postedDate=7` | Posted in the last 1, 3 or 7 days |
| `salary` / `salaryMax` | `salary=80000&salaryMax=150000` | Annual salary range in USD |
| `sort` | `sort=date` | `relevance` or `date` (keyword searches only) |

**Example input**

```json
{
  "searchUrl": "https://www.workingnomads.com/jobs?tag=ai",
  "maxItems": 50
}
```

### Output example

A real row from a `tag=ai` search; `description` and `descriptionHtml` are shortened.

```json
{
  "searchUrl": "https://www.workingnomads.com/jobs?tag=ai",
  "jobId": "1912005",
  "title": "AI Automation Engineer (Claude Code & AI Agents)",
  "detailUrl": "https://www.workingnomads.com/jobs/ai-automation-engineer-claude-code-ai-agents-bamboo-works-1912005",
  "company": "Bamboo Works",
  "companySlug": "bamboo-works",
  "category": "Development",
  "date": "2026-10-03T02:06:57.465963-04:00",
  "location": "Philippines",
  "locations": ["Philippines"],
  "type": "Part-time",
  "experienceLevel": "Mid Level",
  "salary": "$0.9k per month",
  "salaryShort": null,
  "annualSalaryUsd": 10800.0,
  "tags": ["automation", "engineer", "python", "docker", "architecture"],
  "promoted": false,
  "applyType": "url",
  "applyUrl": "https://bambooworks.applytojob.com/apply/G5BDCChUrd/AI-Automation-Engineer-Claude-Code-AI-Agents",
  "applyEmail": null,
  "description": "About the Client\nWe're helping a fast-growing marketing and operations company find an AI Automation Engineer to build the next generation of AI-powered systems across multiple businesses...",
  "descriptionHtml": "<h3><strong>About the Client</strong></h3><p>We're helping a fast-growing marketing and operations company find an <strong>AI Automation Engineer</strong>...",
  "scrapedAt": "2026-10-04T10:35:36Z"
}
```

You can download the dataset in JSON, CSV, Excel, XML or HTML from the **Storage** tab.

### How to use the Working Nomads Jobs Scraper API

**Python** ([apify-client](https://docs.apify.com/api/client/python)):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/workingnomads-jobs-scraper").call(run_input={
    "searchUrl": "https://www.workingnomads.com/jobs?category=development&location=europe&postedDate=7",
    "maxItems": 200,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "|", job["company"], "|", job["salary"], "|", job["applyUrl"])
```

**JavaScript** ([apify-client](https://docs.apify.com/api/client/js)):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/workingnomads-jobs-scraper').call({
    searchUrl: 'https://www.workingnomads.com/remote-jobs-that-pay-100k',
    maxItems: 100,
    includeDescription: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((j) => `${j.title} @ ${j.company}: ${j.annualSalaryUsd}`));
```

### Use cases

- **Job seekers**: get a daily feed of new remote jobs for your skills and region in a spreadsheet or Slack channel.
- **Job boards and newsletters**: source remote listings with apply links and descriptions.
- **Recruiters and sales teams**: find companies actively hiring remote talent in your niche.
- **Salary research**: compare `annualSalaryUsd` across categories, experience levels and regions.
- **Market analysis**: track remote hiring demand by skill tag, category and location over time.

### How it works

1. The scraper reads your URL and turns its filters into the same search query the Working Nomads page sends.
2. It requests results 100 at a time from the site's public job search, in the site's order (featured jobs first).
3. Each job is cleaned up (job type and experience level named, description converted to text) and saved as soon as it is ready.

### How much does it cost to scrape Working Nomads?

Working Nomads Jobs Scraper uses pay-per-event pricing: you pay only for jobs saved to your dataset.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Job scraped (`job-scraped`) | $3.99 / 1,000 | $3.79 / 1,000 | $3.59 / 1,000 | **$3.39 / 1,000** |

For example, 50 jobs cost about $0.20 and the entire Working Nomads board (about 5,500 jobs) costs about $22 on the Free plan. Apify's free plan includes monthly platform credit you can use to try the actor. Set a maximum cost per run in the run options to cap spending.

### FAQ

**Do I need a proxy or a Working Nomads account?**
No. The scraper reads public job listings without logging in, and no proxy is needed. The proxy setting is there only if you want requests to come from a specific network.

**Which URLs can I use?**
Any `https://www.workingnomads.com/jobs?...` search URL, the site's landing pages such as `/remote-development-jobs`, `/remote-usa-jobs`, `/remote-javascript-jobs-europe`, `/remote-senior-marketing-jobs` and `/remote-jobs-that-pay-100k`, and single job links like `/jobs/<job-slug>`. Other pages (blog, companies) are rejected with a clear message.

**Why are featured jobs at the top?**
Working Nomads shows featured (`promoted: true`) jobs first for logged-out visitors, and the scraper keeps the site's order so the results match what you see in the browser.

**How many jobs can I get?**
All of them. Working Nomads returns every job matching a search, up to 10,000, and the whole board is currently about 5,500 jobs.

**What is `annualSalaryUsd`?**
A yearly salary in US dollars that Working Nomads calculates from the listing's salary, useful for sorting and filtering. It is empty when the listing has no salary. The original wording is in `salary`.

**How do I get only new jobs every day?**
Add `postedDate=1` to your URL (e.g. `https://www.workingnomads.com/jobs?tag=react&postedDate=1`) and [schedule](https://docs.apify.com/platform/schedules) the actor to run daily.

**Can I use it with AI agents or through an API?**
Yes. Use the [API tab](https://apify.com/parsebird/workingnomads-jobs-scraper/api), the Python or JavaScript examples above, or the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

**Something is not working. What should I do?**
Open an issue on the [Issues tab](https://apify.com/parsebird/workingnomads-jobs-scraper/issues) with your run ID and search URL. We read every report.

### Is it legal to scrape Working Nomads?

Working Nomads Jobs Scraper collects only job listings that Working Nomads publishes openly to every visitor, without logging in. Some listings include a recruiter's contact email for applications (`applyEmail`), which can be personal data protected by laws like the GDPR or CCPA, so only collect and use it for a legitimate purpose such as applying to that job. Review the [Working Nomads terms](https://www.workingnomads.com/terms-and-conditions) and consult a lawyer if you are unsure. For background, read Apify's guide [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other remote job scrapers

| Actor | What it does |
|-------|--------------|
| [We Work Remotely Jobs Scraper](https://apify.com/parsebird/wwr-jobs-scraper) | Remote jobs from We Work Remotely |
| [RemoteOK Jobs Scraper](https://apify.com/parsebird/remoteok-jobs-scraper) | Remote jobs from RemoteOK |
| [Himalayas Remote Jobs Scraper](https://apify.com/parsebird/himalayas-remote-jobs-scraper) | Remote jobs from Himalayas |
| [Jobicy Remote Jobs Scraper](https://apify.com/parsebird/jobicy-remote-jobs-scraper) | Remote jobs from Jobicy |
| [FlexJobs Jobs Scraper](https://apify.com/parsebird/flexjobs-jobs-scraper) | Remote and flexible jobs from FlexJobs |
| [Remote Job Aggregator API](https://apify.com/parsebird/remote-job-aggregator-api) | One search across Arbeitnow, Jobicy, Himalayas and RemoteOK |
| [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper) | Detailed job listings with salaries from Hiring.cafe |

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/workingnomads-jobs-scraper/changelog.md

# Actor input Schema

## `searchUrl` (type: `string`):

Paste a Working Nomads jobs page URL. All site filters are supported: keywords (<code>tag</code>), category, location, job type, experience level, posted date, salary and sort, e.g. <code>https://www.workingnomads.com/jobs?tag=python\&location=europe</code>. Pages like <code>/remote-development-jobs</code>, <code>/remote-python-jobs-usa</code>, <code>/remote-jobs-that-pay-100k</code> and single job links <code>/jobs/\<job-slug></code> work too.

## `maxItems` (type: `integer`):

Maximum number of jobs to return. Working Nomads lists every matching job, so this is the only limit.

## `includeDescription` (type: `boolean`):

Add the full job description as plain text (<code>description</code>) and HTML (<code>descriptionHtml</code>). Turn off for smaller, faster exports.

## `proxyConfiguration` (type: `object`):

Working Nomads works without a proxy. Add one only if you need requests to come from a specific network.

## Actor input object example

```json
{
  "searchUrl": "https://www.workingnomads.com/jobs?tag=ai",
  "maxItems": 50,
  "includeDescription": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchUrl": "https://www.workingnomads.com/jobs?tag=ai",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/workingnomads-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchUrl": "https://www.workingnomads.com/jobs?tag=ai",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/workingnomads-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrl": "https://www.workingnomads.com/jobs?tag=ai",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/workingnomads-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/workingnomads-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/tuKBdCHkRAB1SQpx8/builds/y8rIozQyrjftRtooH/openapi.json
