Job search API: how to add job search to your product
A build-it integration guide. Get a key, make your first call, learn the filters that matter (title, country, remote, posted-after), wire it into your app with pagination, and keep results fresh.
Eng team
Engineering
Adding job search to a product - a candidate-matching feature, an internal sourcing tool, a market dashboard, an AI agent - sounds like a scraping project and is really an integration project. With a job search API the data layer is one HTTP call; the work is wiring it into your app. This is the build-it guide, from first request to paginated, filtered results in your UI. For the product-level overview of what JobsPipe is, see the jobs API page; this post is the how-to.
What a job search API gives you
One endpoint that returns postings from many sources in a single shape, so your application code never branches per source. You send filters, you get back a page of normalized jobs and a cursor for the next page. No proxies, no parsers, no per-ATS schema handling - the parts that sink a DIY scraper are someone else’s problem.
Step 1: get a key and make your first call
Grab a free key from the dashboard, then POST to https://api.jobspipe.dev/v1/jobs/search with a bearer token. A minimal call:
curl https://api.jobspipe.dev/v1/jobs/search \
-H "Authorization: Bearer jp_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{ "job_title_or": ["product manager"], "limit": 10 }'The response has two parts: a metadata block (total results and a paging cursor) and a data array of normalized postings.
Step 2: the filters that matter
Every filter is optional and combined with AND. The ones you reach for most:
job_title_or- match any of a list of title phrases, for example["product manager", "program manager"].job_country_code_or- restrict by ISO country code, for example["US", "GB", "DE"].remote- a boolean; settrueto keep only remote-eligible roles.posted_at_max_age_days- only jobs posted within the last N days, the single most useful freshness control.source_orandcompany_name_partial_match_or- scope to specific sources or companies when you need to.
Step 3: wire it into your product
A thin typed wrapper plus a loop over the cursor is the whole integration. In TypeScript:
const API = "https://api.jobspipe.dev/v1/jobs/search";
async function searchJobs(filters, cursor) {
const res = await fetch(API, {
method: "POST",
headers: {
"Authorization": "Bearer jp_live_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({ ...filters, limit: 25, cursor }),
});
if (!res.ok) throw new Error("search failed: " + res.status);
return res.json();
}
async function allRemotePMs() {
const filters = {
job_title_or: ["product manager"],
job_country_code_or: ["US", "GB"],
remote: true,
posted_at_max_age_days: 7,
};
const jobs = [];
let cursor = undefined;
do {
const page = await searchJobs(filters, cursor);
jobs.push(...page.data);
cursor = page.metadata.next_cursor;
} while (cursor);
return jobs;
}Each item in page.data has the same fields regardless of source - title, company, normalized location, parsed compensation, seniority, posted_at, and an apply_url - so your rendering code is written once.
Step 4: keep results fresh
For a search feature you query on demand, so freshness is automatic. For a stored index, two options. Poll on a schedule with posted_at_max_age_days set to your interval, or, on higher plans, register a webhook and have new and updated jobs pushed to you with signed, idempotent delivery - covered in the webhooks release notes.
Related research
- Job posting API: one endpoint for every job on the web
- The 5 best jobs APIs in 2026 - comparison, pricing, and coverage
- Search millions of jobs from your AI agent with the JobsPipe MCP server
Add job search to your product today - free tier, 5,000 requests/month.
Get a free API key