Skip Apify Container Cold-Starts. Query 9.9M+ ATS Jobs Synchronously in <300ms.
Running headless Actor containers for every search wastes 5–25 seconds on container boot, burns Compute Units and proxy bandwidth on empty runs, and forces async dataset-polling queues. Call GET /v1/jobs/search directly against our unified index of Greenhouse, Lever, AshbyHQ, Workday, SmartRecruiters, Rippling, and 428+ employer career portals — billed strictly per returned job record (0 Credits on 0 results).
Instant API key + 1,500 Free Credits ($1.50) + 2,000 Streak Bonus Credits · 60 RPM free concurrency · Card / Apple Pay / Google Pay + 0%-fee Crypto (+5% bonus) on /dashboard/billing.
01 / Architecture & Unit Economics
Why High-Frequency Pipelines Move Off Per-Run Actor Containers
Actors are great for one-off CSV exports, but production AI recruiting agents, Clay/n8n enrichment tables, and job boards need sub-second synchronous responses without paying platform compute markups.
| Dimension | Apify Scraper Actor Runs | JobPostings API Direct REST Gateway |
|---|---|---|
| Response Latency | 8 – 25+ sec (Docker pull + container boot + dataset poll) | < 300 ms p50 synchronous JSON response |
| Effective Cost / 1,000 Jobs | $1.20 – $5.00+ (Actor PPR/PPE + Compute Units + Proxy GB) | $0.199 – $0.76 / 1K jobs (Save 40%–60%+) |
| 0-Result / Empty Searches | Still bills container startup CU & residential proxy traffic | $0.00 (Strictly 0 Credits when 0 jobs match) |
| Concurrency & Queueing | Account RAM cap (8–32 GB) queues burst Actor runs | 60 RPM Free · 180 RPM Growth · 300 RPM Pro · 600 RPM Scale (stateless HTTP) |
| Lifecycle & Closed-Job Events | Requires re-scraping every board & diffing snapshots yourself | Built-in /v1/feeds/new, /updated & /closed + HMAC Webhooks |
| AI Agent & MCP Readiness | Async run timeouts inside Claude / Cursor tool calls | Native OAuth 2.1 Remote MCP (mcp.jobpostingsapi.com) |
02 / 1-to-1 Parameter Mapping
Apify Jobs Actor Input JSON → GET /v1/jobs/search
Every common Actor run_input property maps directly to a query parameter on https://api.jobpostingsapi.com/v1/jobs/search (up to 50–100 full job records per call, including HTML & plain-text descriptions).
| Actor Input JSON Field | Direct REST Query Parameter | Example | Behavior |
|---|---|---|---|
"queries" / "searchTerms" / "position" {"queries": ["AI Engineer"], "position": "Backend"} | q | ?q=AI+Engineer | Boolean & phrase search across job titles, skills, and descriptions |
"country" / "countryCode" / "location" {"country": "US", "location": "New York"} | country & location | ?country=US&location=New+York | ISO-3166 alpha-2 country code + normalized city/state matching |
"remoteOnly" / "workplaceType" {"remoteOnly": true} | work_arrangement | ?work_arrangement=remote | Supports remote, hybrid, or onsite filtering |
"atsPlatform" / "sources" / "boards" {"sources": ["greenhouse", "lever", "ashby"]} | source | ?source=greenhouse,lever,ashby,workday | Filter any combination of 434 ATS & corporate career portals |
"companyDomains" / "careerUrls" {"companyDomains": ["stripe.com"]} | company (or /v1/companies/{slug}/jobs) | /v1/companies/stripe/jobs?refresh=true | Direct company lookup + optional real-time ATS ETag refresh |
"publishedAfter" / "datePosted" {"datePosted": "24h"} | posted_since (or /v1/feeds/new) | ?posted_since=24h | Accepts ISO-8601 timestamps or relative windows (1h, 24h, 7d) |
"maxItems" / "maxResults" + dataset offset {"maxItems": 100} | limit & cursor | ?limit=50&cursor=eyJ... | Deterministic stateless cursor pagination (0 Credits on empty pages) |
03 / 2-Minute Code Swap
Delete Your apify-client Polling Loop
Replace 15 lines of Actor run creation, container wait-polling, and dataset iteration with a single standard requests.get or fetch call.
Python Drop-In Replacement
# ❌ BEFORE: Asynchronous Apify Actor container boot + polling + dataset fetch (8–25s)
# from apify_client import ApifyClient
# client = ApifyClient("apify_api_xxx")
# run = client.actor("your-actor/ats-jobs-scraper").call(run_input={
# "queries": ["AI Engineer"], "country": "US", "remoteOnly": True, "maxItems": 50
# })
# jobs = list(client.dataset(run["defaultDatasetId"]).iterate_items())
# ✅ AFTER: Direct synchronous REST API (<300ms p50 cached, 0 container cold-start fee)
import requests
resp = requests.get(
"https://api.jobpostingsapi.com/v1/jobs/search",
headers={"x-api-key": "jp_live_your_api_key"},
params={
"q": "AI Engineer",
"country": "US",
"work_arrangement": "remote",
"source": "greenhouse,lever,ashby,workday",
"limit": 50,
},
timeout=15,
)
resp.raise_for_status()
payload = resp.json()
jobs = payload["data"] # Normalized ATS jobs + full descriptions + apply_url
next_cursor = payload["meta"]["next_cursor"]
print(f"Fetched {len(jobs)} jobs in {payload['meta']['took_ms']}ms")Node.js / TypeScript (Native fetch)
// Direct Node.js / TypeScript fetch — zero SDK or polling loop required
const url = new URL("https://api.jobpostingsapi.com/v1/jobs/search");
url.searchParams.set("q", "Software Engineer");
url.searchParams.set("country", "US");
url.searchParams.set("source", "greenhouse,lever,ashby,workday");
url.searchParams.set("limit", "50");
const res = await fetch(url, {
headers: { "x-api-key": process.env.JOBPOSTINGS_API_KEY ?? "jp_live_your_api_key" },
});
const { data: jobs, meta } = await res.json();
console.log(`Returned ${jobs.length} jobs (took ${meta.took_ms}ms), has_more=${meta.has_more}`);1-Line cURL Smoke Test
curl -s "https://api.jobpostingsapi.com/v1/jobs/search?q=engineer&country=US&source=greenhouse,lever,ashby&limit=20" \
-H "x-api-key: jp_live_your_api_key"Real Captured 200 OK Gateway Response
HTTP 200 · 1 Credit / Job{
"code": 0,
"provider": "https://jobpostingsapi.com",
"status": "ok",
"msg": "success",
"data": [
{
"id": "j_iwnoo5bdjvaf2ivy",
"data_tier": "premium",
"status": "active",
"title": "Production Supervisor $20-24 (Canton, MS)",
"company": {
"id": "c_x2e5m6tp6zuns",
"name": "Quick Hire Staffing",
"domain": null,
"is_staffing_agency": true,
"industry": "staffing_recruiting",
"industry_confidence": 1,
"industry_source": "llm",
"industry_model": "typesafe/jev-1.13-20260917"
},
"department": null,
"location": {
"raw": "Canton, Mississippi, United States | Jackson, Mississippi, United States",
"city": "Canton",
"region": "MS",
"region_code": "US-MS",
"country": "US",
"country_source": "source",
"lat": null,
"lng": null,
"timezone": null,
"remote_scope": null
},
"work_arrangement": null,
"employment_type": null,
"employment_type_raw": null,
"seniority": "lead",
"experience_years_min": 3,
"education": "high_school",
"visa_sponsorship": null,
"job_function": "manufacturing",
"skills": [
"quality assurance",
"six sigma"
],
"salary": {
"min": 20,
"max": 24,
"currency": "USD",
"period": "hour",
"source": "parsed",
"annual_usd_min": 41600,
"annual_usd_max": 49920
},
"language": "en",
"description_snippet": "Position: Production Supervisor Location: Canton, MS Salary: $20 - $24/hr Seeking a Production Supervisor to lead and manage quality assurance activities, ensuring products and processes meet established standards and client expectations. The ideal candidate will foster a culture of continuous impro",
"has_description": true,
"url": "https://apply.workable.com/j/6C5E962163",
"apply_url": "https://apply.workable.com/j/6C5E962163",
"link_type": "direct",
"source": {
"name": "workable",
"display_name": "Workable",
"type": "ats",
"board": "quickhirestaffing",
"job_id": "6C5E962163"
},
"attribution": null,
"license": null,
"posted_at": "2026-10-30T00:00:00Z",
"first_seen_at": "2026-09-28T10:09:49Z",
"last_seen_at": "2026-11-01T05:15:37Z",
"indexed_at": "2026-10-13T08:06:36Z",
"updated_at": null,
"closed_at": null,
"completeness": 0.8,
"score": null
}
],
"meta": {
"request_id": "req_9f41c8e2a7b04d12",
"count": 1,
"total": 14820,
"total_relation": "gte",
"has_more": true,
"next_cursor": "eyJwb3N0ZWRfYXQiOiIyMDI2LTEwLTMwVDAwOjAwOjAwWiIsImlkIjoial9pd25vbzViZGp2YWYyaXZ5In0",
"took_ms": 42,
"redistribution_filter": "redistributable_only"
}
}Using Claude, Cursor, or AI Agents? Connect Remote MCP in 1 Click
Skip Actor MCP container wrappers that time out waiting for browser runs. Connect directly to our hosted OAuth 2.1 MCP server or run via npx:
https://mcp.jobpostingsapi.com/v1/mcpAlso available via streamable HTTP at https://api.jobpostingsapi.com/mcp or /mcp setup guide.
04 / Transparent Per-Record Pricing
Start Free. Scale Without Container Compute Markups.
Frequently Asked Questions — Apify to Direct REST Migration
- Why switch from an Apify Job Scraper Actor to JobPostings API?
- Every Apify Actor run boots an isolated Docker/browser container (5–25 seconds cold start), bills platform Compute Units (CU) plus residential proxy bandwidth even when 0 new jobs are found, and requires asynchronous run-polling loops. JobPostings API serves pre-indexed, deduplicated Greenhouse, Lever, Ashby, Workday, and 430+ ATS sources over synchronous HTTPS GET in <300ms p50 — cutting total job-ingestion spend by 40%–60% with zero container cold-start fees.
- How does credit billing compare to Apify Compute Units and pay-per-result Actors?
- JobPostings API uses deterministic record-level billing: 1 Credit = 1 returned job record ($0.199 to $0.76 per 1,000 jobs across Monthly plans, or non-expiring PAYG packs from $25). Empty searches returning 0 jobs, 4xx/5xx responses, and metadata endpoints (/v1/sources, /v1/tools/ats-detector) cost strictly 0 Credits.
- How do I test the API before migrating production workloads, and what payment methods are supported?
- Every new account receives 1,500 Free Credits ($1.50) instantly on sign-up with no credit card required, plus up to 2,000 Sandbox Streak bonus credits. When ready to scale, upgrade anytime via Stripe (Card, Apple Pay, Google Pay, automatic corporate VAT/Tax PDF invoices) or 0%-fee Crypto (+5% instant bonus credits).
- Can AI agents in Claude, Cursor, Windsurf, or n8n call JobPostings API without Actor webhooks?
- Yes. Connect our remote MCP server directly at https://mcp.jobpostingsapi.com/v1/mcp (OAuth 2.1) or https://api.jobpostingsapi.com/mcp, or call GET https://api.jobpostingsapi.com/v1/jobs/search from any n8n, Make, Clay, or LangChain HTTP node in a single synchronous step.
Test against live Greenhouse, Lever, AshbyHQ & Workday jobs in 30 seconds
Instant 1,500 Free Credits ($1.50) — no credit card required. Scale anytime with Card / Apple Pay / Google Pay or +5% bonus credits via 0%-fee Crypto.