Skip to content
jobpostingsapi.com

Overview

Available credits

Unit rate

Rate limit

API key

No active key

Send it in the x-api-key header. Keys in the URL are rejected.

Generate a new key?

Your current key stops working immediately. Any app using it will get 401 errors until you switch to the new key.

Production Batch Starter Scripts & Quickstart

Paginates across 434 ATS & career-site sources and exports company domains, titles, annual salary bands, and apply URLs to CSV.

import csv, requests

API_KEY = "jp_your_api_key"
jobs, cursor = [], None

while len(jobs) < 500:
    params = {"q": "software engineer", "remote": "true", "license_class": "redistributable", "limit": 100}
    if cursor:
        params["cursor"] = cursor
    res = requests.get(
        "https://api.jobpostingsapi.com/v1/jobs/search",
        params=params,
        headers={"x-api-key": API_KEY},
        timeout=30,
    ).json()
    batch = res.get("data") or []
    if not batch:
        break
    for job in batch:
        comp = job.get("compensation") or {}
        company = job.get("company") or {}
        jobs.append({
            "id": job.get("id"),
            "title": job.get("title"),
            "company": company.get("name"),
            "domain": company.get("domain"),
            "min_annual_usd": comp.get("min_annual_usd"),
            "max_annual_usd": comp.get("max_annual_usd"),
            "apply_url": job.get("apply_url"),
        })
    meta = res.get("meta") or {}
    if not meta.get("has_more"):
        break
    cursor = meta.get("next_cursor")

with open("gtm_hiring_signals.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=["id", "title", "company", "domain", "min_annual_usd", "max_annual_usd", "apply_url"])
    w.writeheader()
    w.writerows(jobs)
print(f"Saved {len(jobs)} jobs to gtm_hiring_signals.csv")

Replace jp_your_api_key with your key, or click Generate new key to inject your live key into these scripts automatically.

Usage