Live · no API key · updated daily

Remote Job Data for AI Agents & LLM Apps

Point your agent, RAG pipeline, or LLM tool at a single no-auth JSON endpoint and get 340+ deduplicated remote roles — tagged, salary-carrying, and ranked by fit. No scraping, no 5 separate board integrations, no API key to request.

340+live remote roles in the feed
5job boards, one endpoint
0auth to start (100 calls/mo free)
259roles scored for an ai match

Why an agent needs a job feed, not 5 scrapers

Building an AI recruiting copilot, a RAG pipeline over live job postings, an MCP server that answers "what's on the market right now?", or a data product that needs fresh remote-role signals means the same problem: you need structured, current, cross-board job data. Doing it by hand means scraping Remotive, RemoteOK, Jobicy, We Work Remotely, and the weekly Hacker News "Who is hiring" thread — each with a different shape, rate limit, and change cadence — then normalizing the fields yourself.

Remote Jobs API does that normalisation for you. One GET returns a single JSON array where every job has the same stable fields: a deduplicated id, title, company, location, source, a tags array, salary_min/salary_max/salary_currency/salary_period, published, and a fit_score when you query by skill. No auth on the free tier. No per-board adapters. Just data your model can ingest.

What's in the feed today

The current live snapshot (2026-10-02) contains 340 remote jobs across five sources: Jobicy (120), RemoteOK (99), We Work Remotely (89), Remotive (17), and Hacker News (15). 232 of them carry a tags array and 88 carry a parsed salary (26% coverage — a data-availability fact, not a gap: the feed reports exactly what each board exposes).

For agent workloads the skill ranking is the useful part. Query skills= with a skill or stack and the feed scores every posting for a match and returns them best-first — so skills=ai surfaces 259 fit-scored roles, skills=data 153, skills=rust 88, skills=ml / skills=agent 55, and skills=python 21. That is the "ranked, deduped, structured" input an agent or RAG index actually wants.

QueryFit-scored rolesUse for
skills=ai259AI/ML market signal, recruiting copilot
skills=data153Data/analytics demand tracker
skills=rust88Systems / high-perf stack tracking
skills=ml55Machine-learning hiring pulse
skills=agent55Agent/autonomy role emergence

Counts are a point-in-time read of the live feed at 2026-10-02 and move daily as the boards update. The endpoint is the source of truth — this page is a snapshot.

How skills= works — honestly

Passing skills=ai does not hard-filter the feed to AI-only jobs. It scores every posting for an AI match (a title hit weighs more than a body/tag hit) and returns them best-first, with the strongest AI-named roles leading the list. The full board is still available so your agent can see adjacent roles too. Combine it with min_score to keep only the strongest matches — that is the clean way to gate a RAG ingestion or a "top-N relevant roles" answer.

Stable, deduplicated, idempotent — agent-friendly by design

Each job has a stable id you can dedupe on across pulls, so a scheduled agent can surface only new roles instead of re-announcing yesterday's. There is no session, no cookie, and no rate-limit handshake on the free tier — one request returns the whole board, which is exactly the call pattern a cron, a GitHub Action, or an MCP tool wants.

Wire it up in one call — no API key, no signup

The free tier needs no authentication and allows 100 calls per month. Pull the current AI-ranked remote roles with a single request:

curl "https://remote-jobs-api.tten.no/v1/jobs?skills=ai&min_score=15&limit=20"

Or ingest it with the Python standard library — no dependencies, ideal as the tool function behind an agent:

import json, urllib.request

url = "https://remote-jobs-api.tten.no/v1/jobs?skills=ai&min_score=15&limit=25"
with urllib.request.urlopen(url) as r:
    data = json.load(r)

for job in data["jobs"]:
    fit = job.get("fit_score") or 0
    sal = job.get("salary") or "n/a"
    tags = ", ".join(job.get("tags") or [])
    print(f"- [{fit}] {job['title']} | {job['company']} | {sal} | {tags}")

Useful parameters for agent tools: skills (comma-separated), source (remotive, remoteok, jobicy, wwr, hn), limit, min_salary, and min_score (minimum fit_score, requires skills). min_salary filters on the salary floor, so it is the honest way to gate by a compensation band.

Three patterns an agent can run on this endpoint

Who this is for

Agent builders: use the feed as the live data source behind an MCP tool, a RAG pipeline, or an agentic job-matcher — one endpoint instead of five scrapers you maintain. Data teams: track remote demand, salary bands, and skill coverage over time from a stable, documented schema. Job-seekers building their own tools: wire a cron to pull the roles that match your skills and get pinged when new ones land — no refreshing five tabs.

Get the live remote-job feed for your agents

No key, no signup, 100 calls/month free. Pro and Team tiers add higher limits, multi-source priority, and SLA. Self-serve checkout is live.

Open the API →

View the source & Helm chart →