# Working Nomads Jobs Scraper (`zerobreak/working-nomads-jobs-scraper-202610120341`) Actor

Working Nomads Jobs Scraper is a Python tool designed to extract remote job listings, company details, job categories, applicant requirements, and posting dates from Working Nomads. It exports structured employment data into clean CSV or JSON formats for job aggregation and career analysis.

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

## Pricing

from $2.99 / 1,000 results

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 — Collect Remote Job Listings

### Overview

Working Nomads Jobs Scraper collects publicly available remote job listings and saves matching opportunities as structured dataset rows. Filter jobs by keyword or category, limit the number of results, and export the collected data in JSON, CSV, or Excel format.

The scraper helps organize remote job opportunities by title, company, category, tags, location, and publication date.

### Features

- **Keyword filtering:** Find jobs by matching keywords in job titles and tags.
- **Category filtering:** Narrow results to categories such as Development or Marketing.
- **Custom result limits:** Choose how many matching jobs to collect, up to 1,000 per run.
- **Duplicate removal:** Avoid saving multiple records with the same job listing URL.
- **Clean descriptions:** Remove HTML markup from job descriptions.
- **Structured datasets:** Save job information in clearly named fields.
- **Multiple export formats:** Work with JSON, CSV, or Excel files.

### Use Cases

- **Remote job boards:** Build categorized lists of remote opportunities in specific fields.
- **Recruiting research:** Organize company names, job categories, skills, and publication dates.
- **Keyword monitoring:** Collect roles mentioning technologies such as Node.js, Python, or JavaScript.
- **Category-based research:** Focus on Development, Marketing, or other available categories.
- **Scheduled job collection:** Maintain recurring snapshots of remote job listings.
- **Job market analysis:** Compare job titles, company information, required skills, and publication dates.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `keyword` | String | Empty | Case-insensitive keyword filter applied to job titles and tags. |
| `category` | String | Empty | Case-insensitive filter applied to the job category name. |
| `maxItems` | Integer | `100` | Maximum number of matching jobs to save. The allowed range is 1–1,000. |
| `timeoutSecs` | Integer | `300` | Overall run time limit in seconds. The allowed range is 1–3,600. |
| `requestTimeoutSecs` | Integer | `30` | Maximum wait for the job feed request, in seconds. The allowed range is 1–300. |

### Example Input

```json
{
  "keyword": "nodejs",
  "category": "Development",
  "maxItems": 100,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30
}
```

This example collects up to 100 matching jobs in the Development category whose titles or tags contain `nodejs`.

### What Data Does This Actor Extract?

Each collected job is saved as one dataset row. Job descriptions are converted to plain text, and duplicate job listing URLs are removed.

The `title` and `description` values are stored as `jobTitle` and `jobDescription` to maintain a compatible dataset schema.

#### Extracted Data Fields

| Field | Type | Description |
|---|---|---|
| `url` | String | Link to the individual job listing. |
| `jobTitle` | String | Job title in plain text. |
| `jobDescription` | String | Job description with HTML markup removed. |
| `company_name` | String | Name of the hiring company. |
| `category_name` | String | Category assigned to the job. |
| `tags` | String | Comma-separated tags associated with the job. |
| `location` | String | Job location or time-zone information. |
| `pub_date` | String | Job publication timestamp supplied by the feed. |
| `scrapedAt` | String | UTC timestamp indicating when the record was saved. |

#### Example Output

```json
{
  "url": "JOB_LISTING_URL",
  "jobTitle": "Senior Backend Developer (Node.js / Nest.js)",
  "jobDescription": "About us: Talent has no borders.",
  "company_name": "Proxify",
  "category_name": "Development",
  "tags": "back-end,nodejs,typescript,javascript,graphql",
  "location": "Time zone: CET (+/- 3 hours)",
  "pub_date": "2026-10-08T12:54:14-04:00",
  "scrapedAt": "2026-10-12T00:00:00+00:00"
}
```

The example illustrates the dataset structure. Actual values depend on the available job listings and the time of collection.

### Working with Your Dataset

After the run completes, use the dataset to:

- Export job records to JSON, CSV, or Excel.
- Filter and sort opportunities by category, company, or publication date.
- Search tags to identify roles requiring particular technologies.
- Import the results into spreadsheets or your own job-tracking workflow.
- Compare job listings across different collection runs.

### Important Notes

- Keyword and category filters are case-insensitive.
- Keyword matching checks job titles and tags; it does not search the entire job description.
- Category matching uses the category name.
- Duplicate job listing URLs are removed.
- The maximum number of saved matching jobs is 1,000 per run.
- The result limit is applied after the job feed is retrieved and filtered.
- If no jobs match the filters, the actor may finish without producing job records.
- Job availability and listing details can change between runs.

### FAQ

**How many jobs can I collect in one run?**

The default limit is 100 jobs. You can increase it to a maximum of 1,000 using `maxItems`.

**Can I filter jobs by technology?**

Yes. Enter a technology or skill in `keyword`. The scraper checks job titles and tags for case-insensitive matches.

**Can I collect only Development jobs?**

Yes. Set `category` to `Development`, or specify another category available in the feed.

**Are job descriptions saved as HTML?**

No. HTML markup is removed, and the description is saved as plain text in `jobDescription`.

**Why is the title field named `jobTitle`?**

The actor uses `jobTitle` and `jobDescription` to maintain a compatible dataset schema.

**What happens when multiple records contain the same job listing URL?**

Duplicate job URLs are discarded so the dataset does not contain repeated listings with the same URL.

**Which export formats are supported?**

The dataset can be exported in JSON, CSV, and Excel formats.

**Will every run return the same jobs?**

Not necessarily. Available listings and their details can change over time. The results also depend on your filters and item limit.

### Disclaimer

This is an independent tool and is not affiliated with, endorsed by, sponsored by, or officially associated with Working Nomads or its owners. The scraper is intended to help users organize publicly available job information. Users are responsible for ensuring that their collection, storage, and use of the data comply with applicable laws and the relevant website's terms.

### Is Web Scraping Legal?

Collecting information that is already public is generally legal. Scraping is not the same thing as hacking, and there is no single law that bans it. The limits are the usual ones: do not break into accounts, do not take private or confidential data, and be careful with personal data and copyrighted works. A site's terms can also restrict how you access it. Facts such as a public name, price, or rating are not the same thing as republishing someone's article or photo.

This actor collects information from public pages. It does not log in and it does not bypass access controls.

For a longer explanation, see Apify's article [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

## `keyword` (type: `string`):

Optional text matched against the job title and tags after the public feed is downloaded. Matching is case-insensitive. Leave blank to keep every category that passes the category filter.

## `category` (type: `string`):

Optional exact category name from the feed, such as Development, Marketing, or Design. Matching is case-insensitive. Leave blank to include every category.

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

Maximum number of matching jobs to save. Values are clamped to the free cap of 1 to 1000.

## `timeoutSecs` (type: `integer`):

Overall run time limit in seconds. The actor stops before the feed request when this limit is already spent.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds for the public jobs feed.

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

Optional proxy for the public jobs feed. Leave Apify Proxy off. The feed is fetched once per run and does not require a proxy.

## Actor input object example

```json
{
  "keyword": "nodejs",
  "category": "Development",
  "maxItems": 100,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `datasetUrl` (type: `string`):

Default dataset with one row per remote job or error.

## `itemsUrl` (type: `string`):

Dataset items as JSON.

## `overviewUrl` (type: `string`):

Dataset items in the overview table view.

# 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 = {
    "keyword": "",
    "category": "",
    "maxItems": 100,
    "timeoutSecs": 300,
    "requestTimeoutSecs": 30,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zerobreak/working-nomads-jobs-scraper-202610120341").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 = {
    "keyword": "",
    "category": "",
    "maxItems": 100,
    "timeoutSecs": 300,
    "requestTimeoutSecs": 30,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("zerobreak/working-nomads-jobs-scraper-202610120341").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 '{
  "keyword": "",
  "category": "",
  "maxItems": 100,
  "timeoutSecs": 300,
  "requestTimeoutSecs": 30,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call zerobreak/working-nomads-jobs-scraper-202610120341 --silent --output-dataset

```

## MCP server setup

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

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/bu9xhQ71KRRzczXuX/builds/5jP9ZYDhaXzMuA12Y/openapi.json
