# Remote OK Jobs Scraper (`deriverge/remoteok-jobs-scraper`) Actor

Remote jobs from Remote OK by tag, with company, tags, location, posting date and the salary range in US dollars where the employer shows one. Each tag returns up to the 100 newest jobs, which you can filter by keyword, location, salary or age, or reduce to new jobs only.

- **URL**: https://apify.com/deriverge/remoteok-jobs-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 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 OK Jobs Scraper

Remote OK Jobs Scraper reads the public job feed of remoteok.com by tag, one row per job: title, company, Remote OK's tags, the location written on the listing, the salary range in US dollars when the employer gives one, the posting date and the link. The form starts with the tags `python` and `javascript` and a limit of 50 jobs, so **Start** returns results within seconds. Each tag gives at most the 100 newest jobs with that tag, and for a narrow tag those reach back months. It costs $0.80 per 1,000 jobs on the Free plan ($0.40 on Business), and the $5 of monthly credit in Apify's Free plan covers about 6,200 jobs.

### What data does it return?

| Field | Description |
|---|---|
| `title`, `company` | Job title and hiring company as posted, e.g. `Solutions Delivery Manager` at `Benchling`. |
| `tags` | Every tag Remote OK attaches to the job, such as `biotech`, `sales` or `digital nomad`. Jobs carry many broad tags: on 11 October 2026, `exec` was on 368 of 422 jobs. |
| `locationRestriction` | The location as the employer typed it: a city such as `Boston`, a country, `Remote`, or `null` when left blank. |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Pay range as numbers, e.g. `150000` and `200000`, with `USD` and `yearly`. All four are `null` when the job shows no salary. |
| `postedAt` | When the job went up on Remote OK, as an ISO 8601 UTC timestamp. |
| `verified` | `true` when Remote OK marks the job as verified. It came on 6 of 422 jobs and is `null` on the rest. |
| `description` | The job text without HTML: its first 300 characters, or all of it with **Include the full description**. Full texts had a median length of about 3,200 characters. |
| `url`, `applyUrl` | The job page on remoteok.com. Remote OK gives the same page as the apply link. |
| `jobId`, `key` | Remote OK's numeric job ID, and `remoteok:<id>`, which the new-only mode compares between runs. |
| `companyLogo`, `companySlug`, `companyUrl`, `companyHeadquarters`, `category`, `employmentType`, `seniority`, `countries`, `timezones`, `expiresAt`, `salaryText` | Always empty here. The table is shared with our other remote job board scrapers, and Remote OK's feed has none of these values; its logo fields were blank in October 2026. `source` and `sourceName` are always `remoteok` and `Remote OK`. |

### How to scrape Remote OK jobs

1. In **Tags**, enter Remote OK tags, one per line: skills such as `python`, `react` or `golang`, or areas such as `design`, `marketing`, `customer support` or `sales`. With no tag, the actor reads the board's newest jobs overall.
2. Narrow the jobs if you want: **Keywords (any of)** keeps jobs whose title, company or tags contain one of the words, **Exclude keywords** drops them, **Locations (any of)** takes places such as `US`, `Germany` or `Europe`, **Minimum salary** is in US dollars per year, and **Posted within the last N days** drops older jobs.
3. Turn on **Include the full description** for the whole job text. The price per job stays the same.
4. Set **Maximum rows** and click **Start**. The jobs appear in the **Output** tab, and its export button gives CSV, Excel or JSON. The `SUMMARY` record in the key-value store shows how many jobs each filter removed and any tag that had no jobs.

Through the API, Python, Go and DevOps jobs from the last 30 days that are open to Europe or have no location, paying at least $100,000 where a salary is shown:

```json
{
  "tags": ["python", "golang", "devops"],
  "locations": ["Europe"],
  "minSalary": 100000,
  "postedWithinDays": 30,
  "includeDescription": true,
  "maxItems": 500
}
```

### Example output

A job from a run on 11 October 2026 with seven tags and full descriptions. The description is cut after its opening sentences here, marked ` ...`; the dataset has the whole text.

```json
{
  "key": "remoteok:1136937",
  "source": "remoteok",
  "sourceName": "Remote OK",
  "jobId": "1136937",
  "title": "Solutions Delivery Manager",
  "company": "Benchling",
  "companyLogo": null,
  "companySlug": null,
  "companyUrl": null,
  "companyHeadquarters": null,
  "category": null,
  "tags": [
    "exec",
    "design",
    "technical",
    "marketing",
    "sales",
    "biotech",
    "medical",
    "education",
    "digital nomad"
  ],
  "employmentType": null,
  "seniority": null,
  "locationRestriction": "Boston",
  "countries": [],
  "timezones": [],
  "salaryMin": 150000,
  "salaryMax": 200000,
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly",
  "salaryText": null,
  "postedAt": "2026-08-18T08:00:07.000Z",
  "expiresAt": null,
  "verified": null,
  "description": "We are rebuilding biotech for the AI era. When a breakthrough is delayed, the world waits. ...",
  "url": "https://remoteok.com/remote-jobs/remote-solutions-delivery-manager-benchling-1136937",
  "applyUrl": "https://remoteok.com/remote-jobs/remote-solutions-delivery-manager-benchling-1136937"
}
```

### How much does it cost to scrape Remote OK?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $0.80 | $0.64 | $0.52 | $0.40 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

Seven tags (`python`, `react`, `devops`, `design`, `marketing`, `customer support`, `sales`) gave 422 different jobs on 11 October 2026, which cost $0.3376 on the Free plan and $0.1688 on Business. A job found under several tags is returned and charged once, and jobs your filters drop or the new-only mode skips are not charged.

### Limits

- Remote OK's feed lists only the newest jobs: up to 100 per tag, and about 100 without a tag. On 11 October 2026 the 100 newest `python` jobs went back to 19 June 2026, and 5 of them had been posted since 1 August. The main feed covered 31 July to 10 October.
- Tags overlap heavily. The seven tags above returned 690 jobs, of which 422 were different.
- Few jobs show pay: 14 of 422. Remote OK publishes two numbers without a period, so the actor labels them yearly USD, but 3 of the 14 were hourly rates such as `40` to `48`. **Minimum salary** removes those along with low yearly ranges, and keeps every job without a salary.
- Locations are free text and not always clean: 43 of 422 jobs had none, and a few name a small town or an odd value. **Locations (any of)** keeps jobs with no location or marked `Remote`.
- Requests go one tag at a time with a pause between them, as Remote OK's robots.txt asks. Seven tags with full descriptions took about a minute, and the two prefilled tags 8 seconds.
- If Remote OK answers a tag with an error, the run moves on to the next tag and names the error in `SUMMARY`.

### Daily alerts for new jobs

Turn on **Return only jobs new since the last run**, give the run a **Watch name** such as `python-europe` or save it as a task, and schedule it once a day. Each run then returns only the jobs it has not sent under that name before; a job stays remembered for 60 days after a run last saw it in the feed, so it does not come back as new. Jobs that passed your filters but did not fit under **Maximum rows** come with the following run. Because the feed holds only the newest 100 jobs per tag, a daily schedule is also the way to collect more than that over time.

### FAQ

#### Is it legal to scrape Remote OK?

The actor reads Remote OK's public JSON feed at remoteok.com/api, a path its robots.txt allows. Remote OK's API terms ask that you name Remote OK as the source and link to the job's `url` when you publish its listings elsewhere. The rows describe jobs and companies and contain nothing about applicants. You are responsible for how you use the data.

#### Which tags can I use?

Any tag Remote OK uses, in lower case as on the site, for example `python`, `react`, `golang`, `devops`, `design`, `marketing`, `customer support`, `sales` or `finance`. A tag with no jobs leaves a warning in the log and in `SUMMARY`.

#### Can I combine Remote OK with other remote job boards?

Yes. The rows have the same columns as our Remote Jobs Scraper, Himalayas Jobs Scraper and We Work Remotely Jobs Scraper, so their datasets can be stacked into one table and told apart by `source`.

### Related scrapers

- [Remote Jobs Scraper](https://apify.com/deriverge/remote-jobs-scraper)
- [Himalayas Jobs Scraper](https://apify.com/deriverge/himalayas-jobs-scraper)
- [We Work Remotely Jobs Scraper](https://apify.com/deriverge/weworkremotely-jobs-scraper)
- [Career Site and ATS Jobs API](https://apify.com/deriverge/career-site-jobs-search)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/remoteok-jobs-scraper/changelog.md

# Actor input Schema

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

Remote OK tags to read, for example python, react, devops, design, marketing or customer support. Each tag returns up to the 100 newest jobs with that tag. Leave empty for the 100 newest jobs overall.

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

Keep only jobs whose title, company or tags contain at least one of these words, case-insensitive. Leave empty to keep everything.

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

Keep only jobs whose location mentions one of these places, for example "US", "Germany" or "Europe". Two-letter country codes work. Jobs with no location or marked Remote always pass.

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

Drop jobs whose published top of range, counted per year (monthly pay times 12, weekly times 52, hourly times 2,080), is below this number, in the currency the board publishes. Jobs with no published salary are kept, because an absent salary is not a low one.

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

Drop jobs older than this. Filtered jobs are never charged.

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

Drop jobs whose title, company, category or tags contain any of these words, for example "senior" or "sales".

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

Adds the full job description as plain text. Off, each row carries the first 300 characters.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily and you have a job alert that bills only for new postings.

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

Name of the snapshot used by the new-only mode, for example "python-europe". Runs from a saved task get a snapshot automatically even without a name.

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

Hard cap on returned jobs in the run. The run stops reading as soon as it has this many.

## Actor input object example

```json
{
  "tags": [
    "python",
    "javascript"
  ],
  "includeDescription": false,
  "newOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

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

One row per Remote OK job with the title, company, salary as numbers, candidate location, posting date and links.

## `changes` (type: `string`):

Jobs that appeared and jobs that disappeared compared with the previous snapshot of the same watch name or task.

## `summary` (type: `string`):

How many jobs were read, how many each filter dropped, warnings about searches that found nothing, and totals.

# 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",
        "javascript"
    ],
    "maxItems": 50
};

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

# Run the Actor and wait for it to finish
run = client.actor("deriverge/remoteok-jobs-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 '{
  "tags": [
    "python",
    "javascript"
  ],
  "maxItems": 50
}' |
apify call deriverge/remoteok-jobs-scraper --silent --output-dataset

```

## MCP server setup

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