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
Top comments (0)