🔌 REST API Reference
Integrate job scraping, search, and analysis into your applications. All endpoints return JSON and support optional API key authentication via the X-API-Key header.
🚀 Quick Start
cURL
Python
JavaScript
Copy # List jobs
curl http://localhost:8000/api/jobs?limit=10
# Search with NLP
curl "http://localhost:8000/api/nlp-search?q=python+developer+remote"
# Start a scrape
curl -X POST http://localhost:8000/api/scrape/start \
-H "Content-Type: application/json" \
-d '{"scrapers":["adzuna"],"overrides":{"adzuna":{"queries":["python"],"max_pages":2}}}'
# Get job metadata
curl http://localhost:8000/api/metadata/skills?limit=20
Copy import requests
BASE = "http://localhost:8000"
HEADERS = {"X-API-Key": "your-key"} # optional
# List jobs
jobs = requests.get(f"{BASE}/api/jobs", params={"limit": 10}, headers=HEADERS).json()
print(f"Found {jobs['count']} jobs")
# NLP search
results = requests.get(f"{BASE}/api/nlp-search",
params={"q": "python developer remote", "limit": 20},
headers=HEADERS).json()
# Start a scrape
task = requests.post(f"{BASE}/api/scrape/start", json={
"scrapers": ["adzuna"],
"overrides": {"adzuna": {"queries": ["python"], "max_pages": 2}}
}, headers=HEADERS).json()
# Poll status
import time
while True:
status = requests.get(f"{BASE}/api/scrape/status/{task['task_id']}",
headers=HEADERS).json()
if status["status"] in ("completed", "failed"):
break
time.sleep(2)
Copy const BASE = 'http://localhost:8000';
const HEADERS = { 'X-API-Key': 'your-key' }; // optional
// List jobs
const jobs = await fetch(`${BASE}/api/jobs?limit=10`,
{ headers: HEADERS }).then(r => r.json());
console.log(`Found ${jobs.count} jobs`);
// NLP search
const results = await fetch(
`${BASE}/api/nlp-search?q=${encodeURIComponent('python developer remote')}`,
{ headers: HEADERS }).then(r => r.json());
// Start a scrape
const task = await fetch(`${BASE}/api/scrape/start`, {
method: 'POST',
headers: { ...HEADERS, 'Content-Type': 'application/json' },
body: JSON.stringify({
scrapers: ['adzuna'],
overrides: { adzuna: { queries: ['python'], max_pages: 2 } }
})
}).then(r => r.json());
// Poll status
const poll = setInterval(async () => {
const s = await fetch(`${BASE}/api/scrape/status/${task.task_id}`,
{ headers: HEADERS }).then(r => r.json());
if (['completed','failed'].includes(s.status)) clearInterval(poll);
}, 2000);