RemoteOK Jobs Scraper avatar

RemoteOK Jobs Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
RemoteOK Jobs Scraper

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

DevilScrapes

Maintained by Community

Actor 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 fingerprintscurl-cffi impersonation 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, honouring Retry-After whenever 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

  1. Click Try for free at the top of the page.
  2. Optionally set tags, keywords, company, or minSalary to narrow the feed — leave everything blank to pull the whole current feed (capped by maxItems).
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

Call it from Python

from apify_client import ApifyClient
client = 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

FieldTypeRequiredDefaultNotes
tagsarrayno[]Keep jobs whose tags include ANY of these (case-insensitive).
keywordsarrayno[]Keep jobs whose position/description/company contains ANY keyword (case-insensitive substring).
companystringno""Case-insensitive substring match on company name.
minSalaryintegernoKeep jobs where the listed maximum salary is at least this amount.
maxItemsintegerno100Cap on rows emitted, applied after filtering (1-1000).
proxyConfigurationobjectno{"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.

FieldTypeNotes
job_idstringRemoteOK job ID (falls back to slug if missing).
slugstringRemoteOK URL slug.
positionstringJob title.
companystringHiring company name.
company_urlstring | nullNot published by the live API today — always null, kept for forward-compat.
locationstring | nullFree-text location, null when empty.
tagsarrayTags/skills on the posting.
salary_mininteger | nullnull when RemoteOK reports no data.
salary_maxinteger | nullnull when RemoteOK reports no data.
descriptionstringHTML stripped to clean plain text.
apply_urlstringDirect application URL.
urlstringRemoteOK job page URL.
date_postedstringISO-8601 timestamp.
epoch_postedintegerUnix epoch seconds.
logostring | nullCompany 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:

EventUSDWhat it is
actor-start$0.02One-off warm-up charge per run
result$0.0015Per 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.