Skip to content
Direct Gateway for Apify DevelopersSave 40%–60% · Zero Container Cold-Start< 300 ms p50 Sync HTTP · 434 ATS Sources

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.

DimensionApify Scraper Actor RunsJobPostings API Direct REST Gateway
Response Latency8 – 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 SearchesStill bills container startup CU & residential proxy traffic$0.00 (Strictly 0 Credits when 0 jobs match)
Concurrency & QueueingAccount RAM cap (8–32 GB) queues burst Actor runs60 RPM Free · 180 RPM Growth · 300 RPM Pro · 600 RPM Scale (stateless HTTP)
Lifecycle & Closed-Job EventsRequires re-scraping every board & diffing snapshots yourselfBuilt-in /v1/feeds/new, /updated & /closed + HMAC Webhooks
AI Agent & MCP ReadinessAsync run timeouts inside Claude / Cursor tool callsNative 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 FieldDirect REST Query ParameterExampleBehavior
"queries" / "searchTerms" / "position"
{"queries": ["AI Engineer"], "position": "Backend"}
q?q=AI+EngineerBoolean & phrase search across job titles, skills, and descriptions
"country" / "countryCode" / "location"
{"country": "US", "location": "New York"}
country & location?country=US&location=New+YorkISO-3166 alpha-2 country code + normalized city/state matching
"remoteOnly" / "workplaceType"
{"remoteOnly": true}
work_arrangement?work_arrangement=remoteSupports remote, hybrid, or onsite filtering
"atsPlatform" / "sources" / "boards"
{"sources": ["greenhouse", "lever", "ashby"]}
source?source=greenhouse,lever,ashby,workdayFilter any combination of 434 ATS & corporate career portals
"companyDomains" / "careerUrls"
{"companyDomains": ["stripe.com"]}
company (or /v1/companies/{slug}/jobs)/v1/companies/stripe/jobs?refresh=trueDirect company lookup + optional real-time ATS ETag refresh
"publishedAfter" / "datePosted"
{"datePosted": "24h"}
posted_since (or /v1/feeds/new)?posted_since=24hAccepts 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/mcp

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

Compare All Monthly & Non-Expiring PAYG Packs →
Free Sandbox
$0
1,500 instant + 2,000 streak credits
60 RPM · No card needed
Starter / PAYG $25
$19/mo
$0.76 / 1K jobs (25,000 credits)
Or $25 never-expiring PAYG (30,000 credits)
Growth (Most Popular)
$49/mo
$0.49 / 1K jobs (100,000 credits)
180 RPM · /v1/feeds/* + ?refresh=true
Pro
$99/mo
$0.33 / 1K jobs (300,000 credits)
300 RPM · 10 HMAC Webhooks
Scale
$199/mo
$0.199 / 1K jobs (1,000,000 credits)
600 RPM · Unlimited Webhooks

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.