JobsPipe
API Reference

Jobs Search

Search live job postings with POST /v1/jobs/search.

POST https://api.jobspipe.dev/v1/jobs/search

Returns 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 (up to your plan's page size). Filters combine with AND; array filters (*_or) match any of their values.

See the full 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 and the pagination cursor. See pagination.
  • data - an array of normalized job objects. See the job schema.
200 OK
{
  "metadata": {
    "total_results": 412,
    "truncated_results": 25,
    "total_companies": null,
    "truncated_companies": 0,
    "next_cursor": "eyJvZmZzZXQiOjI1fQ"
  },
  "data": [
    {
      "id": "jp_3958211043",
      "job_title": "Backend Engineer",
      "company": "Acme Inc",
      "location": "Remote · United States",
      "country_code": "US",
      "remote": true,
      "seniority": "Mid-Senior",
      "date_posted": "2026-06-18",
      "final_url": "https://example.com/careers/3958211043"
    }
  ]
}

The maximum number of results per call depends on your plan (Free 25, Builder 100, Scale 500). Requesting a higher limit is capped at that ceiling. See plans.

Status codes

StatusMeaning
200Success
401Missing or invalid API key
402Monthly request quota exceeded
429Per-second rate limit exceeded
504The upstream search timed out

See the error reference for handling guidance.

On this page