RemoteOK Jobs Scraper [Only $0.99πŸ’°] [/w EMAILS] avatar

RemoteOK Jobs Scraper [Only $0.99πŸ’°] [/w EMAILS]

Pricing

from $0.99 / 1,000 results

Go to Apify Store
RemoteOK Jobs Scraper [Only $0.99πŸ’°] [/w EMAILS]

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

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

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 RemoteOK Jobs Scraper works

How it works

  1. Paste a RemoteOK URL (or set filters) β€” the main board, a salary-filtered board, or direct job URLs.
  2. 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.
  3. 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.
  4. 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 enrichEmails and each row gains contactEmail + 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

CapabilityThis actorTypical 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

Paste any remoteok.com URL into Start URLs. Auto-classified:

URL shapeMeaning
https://remoteok.com/Full live board
https://remoteok.com/?min_salary=100000Board 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.max in USD across 1,000+ remote positions.
  • Lead generation β€” every job is a company actively spending money on hiring; contactEmail + companyWebsite make 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

FieldTypeDefaultNotes
startUrlsarray[]Any remoteok.com URLs; overrides Option B when non-empty
tagstring""Matched against each job's tag chips, client-side
searchKeywordstring""Matched over title + company + industry + location; every word must match
minSalaryinteger0USD/year; server-side param + permissive client check
countriesarray[]Names (United States, Europe) or ISO-2 (US, DE); Anywhere jobs always pass
tagsFilterarray[]Any-of tag match; tag merges into this
jobTypesarray[]FULL_TIME, CONTRACT, …
timeFilterselect""24h / 7d / 30d / 90d
includeDetailPagesbooleanfalseOpt-in per-job page fetch; adds ogImage β€” everything else is already in the row
includeDescriptionbooleantrueOff = drop all description fields
cleanHtmlbooleanfalseOn = plain-text description only
enrichEmailsbooleanfalseOpt-in employer email discovery; billed per email found
maxItemsinteger1000Filtered-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-in contactEmail / 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). With enrichEmails on, 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; salaryText preserves 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:

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: true for plain-text descriptions, or includeDescription: false for 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