# RemoteOK Jobs API — Remote Jobs by Tag, Salary & Location (`nexgensignal/remoteok-remote-jobs-api`) Actor

Remote jobs from Remote OK's public API: pick tags (python, design, marketing…), filter by keyword, location, company, salary and age. Clean text descriptions, fixed accents, Remote OK link on every row. No key, no login. Part of NexGen Signal — data tools and official-source data products

- **URL**: https://apify.com/nexgensignal/remoteok-remote-jobs-api.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 job listings

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

## 🌍 RemoteOK Jobs API — Remote Jobs by Tag, Salary & Location

Get **remote jobs from Remote OK** (remoteok.com) as clean rows: title, company, tags, location, yearly salary in USD when posted, posted date, the full description as plain text (or HTML), and the Remote OK job link.

Pick tags such as `dev`, `python`, `design`, `marketing`, `sales` or `customer-support` (each returns up to 100 current jobs), then keep only what matches your keywords, locations, companies, minimum salary and age, or drop jobs with words you do not want. Accents that Remote OK sometimes serves garbled (`MÃ©xico`) are repaired to `México`.

It uses Remote OK's public JSON API (no key). The unit of output is one job delivered.

### Who buys this and for what job

- **Job boards, newsletters and Slack/Discord bots** posting new remote jobs with a link back to Remote OK.
- **Recruiters and sales teams** spotting companies hiring remotely.
- **Job seekers** tracking new roles by skill and salary.
- **Analysts** watching remote pay by tag.

Buyers usually search for this as **"RemoteOK scraper"**, **"remote jobs API"** or **"remote job listings"**.

### 📊 Sample Output

![Table of Remote OK jobs: title, company, tags, salary in USD, location and posted date.](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/remoteok-remote-jobs-api.png)

| title | company | tags | salary_usd | location | posted |
|---|---|---|---|---|---|
| Software Engineer AI Coding Tasks | Askable | dev, python, javascript, typescript | 10,000–10,000 | — | 2026-10-17 |
| Head of Technology | Sanctuary Computer | dev, engineer, senior, full stack | 140,000–250,000 | — | 2026-10-16 |
| Director of Product Management and IT Operations | Self Bill Pro | product manager, exec, infosec, technical | 130,000–160,000 | — | 2026-10-16 |
| SAP RE FX Consultant | Yopeso Romania SRL | consulting, design, technical, customer support | — | — | 2026-10-16 |
| APAC Python | Kodland | python, teaching, education, customer support | — | — | 2026-10-16 |
| Associate Data Scientist | AlgaeCal | design, python, customer support, marketing | — | Vancouver | 2026-10-16 |
| Director of IT and Workplace | Hippocratic AI | exec, saas, infosec, python | — | Menlo Park | 2026-10-16 |
| Senior Software Engineer II Applied AI | Wrapbook | dev, design, amazon, sys admin | — | — | 2026-10-15 |

Rows from live run `bWk57AHsiJdywKwg2` on Apify (tags dev and marketing, 40 jobs). Notice how often location is empty: on Remote OK that usually means the job is open anywhere.

### ✅ What you get

Every field of each record:

- `record_id`, `job_id` — stable id from the Remote OK job id; use it to upsert.
- `title`, `company_name`, `company_logo` — the job and company.
- `tags`, `location` — skills and categories; location text as posted.
- `salary_min`, `salary_max`, `salary_currency` — yearly salary in USD, when posted.
- `published_at` — posted date (UTC).
- `description_text`, `description_html` — full description (text by default).
- `apply_url`, `job_url` — apply link and job page on Remote OK.
- `verified`, `original` — Remote OK's verified mark; posted on Remote OK directly.
- `source`, `source_url`, `matched_tag`, `read_at` — source credit, which tag found it, when it was read.

### ⚙️ Sample inputs

**Python and design jobs (the Store example)**

```json
{
  "tags": ["python", "design"],
  "maxJobs": 10
}
```

**Developer jobs paying 120k+ posted this week**

```json
{
  "tags": ["dev", "engineer"],
  "minSalary": 120000,
  "postedWithinDays": 7,
  "maxJobs": 200
}
```

**Marketing jobs open in Europe, no crypto**

```json
{
  "tags": ["marketing"],
  "locations": ["Europe", "EMEA", "Worldwide"],
  "excludeKeywords": ["crypto", "web3"],
  "maxJobs": 100
}
```

**The latest jobs across all tags**

```json
{
  "maxJobs": 100
}
```

No tags: Remote OK's latest 100 jobs.

Input fields:

| Field | Meaning |
|---|---|
| `tags` | Remote OK tags; each returns up to 100 current jobs. Empty = latest 100. |
| `keywords`, `excludeKeywords` | keep jobs containing every word of one keyword; drop jobs containing any excluded keyword. |
| `locations`, `companies` | keep matching location text or exact company names. |
| `minSalary`, `salaryOnly` | yearly USD floor; salary present. |
| `postedWithinDays` | age in days. |
| `includeDescription`, `descriptionFormat` | full description on/off; text, html or both. |
| `maxJobs` | stop after this many jobs (default 1,000). Each delivered job is billed. |

### 🧾 JSON sample record

```json
{
  "record_id": "28145054b76649effd3f4cce",
  "job_id": "1137538",
  "title": "Software Engineer AI Coding Tasks",
  "company_name": "Askable",
  "company_logo": null,
  "tags": [
    "dev",
    "python",
    "javascript",
    "typescript",
    "golang",
    "java",
    "c plus plus"
  ],
  "location": null,
  "salary_min": 10000,
  "salary_max": 10000,
  "salary_currency": "USD",
  "published_at": "2026-10-17T01:09:20Z",
  "description_text": "We're looking for experienced software engineers to build AI coding tasks from a codebase they know well. US$1,000 per task, and you can do as many tasks as you want.\n\nYou turn a real change from a repository you know into a task that today's best AI coding models struggle with: hard for the models, but fair for a skilled engineer. Your tasks are used to measure and train AI coding models.\n\nRemote…",
  "description_html": null,
  "apply_url": "https://remoteOK.com/remote-jobs/remote-software-engineer-ai-coding-tasks-askable-1137538",
  "job_url": "https://remoteOK.com/remote-jobs/remote-software-engineer-ai-coding-tasks-askable-1137538",
  "verified": null,
  "original": true,
  "source": "Remote OK",
  "source_url": "https://remoteok.com",
  "matched_tag": "python",
  "read_at": "2026-10-18T02:49:40Z"
}
```

### 🔧 How it works

One request per tag to Remote OK's public API, at most one a second as its robots.txt asks. Jobs found under several tags are delivered once. Filters run on the delivered text, so a keyword in the description counts.

Every run reads each host's robots.txt first: a path it disallows is skipped, listed in the run receipt and never charged. Only public internet addresses are fetched (no private, loopback or cloud-metadata addresses, checked again on every redirect). No logins, no CAPTCHA solving, no proxies.

Delivery is pushed first and charged after. The run receipt (`RUN_RECEIPT`) lists each request, how many jobs each filter dropped, and the delivered and charged counts.

### 💰 Pricing example

Per job delivered, no start fee, no monthly charge:

| Apify plan | Price per job |
|---|---|
| Free | $0.05 |
| Bronze | $0.045 |
| Silver | $0.04 |
| Gold, Platinum, Diamond | $0.0335 |

- 10 jobs: $0.50 on the Free plan, $0.34 on Gold.
- 500 jobs: $25.00 on the Free plan, $16.75 on Gold.
- 5,000 jobs: $250.00 on the Free plan, $167.50 on Gold.

**Coverage and size.** Proof runs on 18 Oct 2026: 40 jobs from two tags in 4 seconds; the Store example in 2 seconds. Remote OK returns up to 100 current jobs per tag, so 10 tags give up to about 1,000 jobs per run; schedule it daily to catch new ones.

### ⚖️ Legal & ToS

Jobs are Remote OK's listings. Remote OK's API terms ask you to link back to the job's Remote OK URL (a followed link) and mention Remote OK as the source, and not to use the Remote OK logo; every row carries `job_url` and `source` for that.

Rows hold job and company fields only.

Every run reads each host's robots.txt first: a path it disallows is skipped, listed in the run receipt and never charged. Only public internet addresses are fetched (no private, loopback or cloud-metadata addresses, checked again on every redirect). No logins, no CAPTCHA solving, no proxies.

### ❓ FAQ

**Do I need a key?**
No.

**Which tags exist?**
Any tag shown on a Remote OK job works, e.g. dev, engineer, python, javascript, react, design, marketing, sales, customer-support, devops, finance.

**Is salary always there?**
No. About a fifth of jobs post one; use salaryOnly to keep just those.

### 🆘 Troubleshooting

- **No job matched** — RUN_RECEIPT shows which filter dropped them.
- **SOURCE UNAVAILABLE** — Remote OK did not answer after retries. Nothing was charged.

### 🔗 Related Actors

- [Sweden Active Job Ads](https://apify.com/nexgensignal/se-active-job-ad-structured-feed) — Sweden's live job-ad feed in structured rows
- [Recently Funded Startups](https://apify.com/nexgensignal/funding-round-intelligence-api) — companies that just raised money, likely to hire
- [Company Email Lookup by Domain](https://apify.com/nexgensignal/business-email-discovery-api) — reach a hiring company from its domain

🏢 **About NexGen Signal** — data tools and official-source data products. Browse the catalog: [apify.com/nexgensignal](https://apify.com/nexgensignal)

### ⭐ Found this useful?

If this actor saved you time, a rating on its Apify Store page helps other buyers find it.

Part of NexGen Signal — data tools and official-source data products.

# Actor input Schema

## `tags` (type: `array`):

Remote OK tags such as dev, python, javascript, design, marketing, sales, customer-support, devops. Each tag returns up to 100 current jobs. Empty = the latest 100 jobs across all tags.

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

Keep jobs whose title, company, tags, location or description contain every word of at least one keyword.

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

Drop jobs that contain every word of any of these, e.g. 'senior', 'crypto'.

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

Keep jobs whose location text contains any of these, e.g. 'Europe', 'Canada'. Jobs with no location are dropped when set.

## `companies` (type: `array`):

Keep only these companies (exact name, any case).

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

Keep jobs whose top of range is at least this. Jobs without salary are dropped when set.

## `salaryOnly` (type: `boolean`):

Drop jobs with no salary.

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

Keep jobs posted in the last N days. 0 = any age.

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

Add the full job description.

## `descriptionFormat` (type: `string`):

Plain text, the original HTML, or both.

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

Stop after this many jobs. Each delivered job is billed.

## Actor input object example

```json
{
  "tags": [
    "python",
    "design"
  ],
  "keywords": [],
  "excludeKeywords": [],
  "locations": [],
  "companies": [],
  "minSalary": 0,
  "salaryOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "descriptionFormat": "text",
  "maxJobs": 10
}
```

# Actor output Schema

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

The delivered (and billed) records.

## `receipt` (type: `string`):

Per-link outcome, robots result, delivered and charged counts.

# 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 = {
    "tags": [
        "python",
        "design"
    ],
    "maxJobs": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/remoteok-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 = {
    "tags": [
        "python",
        "design",
    ],
    "maxJobs": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/remoteok-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 '{
  "tags": [
    "python",
    "design"
  ],
  "maxJobs": 10
}' |
apify call nexgensignal/remoteok-remote-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/remoteok-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/9wClZb7AAmmehFTuG/builds/ebL9H0MFcaTnoaY8V/openapi.json
