1. Why python-jobspy Hits HTTP 429 Too Many Requests & Cloud IP Bans
Developers deploying jobspy.scrape_jobs() into scheduled Airflow/GitHub Actions pipelines, FastAPI backends, or AI recruiting agents consistently run into three infrastructure walls:
- LinkedIn Guest Endpoint Throttling & N+1 Description Amplification: JobSpy scrapes LinkedIn's unauthenticated /jobs-guest/jobs/api/seeMoreJobPostings/search HTML endpoint, which enforces aggressive per-IP sliding-window rate limits (HTTP 429 / status 999). Setting linkedin_fetch_description=True fires an extra HTTP GET per job posting to extract full text and compensation — turning a 100-job batch into 104 rapid requests.
- Datacenter ASN & TLS Fingerprint Blocks on Indeed / Glassdoor: Cloudflare Bot Management and TLS/JA3 fingerprinting block standard Python requests/tls-client traffic originating from AWS, GCP, Azure, DigitalOcean, Hetzner, and GitHub Actions runners — forcing teams to buy rotating residential proxy bandwidth ($5–$12/GB).
- Missing Canonical Company Domains & Redirect-Wrapped Apply Links: Job board HTML cards frequently strip employer domains, mask original ATS URLs behind tracking redirects, and silently return empty DataFrames whenever upstream CSS classes or GraphQL query hashes rotate.
| Production Metric | JobPostings API (jobpostingsapi.com) | DIY python-jobspy + Proxy Pool | Hosted Scraper Actors (Apify / Bright Data) |
|---|---|---|---|
| AWS / GCP / Hetzner / GitHub Actions Safe | 100% Native HTTPS API (0 proxies needed) | Blocked (429 / 403) without residential proxies | Runs in vendor cloud (compute + proxy markup) |
| Monthly Proxy & Maintenance Overhead | $0.00 infrastructure maintenance | $75 – $300+/mo residential GBs + retry queues | $49 – $500+/mo actor compute + proxy residential units |
| Entry Price & Free Sandbox | $0 Free (1,500 Credits) · $19/mo Starter · $25 PAYG | Open-source library, paid proxy bandwidth required | $30 – $49+/mo platform plans |
| Effective Cost per 1,000 Full Jobs | $0.199 – $0.76 / 1,000 jobs (0 Credits on empty queries) | $1.50 – $4.50+ / 1,000 jobs in proxy GBs & retries | $1.50 – $5.00+ / 1,000 scraped records |
| Full HTML/Text JD in Single Request | Yes — up to 100 full jobs per GET call (<300ms p50) | Requires N+1 per-job detail fetches on LinkedIn | Slow async actor run (30s – 10m wait) |
| Employer ATS Source Coverage | 434 direct ATS & career portals (Greenhouse, Lever, Ashby, Workday) | 4–6 consumer job boards (heavy anti-bot walls) | Single-board actors per site |
| Normalized USD Salary & Tech Skills | Built-in salary.annual_usd_min/max + skills[] array | Raw inconsistent strings or missing on guest HTML | Varies by actor schema |
| Remote MCP for Claude & ChatGPT | 1-Click OAuth 2.1: https://mcp.jobpostingsapi.com/v1/mcp | None (fails inside cloud agent sandboxes) | Requires custom MCP token setup |
2. 5-Minute Python Migration: Replace scrape_jobs() with pandas-Ready ATS JSON
Drop out rotating proxy URLs, sleep jitter, and 429 retry loops. The function below returns a clean pandas DataFrame matching JobSpy's familiar columns while adding canonical employer domains, normalized USD compensation, and extracted technical skills:
| Tier / Pack | Price | Monthly / Pack Credits | Effective Rate / 1K Jobs | Rate Limit & Key Capabilities |
|---|---|---|---|---|
| Free Trial | $0 (Instant, no card) | 1,500 instant + 2,000 streak | $0.00 | 60 RPM · Full descriptions & cursor pagination |
| Starter | $19/mo | 25,000 Credits / mo | $0.76 / 1K jobs | 60 RPM · Cheaper than 3 GB of residential proxies |
| Growth | $49/mo | 100,000 Credits / mo | $0.49 / 1K jobs | 180 RPM · Unlocks /v1/feeds/* & live ?refresh=true |
| Pro | $99/mo | 300,000 Credits / mo | $0.33 / 1K jobs | 300 RPM · 10 Webhooks + high-concurrency ETL |
| Scale | $199/mo | 1,000,000 Credits / mo | $0.199 / 1K jobs | 600 RPM · 1,000,000 full jobs/mo + priority routing |
| Never-Expiring PAYG | $25 / $50 / $100 / $300 | 30,000 – 800,000 Credits (+5% Crypto bonus) | $0.375 – $0.83 / 1K jobs | Stripe (Card / Apple Pay / Google Pay) & 0%-fee Crypto |
Drop-In Python Replacement for jobspy.scrape_jobs() + cURL & Node.js
Query remote US backend engineering roles across Greenhouse, Lever, Ashby, Workday, and 430+ sources with zero proxies and deterministic pagination:
curl -sG "https://api.jobpostingsapi.com/v1/jobs/search" \
-H "x-api-key: jp_live_your_api_key" \
--data-urlencode "q=backend engineer" \
--data-urlencode "country=US" \
--data-urlencode "work_arrangement=remote" \
--data-urlencode "limit=50"Verified Production 200 OK JSON Response (First Record from Live Gateway Capture)
{
"code": 0,
"status": "ok",
"meta": {
"request_id": "d1c0b11c-f35c-40cb-87f3-361e394a0dc3",
"count": 1,
"total": 507,
"total_relation": "eq",
"has_more": true,
"next_cursor": "eyJrIjoibG9jYWwiLCJvIjoyfQ",
"took_ms": 123,
"redistribution_filter": "redistributable_only"
},
"data": [
{
"id": "j_n4p2mfqrxjlhyw7w",
"data_tier": "premium",
"status": "active",
"title": "Senior Backend Engineer - Backend",
"company": {
"id": "c_x5lqv2wtrcdok",
"name": "Dragos",
"slug": "dragos",
"domain": "dragos.com",
"is_staffing_agency": false,
"industry": "software_it"
},
"department": "Backend Development",
"location": {
"raw": "United States",
"country": "US"
},
"work_arrangement": "remote",
"employment_type": "full_time",
"seniority": "senior",
"experience_years_min": 5,
"job_function": "engineering",
"skills": [
"cybersecurity",
"rust",
"docker",
"kotlin",
"postgresql",
"terraform",
"microservices",
"python",
"kubernetes",
"distributed systems"
],
"salary": {
"min": 165000,
"max": 165000,
"currency": "USD",
"period": "year",
"annual_usd_min": 165000,
"annual_usd_max": 165000
},
"url": "https://job-boards.greenhouse.io/dragos/jobs/5364834008",
"apply_url": "https://job-boards.greenhouse.io/dragos/jobs/5364834008",
"source": {
"name": "greenhouse",
"display_name": "Greenhouse",
"type": "ats",
"board": "dragos",
"job_id": "5364834008"
},
"redistribution_allowed": true,
"posted_at": "2026-07-21T01:17:03.000Z"
}
]
}3. Give Claude, ChatGPT & Coding Agents Live Job Search via Remote MCP (https://mcp.jobpostingsapi.com/v1/mcp)
Wrapping python-jobspy inside an MCP tool or cloud AI agent fails immediately because Anthropic, OpenAI, Modal, and cloud container egress IPs are blocked by LinkedIn and Cloudflare. Use our hosted MCP endpoints instead:
- 1-Click OAuth 2.1 Remote MCP (Claude Web & ChatGPT Connectors): Point Claude.ai or ChatGPT Connectors to https://mcp.jobpostingsapi.com/v1/mcp. Browser-based OAuth 2.1 PKCE authenticates in one click, mints 1,500 Free Credits automatically, and exposes search_jobs, get_company_jobs, get_job_detail, and detect_company_ats with zero 429 errors.
- API-Key HTTP MCP & Local Stdio Package: For Cursor, Windsurf, Claude Code, or automated agent frameworks, connect directly to https://api.jobpostingsapi.com/mcp with Authorization: Bearer jp_live_... or run npx -y @jobpostingsapi/mcp-server.
- Free Browser Utilities Before Writing Code: Inspect live Greenhouse/Lever/Ashby JSON payloads at /tools/greenhouse-lever-job-json-viewer or detect any company's underlying ATS slug for free at /tools/ats-detector.
Interactive Engineering Workbench · GET /v1/jobs/search
Verify real-time latency, pagination math & JSON schema
Frequently Asked Questions
- Why does python-jobspy throw 429 Too Many Requests after a few pages?
- LinkedIn's unauthenticated guest job search endpoint rate-limits IPs after roughly 10–25 paginated requests, and setting linkedin_fetch_description=True triggers a separate HTTP GET for every single job card. JobPostings API returns up to 100 complete job descriptions per single HTTPS request from our pre-indexed 434-source ATS database with zero 429 blocks.
- Why does JobSpy work on my home Wi-Fi but fail on AWS, GitHub Actions, or Hetzner?
- Home Wi-Fi uses a residential ISP ASN, whereas AWS, GCP, Azure, Hetzner, Railway, and GitHub Actions use datacenter ASNs that Cloudflare and LinkedIn block at the TLS/edge layer. JobPostings API is an authenticated REST & MCP gateway designed specifically for cloud servers, serverless functions, and CI cron jobs.
- Is JobPostings API cheaper than buying rotating residential proxies for JobSpy?
- Yes. Reliable residential proxy pools typically cost $75–$300+/month once HTML page weight and failed retries are counted. JobPostings API includes 1,500 Free Credits ($1.50) on sign-up, starts at $19/month for 25,000 full job records ($0.76/1K jobs) or $25 non-expiring PAYG, and charges 0 Credits when a search returns 0 results.
- Does JobPostings API include direct employer apply URLs instead of job board redirects?
- Yes. Every verified ATS record links directly to the employer's canonical Greenhouse, Lever, Ashby, Workday, Rippling, SmartRecruiters, or corporate career-site requisition URL, alongside company.domain and normalized USD salary bounds.
- How can I connect this API to Claude, ChatGPT, or Cursor without scraping?
- Add https://mcp.jobpostingsapi.com/v1/mcp as a Remote OAuth 2.1 MCP connector in Claude.ai or ChatGPT, or run npx -y @jobpostingsapi/mcp-server in Cursor, Windsurf, or Claude Desktop.