RemoteOK Jobs Scraper
Pricing
from $1.50 / 1,000 results
RemoteOK Jobs Scraper
Pull the full RemoteOK remote-jobs feed in one call and filter it by tags, keywords, company, or minimum salary. Returns typed rows — position, company, tags, salary range, plain-text description, apply URL, posted date. No pagination or auth needed.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
🎯 What this scrapes
RemoteOK (remoteok.com) publishes its entire current remote-jobs feed as a single public JSON array. This Actor fetches that feed, drops the feed metadata, filters the postings client-side by tags, keywords, company name, and/or minimum salary, cleans each HTML job description down to plain text, and lands one typed dataset row per matching job — no pagination, no login, no per-job page visits required.
🔥 Features
- 🛡️ We rotate browser fingerprints —
curl-cffiimpersonation replays real Chrome / Firefox TLS handshakes on every request, so the target sees a browser, not a script. - 🔁 We retry with exponential backoff on
408 / 429 / 5xx— up to 5 attempts, honouringRetry-Afterwhenever the target sends it. - 🧱 We fail loud, not silent — a broken upstream feed surfaces as a failed run with a clear status message, never a quiet empty dataset.
- 🧊 We keep the dataset clean — Pydantic-validated typed rows, HTML stripped to plain text, salary/logo fields null-normalized instead of guessed.
- 💰 You pay only for results that land — Pay-Per-Event pricing. No data, no charge.
💡 Use cases
- Recruiter tooling — pull today's remote-friendly openings for a given tech stack.
- Job-board aggregators — mirror RemoteOK's feed into your own listings without hand-rolling the parser.
- SDR / lead-gen — find companies actively hiring for roles that signal budget or growth.
- Market research — track which tags/skills are trending in remote job postings over time.
⚙️ How to use it
- Click Try for free at the top of the page.
- Optionally set
tags,keywords,company, orminSalaryto narrow the feed — leave everything blank to pull the whole current feed (capped bymaxItems). - Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
Call it from Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("DevilScrapes/remoteok-jobs-scraper").call(run_input={"tags": ["python", "remote"],"keywords": [],"company": "","minSalary": 60000,"maxItems": 100,"proxyConfiguration": {"useApifyProxy": False},})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["position"], item["company"])
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
tags | array | no | [] | Keep jobs whose tags include ANY of these (case-insensitive). |
keywords | array | no | [] | Keep jobs whose position/description/company contains ANY keyword (case-insensitive substring). |
company | string | no | "" | Case-insensitive substring match on company name. |
minSalary | integer | no | — | Keep jobs where the listed maximum salary is at least this amount. |
maxItems | integer | no | 100 | Cap on rows emitted, applied after filtering (1-1000). |
proxyConfiguration | object | no | {"useApifyProxy": false} | Standard Apify Proxy config — optional for this public feed. |
Example input
{"tags": ["python", "remote"],"keywords": [],"company": "","minSalary": 60000,"maxItems": 100,"proxyConfiguration": { "useApifyProxy": false }}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
job_id | string | RemoteOK job ID (falls back to slug if missing). |
slug | string | RemoteOK URL slug. |
position | string | Job title. |
company | string | Hiring company name. |
company_url | string | null | Not published by the live API today — always null, kept for forward-compat. |
location | string | null | Free-text location, null when empty. |
tags | array | Tags/skills on the posting. |
salary_min | integer | null | null when RemoteOK reports no data. |
salary_max | integer | null | null when RemoteOK reports no data. |
description | string | HTML stripped to clean plain text. |
apply_url | string | Direct application URL. |
url | string | RemoteOK job page URL. |
date_posted | string | ISO-8601 timestamp. |
epoch_posted | integer | Unix epoch seconds. |
logo | string | null | Company logo URL when available. |
Example output
{"job_id": "1135478","slug": "remote-entry-level-junior-trader-atom-partners-1135478","position": "Entry Level Junior Trader","company": "Atom Partners","company_url": null,"location": null,"tags": ["other", "finance"],"salary_min": 50000,"salary_max": 60000,"description": "ATOM Partners is an international company focused on digital asset markets...","apply_url": "https://remoteOK.com/remote-jobs/remote-entry-level-junior-trader-atom-partners-1135478","url": "https://remoteOK.com/remote-jobs/remote-entry-level-junior-trader-atom-partners-1135478","date_posted": "2026-07-27T12:50:24+00:00","epoch_posted": 1785156624,"logo": null}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.02 | One-off warm-up charge per run |
result | $0.0015 | Per dataset item (→ $1.50 / 1 000 results) |
Example: 1,000 results at the rates above ≈ $1.50. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
RemoteOK's public feed only exposes its current live listings — there's
no historical archive and no pagination cursor, so this Actor returns a
single snapshot per run. Salary and logo data are sparse in practice
(most postings ship without them); we surface that as null rather than
guessing.
❓ FAQ
Is this legal?
We only fetch content the source makes publicly available via its own documented feed. Respect RemoteOK's terms of service before using output commercially.
How do I export to Sheets?
After the run, click Storage → Dataset → Export and pick CSV. Google Sheets imports it directly.
Why don't I see salary or logo data on most rows?
RemoteOK's feed itself only populates those fields on a minority of
postings — we pass through exactly what the source reports, as null
when it's missing.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.