RemoteOK Jobs Scraper · Remote Roles, Salaries & Tags avatar

RemoteOK Jobs Scraper · Remote Roles, Salaries & Tags

Pricing

from $1.10 / 1,000 job returneds

Go to Apify Store
RemoteOK Jobs Scraper · Remote Roles, Salaries & Tags

RemoteOK Jobs Scraper · Remote Roles, Salaries & Tags

RemoteOK Jobs Scraper to scrape remote job listings from RemoteOK (remoteok.com). Extract remote jobs, tech positions, developer roles, salaries, hiring companies, tags, and apply links. Filter by skill tags, keywords, company name, location, and minimum salary.

Pricing

from $1.10 / 1,000 job returneds

Rating

0.0

(0)

Developer

Tarek Etman

Tarek Etman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

reapX — public sources in, addressable records out

RemoteOK Jobs Scraper · Remote Roles, Salaries & Tags

RemoteOK Jobs Scraper to scrape remote job listings, tech positions, developer roles, salaries, hiring companies, and tags from RemoteOK (remoteok.com). Extract real-time remote job data and filter by skill tags, keywords, company name, location policy, and minimum salary range using the RemoteOK API. Export clean structured job data in JSON, CSV, or Excel.

Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/remoteok-jobs-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me

Scrape RemoteOK job listings by tag

Tags is the breadth control. Give it python, golang, design, marketing, senior, or any other RemoteOK tag, one per line. Each tag is fetched separately and the results are merged and deduplicated on job ID, so overlapping tags never produce duplicate rows.

Leave Tags empty and you get the whole current board.

Filter RemoteOK jobs by salary

RemoteOK publishes a salary range on a minority of postings - on a 478-row sample taken while building this Actor, under 2% carried one. That is the board's reality, not a gap in the scraper, so every row carries a hasSalary flag and the Salaries view is built around it. Segment on hasSalary before you average anything, or your figures describe the small subset that discloses.

Only jobs with a published salary and Minimum salary in USD narrow to the disclosing subset directly.

Filter RemoteOK jobs by keyword, company or verification

Keyword filter matches across title, company, tags and description. Company filter narrows to one employer. Only verified employers keeps postings RemoteOK has marked verified.

Monitor new RemoteOK jobs

Schedule the Actor and deduplicate on jobId, which is permanent per posting. postedEpoch is a Unix timestamp, so windowing to "since my last run" is a single comparison.

What RemoteOK job data you get

Job ID, slug, position, company, location, tags, primary tag, salary minimum and maximum in USD, a has-salary flag, verified-employer flag, posted timestamp and epoch, description as plain text at whatever length you ask for, apply URL and canonical posting URL.

Three views: Jobs, Salaries and Companies. Export as JSON, CSV, Excel or XML.

Input configuration

Every field is optional. The prefilled values below are what runs if you press Start without changing anything.

What to pull

Tags decide breadth. Everything below narrows what comes back.

FieldTypeAcceptsWhat it does
tagslistone value per lineRemoteOK tags to pull, one per line, for example python, golang, design, marketing, senior. Each tag is fetched separately and the results are merged and deduplicated. Leave empty to take the whole board. Prefilled with ["python"].
searchstringfree textKeep only jobs whose title, company, tags or description contain this text. Matching is case-insensitive.
companystringfree textKeep only jobs from companies whose name contains this text.

Filters

All optional.

FieldTypeAcceptsWhat it does
onlyWithSalarytrue/falsecheckboxRemoteOK publishes a salary range on a minority of postings. Turn this on to keep only those.
minSalaryUsdinteger0 to 1000000Keep only jobs whose published range reaches at least this figure. Jobs without a published salary are dropped.
onlyVerifiedtrue/falsecheckboxKeep only postings RemoteOK has marked as from a verified employer.

Output

Row size and volume.

FieldTypeAcceptsWhat it does
descriptionCharactersinteger0 to 20000How much of the job description to keep, in characters. Set 0 to omit descriptions entirely and keep rows small. Prefilled with 1000.
maxJobsinteger1 to 5000Hard ceiling on the rows this run produces, and therefore on what it costs. You are charged per job returned. Prefilled with 100.

Pricing

Pay per event. The primary event is Job returned (job-returned), charged at $0.002 per event on the free plan, falling to $0.001 on the highest tier.

One remote job posting delivered as a complete row. Blocked sources and empty result sets are never charged.

Minimum charge cap per run: $0.02.

Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.

Usage examples

The prefilled run, which is what Start does with nothing changed

{
"tags": [
"python"
],
"descriptionCharacters": 1000,
"maxJobs": 100
}

Filter by tags

{
"tags": [
"python",
"golang"
],
"descriptionCharacters": 1000,
"maxJobs": 100
}

Filter by keyword

{
"tags": [
"python"
],
"descriptionCharacters": 1000,
"maxJobs": 100,
"search": "senior"
}

Filter by company

{
"tags": [
"python"
],
"descriptionCharacters": 1000,
"maxJobs": 100,
"company": "Automattic"
}

Only jobs with a published salary

{
"tags": [
"python"
],
"descriptionCharacters": 1000,
"maxJobs": 100,
"onlyWithSalary": true
}

Output example

One row, exactly as the actor wrote it to the dataset:

{
"jobId": "1135789",
"slug": "remote-patient-outreach-specialist-grapefruit-health-1135789",
"position": "Patient Outreach Specialist",
"company": "Grapefruit Health",
"location": null,
"tags": [
"hr",
"teaching",
"education",
"recruiter",
"supervisor",
"customer support",
"dev",
"virtual assistant",
"video",
"medical",
"part time",
"non tech",
"digital nomad"
],
"primaryTag": "hr",
"salaryMinUsd": null,
"salaryMaxUsd": null,
"hasSalary": false,
"isVerified": true,
"postedAt": "2026-08-01T16:00:13+00:00",
"postedEpoch": 1785600013,
"description": "<p><span><strong id=\"docs-internal-guid-d2f9f2ed-7fff-9271-9657-97ab474bb4a0\">Patient Outreach Specialist: Remote Healthcare Position</strong></span></p><p><span><strong id=\"docs-internal-guid-d2f9f2ed-7fff-9271-9657-...",
"applyUrl": "https://remoteOK.com/remote-jobs/remote-patient-outreach-specialist-grapefruit-health-1135789",
"jobUrl": "https://remoteOK.com/remote-jobs/remote-patient-outreach-specialist-grapefruit-health-1135789",
"retrievedAt": "2026-08-03T00:36:57Z"
}

Fields on every row

FieldTypeWhat it is
jobIdstringRemoteOK's permanent identifier for this posting. Deduplicate on this across runs.
slugstringURL slug of the posting.
positionstringJob title as the employer wrote it.
companystringHiring company.
locationstringWhere the role may be worked from. Often a region or 'Worldwide' rather than a city.
tagslistRemoteOK's tags for the role, covering stack, seniority and function.
primaryTagstringFirst tag on the posting, usually the main technology or function.
salaryMinUsdnumberBottom of the published annual range. Null on the majority of postings, which publish no salary.
salaryMaxUsdnumberTop of the published annual range. Null where no salary is published.
hasSalarytrue/falseWhether this posting publishes a salary range at all. Use it to segment before averaging.
isVerifiedtrue/falseWhether RemoteOK has marked the employer as verified.
postedAtstringISO timestamp the job was posted.
postedEpochintegerPosting time as a Unix timestamp, for sorting and windowing.
descriptionstringJob description as plain text, truncated to the requested length. Null when descriptions are switched off.
applyUrlstringWhere to apply for the role.
jobUrlstringCanonical RemoteOK posting URL. RemoteOK's API terms ask that this link is credited wherever the data is shown.
retrievedAtstringUTC timestamp this row was collected.

3 named dataset views ship with it: Jobs, Salaries, Companies. They drive the Output tab in Console and the Output block on the Actor's .md page.

FAQ

Do I need an API key?

No. RemoteOK publishes the board as JSON without any credential.

How many jobs does one tag return?

The feed returns up to 100 postings per tag. Pull several tags to go wider - five tags returned 273 distinct jobs in testing, because tags overlap and duplicates are removed.

Why do some descriptions contain other languages?

Because the board is international. RemoteOK's feed serves those descriptions double-encoded, which renders them as mojibake in most clients; this Actor detects and repairs that, so non-Latin text comes back readable.

Why is there no company logo field?

Because the feed's company_logo and logo fields are empty on every record of both the whole-board and per-tag feeds. Rather than ship a column that is always null, it is omitted.

How do I use this data on my own site?

RemoteOK's API terms ask that you credit RemoteOK and link back to the posting. Every row carries jobUrl for exactly that purpose.


Unofficial - not affiliated with RemoteOK. Collects public data only. reapx. Contact reapxdev@proton.me.

The full published archive

Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent can resolve an entity without running anything. Nothing on those pages is estimated or modelled.

🧪 Example input

A real, runnable configuration — this is an actual input this Actor has run with.

{
"descriptionCharacters": 1200,
"maxJobs": 2000
}

📄 Sample output

One real row from a real run of this Actor, unedited.

{
"jobId": "1135789",
"slug": "remote-patient-outreach-specialist-grapefruit-health-1135789",
"position": "Patient Outreach Specialist",
"company": "Grapefruit Health",
"location": null,
"tags": [
"hr",
"teaching",
"education",
"recruiter",
"supervisor",
"customer support",
"dev",
"virtual assistant",
"video",
"medical",
"part time",
"non tech",
"digital nomad"
],
"primaryTag": "hr",
"salaryMinUsd": null,
"salaryMaxUsd": null,
"hasSalary": false,
"isVerified": true,
"postedAt": "2026-08-01T16:00:13+00:00",
"postedEpoch": 1785600013,
"description": "<p><span><strong id=\"docs-internal-guid-d2f9f2ed-7fff-9271-9657-97ab474bb4a0\">Patient Outreach Specialist: Remote Healthcare Position</strong></span></p><p><span><strong id=\"docs-internal-guid-d2f9f2ed-7fff-9271-9657-97ab474bb4a0\">Grapefruit Health · Remote, U.S. · Part-time, Flexible · Graduates Only</strong></span></p><p></p><h5><span><strong id=\"docs-internal-guid-9ce6a45c-7fff-b3a4-432d-8169b305997a\">ABOUT GRAPEFRUIT HEALTH</strong></span></h5><p><span>Grapefruit Health is a healthcare services company on a mission to solve the growing staffing shortage in healthcare by putting tomorrow's clinicians to work today. We train and manage healthcare graduates to conduct remote, telephonic patient interactions using our purpose-built software. The result: patients receive timely support, healthcare organizations extend their capacity, and you gain real clinical experience.</span></p><h5><span><strong id=\"docs-internal-guid-9ce6a45c-7fff-b3a4-432d-8169b305997a\">THE ROLE</strong></span></h5><p><span>As a GFH Patient Outreach Specialist, you'll conduct structured phone-based interactions with patients on behalf of our partner healthcare organizations. Using our software, you'll follow e",
"applyUrl": "https://remoteOK.com/remote-jobs/remote-patient-outreach-specialist-grapefruit-health-1135789",
"jobUrl": "https://remoteOK.com/remote-jobs/remote-patient-outreach-specialist-grapefruit-health-1135789",
"retrievedAt": "2026-08-03T00:36:57Z"
}

How it works

  1. You set the filters below, or none at all - every field is optional.
  2. The Actor calls the public remoteok.com API directly over HTTP. There is no key to obtain, no login and no headless browser, so a run is fast and cannot break on a UI change.
  3. It pages through the results until your maximum is reached or the source runs out of matches.
  4. Every row is pushed to the dataset as it is built - never buffered to the end. A run that hits its time limit still returns everything it collected.
  5. You are charged job-returned at $0.002 per row, and nothing for Apify platform usage. The maximum-results field is therefore your cost cap, and Apify Store discounts apply on top.

💬 Your feedback

Found a bug, or need a field this does not return yet? Open an issue on the Actor's Issues tab, or write to reapxdev@proton.me. Bugs get fixed and reasonable field requests get added.

⚠️ Run outcomes and error handling

This Actor reports what happened in the run's status message, and it always keeps whatever it collected. These are the outcomes you can get and what each one means.

OutcomeWhat it means
SuccessRows were returned and you were charged job-returned at $0.002 per row.
No matchesThe source returned nothing for your filters. Nothing is charged. Widen the date window or drop a filter.
Partial - source refusedThe source rate-limited or refused some requests. The affected items are skipped and named in the log, and everything already collected is still pushed. A block never discards a run's work.

What is guaranteed either way

  • Every row is pushed as it is built, not buffered to the end of the run. Anything that buffers output loses everything to a timeout, a block or a migration; this does not.
  • A field absent from the source is absent from the row. Nothing is inferred, modelled or filled in to make a row look complete.

🧭 Ready-made configurations

These are saved, published configurations of this exact Actor. Open one and run it as it is, or copy its input as a starting point - each link is a live page with the full input and its output schema.

ConfigurationInput
Python Remote Jobs on RemoteOKtags: python; descriptionCharacters: 1200; maxJobs: 500
JavaScript Remote Jobs on RemoteOKtags: javascript; descriptionCharacters: 1200; maxJobs: 500
React Remote Jobs on RemoteOKtags: react; descriptionCharacters: 1200; maxJobs: 500
Go Remote Jobs on RemoteOKtags: golang; descriptionCharacters: 1200; maxJobs: 500
Java Remote Jobs on RemoteOKtags: java; descriptionCharacters: 1200; maxJobs: 500
PHP Remote Jobs on RemoteOKtags: php; descriptionCharacters: 1200; maxJobs: 500
Ruby Remote Jobs on RemoteOKtags: ruby; descriptionCharacters: 1200; maxJobs: 500
Node.js Remote Jobs on RemoteOKtags: node; descriptionCharacters: 1200; maxJobs: 500
TypeScript Remote Jobs on RemoteOKtags: typescript; descriptionCharacters: 1200; maxJobs: 500
AWS Remote Jobs on RemoteOKtags: aws; descriptionCharacters: 1200; maxJobs: 500
DevOps Remote Jobs on RemoteOK-
Kubernetes Remote Jobs on RemoteOK-
Data Remote Jobs on RemoteOK-
Machine Learning Remote Jobs on RemoteOK-

There are 50 of these in total, all listed on the Actor's Examples tab.