# Remote Jobs Scraper: Work From Home Jobs from 25,500+ Companies (`richiedc95/remote-jobs-search`) Actor

Remote and work-from-home jobs straight from 25,500+ companies' own career sites (Greenhouse, Lever, Ashby, Workday and more): no reposts, salaries, apply links, daily new-job alerts. $3.00 per 1,000 jobs.

- **URL**: https://apify.com/richiedc95/remote-jobs-search.md
- **Developed by:** [Richie Data](https://apify.com/richiedc95) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 Jobs Scraper: Work From Home Jobs from 25,500+ Companies

Find **remote and work-from-home jobs** directly from the career sites of **25,500+ companies**: startups, scale-ups and enterprises that hire on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and 9 more applicant tracking systems. Type a role and get every matching remote opening, with the salary when published and the employer's own apply link.

⭐ **Is this Actor useful to you?** A short review on the Reviews tab helps other users find it, and tells us what to build next.

- 🏠 **Remote only**: jobs the employer marks as remote, work from home or anywhere.
- 🏢 **Straight from employers**: no job-board reposts, no recruiters' duplicates, no expired listings copied around the web.
- 💰 **Salary ranges parsed into numbers** when the company publishes them.
- 🔔 **Daily job alerts**: save your search as a task, schedule it daily and turn on **Only new jobs**: each run returns just the jobs posted since the last one, straight to Slack, email, Google Sheets or a webhook.
- 🌍 **Regional filter**: keep remote roles open to the US, Europe, a country, or worldwide.
- 🎯 **Filters**: experience level (intern, junior, senior...), employment type, minimum salary, words in the description, posted in the last N days.
- 🔔 **Daily alerts**: turn on **Only new jobs** and schedule it; each run returns only jobs you have not seen.
- 💵 **$3.00 per 1,000 jobs**.

### Who uses it

- **Remote job boards and newsletters** that publish fresh remote openings every day.
- **Remote job seekers and career coaches** building a personal alert for a role.
- **Recruiters and researchers** tracking which companies hire remotely, and for what.

### How to use it

1. Enter one or more **roles** (for example `software engineer`, `customer support`, `product designer`).
2. Optionally add **regions** (`US`, `Europe`, `Worldwide`), **posted within N days**, **experience level** or **minimum salary**.
3. Click **Start**. For a daily remote-jobs feed, turn on **Only new jobs** and add a schedule.

#### Example input

```json
{
    "keywords": ["software engineer", "devops"],
    "locations": ["US", "Worldwide"],
    "postedWithinDays": 7,
    "seniorityLevels": ["mid", "senior"],
    "onlyNewJobs": true
}
```

### Output

Each job has the same schema as our other job Actors: company, title, department, location, `workplaceType` (always `remote` here), employment type, seniority, salary min/max/currency/period, posting date, apply URL and description. The `SUMMARY` record lists the companies scanned and matched.

### Pricing

**$3.00 per 1,000 jobs** saved plus about $0.01 per run. Use **Max jobs** to cap a run. In the **Companies** output (lead lists), each hiring company costs $0.01 more, because one record bundles every matching role, the careers page and the salary range.

### FAQ

**Is this an alternative to a LinkedIn or Indeed jobs scraper?** Yes, and a safer one. Most jobs you see on LinkedIn and Indeed are first published on the employer's own career site (Greenhouse, Lever, Workday and the other ATS this Actor reads), so you get the same openings from the original source, usually earlier and with the full description, salary range and direct apply link. No LinkedIn or Indeed account, cookies, proxies or login are needed, nothing is scraped from those sites, and there are no blocked runs or duplicated reposts. This Actor is not affiliated with LinkedIn or Indeed.

**How do you know a job is remote?** From the employer's own posting: the workplace type field when the ATS provides one, or "Remote", "Anywhere", "Work from home" in the location. Hybrid jobs are not included.

**Remote for which countries?** Many remote roles are limited to a region. Use **Locations** with `US`, `Europe`, a country name or `Worldwide` to keep only the ones open to you.

**How fresh are the results?** Titles are indexed daily and every matching job is fetched live from the employer's career site at run time, so closed jobs are not returned.

**Is it legal?** It reads public job postings that companies publish for anyone to see, through each ATS's public job board endpoints. No login and no personal data.

### Use it from your code, AI agents and automations

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("richiedc95/remote-jobs-search").call(run_input={
    "keywords": [
        "software engineer"
    ],
    "locations": [
        "Worldwide",
        "Europe"
    ],
    "postedWithinDays": 1,
    "onlyNewJobs": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('richiedc95/remote-jobs-search').call({
    "keywords": [
        "software engineer"
    ],
    "locations": [
        "Worldwide",
        "Europe"
    ],
    "postedWithinDays": 1,
    "onlyNewJobs": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

- 🤖 **AI agents (MCP)**: add the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client and this Actor becomes a tool your agent can call.
- 🔗 **No-code (n8n, Make, Zapier)**: one HTTP request runs the Actor and returns the results, so any automation tool can use it. In n8n, add an *HTTP Request* node with method `POST`, URL `https://api.apify.com/v2/acts/richiedc95~remote-jobs-search/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>` and the JSON input above as the body, then send the items to Slack, Google Sheets, email or a CRM. Put a *Schedule* node in front for daily alerts. Make and Zapier have official Apify apps (*Run an Actor* → *Get dataset items*). Ready-made n8n workflows (import from URL) and a step-by-step guide: [n8n / Make / Zapier examples](https://github.com/richiedc95/job-search-mcp/blob/main/examples/README.md).
- 📥 **Exports**: download every run as JSON, CSV, Excel, XML or RSS, or read it through the [Apify API](https://docs.apify.com/api/v2).

### Get a fresh feed automatically (job boards, dashboards, alerts)

1. Click **Save as a new task** with your input (turn on the monitoring option if the Actor has one, so each run returns only new jobs).
2. Add a **schedule** to the task (hourly, daily or weekly) under **Schedules**.
3. Read the latest results from one stable URL, in the format your tool expects:

```text
https://api.apify.com/v2/actor-tasks/<TASK_ID>/runs/last/dataset/items?token=<YOUR_APIFY_TOKEN>&status=SUCCEEDED&format=csv
```

Use `format=json`, `csv`, `xlsx`, `xml` or `rss`. Job-board plugins and spreadsheets can import that URL directly.

### Related Actors

- [Job Search Scraper: 25,500+ Company Career Sites](https://apify.com/richiedc95/company-jobs-search): the same search for any job, remote or not.
- [Career Site Jobs Scraper & API](https://apify.com/richiedc95/career-site-jobs-scraper): all jobs from the companies you choose.

Found a bug or need a feature? Open an issue on the Issues tab and we will usually answer within a day.

# Actor input Schema

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

Remote jobs whose title contains at least one of these words or phrases, e.g. "software engineer", "customer support", "designer".

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

Skip jobs whose title contains any of these words, e.g. "senior", "intern".

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

Keep only remote jobs whose location mentions one of these texts, e.g. "US", "Europe", "Worldwide", "Canada" (useful for remote roles limited to a region).

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

Keep only jobs posted in the last N days. 0 = no limit.

## `excludeLocations` (type: `array`):

Skip jobs whose location contains any of these texts, e.g. "India", "Remote".

## `seniorityLevels` (type: `array`):

Keep only these levels, detected from the job title (e.g. "Junior", "Graduate", "Senior", "Head of"). "Mid" is any title without a level word. Leave empty for all.

## `employmentTypes` (type: `array`):

Keep only these employment types. Jobs that do not state a type are skipped when this is set.

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

Keep only jobs that publish a pay range whose top reaches at least this yearly amount, in the job's own currency (hourly and monthly pay are converted to yearly). Jobs without a published salary are skipped when this is set. 0 = no filter.

## `descriptionKeywords` (type: `array`):

Keep only jobs whose title or description contains at least one of these words, e.g. "Python", "visa sponsorship", "Spanish".

## `visaSponsorship` (type: `boolean`):

Keep only jobs whose description says visa sponsorship is offered (e.g. "we sponsor H-1B visas"). Every job also gets a visaSponsorship field: true, false (says it does not sponsor) or null (does not say).

## `ycOnly` (type: `boolean`):

Search only the ~950 Y Combinator startups in the directory. Every job from a YC company also carries its batch in ycBatch (e.g. W24).

## `companyNames` (type: `array`):

Search only companies whose name contains one of these texts, e.g. "Stripe", "Bank". Leave empty to search the whole directory.

## `excludeCompanyNames` (type: `array`):

Skip companies whose name contains any of these texts (e.g. staffing agencies or your own company).

## `atsList` (type: `array`):

Limit the search to some ATS. Leave empty to search all of them.

## `onlyNewJobs` (type: `boolean`):

Return only jobs not returned in previous runs. Schedule it daily for a job alert feed.

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

Format of the job description field.

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

Stop after saving this many jobs. 0 = no limit.

## `outputMode` (type: `string`):

Companies gives one record per company with matching jobs: careers page, how many matching and remote jobs, titles, locations, salary range and newest posting date. Max jobs then counts companies.

## `mergeDuplicates` (type: `boolean`):

Companies often post the same opening once per city. Keep one job per company and title, with every location in locations and the merged postings in duplicates.

## `maxJobsPerCompany` (type: `integer`):

Keep at most this many jobs from each company, for a more varied list. 0 = no limit.

## `maxCompanies` (type: `integer`):

For testing: scan only the first N companies of the directory. 0 = all.

## Actor input object example

```json
{
  "keywords": [
    "software engineer",
    "customer support"
  ],
  "postedWithinDays": 0,
  "minSalary": 0,
  "visaSponsorship": false,
  "ycOnly": false,
  "onlyNewJobs": false,
  "descriptionFormat": "text",
  "maxItems": 100,
  "outputMode": "jobs",
  "mergeDuplicates": false,
  "maxJobsPerCompany": 5,
  "maxCompanies": 0
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "software engineer",
        "customer support"
    ],
    "maxItems": 100,
    "maxJobsPerCompany": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("richiedc95/remote-jobs-search").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 = {
    "keywords": [
        "software engineer",
        "customer support",
    ],
    "maxItems": 100,
    "maxJobsPerCompany": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("richiedc95/remote-jobs-search").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 '{
  "keywords": [
    "software engineer",
    "customer support"
  ],
  "maxItems": 100,
  "maxJobsPerCompany": 5
}' |
apify call richiedc95/remote-jobs-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,richiedc95/remote-jobs-search"
        }
    }
}
```

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/3svdaw0YcKPTTx2RL/builds/KnCf66LtCV9NXqZ5X/openapi.json
