# Remote Jobs Aggregator · RemoteOK, Jobicy & More, Only New (`thequietstack/remote-jobs-aggregator`) Actor

Remote jobs from four public job feeds (Remote OK, Jobicy, Arbeitnow, Working Nomads) in one deduplicated list: title, company, salary, region, tags, full description, apply link and source credit. Keyword, region, salary and date filters; only-new mode for job alerts.

- **URL**: https://apify.com/thequietstack/remote-jobs-aggregator.md
- **Developed by:** [TheQuietStack](https://apify.com/thequietstack) (community)
- **Categories:** Jobs, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.19 / 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

## Remote Jobs Aggregator · RemoteOK, Jobicy & More, Only New

**Remote jobs from four public job feeds in one deduplicated list:** Remote OK, Jobicy, Arbeitnow (remote jobs only) and Working Nomads. One flat row per job with **title, company, salary, region, tags, full description, apply link and the source credit** the boards ask for. Keyword, region, salary and date filters, and an **only-new mode for job alerts**. No login, no browser, no keys.

### What does Remote Jobs Aggregator do?

- **One list instead of four:** the same job posted on two boards appears once (company + title match); the other board is listed in `alsoOn`.
- **Comparable fields:** dates as ISO timestamps, salaries as numbers with currency and period, location text turned into coarse regions (`Worldwide`, `USA`, `Europe`, `LATAM`, `APAC`, …) for filtering.
- **Only sources that allow it:** each feed is published by its board for reuse; every row carries the credit line and link the board asks for.
- **Job alerts:** *Only new jobs* remembers delivered jobs across all boards; schedule it and get only new postings.

### Input example

```json
{
    "keywords": ["developer", "engineer"],
    "excludeKeywords": ["senior"],
    "regions": ["Europe", "Worldwide"],
    "postedWithinDays": 7,
    "requireSalary": false,
    "maxJobs": 200,
    "onlyNew": true
}
```

### Output example

Real row (30 Oct 2026; description shortened):

```json
{
    "title": "Creative eLearning Developer",
    "company": "Tenable",
    "source": "Jobicy",
    "sourceUrl": "https://jobicy.com",
    "attribution": "Job via Jobicy (https://jobicy.com) - keep this link when you show the job.",
    "url": "https://jobicy.com/jobs/154191-creative-elearning-developer",
    "applyUrl": "https://jobicy.com/jobs/154191-creative-elearning-developer",
    "postedAt": "2026-10-30T03:25:19.000Z",
    "location": "USA",
    "regions": ["USA"],
    "tags": ["Education & E-learning"],
    "employmentType": "Full-Time",
    "seniority": "Director",
    "salaryMin": 80500,
    "salaryMax": 107166,
    "salaryCurrency": "USD",
    "salaryPeriod": "YEAR",
    "description": "Who is Tenable ? Tenable® is the Exposure Management company. …",
    "alsoOn": null,
    "scrapedAt": "2026-10-30T11:43:08.265Z"
}
```

In the first test run (keyword "developer", last 7 days) the four feeds returned 240 jobs; 33 matched, 9 duplicates were merged.

### Sources and their terms (checked 30 Oct 2026)

| Source | What the board says |
|---|---|
| Remote OK (`remoteok.com/api`) | "Please link back … and mention Remote OK as a source" |
| Jobicy (`jobicy.com/api/v2`) | Free API "can be used in commercial projects"; "clearly credit Jobicy" |
| Arbeitnow (`arbeitnow.com/api/job-board-api`) | "free public API for jobs, please do not abuse"; linking back appreciated |
| Working Nomads (`workingnomads.com/api/exposed_jobs`) | Public API linked in the site footer |

**Left out on purpose:** Remotive and Himalayas (their terms forbid passing jobs on to other aggregators) and We Work Remotely (terms not readable). If you show the jobs, keep the `attribution` link and send applicants to `applyUrl`.

### How much does it cost?

Pay per event: **$0.0017 per job row** on the Free plan (lower on paid Apify plans), plus a tiny start fee. **100 jobs = $0.17.**
Never charged: duplicates, filtered jobs, jobs already delivered in only-new mode, the free status row of an empty run. `maxJobs` caps every run.

### Honest limits

- The feeds carry the boards' current jobs (Remote OK about 100, Arbeitnow a few hundred of which only the remote ones are kept, Jobicy up to 50 per page). This is a fresh daily feed, not a historical archive.
- Regions are derived from the location text only; "Unspecified" means the board gave no location.
- Salary filter: compared in the posting's own currency (hourly/monthly converted to yearly). Most remote postings state no salary; they are kept unless *Only jobs with salary* is on.
- Arbeitnow focuses on Germany/Europe; its non-remote jobs are skipped.

### Feedback

Want another board whose terms allow reuse? Open an issue on the **Issues** tab. A short review on the Store page helps others find the Actor.

# Actor input Schema

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

Keep jobs that mention at least one word (title, tags, company, description). Empty = all.

## `excludeKeywords` (type: `array`):

Drop jobs that mention any of these words (e.g. senior, sales).

## `regions` (type: `array`):

Keep jobs open to these regions. Worldwide jobs are always kept. Empty = all.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted in the last N days.

## `minSalary` (type: `integer`):

In the posting's own currency, hourly/monthly converted to yearly. Jobs without a salary are kept unless 'Only jobs with salary' is on.

## `requireSalary` (type: `boolean`):

Return only jobs that state a salary.

## `sources` (type: `array`):

Empty = all four.

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

Include the full job description in each result.

## `maxJobs` (type: `integer`):

Hard cap for the run (and therefore the bill).

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

Remember delivered jobs (across all four boards) and return only new ones. Run it on a schedule.

## `stateStoreName` (type: `string`):

Name of the key-value store that remembers already seen items for only-new mode. Use a different name per alert.

## `resetMemory` (type: `boolean`):

Forget previously seen items and return everything again on this run.

## `maxPagesPerSource` (type: `integer`):

Arbeitnow and Jobicy are paged; the others return one list.

## Actor input object example

```json
{
  "keywords": [
    "developer"
  ],
  "postedWithinDays": 7,
  "requireSalary": false,
  "includeDescription": true,
  "maxJobs": 50,
  "onlyNew": false,
  "stateStoreName": "remote-jobs-aggregator-state",
  "resetMemory": false,
  "maxPagesPerSource": 3
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `summary` (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 = {
    "keywords": [
        "developer"
    ],
    "postedWithinDays": 7,
    "maxJobs": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("thequietstack/remote-jobs-aggregator").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 = {
    "keywords": ["developer"],
    "postedWithinDays": 7,
    "maxJobs": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("thequietstack/remote-jobs-aggregator").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 '{
  "keywords": [
    "developer"
  ],
  "postedWithinDays": 7,
  "maxJobs": 50
}' |
apify call thequietstack/remote-jobs-aggregator --silent --output-dataset

```

## MCP server setup

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

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/I4S60kku3FDqEjuxI/builds/nhM55SdcTWqCqgve6/openapi.json
