Integrations · Databases and warehouses
Load job postings data into DuckDB
Pull job posts into a local DuckDB file and analyze them with SQL in seconds - nested company data included.
Steps
You need: Python 3.9+, pip install requests duckdb and a jobdata API key.
- Set your API key and the filters you need.
- The script writes newline-delimited JSON and loads it with
read_json_auto, keeping nested fields as structs. - Query with plain SQL, e.g.
company.namefor the hiring company.
import requests
API_KEY = "YOUR_API_KEY"
def fetch_jobs(**params):
"""Yield every job for the given filters, following pagination."""
url = "https://jobdataapi.com/api/jobs/"
params = {"page_size": 1000, **params}
headers = {"Authorization": f"Api-Key {API_KEY}"}
while url:
resp = requests.get(url, headers=headers, params=params, timeout=60)
resp.raise_for_status()
data = resp.json()
yield from data["results"]
url, params = data["next"], None # "next" already carries the filters
import json
import duckdb
with open("jobs.jsonl", "w") as f:
for job in fetch_jobs(max_age=30, has_remote="true"):
f.write(json.dumps(job) + "\n")
con = duckdb.connect("jobs.duckdb")
con.execute("CREATE OR REPLACE TABLE jobs AS SELECT * FROM read_json_auto('jobs.jsonl')")
print(con.sql("""
SELECT company.name AS company, count(*) AS job_posts
FROM jobs
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10
"""))
Notes
- DuckDB reads the weekly Parquet downloads (access ultra) directly:
SELECT * FROM 'jobs.parquet'. - Run it daily with
max_age=1to pick up new job posts; on access lite, dropmax_age- the feed covers the past 90 days and upserting byidkeeps it free of duplicates.
Related docs and tutorials
Practical Parquet Analytics: Hiring Signals and Labor-Market Intelligence
Build B2B prospect lists and salary and remote-work benchmarks from the weekly jobs and companies Parquet download with DuckDB and Python.
CSV and Parquet File Downloads Documentation
Weekly CSV and Parquet downloads for complete job data, company context, and analytical workflows.
Jobs API Ingestion Guide: Reliable Historical Backfills and Incremental Syncs
A practical guide to high-volume historical backfills and incremental syncs using bounded windows, multi-pass pagination, ID deduplication, and reconciliation.
Ready to load real data?
All endpoints are public for limited testing - run the script without a key to see the structure, then add your key. Flat monthly plans with unlimited usage.
More integrations
Explore jobdata API with AI tools
Ask an AI assistant how to search and build with live job data.