Remote Jobs API

Live, normalized remote-job data from 5 boards β€” one clean endpoint, one schema, no scraping on your side.

🟒 loading live job count… 5 boards JSON + CSV 0-100 fit score Structured salary Stdlib-only Python πŸ“¦ pip installable MIT

Stop stitching 5 scrapers together

Remotive, RemoteOK, We Work Remotely, Jobicy, and Hacker News each have a different format, a different rate-limit, and a different way to break. Remote Jobs API pulls all five, normalizes every listing into a single schema, dedupes it, and hands you structured JSON or CSV β€” with an optional 0–100 skill fit-score for ranking.

Built for job boards & aggregator sites, recruiter/ATS tooling, lead-gen and market research, and AI agents that need structured job data in a single call.

Why it's different

One schema, every board

No per-board adapters on your side. A remotive job and a wwr job look identical.

No session scraping

Reads public job-board endpoints only β€” no browser, no accounts, no fragile login flows.

Self-hostable

Pure Python stdlib, zero dependencies. Run it on a laptop, a $5 VPS, or the included Dockerfile.

Structured salary

Boards that publish pay come back as parsed salary_min/salary_max + currency/period β€” filter by floor with ?min_salary=, no regex on your side.

Deterministic fit scoring

No hidden LLM, no black box β€” reproducible ranking you can reason about and unit-test.

Endpoints

MethodPathDescription
GET/healthStatus + live job count
GET/v1/jobs/sourcesAvailable boards
GET/v1/jobsNormalized job listings
GET/v1/snapshotLive market snapshot β€” salary, demand, skills (no key)
GET/v1/salary-bandPer-skill salary bands β€” min/p25/median/p75/max for each skill (no key)

GET /v1/jobs query params

ParamTypeNotes
skillsstringComma-separated keywords β†’ adds fit_score, ranks best-first
sourcestringremotive / remoteok / jobicy / wwr / hn
limitint1-500 (default 50)
min_scoreint0-100, filter by fit (needs skills)
min_salaryintMinimum salary_min (number), e.g. ?min_salary=100000 β€” keeps only listings whose parsed floor meets it
formatstringjson (default) or csv

See real, current data

Below is a live normalized snapshot of what the engine returns today β€” real listings from all 5 boards, already in one schema, ranked by a deterministic skills=python,backend,api fit-score. This is the same JSON the API serves, captured on the last release.

Loading sample…

FitSourceJobCompany / LocationPublished

Example

curl "https://<your-host>/v1/jobs?skills=python,backend,api&min_salary=100000&limit=3"

Response (captured live on 2026-10-04; a real, verifiable snapshot — the feed is live so the exact listings shift over time, but the response shape and the normalized salary fields stay stable):

{
  "count": 3,
  "generated_at": 1791096147,
  "jobs": [
    {
      "id": "154467",
      "title": "Senior Backend Engineer - Backend Platform (USA Only, 100% Remote)",
      "company": "Close",
      "url": "https://jobicy.com/jobs/154467-senior-backend-engineer-backend-platform-usa-only-100-remote",
      "location": "USA / Senior",
      "salary": "USD 140,000-210,000 / yearly",
      "source": "jobicy",
      "published": "2026-10-03T14:58:34+00:00",
      "salary_min": 140000,
      "salary_max": 210000,
      "salary_currency": "USD",
      "salary_period": "year",
      "fit_score": 40
    },
    {
      "id": "154463",
      "title": "Senior Backend Engineer - CRM (USA Only, 100% Remote)",
      "company": "Close",
      "url": "https://jobicy.com/jobs/154463-senior-backend-engineer-crm-usa-only-100-remote",
      "location": "USA / Senior",
      "salary": "USD 140,000-210,000 / yearly",
      "source": "jobicy",
      "published": "2026-10-03T14:58:33+00:00",
      "salary_min": 140000,
      "salary_max": 210000,
      "salary_currency": "USD",
      "salary_period": "year",
      "fit_score": 40
    },
    {
      "id": "154446",
      "title": "Senior Backend Engineer - Workforce Verification",
      "company": "Socure",
      "url": "https://jobicy.com/jobs/154446-senior-backend-engineer-workforce-verification",
      "location": "USA / Senior",
      "salary": "USD 180,000-210,000 / yearly",
      "source": "jobicy",
      "published": "2026-10-03T13:52:19+00:00",
      "salary_min": 180000,
      "salary_max": 210000,
      "salary_currency": "USD",
      "salary_period": "year",
      "fit_score": 40
    }
  ]
}

Fields shown when the board publishes them β€” salary_min, salary_max, salary_currency and salary_period are present on listings that carry parsed pay, and null where a board doesn't publish it. Filter on the floor with ?min_salary= (e.g. ?min_salary=100000).

How the skill filter works — honestly

Passing skills=python,backend,api does not hard-filter the feed to Python-only jobs. It scores every posting for a match (a title hit weighs more than a body/tag hit) and returns them best-first — right now the top hit is Senior Backend Developer (Python) at a fit score of 80, with the full board still available so you can see adjacent roles. To keep only the strongest matches, add &min_score=50 (3 jobs) or &min_score=70 (1 job). To gate by pay, add &min_salary=100000 (36 jobs right now) — that is the honest way to filter by a compensation band, since skills= ranks rather than filters. The example above pairs both: skills=python,backend,api&min_salary=100000 returns the best Python/backend/api matches that also meet the pay floor.

Install

One command β€” pure Python stdlib, zero dependencies.

pip install remote-jobs-api

Query the feed directly (JSON or CSV, with an optional 0–100 skill fit-score):

remote-jobs-api --skills python,api --limit 5
remote-jobs-api --source wwr --format csv

Or run the HTTP API server on your own host:

remote-jobs-api --serve --port 8321

Or run from source:

git clone https://github.com/earnnova-dev/remote-jobs-api
cd remote-jobs-api
python3 -m remote_jobs_api.server          # listens on :8321

Or with Docker:

docker build -t remote-jobs-api .
docker run -p 8321:8321 remote-jobs-api

Or one command with the included docker-compose.yml (keys persist in a volume): export RJA_ADMIN_TOKEN=*** && docker compose up -d.

Want to know the moment a feed breaks silently? jobfeed-watchdog is a drop-in GitHub Action that fingerprints a feed every 6 hours and fails the build on count collapse, schema change, or outage. Or track new matches with GigWatch.

Env vars: PORT (default 8321) Β· RJA_CACHE_TTL (default 300 s) β€” how long to cache upstream fetches.

View on GitHub β†’   Free remote-job API list   Scraper vs API guide   Free remote-job data API   Build a market dashboard   Compare free remote-job APIs (benchmarked)   2026 remote salary data (live)

Self-serve β€” no email, no waitlist: start in 30 seconds.

Free tier: 100 calls/month, no API key, no signup. The live self-serve funnel β€” register a key, pull the feed, and upgrade to Pro/Team when you scale:

Get a free API key β†’   Upgrade to Pro   Dashboard

More role guides:   Remote software engineer jobs   Remote security engineer jobs   Remote backend developer jobs   Remote fullstack developer jobs   Remote frontend developer jobs   Remote data & AI engineer jobs   Remote DevOps & SRE jobs   Remote product manager jobs   Remote executive & leadership jobs   Remote python developer jobs   Remote data science & analyst jobs   Remote staff & principal engineer jobs   Remote customer & client success manager jobs   Remote digital nomad jobs   Remote sales & GTM jobs   Remote marketing & content jobs   Remote jobs in Europe (2026)

Turn this feed into alerts

You have the data. Now watch it: GigWatch is a hosted remote-job feed that turns any of the 5 boards in this API into new-match alerts β€” email you the moment a role matching your skills + salary floor lands, no polling, no scraping to maintain. Self-hosted is free (MIT), or let us run it for you.

See how GigWatch works →   GigWatch on GitHub

Pricing (hosted tier)

PlanPriceIncludes
Free$0100 calls/mo, all boards, 50 results/req
Pro$19/mo10k calls/mo, CSV, min_score, higher limits
Team$49/mo100k calls/mo, SLA, webhooks (soon)

These are firm prices, not estimates β€” Pro and Team are live now via secure Stripe checkout (Pro = $19/mo, cancel anytime). Self-hosted is free, MIT: the paid tiers are the hosted, always-on, high-rate-limit version of the same engine, managed for you.