# RemoteOK Jobs Scraper — Official API (`bovi/remoteok-scraper`) Actor

Scrape remote job listings from RemoteOK via the public JSON API. Get title, company, tags, salary, seniority, descriptions and parse\_confidence. Tag-based filtering, zero auth, zero proxy.

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

## Pricing

from $0.87 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## RemoteOK Scraper | $1.50/1K — Official API, Salary Min/Max

For remote-first companies tracking competitor hiring, job aggregators building remote-only boards, and data teams studying the remote job market — RemoteOK's official API is the authoritative source.

**Pricing: $1.50/1,000 jobs** ($0.0015 each — you pay only for results returned)

Scrape **remote job listings from RemoteOK** via the official public JSON API.
Give it a tag (or leave blank for all listings) — get back clean, enriched job
data in seconds. **No login, no API key, no browser, no proxy required.**

Get started instantly: use the pre-filled "python" tag example or enter any
RemoteOK tag. **Try it free** — Apify's $5/month free tier covers thousands of runs.

### What this RemoteOK scraper does

- Fetches all open remote jobs from **remoteok.com/api** — the official public JSON endpoint.
- Filters by **tag** (e.g. "python", "react", "senior") using RemoteOK's native tag system.
- Returns a **clean flat schema** — identical fields every run, no parsing surprises.
- Enriches each job with **seniority** (intern / entry / mid / senior / lead / staff /
  principal / manager / director / vp / executive) from RemoteOK tags first, then title.
- Returns **salary range** (min/max USD) when RemoteOK discloses it.
- Returns full **job descriptions** as both plain text and HTML (togglable).
- Includes a **parse_confidence score** (0–1.0) and `warnings` list in every record.
- Supports **multi-tag batch runs** — enter comma-separated tags for a single API call.
- **maxItems** cap (default 100) prevents surprise bills on first runs.
- All jobs are **remote by definition** — `remote: true` on every record.

### What data you get

One flat row per job — 17 structured fields:

```json
{
  "job_id": "1132574",
  "title": "Entry Level Junior Trader",
  "company": "Infiniti Group",
  "location": "Anywhere",
  "tags": ["other", "finance", "analyst", "entry level"],
  "salary_min": 50000,
  "salary_max": 60000,
  "remote": true,
  "seniority": "entry",
  "posted_at": "2026-05-30T08:26:26+00:00",
  "url": "https://remoteOK.com/remote-jobs/...",
  "apply_url": "https://remoteOK.com/remote-jobs/...",
  "description_text": "We are looking for a Junior Trader...",
  "description_html": "<p>We are looking for a <strong>Junior Trader</strong>...</p>",
  "parse_confidence": 1.0,
  "warnings": [],
  "scraped_at": "2026-05-31T12:00:00+00:00"
}
````

**Field notes:**

- `salary_min` / `salary_max` are `null` when not disclosed (most listings). Annual USD.
- `seniority` is inferred from RemoteOK tags first (cleaner), then job title.
- `remote` is always `true` — every job on RemoteOK is remote by definition.
- `parse_confidence` is `1.0` for a fully-populated job; small deductions for missing
  optional fields. Check `warnings` for the reason codes.

### Input schema

| Field | Type | Default | Description |
|---|---|---|---|
| `searchTags` | string | "python" | RemoteOK tag filter. Comma-separate for multi-tag: "python,django". Leave blank for all jobs. |
| `keywords` | string | — | Case-insensitive title keyword filter (applied client-side) |
| `maxItems` | integer | 100 | Cap on total jobs returned (0 = unlimited) |
| `includeDescriptions` | boolean | true | Include description\_text + description\_html |

### Common tags

Technology: `python`, `javascript`, `typescript`, `react`, `node`, `go`, `rust`, `devops`,
`aws`, `kubernetes`, `django`, `rails`, `vue`, `flutter`, `ios`, `android`

Function: `design`, `marketing`, `finance`, `sales`, `hr`, `legal`, `medical`, `customer support`

Seniority: `senior`, `exec`, `lead`, `entry level`, `intern`

Type: `saas`, `b2b`, `startup`, `non tech`, `digital nomad`

### Pricing example

| Run | Jobs returned | Cost |
|---|---|---|
| Quick trial (1 tag, 100-cap default) | ~100 | $0.15 |
| 1,000 jobs (10 tags) | 1,000 | $1.50 |
| All listings (no tag, unlimited) | ~200–400 | $0.30–$0.60 |

Pay-per-result: **$1.50 / 1,000 jobs** ($0.0015 each). You pay only for jobs
returned. RemoteOK's public API is free — your compute cost is just Apify's
platform usage, which the buyer pays.

### FAQ

**Do I need an API key or proxy?**
No. RemoteOK's `/api` endpoint is officially public — no credentials, no proxy, no browser.

**What formats can I export?**
JSON, CSV, Excel, or JSONL — from the Apify dataset UI or via REST API.

**How many jobs are available?**
RemoteOK typically has 200–400 active listings at any time. With a tag filter you get the subset matching that tag.

**What if a tag returns 0 results?**
The actor skips that tag cleanly and continues — no crash, no charge.

### Reliability

RemoteOK's `/api` endpoint is a stable, officially public JSON feed with no
authentication and no rate limiting under normal usage. This actor uses zero
browser, zero proxy — just direct HTTP to the official endpoint with a realistic
User-Agent. Parse confidence is consistently 1.0 on complete listings.

Typical run: 100 jobs in under 3 seconds.

### Use cases

- **Job aggregation** — build a searchable board of remote jobs by technology stack.
- **Hiring intelligence** — track which companies are hiring for specific skills remotely.
- **AI agent input** — feed job data to an LLM for matching, summarizing or alerting.
- **Lead generation** — identify fast-growing companies hiring remote engineers.
- **Salary research** — collect salary ranges for remote roles by tag/function.
- **Career monitoring** — set up alerts for new remote roles matching your skills.

### Use with AI agents (MCP)

This actor is available via Apify's MCP server. Connect it to any MCP-compatible agent (Claude, n8n, Make) to pull live remote job data on demand — no code required.

```
https://mcp.apify.com/?tools=bovi/remoteok-scraper
```

### Alternatives and comparison

| Feature | This scraper | Generic job scrapers |
|---|---|---|
| `parse_confidence` score | Yes | No |
| Seniority enrichment | Yes (tags + title, 11 levels) | Rarely |
| Salary min/max (integer fields) | Yes (when disclosed) | String only or missing |
| Tag-based filtering | Yes (native API) | No |
| Multi-tag batch | Yes | No |
| Official API (not HTML scrape) | Yes | Rarely |
| Zero proxy | Yes | Often needs proxy |
| Price | $1.50/1K | Varies |

Every record includes `parse_confidence` (1.0 for complete listings). Check `warnings` for the specific reason code when it drops. RemoteOK's API is stable — 1.0 is the norm.

### Attribution

RemoteOK's API Terms of Service require linking back to RemoteOK with a
follow link and crediting RemoteOK as the source in any published use of the
data. Please ensure your downstream application attributes RemoteOK appropriately.

This actor is not affiliated with, endorsed by, or partnered with RemoteOK or
its parent company. It uses the freely accessible public JSON API at remoteok.com/api.

### Integrations

Built for remote-first hiring teams and job aggregators monitoring the remote job market by tag and salary — the JSON/dataset output drops into the tools you already run, no glue code:

- **n8n / Make / Zapier** — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: [n8n](https://docs.apify.com/platform/integrations/n8n), [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier).
- **Webhooks** — fire your own endpoint the moment a run finishes, to push results straight into your pipeline ([docs](https://docs.apify.com/platform/integrations/webhooks)).
- **MCP server** — expose this actor as a tool to Claude, Cursor, or any [MCP client](https://mcp.apify.com) so an AI agent can pull this data mid-conversation ([guide](https://blog.apify.com/how-to-use-mcp/)).
- **API & SDKs** — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all [Apify integrations](https://apify.com/integrations).

# Actor input Schema

## `searchTags` (type: `string`):

Filter jobs by RemoteOK tag(s). Comma-separate multiple tags: "python,django" or "react,node". Leave blank to fetch all ~100 current listings. Common tags: python, javascript, typescript, react, node, go, rust, devops, design, marketing, finance, saas, senior, exec.

## `keywords` (type: `string`):

Keep only jobs whose title contains this text (case-insensitive). Applied client-side after fetching. Example: "engineer" or "product manager". Leave blank to return all jobs.

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

Maximum number of jobs to return across all tag requests. Default 100 (one API call = ~100 results). Set to 0 for no limit.

## `includeDescriptions` (type: `boolean`):

Return full job description as plain text and HTML. RemoteOK includes descriptions inline — no extra requests. Disable to reduce output size.

## Actor input object example

```json
{
  "searchTags": "python",
  "maxItems": 100,
  "includeDescriptions": true
}
```

# Actor output Schema

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

Dataset containing Remoteok Scraper records (title, company, tags, seniority, salary\_min, salary\_max, location, posted\_at, url, parse\_confidence).

# 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 = {
    "searchTags": "python",
    "maxItems": 100,
    "includeDescriptions": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/remoteok-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 = {
    "searchTags": "python",
    "maxItems": 100,
    "includeDescriptions": True,
}

# Run the Actor and wait for it to finish
run = client.actor("bovi/remoteok-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTags": "python",
  "maxItems": 100,
  "includeDescriptions": true
}' |
apify call bovi/remoteok-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=bovi/remoteok-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RemoteOK Jobs Scraper — Official API",
        "description": "Scrape remote job listings from RemoteOK via the public JSON API. Get title, company, tags, salary, seniority, descriptions and parse_confidence. Tag-based filtering, zero auth, zero proxy.",
        "version": "0.1",
        "x-build-id": "fiVvpWqHoq5S1lNVT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bovi~remoteok-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bovi-remoteok-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/bovi~remoteok-scraper/runs": {
            "post": {
                "operationId": "runs-sync-bovi-remoteok-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/bovi~remoteok-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-bovi-remoteok-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchTags": {
                        "title": "Tag filter (comma-separated)",
                        "type": "string",
                        "description": "Filter jobs by RemoteOK tag(s). Comma-separate multiple tags: \"python,django\" or \"react,node\". Leave blank to fetch all ~100 current listings. Common tags: python, javascript, typescript, react, node, go, rust, devops, design, marketing, finance, saas, senior, exec."
                    },
                    "keywords": {
                        "title": "Title keyword filter",
                        "type": "string",
                        "description": "Keep only jobs whose title contains this text (case-insensitive). Applied client-side after fetching. Example: \"engineer\" or \"product manager\". Leave blank to return all jobs."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of jobs to return across all tag requests. Default 100 (one API call = ~100 results). Set to 0 for no limit.",
                        "default": 100
                    },
                    "includeDescriptions": {
                        "title": "Include job descriptions",
                        "type": "boolean",
                        "description": "Return full job description as plain text and HTML. RemoteOK includes descriptions inline — no extra requests. Disable to reduce output size.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
