# Remote Jobs API - RemoteOK, Jobicy, Arbeitnow & More (`teddythebuilder/remote-jobs-api`) Actor

Get remote jobs from Remote OK, Jobicy, Arbeitnow and Working Nomads in one schema: title, company, location, salary, seniority, tags, description, apply link. Keyword, location and salary filters, de-duplication, new-jobs monitor. Export JSON/CSV or call via API/MCP.

- **URL**: https://apify.com/teddythebuilder/remote-jobs-api.md
- **Developed by:** [Teddy Wasserman](https://apify.com/teddythebuilder) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 job returneds

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

### What does Remote Jobs API do?

Remote Jobs API collects **remote job listings from several job boards in one clean schema**: Remote OK, Jobicy, Arbeitnow and Working Nomads. Each job comes with title, company, logo, location or allowed regions, salary range, seniority, employment type, categories and tags, posting date, the full description as plain text, and the original job and apply links.

Filter by keywords, locations, salary and posting date, remove duplicates across boards, and switch on **monitor mode** to get only the jobs that are new since your last run. It reads the boards' public JSON APIs, so runs take a few seconds and never break on page redesigns.

### Why use Remote Jobs API?

- **Four boards, one format.** No more writing a parser per job board: every job has the same fields, whatever the source.
- **Official public APIs.** Remote OK, Jobicy, Arbeitnow and Working Nomads publish these feeds for reuse. No scraping of HTML, no login, no proxies.
- **Useful filters.** Keywords (title, tags or full text), exclude words, location words such as `europe` or `worldwide`, salary-only, posted within N days, remote-only.
- **Salary data.** Salary ranges from the boards' own fields (Jobicy, Remote OK) plus clear ranges written in the description (e.g. "£30,000 - £40,000").
- **De-duplicated.** The same company + title posted on two boards is returned once.
- **Monitor mode.** `onlyNew` remembers what you already received, so a daily schedule becomes a new-jobs feed. Already-seen jobs are free.
- **Cheap.** $1 per 1,000 jobs, and info rows are free.

### What data can you extract?

| Field | Example | Description |
|---|---|---|
| `id` | `jobicy:156198` | Stable ID: source + the board's job ID |
| `source` / `sourceName` | `jobicy` / `Jobicy` | Job board |
| `title` | `Senior Product Manager` | Job title |
| `company` | `Envato` | Hiring company |
| `companyLogo` | `https://jobicy.com/data/…jpg` | Logo URL when the board provides one |
| `location` | `Australia, New Zealand` / `Worldwide` | Location or allowed regions as written by the board |
| `remote` | `true` | Remote job |
| `employmentType` | `Full-Time` | Employment type |
| `seniority` | `Senior` | Level (Jobicy) |
| `categories` | `["Product"]` | Category / industry |
| `tags` | `["devops", "python", "terraform"]` | Board tags |
| `salaryMin` / `salaryMax` | `30000` / `40000` | Salary range |
| `salaryCurrency` / `salaryPeriod` | `GBP` / `year` | Currency and period (period empty when parsed from text) |
| `salaryFromText` | `true` | Salary parsed from the description |
| `postedAt` | `2026-10-21T11:05:02Z` | Posting time (UTC) |
| `url` | `https://jobicy.com/jobs/156198-…` | Job page on the source board |
| `applyUrl` | `https://remoteok.com/remote-jobs/…` | Apply link from the board |
| `description` | `GitLab is the intelligent orchestration platform…` | Full description as plain text |
| `attribution` | `Job via Jobicy (https://jobicy.com)` | Source credit to show next to the job |
| `scrapedAt` | `2026-10-21T18:06:20Z` | Run time |

### How to use Remote Jobs API (step by step)

1. Click **Try for free**.
2. Enter **Keywords** such as `python`, `designer` or `customer support` (or leave empty for all jobs).
3. Optional: add **Locations** (`europe`, `worldwide`, `usa`), set **Posted within (days)**, switch on **Only jobs with a salary**, or choose the **Job boards**.
4. Set **Max jobs** and click **Start**.
5. Open the **Jobs** view, or export to CSV, Excel or JSON. For a daily feed, switch on **Only new jobs** and add a schedule.

### Input example

```json
{
  "keywords": ["python", "data engineer"],
  "locations": ["europe", "worldwide"],
  "postedWithinDays": 7,
  "withSalaryOnly": false,
  "maxResults": 200,
  "onlyNew": true,
  "watchName": "python-europe"
}
```

### Output example

```json
{
  "id": "workingnomads:1958438",
  "source": "workingnomads",
  "sourceName": "Working Nomads",
  "title": "Senior DevOps Engineer",
  "company": "Lemon.io",
  "url": "https://www.workingnomads.com/job/go/1958438/",
  "attribution": "Job via Working Nomads (https://www.workingnomads.com)",
  "companyLogo": null,
  "location": "Europe, LATAM, APAC, the U.S., Canada",
  "remote": true,
  "employmentType": null,
  "seniority": null,
  "categories": ["Development"],
  "tags": ["devops", "python", "golang", "bash", "terraform"],
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "postedAt": "2026-10-20T17:39:57Z",
  "applyUrl": "https://www.workingnomads.com/job/go/1958438/",
  "description": "Lemon.io helps companies in the US and Europe hire experienced engineers…",
  "scrapedAt": "2026-10-21T18:06:20Z"
}
```

### How much does it cost?

Remote Jobs API uses pay-per-event pricing.

| Event | Price (Free plan) | When it is charged |
|---|---|---|
| Actor start | $0.0005 | Once per run |
| Job returned | $0.001 ($1 per 1,000) | One job in the dataset |

Info rows (no matches, a board temporarily unavailable) and jobs skipped as already seen in monitor mode are **free**. Paid Apify plans get Store discounts (Bronze −15%, Silver −30%, Gold and up −45%).

Worked examples (Free plan prices):

- **All remote jobs of the last week** from the four boards (about 1,000 after de-duplication): ≈ **$1**.
- **A daily "new Python jobs" feed** with `onlyNew` (about 20 new jobs a day): ≈ $0.02 per day, **about $0.60 per month**.
- **A weekly salary snapshot** of 300 jobs with salaries: ≈ **$0.30** per run.

The Apify Free plan includes monthly platform credit, which covers runs like these.

### Use cases

- **Job boards and newsletters.** Fill a niche remote job board, Slack/Discord channel or weekly newsletter with fresh listings (credit the source, see below).
- **Job seekers.** Get a daily email or spreadsheet of new remote jobs that match your skills and time zone.
- **Recruiters and sales teams.** See which companies are hiring remotely right now, and for which roles, as warm leads.
- **Salary and market research.** Track salary ranges, seniority mix and hiring volume by category over time.
- **AI agents.** Let an assistant answer "find me remote Rust jobs in Europe posted this week" with structured data.

### Use with AI agents, MCP and the API

```bash
curl -X POST "https://api.apify.com/v2/acts/teddythebuilder~remote-jobs-api/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["rust"],"postedWithinDays":7,"maxResults":50}'
```

Python with `apify-client`:

```python
from apify_client import ApifyClient

client = ApifyClient("<TOKEN>")
run = client.actor("teddythebuilder/remote-jobs-api").call(run_input={
    "keywords": ["product designer"],
    "locations": ["europe", "worldwide"],
    "withSalaryOnly": True,
    "maxResults": 100,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job.get("company"), "-", job.get("title"), job.get("salaryMin"), job.get("salaryCurrency"), job.get("url"))
```

**MCP:** available as a tool in the Apify MCP server (`https://mcp.apify.com`) for Claude, ChatGPT, Cursor and other MCP clients.

### Integrations

Send new jobs to Slack, Discord, Telegram, Google Sheets, Airtable, Notion, email, Make, Zapier, n8n or a webhook after each scheduled run.

### Data source and legality

All jobs come from public job-board APIs that their owners offer for reuse:

- **Jobicy** public Jobs API (jobicy.com/api/jobs): the documentation allows building job boards and aggregators and redistributing listings, as long as Jobicy is credited and apply buttons go to the original job URL.
- **Remote OK** API (remoteok.com/api): free to use with a link back to the job on Remote OK and naming Remote OK as the source.
- **Arbeitnow** Job Board API (arbeitnow.com/api/job-board-api): a free public API; a link back to Arbeitnow is requested.
- **Working Nomads** jobs feed (workingnomads.com/api/exposed_jobs/).

Every job therefore includes `url` (the job on the source board), `applyUrl` and an `attribution` text. **If you publish the jobs, show the attribution and keep the links pointing to the source**, as these boards ask. Boards whose API terms forbid passing jobs on to aggregators (for example Himalayas and Remotive) are deliberately not included.

The output contains company and job information only; the boards' APIs don't expose recruiters' personal contact details, and none are added.

### FAQ

**How far back do jobs go?**
Each board's public feed covers its recent listings: Jobicy the last 7 days, Remote OK the latest ~100 jobs, Arbeitnow and Working Nomads their newest pages. For history, schedule the actor daily with `onlyNew` and keep the dataset.

**Why do I see German job titles?**
Arbeitnow focuses on Europe and Germany. Exclude it in **Job boards**, or add `excludeKeywords` such as `m/w/d`.

**How are duplicates detected?**
Jobs with the same company and title (ignoring case and punctuation) are returned once, from the first board read.

**Why is a salary missing?**
Many employers don't publish one. Salaries come from the boards' fields or from a clear currency range in the description; turn on **Only jobs with a salary** to keep only those.

**Can you add another job board?**
Yes, if its API terms allow reuse. Open an issue with the board's name.

**A board returned an error.**
The run continues with the other boards and adds a free info row. Try again later; public APIs sometimes rate-limit.

**Questions or bugs?**
Open an issue on the actor page. We reply within 24 hours. If the actor helps you, a rating on the Store page helps others find it.

### Related actors

- [Hacker News Scraper - Who Is Hiring Jobs](https://apify.com/teddythebuilder/hacker-news-scraper): the monthly HN "Who is hiring?" thread as structured jobs with remote and salary fields.
- [Career Site Jobs API - Greenhouse, Lever, Ashby & Workable](https://apify.com/teddythebuilder/career-site-jobs-api): every open role straight from company job boards.
- [Swedish Jobs Scraper - Platsbanken](https://apify.com/teddythebuilder/swedish-jobs-monitor): all Swedish job ads from the official Arbetsförmedlingen API.
- [Website Contact Scraper](https://apify.com/teddythebuilder/website-contact-scraper): company emails, phones and social profiles for the hiring companies.

### Changelog and support

- **1.0 (October 2026):** first release. Jobicy, Remote OK, Arbeitnow and Working Nomads; keyword, location, salary and date filters; cross-board de-duplication; monitor mode.

Questions or feature requests? Open an issue on the actor page. We reply within 24 hours.

# Actor input Schema

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

Return jobs that mention any of these words in the title, tags, company or description, e.g. python, product designer, marketing. Empty = all jobs.

## `keywordsInTitleOnly` (type: `boolean`):

Ignore the description when matching keywords (fewer, more precise results).

## `locations` (type: `array`):

Keep jobs whose location contains one of these words, e.g. worldwide, europe, usa, germany. Empty = any location.

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

Only jobs posted in the last N days, e.g. 7. 0 = no limit (each source keeps roughly its last 1-4 weeks).

## `maxResults` (type: `integer`):

Maximum jobs to return (newest first). You pay per job returned.

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

Which job-board APIs to read.

## `remoteOnly` (type: `boolean`):

Drop non-remote jobs (only Arbeitnow lists on-site jobs too, mostly in Germany).

## `withSalaryOnly` (type: `boolean`):

Keep only jobs with a salary range (from the board's salary fields or a clear range in the description).

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

Drop jobs whose title or company contains one of these words, e.g. senior, intern, crypto.

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

Return the full description as plain text. Turn off for smaller exports.

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

Pages read from paginated boards (Jobicy 200 jobs per page, Arbeitnow 300 jobs per page).

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

Return only jobs not returned by earlier runs with the same watch name. Schedule the actor daily for a new-jobs feed; already-seen jobs are free.

## `watchName` (type: `string`):

Name of the monitor state, e.g. python-europe. Use different names for different searches.

## Actor input object example

```json
{
  "keywords": [
    "python",
    "data engineer"
  ],
  "keywordsInTitleOnly": false,
  "locations": [],
  "postedWithinDays": 14,
  "maxResults": 20,
  "sources": [
    "jobicy",
    "remoteok",
    "arbeitnow",
    "workingnomads"
  ],
  "remoteOnly": true,
  "withSalaryOnly": false,
  "excludeKeywords": [],
  "includeDescription": true,
  "maxPagesPerSource": 3,
  "onlyNew": false,
  "watchName": "default"
}
```

# Actor output Schema

## `results` (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": [
        "python",
        "data engineer"
    ],
    "postedWithinDays": 14,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("teddythebuilder/remote-jobs-api").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": [
        "python",
        "data engineer",
    ],
    "postedWithinDays": 14,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("teddythebuilder/remote-jobs-api").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": [
    "python",
    "data engineer"
  ],
  "postedWithinDays": 14,
  "maxResults": 20
}' |
apify call teddythebuilder/remote-jobs-api --silent --output-dataset

```

## MCP server setup

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

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/Qs7g7q5zsQ0j6r2SJ/builds/m2Pg4rWw3GXKPlLjw/openapi.json
