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 MITRemotive, 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.
No per-board adapters on your side. A remotive job and a wwr job look identical.
Reads public job-board endpoints only β no browser, no accounts, no fragile login flows.
Pure Python stdlib, zero dependencies. Run it on a laptop, a $5 VPS, or the included Dockerfile.
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.
No hidden LLM, no black box β reproducible ranking you can reason about and unit-test.
| Method | Path | Description |
|---|---|---|
| GET | /health | Status + live job count |
| GET | /v1/jobs/sources | Available boards |
| GET | /v1/jobs | Normalized job listings |
| GET | /v1/snapshot | Live market snapshot β salary, demand, skills (no key) |
| GET | /v1/salary-band | Per-skill salary bands β min/p25/median/p75/max for each skill (no key) |
GET /v1/jobs query params
| Param | Type | Notes |
|---|---|---|
skills | string | Comma-separated keywords β adds fit_score, ranks best-first |
source | string | remotive / remoteok / jobicy / wwr / hn |
limit | int | 1-500 (default 50) |
min_score | int | 0-100, filter by fit (needs skills) |
min_salary | int | Minimum salary_min (number), e.g. ?min_salary=100000 β keeps only listings whose parsed floor meets it |
format | string | json (default) or csv |
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β¦
| Fit | Source | Job | Company / Location | Published |
|---|
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).
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.
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:
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)
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.
| Plan | Price | Includes |
|---|---|---|
| Free | $0 | 100 calls/mo, all boards, 50 results/req |
| Pro | $19/mo | 10k calls/mo, CSV, min_score, higher limits |
| Team | $49/mo | 100k 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.