Jobs Search
Search live job postings with POST /v1/jobs/search.
POST https://api.jobspipe.dev/v1/jobs/searchReturns live job postings matching your filters, normalized into a single schema. Requires authentication.
Prefer to explore interactively? The API Explorer has a live playground with every parameter, the full response schema, and a "try it" panel.
Request
The body is a JSON object of filters. All fields are optional; an empty body returns the most recent postings. Filters combine with AND; array filters (*_or) match any of their values.
See the filter reference for every field.
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": ["software engineer", "backend engineer"],
"job_country_code_or": ["US"],
"posted_at_max_age_days": 7,
"remote": true,
"limit": 25,
"include_total_results": true
}'import requests
resp = requests.post(
"https://api.jobspipe.dev/v1/jobs/search",
headers={"Authorization": "Bearer jp_live_your_key_here"},
json={
"job_title_or": ["software engineer", "backend engineer"],
"job_country_code_or": ["US"],
"posted_at_max_age_days": 7,
"remote": True,
"limit": 25,
"include_total_results": True,
},
)
resp.raise_for_status()
result = resp.json()
for job in result["data"]:
print(job["job_title"], "-", job["company"])const resp = await fetch("https://api.jobspipe.dev/v1/jobs/search", {
method: "POST",
headers: {
Authorization: "Bearer jp_live_your_key_here",
"Content-Type": "application/json",
},
body: JSON.stringify({
job_title_or: ["software engineer", "backend engineer"],
job_country_code_or: ["US"],
posted_at_max_age_days: 7,
remote: true,
limit: 25,
include_total_results: true,
}),
});
const result = await resp.json();
for (const job of result.data) {
console.log(job.job_title, "-", job.company);
}Response
A 200 response has two top-level keys:
-
metadata: counts, the pagination cursor and the cost of the call.credits_charged: credits this response cost.jobs_already_paid: returned jobs that were free because you already paid for them this month.technologies_credits_charged,technologies_already_paid: the part for technologies, only withinclude_technologies: true.credits_remaining: what the account can still spend after this call.credits_allowanceis what it is measured against.
See pagination and how usage is counted.
-
data: an array of job objects. See the job schema.
{
"metadata": {
"total_results": 412,
"truncated_results": 25,
"total_companies": null,
"truncated_companies": 0,
"next_cursor": "eyJwIjoiMjAyNi0wOS0wMiAwMDowMDowMCIsImkiOiI4MTY0OTMzIn0",
"credits_charged": 18,
"jobs_already_paid": 7,
"credits_remaining": 24382,
"credits_allowance": 25000
},
"data": [
{
"id": "8164933",
"job_title": "Backend Engineer",
"company": "Northwind Labs",
"location": "Austin, TX 78701",
"country_code": "US",
"remote": true,
"seniority": "senior",
"date_posted": "2026-09-02T00:00:00+00:00",
"source_url": "https://boards.greenhouse.io/northwindlabs/jobs/8164933",
"last_seen_at": "2026-09-04 07:31:05",
"verified_at": "2026-09-04 07:31:05",
"sources": [
{
"provider": "greenhouse",
"url": "https://boards.greenhouse.io/northwindlabs/jobs/8164933",
"seen_at": "2026-09-02T09:12:44.118+00:00"
}
]
}
]
}id is the posting's ID on its source, so its format varies. Treat it as an opaque string.
The maximum results per call depend on your plan (Free 25, Builder and Growth 100, Scale and Business 500). A higher limit is capped silently. See plans.
Status codes
| Status | Meaning |
|---|---|
200 | Success |
400 | Invalid or unknown filter |
401 | Missing or invalid API key |
402 | Out of credits |
429 | Per-second rate limit exceeded |
502 | The search failed; retry |
504 | The search timed out; retry |
See the error reference for handling guidance.