DEV Community

earnnova-dev
earnnova-dev

Posted on

A free, keyless Remote Jobs API I built to stop scraping job boards (5 sources, one call)

Building something that needs to know "which jobs are out there right now" keeps hitting the same wall: every remote job board is a different scrape, a different HTML layout, a different rate limit, and a different set of dead links.

So I built a single API that normalizes all of it into one call. It's live, free, and requires no API key.

What it is

Remote Jobs API is a small service that aggregates remote roles from five public sources — Remotive, RemoteOK, Jobicy, WeWorkRemotely, and Hacker News (Who's Hiring) — and returns them as one clean, typed feed.

No registration. No API key. No rate-limit handshake. Point a client at an endpoint and you get normalized jobs back.

Why keyless

Most "job APIs" make you sign up, burn through a free quota, and wrap every call in an auth token before you can get a single listing. That friction is fine for a data vendor selling you a dashboard. It's hostile if you just want to build a tool, a demo, a newsletter digest, or an AI agent that needs to see current openings.

I wanted the opposite: the lowest-possible-friction way to say "give me remote jobs." So the design constraint was zero setup. If a call can't be made with a plain curl, it's not finished.

The shape of the data

Each job is normalized to a small, predictable object. What varies wildly across source sites (title casing, salary formats, remote-region wording) is flattened to a consistent schema:

{
  "title":   "Data Scientist III - Temporary",
  "company": "Veracyte",
  "salary":  "USD 63-72 / hourly",
  "url":     "https://jobicy.com/jobs/154571-..."
}
Enter fullscreen mode Exit fullscreen mode

The health endpoint tells you how much is live at any moment:

GET /health
{ "status": "ok", "sources": ["remotive","remoteok","jobicy","wwr","hn"],
  "count_live": 339 }
Enter fullscreen mode Exit fullscreen mode

That's 339 live roles across the five sources, each with a real company name, a normalized salary string when the source provides one, and a working apply URL.

What it's for (and what it isn't)

This is not a replacement for a job board. It won't email you, track applications, or rank roles. It's a data substrate: a cheap, structured feed of currently-live remote openings you can pipe into your own thing.

Concretely, it fits:

  • Job alerts / career-page monitors that need a broad, deduplicated pool to diff against — one call normalizes title + skills + salary across many sources instead of scraping each.
  • AI agents and auto-apply tooling that need to match a candidate profile against real open roles without maintaining a per-site scraper stack.
  • Dashboards, digests, and newsletters that want a "here's what's remote today" section without owning the crawling.
  • Self-hosting — the project is MIT and public, so if you'd rather run your own copy of the aggregation against sources you choose, you can.

The honest caveats

  • Salaries are best-effort. Only some sources expose them, so the field is sometimes empty or approximate.
  • It's a snapshot. The feed reflects what's live at scrape time; a role can close between calls.
  • Coverage is the five sources above. It's a starting pool, not the whole internet.

The one-call proof

If you want to see it live right now, this is the entire client:

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

You'll get back three real, currently-posted remote jobs with company, salary, and apply URL — no token, no signup.

That's the whole pitch: one endpoint, no key, normalized remote jobs. If you're building something that needs to know what's out there, try it as the data layer and tell me where it breaks.

Top comments (0)