Pagination
Page through large result sets with cursors, offsets, or page numbers.
A single POST /v1/jobs/search returns at most your plan's page size: Free 25, Builder 100, Scale 500. To retrieve more, paginate.
Cursor pagination (recommended)
Each response includes metadata.next_cursor. Pass it back as cursor to get the next page. When next_cursor is null, you've reached the end.
import requests
URL = "https://api.jobspipe.dev/v1/jobs/search"
HEADERS = {"Authorization": "Bearer jp_live_your_key_here"}
cursor, all_jobs = None, []
while True:
body = {"job_title_or": ["software engineer"], "limit": 100}
if cursor:
body["cursor"] = cursor
page = requests.post(URL, headers=HEADERS, json=body).json()
all_jobs.extend(page["data"])
cursor = page["metadata"].get("next_cursor")
if not cursor:
break
print(f"fetched {len(all_jobs)} jobs")const URL = "https://api.jobspipe.dev/v1/jobs/search";
const headers = {
Authorization: "Bearer jp_live_your_key_here",
"Content-Type": "application/json",
};
let cursor = null;
const all = [];
do {
const body = { job_title_or: ["software engineer"], limit: 100 };
if (cursor) body.cursor = cursor;
const page = await fetch(URL, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then((r) => r.json());
all.push(...page.data);
cursor = page.metadata.next_cursor;
} while (cursor);
console.log(`fetched ${all.length} jobs`);Offset & page pagination
If you prefer numeric paging, use offset (results to skip) or page (page index) instead of cursor:
{ "job_title_or": ["software engineer"], "limit": 100, "offset": 100 }Cursor pagination is more reliable for large or fast-changing result sets, since offsets can shift as new jobs are ingested.
Total counts
By default metadata.total_results is null (counting is skipped for speed). Set include_total_results: true to populate it - useful for showing "X of Y results", at a small performance cost.
Ordering
Control sort order with order_by, an array of { field, desc } objects:
{ "job_title_or": ["software engineer"], "order_by": [{ "field": "date_posted", "desc": true }] }