Universal JD Parser

🔌 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.

🔑 Authentication

If the server has API_KEY set in its environment, all /api/* requests require a matching X-API-Key header. Leave blank if no key is configured.

🚀 Quick Start

# 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
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)
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);