Guides
Build a daily new-jobs feed
Poll JobsPipe for postings added since your last run.
A common integration is a job that runs on a schedule (cron, a worker, a serverless function) and pulls everything posted since it last ran - to power alerts, a feed, or a database sync.
Approach
Use the posted-date filters to scope to recent postings:
posted_at_max_age_days- simplest: "anything from the last N days".posted_at_gte- precise: "anything on or after this date".
Then paginate with the cursor until you've drained the result set.
Example: jobs from the last day
import requests
URL = "https://api.jobspipe.dev/v1/jobs/search"
HEADERS = {"Authorization": "Bearer jp_live_your_key_here"}
def fetch_recent(titles, country="US"):
cursor, jobs = None, []
while True:
body = {
"job_title_or": titles,
"job_country_code_or": [country],
"posted_at_max_age_days": 1,
"limit": 100,
}
if cursor:
body["cursor"] = cursor
page = requests.post(URL, headers=HEADERS, json=body).json()
jobs.extend(page["data"])
cursor = page["metadata"].get("next_cursor")
if not cursor:
return jobs
new_jobs = fetch_recent(["software engineer", "data engineer"])
print(f"{len(new_jobs)} new postings")const URL = "https://api.jobspipe.dev/v1/jobs/search";
const headers = {
Authorization: "Bearer jp_live_your_key_here",
"Content-Type": "application/json",
};
async function fetchRecent(titles, country = "US") {
let cursor = null;
const jobs = [];
do {
const body = {
job_title_or: titles,
job_country_code_or: [country],
posted_at_max_age_days: 1,
limit: 100,
};
if (cursor) body.cursor = cursor;
const page = await fetch(URL, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then((r) => r.json());
jobs.push(...page.data);
cursor = page.metadata.next_cursor;
} while (cursor);
return jobs;
}
const newJobs = await fetchRecent(["software engineer", "data engineer"]);
console.log(`${newJobs.length} new postings`);Deduplicate across runs
JobsPipe gives every posting a stable id (same job, same ID across sources). Track the IDs you've already processed and skip them on the next run, so a job that stays live for several days is only handled once.
Each call is one request against your monthly quota - independent of how many jobs come back. Larger limit values (up to your plan's max) mean fewer calls to drain a feed.