RemoteOK Jobs Scraper [Only $0.99π°] [/w EMAILS]
Pricing
from $0.99 / 1,000 results
RemoteOK Jobs Scraper [Only $0.99π°] [/w EMAILS]
Scrape the FULL RemoteOK board β 1,000+ live remote jobs, not the API's newest 100 β with complete descriptions, salary ranges, tags, benefits, and geo eligibility. Opt-in employer contact emails turn jobs into leads. Filter by tag, keyword, country, salary. $0.99/1K. JSON, CSV, Excel
Pricing
from $0.99 / 1,000 results
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Share
RemoteOK Jobs Scraper
Scrape the entire live RemoteOK board β 1,000+ remote jobs, not just the 100 newest that RemoteOK's public API returns β with full job descriptions, salary ranges, tags, benefits, applicant-location eligibility, and opt-in employer contact emails. Built for recruiters, job boards, market researchers, and lead-gen teams who need remote-hiring data that is actually complete.

How it works
- Paste a RemoteOK URL (or set filters) β the main board, a salary-filtered board, or direct job URLs.
- The actor walks RemoteOK's board feed at ~50 jobs per request β the whole live board costs ~21 requests, and every row already carries the complete job record.
- Filters (keyword, tags, countries, salary, time window, job type) run before a job counts toward your
maxItems, so you only pay for rows you keep. - Export JSON, CSV, or Excel from the Apify Console, or stream via the Apify API.
π° $0.99 per 1,000 jobs. Full-board depth and full descriptions at the market's lowest price tier.
β¨ Why use this scraper?
- Full board depth, verified. RemoteOK's public API stops at the 100 newest jobs (~4 days of postings). This actor reaches the complete live board β 1,000+ jobs going back weeks. Most alternative scrapers are thin wrappers around that 100-job API.
- Full descriptions, not stubs. RemoteOK truncates job descriptions at ~1,000 characters in its structured data. This actor recovers the complete text from the page itself β 5,000β20,000 characters where the employer wrote that much.
- Employer contact emails (opt-in). Flip
enrichEmailsand each row gainscontactEmail+contactWebsite, discovered from the hiring company's own website. Turns a job feed into a lead list. - Broken-data proof. RemoteOK emits invalid JSON for multi-country listings (missing commas between country objects). This actor repairs it on the fly β precisely the rows where location eligibility matters most.
- Cheap and fast to run. Default mode needs no per-job page fetches, so a full-board scrape finishes in seconds and consumes a fraction of the compute of detail-crawling scrapers.
What makes this richer than alternatives
| Capability | This actor | Typical RemoteOK scraper |
|---|---|---|
| Board depth | β Full live board (1,000+ jobs) | β Newest ~100 (public API cap) |
| Description | β Full text from the page | β οΈ ~1,000-char API stub |
| Multi-country eligibility | β Parsed (invalid JSON repaired) | β Often missing or broken |
| Contact emails | β Opt-in enrichment | β |
| Employer website | β When the listing exposes it | β |
| Benefits, work hours, industry | β Included | β οΈ Rarely |
| Paid-placement flags | β
isSticky / isHighlighted / isVerified | β |
| Filter billing | β Filtered rows are free | β οΈ Billed after scraping |
Supported inputs
Option A β Search by URL π (recommended)
Paste any remoteok.com URL into Start URLs. Auto-classified:
| URL shape | Meaning |
|---|---|
https://remoteok.com/ | Full live board |
https://remoteok.com/?min_salary=100000 | Board filtered by minimum salary (server-side) |
https://remoteok.com/remote-jobs/{slug} | One specific job (detail page) |
Mix listing and job-detail URLs in the same array.
Option B β Configure with Filters ποΈ
Leave Start URLs empty and set any of tag (e.g. python, design), searchKeyword (e.g. senior engineer), minSalary, countries, jobTypes, timeFilter. Tag and keyword are matched client-side over the full board β RemoteOK has no reliable server-side tag or search filter (verified: its tag boards interleave unrelated jobs), so exact client-side matching is the only honest way to filter this site.
π― Use cases
- Recruiting & sourcing β pull every live listing for a skill, salary band, or geography; contact hiring companies directly with enriched emails.
- Job boards & aggregators β mirror the complete RemoteOK board into your product with one scheduled run per day.
- Salary benchmarking β structured
salary.min/salary.maxin USD across 1,000+ remote positions. - Lead generation β every job is a company actively spending money on hiring;
contactEmail+companyWebsitemake them reachable. - Market research β tag frequency, benefits offered, and geographic-eligibility trends across the remote market.
- Job alerts β schedule daily with
timeFilter: "24h"and get only fresh postings.
Quick start
Minimal input β full board, up to 1,000 jobs:
{"startUrls": ["https://remoteok.com/"]}
Python jobs open to US applicants, posted in the last week, with employer emails:
{"tag": "python","countries": ["US"],"timeFilter": "7d","enrichEmails": true}
Input configuration
| Field | Type | Default | Notes |
|---|---|---|---|
startUrls | array | [] | Any remoteok.com URLs; overrides Option B when non-empty |
tag | string | "" | Matched against each job's tag chips, client-side |
searchKeyword | string | "" | Matched over title + company + industry + location; every word must match |
minSalary | integer | 0 | USD/year; server-side param + permissive client check |
countries | array | [] | Names (United States, Europe) or ISO-2 (US, DE); Anywhere jobs always pass |
tagsFilter | array | [] | Any-of tag match; tag merges into this |
jobTypes | array | [] | FULL_TIME, CONTRACT, β¦ |
timeFilter | select | "" | 24h / 7d / 30d / 90d |
includeDetailPages | boolean | false | Opt-in per-job page fetch; adds ogImage β everything else is already in the row |
includeDescription | boolean | true | Off = drop all description fields |
cleanHtml | boolean | false | On = plain-text description only |
enrichEmails | boolean | false | Opt-in employer email discovery; billed per email found |
maxItems | integer | 1000 | Filtered-out rows never count |
Output overview
One dataset row per job, 30+ fields. Highlights:
- Identity:
jobId,slug,url,applyUrl - Job:
title,description(+descriptionHtml,descriptionText,descriptionUrls[]),employmentType[],occupationalCategory[],industry,workHours,jobBenefits[],tags[] - Company:
companyName,companyLogo,companyPageUrl,companyWebsite, opt-incontactEmail/contactWebsite/emailEnrichment - Geography:
applicantCountries[](who may apply β["Anywhere"]or explicit country lists),location,jobLocationType - Compensation:
salary { currency, min, max, unit },salaryText - Timing:
postedDate,epoch,validThrough,applyBefore - Board state:
isSticky,isHighlighted,isVerified,source,scrapedFrom,scrapedAt
Output samples
Job row (real smoke-test data, description truncated for display)
{"type": "job","jobId": "1135606","slug": "remote-senior-demand-generation-manager-testgorilla-1135606","url": "https://remoteok.com/remote-jobs/remote-senior-demand-generation-manager-testgorilla-1135606","title": "Senior Demand Generation Manager","companyName": "TestGorilla","companyLogo": "https://r2.remoteok.com/jobs/β¦.jpg","companyPageUrl": "https://remoteok.com/company/testgorilla","companyWebsite": "https://testgorilla.com","description": "Hi there, I'm Mehak, interim Head of Marketing at TestGorilla. We're excited to share more about the Sr. Demand Generation Manager roleβ¦ (7,234 chars total)","descriptionUrls": ["https://www.testgorilla.com/careers/"],"jobLocationType": "TELECOMMUTE","applicantCountries": ["Anywhere"],"employmentType": ["FULL_TIME"],"industry": "Startups","jobBenefits": ["distributed_team", "async", "paid_time_off"],"workHours": "Flexible","tags": ["sales", "marketing"],"salary": { "currency": "USD", "min": 70000, "max": 100000, "unit": "YEAR" },"salaryText": null,"postedDate": "2026-08-01T09:04:12+00:00","validThrough": "2026-10-30T09:04:12+00:00","applyBefore": "Oct 30th, 2026","applyUrl": "https://remoteok.com/l/1135606","applyType": "remoteok","directApply": false,"isSticky": false,"isHighlighted": false,"isVerified": true,"source": "listing","scrapedFrom": "https://remoteok.com/","scrapedAt": "2026-08-04T09:48:11.102Z"}
With enrichEmails: true, matching rows additionally carry:
{"contactEmail": "hello@testgorilla.com","contactWebsite": "https://testgorilla.com","emailEnrichment": { "website": "β¦", "emails": ["β¦"], "source": "β¦" }}
Key output fields
Identifiers
jobIdβ RemoteOK's numeric id (stable, unique).slug/urlβ canonical job-detail URL.
Job information
descriptionβ the FULL posting text. RemoteOK's own structured data truncates at ~1,000 chars; this actor recovers the complete text from the page (often 5,000β20,000 chars).tags[]β RemoteOK's rendered tag chips, lowercased. Note: RemoteOK auto-tags some listings loosely β a minority of rows carry 20+ generic tags. That is the site's own data, reported faithfully.jobBenefits[]β e.g.distributed_team,async,401k_matching,equity_compensation.
Company
companyPageUrlβ the RemoteOK company profile (/company/{slug}).companyWebsiteβ the employer's own site, when the listing exposes it (a minority of rows). WithenrichEmailson, it seeds email discovery directly.
Geography (the load-bearing field)
applicantCountries[]β who may apply. Either["Anywhere"]or an explicit list like["United Kingdom", "Australia", "New Zealand"]. RemoteOK's own JSON for multi-country rows is invalid (missing commas) β this actor repairs and parses it, so the field is populated where wrapper scrapers return nothing.
Compensation
salaryβ structured{ currency, min, max, unit }from the listing (USD/year). Most rows carry a range;salaryTextpreserves the display string when present.
Application
applyUrlβhttps://remoteok.com/l/{jobId}, RemoteOK's public apply entry point. See FAQ for why the employer's final ATS URL is not directly exposed.directApplyβ RemoteOK's own flag for whether applications happen on-platform.
β FAQ
How is this different from RemoteOK's free API? The public API returns only the ~100 newest jobs (about 4 days of postings) with truncated descriptions. This actor walks the full live board β 1,000+ jobs β with complete descriptions, benefits, badges, and repaired country data.
Why is applyUrl a remoteok.com link and not the employer's ATS?
RemoteOK gates the employer's external URL behind a JavaScript bot-check β verified: their API, their HTML, and their /l/{id} redirect all point back to remoteok.com. applyUrl is the same public apply entry every visitor uses. Where the listing itself exposes employer links, you get them in companyWebsite and descriptionUrls; enrichEmails closes the rest of the gap with a direct contact email.
Does the tag filter miss jobs?
No β the opposite. RemoteOK's own tag boards are unreliable (they interleave unrelated jobs β verified during development), so this actor scans the complete board and matches tags client-side against each job's real chips. Exact, reproducible, and misses are never billed.
Why do some rows have odd tags?
RemoteOK auto-tags listings and is sometimes generous (a non-technical job carrying developer). Tags are reported as the site publishes them. For precise role filtering, combine searchKeyword (title/company match) with tagsFilter.
How many jobs will I get?
The live board holds roughly 1,000 jobs spanning ~3 weeks of postings (it grows and shrinks daily). maxItems caps the run; filtered-out rows never count toward it.
When should I enable includeDetailPages?
Almost never β board rows already contain the complete record. Turn it on only if you want ogImage (the social-share card per job). It costs ~1 request per job instead of ~21 total.
Is enrichEmails guaranteed to find an email?
No β it is best-effort discovery from the employer's website (seeded by companyWebsite when the listing exposes it, otherwise name-based lookup with a business-precision guard). You are billed per email found, never for misses.
Can I schedule it?
Yes β any Apify schedule works. For a daily "new jobs" feed, set timeFilter: "24h" and schedule the actor every morning.
Support
- π Issues tab of this actor β the fastest way to reach me, usually answered within hours.
- π¬ Feature requests welcome: more filters, output fields, or integrations ship on demand.
Additional Services
Need something beyond this actor?
- Custom scrapers for any job board, directory, or listing site β delivered as private Apify actors.
- Managed data feeds β scheduled runs, deduplication, delivery to your warehouse (BigQuery, Postgres, S3, Google Sheets).
- Email enrichment at scale across any of my actors.
Open an issue on this actor or message via my Apify profile to discuss.
Explore More Scrapers
More job-market actors from the same portfolio β same schema philosophy, same support:
- WeWorkRemotely Jobs Scraper β the other big independent remote board, with emails.
- Wellfound Jobs Scraper β startup jobs with funding context.
- Y Combinator Jobs Scraper β every YC company hiring.
- Glassdoor Scraper β jobs + salaries + reviews.
- Naukri Scraper β India's largest job market.
Browse the full catalog: apify.com/memo23
π€ For AI Agents & LLM Apps
This actor is agent-friendly out of the box:
- Structured, stable schema β every field is always present (null when unavailable, never omitted), so tool-calling code never branches on missing keys.
- MCP-ready β callable through Apify's MCP server; the input schema above is the tool contract. A minimal call is
{ "searchKeyword": "python", "maxItems": 20 }. - Token-friendly modes β set
cleanHtml: truefor plain-text descriptions, orincludeDescription: falsefor compact metadata-only rows that fit hundreds of jobs in one context window. - Deterministic filters β all filtering is exact and client-side; the same input yields the same selection logic on every run.
- Fast and cheap in loops β a filtered query typically completes in seconds and only bills matching rows, so agents can iterate freely.
β οΈ Disclaimer
This actor is an independent tool, not affiliated with, endorsed by, or sponsored by Remote OK / remoteok.com. It accesses only publicly available data β the same pages any visitor sees β and does not bypass authentication, paywalls, or access controls. You are responsible for how you use the data: comply with applicable laws (GDPR/CCPA where relevant), respect RemoteOK's terms of service, and attribute RemoteOK as the source where their data guidelines require it. Job data is scraped from a live site and can change or contain employer-supplied errors; verify before making decisions based on it.
SEO Keywords
remoteok scraper, remote ok jobs scraper, scrape remoteok, remoteok api alternative, remote jobs scraper, remote job listings data, remoteok full board export, remote jobs dataset, remote job leads with emails, remote hiring companies list, remoteok json csv export, remote job market data, digital nomad jobs scraper, remote developer jobs data, remote jobs api
License
Apache-2.0