DEV Community

Hải Hà Phan Thanh
Hải Hà Phan Thanh

Posted on

One remote-jobs feed from RemoteOK, Remotive and five other boards with Python

If you run a job newsletter, a Slack job bot, or just your own search alert, you end up checking the same remote boards every day. Several of them publish free JSON feeds, so merging two of them takes about 30 lines.

DIY: merge Remotive and RemoteOK

# pip install requests
import requests

H = {"User-Agent": "Mozilla/5.0"}

def remotive(q):
    r = requests.get("https://remotive.com/api/remote-jobs", params={"search": q}, headers=H, timeout=30)
    return [{"source": "remotive", "title": j["title"], "company": j["company_name"],
             "location": j["candidate_required_location"], "url": j["url"]}
            for j in r.json()["jobs"]]

def remoteok(q):
    r = requests.get("https://remoteok.com/api", headers=H, timeout=30)
    jobs = [j for j in r.json()[1:] if q.lower() in (j.get("position", "") + " " + " ".join(j.get("tags", []))).lower()]
    return [{"source": "remoteok", "title": j["position"], "company": j["company"],
             "location": j.get("location") or "Anywhere", "url": j["url"]} for j in jobs]

seen, merged = set(), []
for job in remotive("python") + remoteok("python"):
    key = (job["company"].strip().lower(), job["title"].strip().lower())
    if key not in seen:
        seen.add(key)
        merged.append(job)

print(len(merged), "unique jobs")
for j in merged[:3]:
    print(j["source"], "|", j["title"], "|", j["company"], "|", j["location"])
Enter fullscreen mode Exit fullscreen mode

Output (31/10/2026):

28 unique jobs
remotive | Senior Back-end Developer | Lemon.io | Europe, USA, Canada, Australia, Singapore, Mexico, Saudi Arabia
remotive | Head of Engineering | Lemon.io | Worldwide
remotive | AI Trainer - Video Annotation | iMerit Technology | Worldwide
Enter fullscreen mode Exit fullscreen mode

Things to know before you build on this:

  • Each board has its own fields. Salary is a number on one, free text on another, missing on a third. Locations are strings like "Worldwide", "USA" or "Europe, Canada".
  • RemoteOK returns its whole feed in one call, and its first element is a legal notice, not a job (hence [1:]). Its terms ask you to link back to the job.
  • The same job is often posted on several boards. Deduplicating on company + title catches most repeats.
  • For a daily alert you also need to remember which jobs you already sent.

When you need more boards

I built the Remote Jobs Scraper actor for the full version. It reads 7 boards (RemoteOK, Remotive, Himalayas, We Work Remotely, Arbeitnow, Jobicy, Working Nomads) into one schema and deduplicates across them. It can filter by keywords, excluded keywords, region, minimum yearly salary and posting age. With onlyNew, a scheduled run returns only jobs it has not returned before. Each record has title, company, location, salary range, tags, apply URL, plain-text description and an attribution line for the source board.

Input example:

{
  "keywords": ["python", "data engineer"],
  "excludeKeywords": ["intern"],
  "salaryMin": 60000,
  "postedWithinDays": 7,
  "onlyNew": true
}
Enter fullscreen mode Exit fullscreen mode

Pricing is $1.50 per 1,000 jobs, no subscription. No login, API key or proxy is needed.

When to use which

  • One or two boards, an occasional look: the script above is enough.
  • Seven boards, salary filters, or a daily feed that only shows new jobs: use the actor, or extend the script yourself.

Disclosure: I built and maintain the actor. It reads the boards' public feeds and keeps their attribution.

Top comments (0)