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. 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 with include_technologies: true.
    • credits_remaining: what the account can still spend after this call. credits_allowance is what it is measured against.

    See pagination and how usage is counted.

  • data: an array of job objects. See the job schema.

200 OK
{
  "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

StatusMeaning
200Success
400Invalid or unknown filter
401Missing or invalid API key
402Out of credits
429Per-second rate limit exceeded
502The search failed; retry
504The search timed out; retry

See the error reference for handling guidance.

On this page