# Remotive.com Scraper (`hoholabs/remotive-scraper`) Actor

Fetch remote job listings from Remotive.com by category or keyword. No API key required.

- **URL**: https://apify.com/hoholabs/remotive-scraper.md
- **Developed by:** [Hoho](https://apify.com/hoholabs) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Remotive.com Scraper

Fetch remote job listings from [Remotive.com](https://remotive.com). No API key required.

> ⚠️ **Read "Upstream limitations" before using this scraper.** Remotive's public API ignores its own category and keyword-search params, so this scraper cannot offer them. It returns Remotive's full current feed, which as of 2026-09-09 is **17 jobs**.

***

### Why this scraper?

- **No auth needed** — Remotive's public API requires no registration or API key
- **30 job categories listed** — via `categories` mode (the category *filter* is dead upstream; see limitations)
- **Rich job data** — salary, location requirements, tags, company logo, full HTML description
- **Global remote jobs** — listings from companies worldwide with remote-friendly positions

***

### What you can fetch

| Mode | Description |
|------|-------------|
| `browse` | Fetch the current remote-jobs feed (optionally truncated with `limit`) |
| `categories` | List all 30 job categories Remotive publishes, with slugs |

***

### Usage

#### Browse remote jobs

```json
{
  "queryType": "browse"
}
```

#### Browse, limited to 5 results

```json
{
  "queryType": "browse",
  "limit": 5
}
```

#### List all categories

```json
{
  "queryType": "categories"
}
```

***

### Input fields

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `queryType` | string | `browse` | `browse` or `categories` |
| `limit` | integer | *(all)* | Max number of jobs to return. Applied **by this scraper** after fetching — Remotive's own `limit` param does nothing. |

***

### Output fields (browse mode)

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | integer | Remotive internal job ID |
| `url` | string | Link to the job on Remotive |
| `jobTitle` | string | Job title |
| `company_name` | string | Hiring company name |
| `company_logo_url` | string | Company logo image URL |
| `category` | string | Job category |
| `tags` | array | Skills / technology tags |
| `job_type` | string | Employment type (full\_time, contract, etc.) |
| `publication_date` | string | ISO 8601 publication timestamp |
| `candidate_required_location` | string | Location requirement (e.g. "USA Only", "Worldwide") |
| `salary` | string | Salary range as a string (may be empty) |
| `jobDescription` | string | Full job description in HTML |

### Upstream limitations

Remotive's public API accepts these params but **ignores them** — verified 2026-09-09 by calling
`remotive.com/api/remote-jobs` directly, using Remotive's own slugs from their `/categories`
endpoint. This is a limit of their API, not of this scraper, so they are not offered:

- **Category filter** — `?category=software-development` (their own slug) returns the identical
  full feed, 17/17 the same job ids as no filter at all.
- **Keyword search** — `?search=python` returns the identical full feed, 17/17 the same ids.
- **Upstream `limit`** — also ignored. This scraper therefore applies `limit` itself, after
  fetching, so the parameter does work — but it truncates, it does not fetch more.

**Feed size:** Remotive's entire public API returned **17 jobs** on 2026-09-09 (down from 42 in
July 2026). The `categories` endpoint still lists 30 categories, but only ~9 have any jobs in the
live feed. The jobs returned are genuine and fresh (newest 2.6 days old) — there are just very
few of them. Use `categories` mode for the category list, and expect a small feed from `browse`.

### Output fields (categories mode)

| Field | Type | Description |
|-------|------|-------------|
| `id` | integer | Category ID |
| `name` | string | Category display name |
| `slug` | string | Category slug *(informational — the category filter is dead upstream)* |

***

### Use cases

- **Job boards** — aggregate remote listings into your own platform
- **Job alert tools** — monitor new postings (filter client-side by the `category` field on each job)
- **Salary research** — collect salary data across remote roles
- **Recruiting tools** — track available talent pools by skill or category
- **Career analytics** — analyze remote job market trends over time

***

### Latency & caching

| Data | Cache TTL |
|------|-----------|
| Job listings | 4 hours |
| Categories | 24 hours |

***

### Disclaimer

This scraper uses Remotive's public API. It is not affiliated with or endorsed by Remotive. Use responsibly and in accordance with [Remotive's terms of service](https://remotive.com/terms). The API requires attribution and prohibits redistribution to aggregator sites (Jooble, Google Jobs, LinkedIn, etc.).

# Actor input Schema

## `queryType` (type: `string`):

What to fetch: browse remote jobs (category / keyword filters), list all job categories.

## `limit` (type: `integer`):

Maximum number of jobs to return (applied by this scraper, not upstream). Leave blank for all available jobs.

## Actor input object example

```json
{
  "queryType": "browse"
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("hoholabs/remotive-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("hoholabs/remotive-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 '{}' |
apify call hoholabs/remotive-scraper --silent --output-dataset

```

## MCP server setup

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