# Working Nomads Remote Job Scraper (`midnight_static/workingnomads-job-scraper`) Actor

Remote jobs for digital nomads: read the Working Nomads job board feed, the 50 most recent job listings, with job title, company name, category, location, tags, publish date and the description as HTML and plain text. Change detection across runs: by default a rerun writes only new postings.

- **URL**: https://apify.com/midnight\_static/workingnomads-job-scraper.md
- **Developed by:** [Midnight Static](https://apify.com/midnight_static) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 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 Remote Job Scraper

Working Nomads publishes a rolling feed of the 50 most recent remote jobs. This Actor reads it, and **remembers what it already sent you**, so a daily run costs you only the postings that are actually new.

### Why that matters

Run any other Working Nomads scraper twice a day and you will receive the same jobs twice, and pay for them twice. The feed does not page: whatever you request, the site returns the same 50 postings. Measured on 17 September 2026 — `?limit`, `?page`, `?offset` and `?category` all return the identical response.

So this Actor keeps a memory across runs. On its first run it gives you all 50. On the next run it gives you only what appeared since. In a live test the second run wrote nothing at all and charged nothing, because nothing had changed.

If you want the full feed every time, switch **Only jobs new since your last run** off.

### What you get

**The posting**
Job id, title, company name, category, location, publication date, and how many days old it is.

**Tags twice**
As the original comma string and as a clean array with a count, so you can filter without splitting strings yourself.

**The description twice**
As the original HTML and as readable plain text, with its character length. Most scrapers hand you HTML and leave the stripping to you.

**Provenance**
`sourceUrl`, `fetchedAt`, `httpStatus`, `filledFieldCount`, and `isNewSinceLastRun` on every record.

### Filters

**Categories** keeps only the categories you name, for example Development, Design, Marketing. **Keywords** keeps only jobs whose title, tags or description contain one of your words. Filtered-out jobs are counted in the run statistics and cost you nothing.

### Example record (trimmed)

```json
{
  "jobId": "1867649",
  "title": "Senior SEO & Organic Growth Strategist",
  "companyName": "Powered by search",
  "categoryName": "Marketing",
  "location": "Global",
  "tagList": ["seo", "b2b", "strategy", "english", "client relationship"],
  "tagCount": 5,
  "publishedAt": "2026-09-16T12:32:34-04:00",
  "daysSincePosted": 1,
  "descriptionLength": 7243,
  "isNewSinceLastRun": true,
  "filledFieldCount": 18,
  "jobUrl": "https://www.workingnomads.com/job/go/1867649/"
}
```

### Typical uses

Feeding a job board or newsletter with fresh remote roles. Watching a category for new openings. Tracking which companies hire remotely and how often. Building a dataset of remote job descriptions over time by running daily and letting the memory do the deduplication.

### Failures are loud

The run fails with an explanation rather than finishing quietly. If the feed format changes, you get a parse error with the first 200 characters of what actually came back, not an empty dataset. If the feed is empty, the run fails instead of reporting success with nothing. Counters are reconciled every run: jobs in the feed, written, new, already seen, filtered out, HTTP failures, parse failures. The breakdown is written to the `RUN_STATS` key.

### Limits and compliance

`robots.txt` is checked before the request and the path is confirmed allowed. If `robots.txt` cannot be read, the run stops before making any data request rather than guessing.

No personal data is collected. The feed carries company names, not people. The output is built from an explicit list of known fields, so nothing outside that list can reach your dataset.

The feed holds 50 postings at a time. This Actor does not pretend otherwise, and it is priced for what it is.

### Pricing

**$1.50 per 1,000 jobs, everything included.** No start fee, no minimum charge per run, no separate platform usage line.

Paid Apify plans pay less, automatically — there is nothing to apply for: Bronze $1.35, Silver $1.20, Gold and above $1.05 per 1,000 jobs. The Free plan price is unchanged at $1.50.

You are charged per job written. With the default setting, a job you already received is never written again, so a daily run on an unchanged feed costs you nothing at all.

### Measured performance

Three runs on 17 September 2026:

| Run | Jobs in feed | New | Written | Charged |
|---|---|---|---|---|
| First | 50 | 50 | 50 | 50 |
| Second, minutes later | 50 | 0 | 0 | 0 |
| Filtered to Development | 50 | 0 | 10 | 10 |

Each run takes under twenty seconds.

# Actor input Schema

## `onlyNew` (type: `boolean`):

On by default. The site publishes a rolling feed of 50 jobs, so most of what you see today you already saw yesterday. With this on you are charged only for postings you have not received before.

## `categories` (type: `array`):

Keep only these categories, one per line, for example Development, Design, Marketing. Leave empty for all.

## `keywords` (type: `array`):

Keep only jobs whose title, tags or description contain one of these words, one per line. Leave empty for all.

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

Hard cap on how many job records are written. The feed holds 50 at a time.

## Actor input object example

```json
{
  "onlyNew": true,
  "maxItems": 50
}
```

# Actor output Schema

## `results` (type: `string`):

One record per job: title, company, category, tags, location, date and full description.

## `runStats` (type: `string`):

Counters: jobs in feed, written, new, already seen, filtered out.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("midnight_static/workingnomads-job-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("midnight_static/workingnomads-job-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 '{}' |
apify call midnight_static/workingnomads-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,midnight_static/workingnomads-job-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/mCpb2XiNY4KnHhDzf/builds/Jg5Npu0xyAZKpEFnI/openapi.json
