I was maintaining a personal remote-job feed and kept re-writing scrapers for each board. Every board has a different shape, a different update cadence, and a pile of stale or duplicated listings. So I built a small service that does the boring part for everyone: normalize live remote-job data from 5 boards into one stable schema, behind a free, keyless API.

What it is

A REST endpoint that returns normalized remote-job postings. No signup, no API key — just curl.

curl https://remote-jobs-api.tten.no/v1/jobs?limit=3 

Each posting has a consistent shape: title, company, location, salary, remote_policy, source, posted_at, url.

The 5 sources

  • We Work Remotely
  • RemoteOK
  • Remotive
  • Hacker News "Who is Hiring?"
  • Any arbitrary RSS/Atom or JSON endpoint you point it at

Currently serving ~330 live listings at any moment.

Filtering

curl "https://remote-jobs-api.tten.no/v1/jobs?min_salary=150000&limit=5" 

min_salary returns real senior roles with hard salary bands, location and source narrow by place and board, limit caps the count.

Why "keyless"

I wanted the part that's tedious — scraping, normalizing, deduping, and serving a stable shape — to be free. If you're building a job tool, a salary benchmark, an internal hiring feed, or an AI agent that needs "what remote jobs exist right now," you should not have to maintain five scrapers.

Self-hostable

It's MIT-licensed and on PyPI:

pip install remote-jobs-api 

The repo is open, so you can run it against your own feeds if you don't want to hit my instance.

What I'm curious about

  • How people handle the "Who is Hiring?" thread — it's the messiest source (monthly, unstructured, lots of duplicates).
  • Whether the normalization schema is missing a field you'd actually use.
  • Any board I should add.

Feedback and PRs welcome. Repo: https://github.com/earnnova-dev/remote-jobs-api