# Remote Jobs Scraper: Career Pages, Remote OK & Jobicy (`resonating_quoll/remote-jobs-feed`) Actor

Remote jobs from 5,800+ employer career pages plus the Remote OK and Jobicy job boards, only from sources that permit reuse. Deduplicated and trust-scored, with region, hybrid, seniority and salary filters and new-job alerts. $2/1K jobs.

- **URL**: https://apify.com/resonating_quoll/remote-jobs-feed.md
- **Developed by:** [Michael Best](https://apify.com/resonating_quoll) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 job results

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: Career Pages, Remote OK & Jobicy

![Remote Jobs Scraper pipeline: 5,800+ employer career pages plus Remote OK and Jobicy, deduplicated, confirmed on the employer site and trust-scored](https://api.apify.com/v2/key-value-stores/WmxXg7tu4yTt456JW/records/remote-readme-v2.png)

**Remote jobs straight from 5,800+ employer career pages (Greenhouse, Lever, Ashby, Workable, Recruitee, Personio) plus Remote OK and Jobicy, from sources whose terms allow reuse. One de-duplicated dataset where every job gets a 0-100 `trust_score`, the regions it is open to, and a remote / hybrid flag, and only new jobs on every scheduled run.**

Two of the best-known remote job boards plus remote roles straight from employers' own career pages, one schema. The Actor reads only **official public APIs** (Remote OK, Jobicy, and the Greenhouse, Lever, Ashby, Workable, Recruitee and Personio job-board APIs), so runs need no browser, no proxies and no login, and they don't break when a website is redesigned. Every record keeps its original listing link and a source credit line, which is all both sources ask for.

**Price: $2 per 1,000 jobs.** You pay only for jobs that end up in your results. In monitoring mode you pay only for *new* jobs.

### Why this remote jobs scraper?

| | |
|---|---|
| 🌍 **3 sources, 1 schema** | Remote OK (latest ~100 jobs) + Jobicy (every remote job of the last 7 days, typically 1,000–1,500) + **company career pages**: remote roles from ~5,800 companies that post them on Greenhouse, Lever, Ashby, Workable, Recruitee or Personio (tens of thousands of jobs, straight from the employer). Same field names for all. |
| 🛡️ **Trust score + employer confirmation** | Board listings are checked against the company's own careers page; when the role is there you get `confirmed_on_employer_site` and the employer's own `employer_apply_url`. `trust_score` (0-100) adds up confirmation, multiple sources, a published salary, recency and stated eligibility, with `trust_signals` explaining it. Skip stale reposts and ghost listings. |
| 🗺️ **Where can I actually work from?** | `eligible_regions` (worldwide, us, canada, north_america, latam, europe, uk, emea, apac, africa, middle_east) parsed from each listing, a region filter, and **Exclude hybrid** to drop "remote" jobs that want you in an office. |
| 🧹 **Cross-source de-duplication** | The same job posted on several sources appears once (company and title normalized, "(Remote)" style suffixes ignored); `also_listed_on` tells you where else it was listed. |
| 📈 **Salary you can filter on** | `salary_min`/`salary_max`/currency/interval, plus a **minimum yearly salary** filter that annualizes hourly and monthly pay. |
| 🎯 **Filters** | Keywords (title + tags, optionally description), excluded title words, eligible regions, exclude hybrid, seniority, employment type, has salary, posted since (`24 hours`, `3 days`, `2026-10-01`), and Jobicy server-side region/category. |
| 🔔 **Only new jobs** | Remembers what earlier runs returned. Schedule it hourly or daily and you have a remote-job alert feed. |
| ✅ **Terms-friendly** | Uses only public APIs whose terms allow reuse with attribution, and caches each source for 60 minutes per account to respect fair-use polling limits. |

### What data do you get?

`source` · `job_id` · `global_id` · `title` · `company` · `company_logo` · `location` · `remote` · `remote_type` · `eligible_regions` · `country` · `employment_type` · `seniority` · `category` · `tags` · `salary_min` · `salary_max` · `salary_currency` · `salary_interval` · `posted_at` · `job_url` · `apply_url` · `description_text` · `attribution` · `also_listed_on` · `source_count` · `confirmed_on_employer_site` · `employer_apply_url` · `trust_score` · `trust_signals` · `listing_age_days` · `scraped_at`

Export as JSON, CSV, Excel or HTML, or pull it through the Apify API.

### Use cases

- **Remote job board or newsletter:** backfill your board or weekly email with fresh, salaried remote roles.
- **Job alerts:** schedule hourly with "Only new jobs" and send results to Slack, email or Google Sheets with an Apify integration.
- **Job seekers:** one daily list of remote roles matching your stack and salary floor.
- **Recruiters and sales teams:** see which companies are actively hiring remotely right now, and for which roles.
- **Market research:** track remote salary ranges and demand by category and seniority.
- **AI agents:** a clean, structured remote-jobs tool for agent workflows.

### How to use it

1. Click **Try for free**. The form is prefilled (all three sources, keywords `engineer`, `developer`, 20 results), so the first run takes under a minute and costs about 4 cents.
2. Adjust keywords and filters, set **Max results** to 0 for everything that matches. With Max results 0, the career-pages source stops after **Career pages: max jobs** (default 1,000) matching remote jobs.
3. Click **Start**, then open the **Output** tab or export the dataset.

### Input example

```json
{
  "sources": ["remoteok", "jobicy", "careers"],
  "keywords": ["python", "data engineer"],
  "excludeKeywords": ["intern"],
  "eligibleRegions": ["us"],
  "excludeHybrid": true,
  "seniority": ["senior", "staff"],
  "requireSalary": true,
  "minSalaryYearly": 100000,
  "postedSince": "3 days",
  "onlyNew": true,
  "stateKey": "python-us",
  "maxResults": 0
}
```

### Output example

```json
{
  "source": "jobicy",
  "job_id": "jobicy:157231",
  "title": "Staff Software Engineer (Android)",
  "company": "TeamSnap",
  "location": "Remote (USA)",
  "remote": true,
  "remote_type": "remote",
  "eligible_regions": [
    "north_america",
    "us"
  ],
  "country": "US",
  "employment_type": "full_time",
  "seniority": "staff",
  "category": "Software Engineering",
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_interval": null,
  "posted_at": "2026-10-26T16:38:52Z",
  "job_url": "https://jobicy.com/jobs/157231-staff-software-engineer-android",
  "apply_url": "https://jobicy.com/jobs/157231-staff-software-engineer-android",
  "confirmed_on_employer_site": true,
  "employer_apply_url": "https://jobs.lever.co/teamsnap/4f98ad5c-024f-4c4c-96f9-df171909aa1f/apply",
  "also_listed_on": [],
  "source_count": 1,
  "listing_age_days": 0.2,
  "trust_score": 65,
  "trust_signals": [
    "confirmed on the employer's own careers page",
    "posted in the last 7 days",
    "location eligibility stated",
    "direct apply link"
  ],
  "description_text": "About Us\n\nAt TeamSnap, we believe when the world connects through sports; the world becomes better...",
  "attribution": "Job via Jobicy (https://jobicy.com)",
  "scraped_at": "2026-10-26T21:10:06.973387Z"
}
```

#### Field notes

- `seniority` is taken from the job title (e.g. "Senior", "Staff", "Lead", "Manager"), falling back to the source's own level field.
- `salary_*` are only filled when the employer published pay. Remote OK salaries are yearly USD.
- `location` is the region a remote job is open to, e.g. `Remote (USA)` or `Remote (EMEA, LATAM)`.
- `trust_score`: +40 confirmed on the employer's careers page, +15/+20 listed on 2/3 sources, +15 salary published, +15 posted within 7 days (+8 within 30), +5 eligibility stated, +5 direct apply link.
- `eligible_regions` is `[]` when the listing doesn't say; the region filter drops those (keep **Count worldwide jobs** on to include "Anywhere" roles).
- Employer confirmation checks up to 60 companies per run (`verifyMaxCompanies`) found in the built-in directory, at no extra charge.
- `source` is `remoteok`, `jobicy` or `careers` (company career page; `attribution` names the company and ATS).
- `attribution` and `job_url` must be kept if you republish the jobs (see below).

### Pricing

Pay per event: **$0.002 per job in your results** ($2 per 1,000). No charge for jobs filtered out, duplicates, or jobs already seen in monitoring mode. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

| Run | Results | Cost |
|---|---|---|
| Prefilled test | 20 | $0.04 |
| Daily "new jobs only" for one keyword set | ~30–100 | $0.06–$0.20 |
| Full 7-day remote feed, no filters | ~1,500 | ~$3 |
| Career pages, keyword `engineer`, 1,000 jobs | ~1,000 | ~$2 |

### Monitoring: get alerts for new jobs

Turn on **Only new jobs**, give the search a **Monitoring state name**, and add a schedule (hourly or daily). Each run outputs only jobs it hasn't returned before. Jobs posted more than 3 days before the previous run are treated as backlog, not new, so a result cap never drips old postings into later runs (counted free as `backlog_skipped` in `RUN_SUMMARY`). Connect a Slack, email, Zapier, Make or Google Sheets integration to get alerts automatically.

#### Run it from the API

```bash
curl -X POST "https://api.apify.com/v2/acts/resonating_quoll~remote-jobs-feed/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["react"],"postedSince":"24 hours"}'
```

### Republishing the jobs (please read)

Both sources allow reuse on the condition that you credit them:

- **Remote OK:** "Please link back … to the URL on Remote OK and mention Remote OK as a source." Don't use the Remote OK logo.
- **Jobicy:** "Clearly credit Jobicy as the original source when displaying listings", and apply buttons should go to the job URL in the feed.

Keep `job_url`/`apply_url` as the apply link and show the `attribution` text, and you're covered. Career-page jobs link to the employer's own posting.

### FAQ

**Which job boards are included?** Remote OK, Jobicy and company career pages on Greenhouse, Lever, Ashby, Workable, Recruitee and Personio. Their public APIs allow this use. Remotive, Himalayas, We Work Remotely and Arbeitnow are deliberately not included: their terms forbid passing their jobs to third parties or commercial reuse, or couldn't be verified.

**How does the career-pages source work?** It uses the verified company directory from our [ATS Jobs Scraper](https://apify.com/resonating_quoll/ats-jobs-scraper) (~5,800 companies that had remote openings), reads their public job boards live, keeps only jobs marked remote, and stops once it has enough matches. Use keywords to target it; a full sweep takes about 5-15 minutes.

**How fresh is the data?** Jobicy publishes jobs with a ~3-hour delay and keeps the last 7 days. Remote OK returns its latest ~100 jobs. The Actor caches each source for 60 minutes per account, so running more often than hourly returns the same data.

**Is it legal?** The Actor only calls public APIs the sources provide for developers, and keeps the attribution they ask for. You are responsible for how you use the data, including any personal data rules in your country.

### Limitations

- Remote OK's API returns only its latest ~100 listings, so schedule it at least daily to build a full history.
- The career-pages source covers companies in the directory; it is not cached, so each run reads boards live. Its Workable, Recruitee and Personio coverage is still small (69 companies with remote roles).
- Regions and hybrid status are read from listing text and can be missing or occasionally wrong.
- Some listings don't publish salary, employment type or region.

### Use with AI agents (Apify MCP)

Add this Actor as a tool in Claude, Cursor, ChatGPT or any MCP client through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp):

```json
{
  "mcpServers": {
    "apify": { "url": "https://mcp.apify.com?tools=resonating_quoll/remote-jobs-feed" }
  }
}
```

The first connection signs you in to Apify (OAuth). Then ask, for example: *"Find remote senior backend jobs open to Europe, no hybrid, posted this week, only ones confirmed on the employer's site."*

### Directory credits

The career-pages company directory was built from the [LastRound AI ATS directory](https://lastroundai.com/blog/salary-transparency-study-2026) (CC BY 4.0, LastRound AI), [ats-jobs-mcp](https://github.com/groundtruthtools/ats-jobs-mcp) (MIT License, Copyright (c) 2026 Ground Truth), and Workable / Recruitee / Personio slugs from [OpenJobs](https://github.com/outscal/OpenJobs) (MIT, © 2026 Santiago Fernández de Valderrama and Outscal), [africa-ats-directory](https://github.com/Thelastpoet/africa-ats-directory) (MIT) and [ever-jobs](https://github.com/ever-jobs/ever-jobs) (MIT); full notices in `src/DIRECTORY_LICENSES.txt`. Every board was verified live.

### More from this developer

- [ATS Jobs Scraper](https://apify.com/resonating_quoll/ats-jobs-scraper): search 12,000+ company career boards on 6 ATSs, with new and closed job alerts and hiring velocity per company.
- [Startup Funding Tracker: SEC Form D](https://apify.com/resonating_quoll/sec-form-d-leads): companies that just raised money, from SEC Form D filings, with a weekly funding drop summary.

### Feedback

Missing a field or a source with open terms? Open an issue on the **Issues** tab and I'll add it.

# Changelog

This Actor's version history is a separate document: https://apify.com/resonating_quoll/remote-jobs-feed/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Which job sources to pull (empty = Remote OK + Jobicy). Remote OK and Jobicy are public APIs that allow reuse with attribution. 'Company career pages' searches ~5,800 companies that post remote roles on their own Greenhouse, Lever, Ashby, Recruitee, Personio or Workable boards, so you get jobs straight from the employer; it reads boards until it has Max results (or 'Career pages: max jobs') matching remote jobs, so use keywords to target it.

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

Keep jobs whose title or tags contain at least one of these words (case-insensitive), e.g. "python", "designer", "customer support". Leave empty to keep all.

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

Drop jobs whose title contains any of these words, e.g. "senior", "sales".

## `searchDescription` (type: `boolean`):

Match keywords against the full description too, not just title and tags.

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

Keep jobs whose location (or the start of the description) mentions one of these, e.g. "USA", "Europe", "Worldwide", "Canada".

## `eligibleRegions` (type: `array`):

Keep only jobs whose stated hiring region includes one of these (read from the location and title, e.g. 'Remote - US', 'Anywhere in Europe', 'Worldwide'). Jobs with no stated region are dropped when this is set.

## `includeWorldwide` (type: `boolean`):

With Eligible regions set, also keep jobs open worldwide / anywhere.

## `excludeHybrid` (type: `boolean`):

Drop jobs marked hybrid (part-time in an office). Keeps fully remote roles only.

## `seniority` (type: `array`):

Keep only these seniority levels (detected from the job title and the ATS's own level field).

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

Keep only these employment types. Jobs with unknown type are dropped when this is set.

## `requireSalary` (type: `boolean`):

Keep only jobs that publish a salary range.

## `minSalaryYearly` (type: `integer`):

Keep jobs whose top of range (annualized) is at least this amount in the listed currency. Jobs without salary are dropped when set.

## `postedSince` (type: `string`):

Keep jobs posted on or after this date. YYYY-MM-DD or relative, e.g. "24 hours", "3 days", "1 week".

## `jobicyGeo` (type: `string`):

Optional Jobicy location slug sent to the API, e.g. "usa", "europe", "canada", "apac", "uk".

## `jobicyIndustry` (type: `string`):

Optional Jobicy category slug, e.g. "engineering", "marketing", "data-science", "supporting", "design-multimedia".

## `careersMaxJobs` (type: `integer`):

When Max results is 0, stop the company-career-pages source after this many matching remote jobs. A full sweep of all ~5,700 boards takes about 5-15 minutes.

## `verifyOnEmployerSite` (type: `boolean`):

For Remote OK / Jobicy jobs from companies in the built-in directory, check the company's own job board and, when the same role is there, set confirmed_on_employer_site and employer_apply_url. Raises trust_score. Adds a few seconds; no extra charge.

## `verifyMaxCompanies` (type: `integer`):

Upper bound on employer career pages read for confirmation per run.

## `onlyNew` (type: `boolean`):

Remember job IDs from previous runs and output only jobs not seen before. Ideal for an hourly or daily schedule. Jobs posted more than 3 days before the previous run count as backlog and are skipped, free.

## `stateKey` (type: `string`):

Use a different name per saved search so separate schedules don't interfere.

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

Include the full job description as plain text.

## `maxResults` (type: `integer`):

Cap on output records (0 = no limit). Prefilled with 20 so the first test run costs about 4 cents.

## Actor input object example

```json
{
  "sources": [
    "remoteok",
    "jobicy",
    "careers"
  ],
  "keywords": [
    "engineer",
    "developer"
  ],
  "searchDescription": false,
  "includeWorldwide": true,
  "excludeHybrid": false,
  "requireSalary": false,
  "careersMaxJobs": 1000,
  "verifyOnEmployerSite": true,
  "verifyMaxCompanies": 60,
  "onlyNew": false,
  "stateKey": "default",
  "includeDescription": true,
  "maxResults": 20
}
```

# Actor output Schema

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

One normalized record per remote job (title, company, salary, seniority, tags, posted date, apply URL, source attribution).

# 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 = {
    "sources": [
        "remoteok",
        "jobicy",
        "careers"
    ],
    "keywords": [
        "engineer",
        "developer"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("resonating_quoll/remote-jobs-feed").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 = {
    "sources": [
        "remoteok",
        "jobicy",
        "careers",
    ],
    "keywords": [
        "engineer",
        "developer",
    ],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("resonating_quoll/remote-jobs-feed").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 '{
  "sources": [
    "remoteok",
    "jobicy",
    "careers"
  ],
  "keywords": [
    "engineer",
    "developer"
  ],
  "maxResults": 20
}' |
apify call resonating_quoll/remote-jobs-feed --silent --output-dataset

```

## MCP server setup

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

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/nbSLtrdRApmHLfsGy/builds/9BRxkDMCPNQn7vDdo/openapi.json
