Quickstart

Create an API key and run your first job search in under two minutes.

Try it without a key first

Routes under /v1/sandbox need no API key and cost no credits. They return the same two fixed sample jobs whatever you send, in the { metadata, data } shape with a subset of the job fields. The sandbox does not validate your query, so use it to check your client wiring, not your filters.

Terminal
curl https://api.jobspipe.dev/v1/sandbox/jobs/search \
  -H "Content-Type: application/json" \
  -d '{ "job_title_or": ["software engineer"], "remote": true }'

For live data, follow the steps below. The request is the same; the live response carries the full job schema.

/v1/sandbox/jobs/export and /v1/sandbox/jobs/search/batch have no live equivalent. Do not build against them.

Create an API key

Sign in to your dashboard, open Settings → API Keys, and click Generate API key. Copy the key - it starts with jp_live_ and is shown only once.

See Manage API keys to name and revoke keys.

Make your first request

Send a POST to /v1/jobs/search with your key as a Bearer token.

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"], "limit": 5 }'
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"], "limit": 5},
)
resp.raise_for_status()
data = resp.json()
print(data["metadata"], len(data["data"]))
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"], limit: 5 }),
});
const data = await resp.json();
console.log(data.metadata, data.data.length);

Read the response

Every response has a metadata object and a data array of normalized jobs.

200 OK
{
  "metadata": {
    "total_results": null,
    "truncated_results": 5,
    "total_companies": null,
    "truncated_companies": 0,
    "next_cursor": "eyJwIjoiMjAyNi0wOS0wMiAwMDowMDowMCIsImkiOiI4MTY0OTMzIn0"
  },
  "data": [
    {
      "id": "8164933",
      "job_title": "Senior Software Engineer",
      "company": "Northwind Labs",
      "location": "Austin, TX 78701",
      "country_code": "US",
      "remote": true,
      "date_posted": "2026-09-02T00:00:00+00:00",
      "source_url": "https://boards.greenhouse.io/northwindlabs/jobs/8164933"
    }
  ]
}

total_results is null unless you send include_total_results: true. Each job carries many more fields than shown here; see the job schema.

Next steps

On this page