# Remote Jobs Scraper · Remote Openings, Salary, Tags & Company (`reapx/remote-jobs-scraper`) Actor

Scrape open remote jobs from Remotive API with company name, job title, salary, category, tags, locations, and direct apply link. Emits companyName per row.

- **URL**: https://apify.com/reapx/remote-jobs-scraper.md
- **Developed by:** [Tarek Etman](https://apify.com/reapx) (community)
- **Categories:** Jobs, Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

![reapX — public sources in, addressable records out](https://reapx.dev/reapx.gif)

## Remote Jobs Scraper · Remote Openings, Salary, Tags & Company

**Remote Jobs Scraper** extracts real-time remote job openings, hiring company names, salary ranges, skill tags, categories, location requirements, and direct application links from the Remotive API (`https://remotive.com/api/remote-jobs`). Every extracted record maps the employer to a clean `companyName` field, enabling entity-level page generation and cross-dataset aggregation.

> Maintained by **reapX**. Every row cites the Apify run that produced it — nothing is
> inferred, modelled or filled in, and a field absent from the source is absent from the row.
> The extracted archive for this source is browsable at
> [reapx.dev/data/remote-jobs-scraper/](https://reapx.dev/data/remote-jobs-scraper/) and mirrored as an open dataset on
> [Hugging Face](https://huggingface.co/datasets/reapxdev/remote-jobs-scraper) and
> [Kaggle](https://www.kaggle.com/datasets/reapxdev/remote-jobs-scraper). Questions: reapxdev@proton.me

Maintained by reapx (<reapxdev@proton.me>). Public sources in, addressable records out. Citation guarantee & archive links.

***

### Key Features & Capabilities

- **Direct Public API Extraction**: Fetches job listings directly over lightweight HTTP without requiring headless browser overhead or complex page rendering.
- **Entity Page Ready (`companyName`)**: Emits `companyName` on every row, fully validated by `growth/entity_pages.py` for automated entity page indexing.
- **Salary Transparency**: Captures published salary ranges and hourly compensation rates, with built-in filtering for pay transparency analysis.
- **Skill & Technology Tagging**: Extracts full technology stack tags (e.g. `python`, `react`, `aws`, `figma`, `kubernetes`, `solidity`).
- **Flexible Filtering**: Query jobs by official Remotive categories (`software-dev`, `design`, `marketing`, `data`, `sales`, etc.), search keywords, company name substrings, or tag matches.
- **Dataset Views**: Includes four tailored Console dataset views: *Overview*, *Companies Hiring*, *Positions with Disclosed Pay*, and *Full Remote Job Details*.
- **Flat Pay-Per-Event Billing**: Only pay per successfully returned job posting with 6 automatic volume discount tiers (`FREE` through `DIAMOND`).

***

### ⬇️ Input

The actor accepts standard JSON input parameters to filter and control job extraction. All filter fields are optional; leaving them empty fetches remote jobs across all categories and companies.

#### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `category` | String | `""` | Filter job listings by official Remotive category slug (e.g., `software-dev`, `design`, `data`, `marketing`, `sales`, `product`). Leave empty for all categories. |
| `search` | String | `""` | Full-text search keyword matched against job title, company name, skill tags, or job description (e.g., `python`, `react`, `senior`). |
| `companyNameFilter` | String | `""` | Substring filter matched against hiring employer name (e.g., `Lemon.io`, `Workada`). |
| `tagFilter` | String | `""` | Skill or technology stack tag filter (e.g., `python`, `golang`, `figma`, `aws`). |
| `mustHaveSalary` | Boolean | `false` | When true, only returns job postings that specify a clear salary range or pay rate. |
| `maxItems` | Integer | `200` | Maximum total number of remote job postings to return in dataset output. |

#### Input JSON Example

```json
{
  "category": "software-dev",
  "search": "senior",
  "tagFilter": "python",
  "mustHaveSalary": true,
  "maxItems": 100
}
```

***

### ⬆️ Output

All extracted remote job postings are written to the run's default dataset. Every item represents one job vacancy offered by a hiring employer.

#### Dataset Field Definitions

| Field Name | Type | Description | Example |
| :--- | :--- | :--- | :--- |
| `companyName` | String | Name of the hiring company or employer offering the remote position. Primary addressable entity key. | `Lemon.io` |
| `jobId` | String | Unique numeric identifier for the job posting on Remotive. | `2091081` |
| `title` | String | Title of the open remote position as published by the employer. | `Senior Graphic Designer` |
| `url` | String | Direct URL link to the job posting page on Remotive. | `https://remotive.com/remote-jobs/design/senior-graphic-designer-2091081` |
| `category` | String | Primary job category assigned by Remotive. | `Design` |
| `tags` | Array\[String] | Skill requirements, technology stack tags, or job keywords. | `["illustrator", "graphic design", "adobe creative suite"]` |
| `jobType` | String | Employment model (e.g. `full_time`, `contract`, `part_time`). | `full_time` |
| `publicationDate` | String | ISO 8601 publication timestamp of the job posting. | `2026-07-28T14:23:05` |
| `publicationDay` | String | Publication date formatted as `YYYY-MM-DD` for daily aggregation. | `2026-07-28` |
| `candidateRequiredLocation` | String | Geographic location or regional requirement for remote candidates. | `Americas, Europe, Asia, Africa, Oceania` |
| `salary` | String | Published salary range or hourly compensation rate when disclosed. | `$45,000 - $50,000` |
| `hasSalary` | Boolean | True when a non-empty salary range or pay rate is published. | `true` |
| `companyLogoUrl` | String | Direct image URL link to the hiring employer logo. | `https://remotive.com/job/2091081/logo` |
| `descriptionText` | String | Clean plain-text version of the job description for NLP and indexing. | `Are you a talented Senior Designer looking for a remote job...` |
| `descriptionHtml` | String | Original HTML formatted job description from Remotive API. | `<p>Are you a talented Senior Designer looking for a remote job...</p>` |
| `scrapedAt` | String | ISO 8601 UTC timestamp recording when this record was retrieved. | `2026-08-03T20:00:00.000Z` |

#### Sample Output Record

```json
{
  "companyName": "Lemon.io",
  "jobId": "2091081",
  "title": "Senior Graphic Designer",
  "url": "https://remotive.com/remote-jobs/design/senior-graphic-designer-2091081",
  "category": "Design",
  "tags": [
    "illustrator",
    "graphic design",
    "adobe creative suite",
    "figma"
  ],
  "jobType": "full_time",
  "publicationDate": "2026-07-28T14:23:05",
  "publicationDay": "2026-07-28",
  "candidateRequiredLocation": "Americas, Europe, Asia, Africa, Oceania",
  "salary": "$45,000 - $50,000",
  "hasSalary": true,
  "companyLogoUrl": "https://remotive.com/job/2091081/logo",
  "descriptionText": "Are you a talented Senior Designer looking for a remote job that lets you show your skills and get decent compensation? Look no further than Lemon.io — the marketplace that connects you with hand-picked startups in the US and Europe.",
  "scrapedAt": "2026-08-03T20:00:00Z"
}
```

***

### How it works

1. **Lightweight HTTP Retrieval**: Connects directly to `https://remotive.com/api/remote-jobs` using Python's standard network stack without standard headless browser overhead.
2. **Entity Key Mapping**: Maps raw `company_name` fields into `companyName` and validates against `growth/entity_pages.py` rules to guarantee 100% addressable page generation.
3. **Structured Transformation**: Parses HTML job descriptions into clean plain text (`descriptionText`) while preserving raw HTML formatting (`descriptionHtml`).
4. **Resilient Network Architecture**: Automatically retries failed requests with exponential backoff on intermittent errors or rate limits (HTTP 429/5xx).
5. **Streamed Pushing & PPE Billing**: Pushes records to the dataset in real-time batches of 20 items and charges per returned row under Apify's Pay-Per-Event system.

***

### Worked Examples

#### Example 1: Software Development Openings with Disclosed Salary

Extract open remote engineering positions that explicitly feature salary compensation ranges.

```json
{
  "category": "software-dev",
  "mustHaveSalary": true,
  "maxItems": 50
}
```

#### Example 2: Python & Data Engineering Roles

Find remote positions matching Python and Data Engineering skill tags.

```json
{
  "search": "python",
  "tagFilter": "data engineering",
  "maxItems": 100
}
```

#### Example 3: Full Remote Job Dump across All Employers

Retrieve all open remote jobs across all categories for market research and compensation benchmarking.

```json
{
  "maxItems": 500
}
```

***

### ❓ FAQ

##### How often is the Remotive job data updated?

Remotive updates its public API listings continuously throughout the day. Running this scraper daily guarantees complete coverage of new remote openings.

##### Does this scraper require API keys or paid credentials?

No. This scraper extracts data from Remotive's public endpoint over HTTP without needing any API key or subscription.

##### How does pricing work?

The actor uses Pay-Per-Event billing at $0.002 per returned job row (plus a fixed $0.00005 start event). If a query returns zero results or encounters a block, nothing is charged for data items.

##### Can I filter by specific tech stacks like React or Python?

Yes. You can pass keywords into `search` or `tagFilter` to isolate specific technologies, frameworks, or languages.

***

### 💬 Your feedback

We continuously improve our scrapers based on user feedback. If you encounter issues, require custom dataset fields, or want to suggest new features, please reach out to us at <reapxdev@proton.me>.

***

*Unofficial - not affiliated with Remotive. Collects public data only. reapx. Contact reapxdev@proton.me.*

### 🧪 Example input

A real, runnable configuration — this is an actual input this Actor has run with.

```json
{
  "category": "software-dev"
}
```

### 📄 Sample output

One real row from a real run of this Actor, unedited.

```json
{
  "companyName": "Lemon.io",
  "jobId": "2091081",
  "title": "Senior Graphic Designer",
  "url": "https://remotive.com/remote-jobs/design/senior-graphic-designer-2091081",
  "category": "Design",
  "tags": [
    ".Net",
    "android",
    "C",
    "C#",
    "C++",
    "data science",
    "golang",
    "illustrator",
    "ios",
    "java",
    "javascript",
    "node.js",
    "php",
    "python",
    "react",
    "ruby/rails",
    "scala",
    "shopify",
    "swift",
    "wordpress",
    "blockchain",
    "AI/ML",
    "automation",
    "project management",
    "adobe creative suite",
    "react native",
    "rust",
    "unity",
    "electron",
    "spring",
    "laravel",
    "Ethereum",
    "graphic design",
    "Typescript",
    "angular",
    "data engineering",
    "Site Reliability",
    "SOLID",
    "Symfony",
    "startup",
    "marketplace",
    "next.js",
    "adobe illustrator",
    "flutter"
  ],
  "jobType": "full_time",
  "publicationDate": "2026-07-28T14:23:05",
  "publicationDay": "2026-07-28",
  "candidateRequiredLocation": "Americas, Europe, Asia, Africa, Oceania",
  "salary": "",
  "hasSalary": false,
  "companyLogoUrl": "https://remotive.com/job/2091081/logo",
  "descriptionText": "Are you a talented Senior Designer looking for a remote job that lets you show your skills and get decent compensation? Look no further than Lemon.io — the marketplace that connects you with hand-picked startups in the US and Europe. What we offer: The rate depends on your skills and experience. We've already paid out over $11M to our engineers & designers . No more hunting for clients or negotiating rates — let us handle the business side of things so you can focus on what you do best. Choose a schedule that works best for you. It’s possible to communicate async or minimally overlap within team working hours. We respect your seniority so you can expect no micromanagement or screen trackers. Communicate directly with the clients. Sounds good, yeah? Most of our projects involve working in a fast-paced startup environment. We hope you like it as much as we do. Requirements: 5+ years of experience in Graphic Design 5+ years of commercial experience with Adobe Creative Suite & Adobe Illustrator Other requirements: Strong design craft — as a Senior Designer, you're expected to build polished, production-ready work from scratch, with a solid grasp of design systems, component architecture, and how your decisions translate into real product or brand outcomes. Clear and confident communication in English — advanced ability to discuss creative briefs, defend design decisions, and flag blockers early. Strong self-presentation is essential, particularly on client calls. High ownership, zero hand-holding — you thrive working full-time remotely, manage your own time, and consistently hit deadlines without being chased. Reliability — we need to trust you completely. If you commit to something, you deliver it. If something changes, you communicate early. Fast ramp-up — you can absorb project context quickly, align with existing style guides or brand directions, and start producing valuable work within the first days, not weeks. NOT YOUR TECH STACK? We have a
```

### ⚠️ Run outcomes and error handling

This Actor reports what happened in the run's **status message**, and it always keeps whatever it collected. These are the outcomes you can get and what each one means.

| Outcome | What it means |
|---|---|
| **Success** | Rows were returned and you were charged `job-returned` at $0.002 per row. |
| **No matches** | The source returned nothing for your filters. **Nothing is charged.** Widen the date window or drop a filter. |
| **Partial - source refused** | The source rate-limited or refused some requests. The affected items are skipped and named in the log, and **everything already collected is still pushed**. A block never discards a run's work. |

#### What is guaranteed either way

- **Every row is pushed as it is built**, not buffered to the end of the run. Anything that buffers output loses everything to a timeout, a block or a migration; this does not.
- **A field absent from the source is absent from the row.** Nothing is inferred, modelled or filled in to make a row look complete.

# Actor input Schema

## `category` (type: `string`):

Filter job listings by official Remotive job category slug (e.g. <code>software-dev</code>, <code>design</code>, <code>marketing</code>, <code>data</code>, <code>devops</code>, <code>product</code>). <b>Consequence:</b> Selecting a specific category narrows returned job postings to that domain; leaving this field empty fetches remote job openings across all available categories without restriction. <br><br>Learn more at <a href="https://remotive.com">remotive.com</a>.

## `search` (type: `string`):

Full-text search keyword matched against job title, company name, skill tags, or job description (e.g. <code>python</code>, <code>react</code>, <code>senior</code>, <code>engineer</code>). <b>Consequence:</b> Keyword filtering returns only matching remote positions; leaving this field empty returns all open remote positions across the board. <br><br>See <a href="https://remotive.com">Remotive</a> for search syntax.<br><br>Leave this field empty to skip this filter.

## `companyNameFilter` (type: `string`):

Filter remote job openings by company or employer name (e.g. <code>Lemon.io</code>, <code>Workada</code>, <code>Outsite</code>). <b>Consequence:</b> Narrows output to specific hiring companies; leaving this field empty includes job postings from all hiring employers. <br><br>Check employer names on <a href="https://remotive.com">Remotive</a>.<br><br>Leave this field empty to skip this filter.

## `tagFilter` (type: `string`):

Filter jobs by technology stack or skill tag (e.g. <code>python</code>, <code>golang</code>, <code>javascript</code>, <code>node.js</code>, <code>ai/ml</code>). <b>Consequence:</b> Limits output to jobs tagged with this technology; leaving this field empty includes jobs regardless of tags. <br><br>See available tags on <a href="https://remotive.com">Remotive</a>.<br><br>Leave this field empty to skip this filter.

## `mustHaveSalary` (type: `boolean`):

Only return remote job postings that specify a clear salary range or hourly compensation rate. <b>Consequence:</b> Filters out jobs without disclosed pay; leaving this disabled (false) returns all jobs whether salary is published or not. <br><br>Salary transparency details on <a href="https://remotive.com">Remotive</a>.

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

Maximum total number of remote job postings returned in the dataset output (e.g. <code>100</code>, <code>200</code>, <code>500</code>). <b>Consequence:</b> Higher limits take slightly longer to process and return more records, while lower limits run faster and cost less. Leaving empty uses default 200 limit. <br><br>Adjust capacity based on your pipeline needs.<br><br>The higher the number, the longer the run takes and the more you are charged, because you pay per row returned.

## Actor input object example

```json
{
  "maxItems": 200
}
```

# Actor output Schema

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

Every remote job posting record found by this run, one row per item, in the default dataset. Switch between views in Console.

# 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 = {
    "category": "",
    "search": "",
    "companyNameFilter": "",
    "tagFilter": "",
    "mustHaveSalary": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("reapx/remote-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 = {
    "category": "",
    "search": "",
    "companyNameFilter": "",
    "tagFilter": "",
    "mustHaveSalary": False,
}

# Run the Actor and wait for it to finish
run = client.actor("reapx/remote-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 '{
  "category": "",
  "search": "",
  "companyNameFilter": "",
  "tagFilter": "",
  "mustHaveSalary": false
}' |
apify call reapx/remote-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reapx/remote-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/bTUxGTjtMXITg8aIJ/builds/c31IO4LGOFIthXvH8/openapi.json
