American Jobs Scraper — 6 Sources in One
Pricing
from $3.00 / 1,000 job results
American Jobs Scraper — 6 Sources in One
US job sources behind one endpoint: LinkedIn United States, AI Jobs, Built In, RemoteOK/Remotive/WeWorkRemotely/Himalayas, Hacker News Who Is Hiring and Y Combinator Work at a Startup. One merged, deduped dataset.
American Jobs Scraper - 6 Sources in One
One call for US-focused job data. This bundle fans out to 6 existing job-source Actors, merges their results, dedupes by URL, and returns one flat dataset of live American job postings.
Claude / Codex skill to describe and setup this actor: SKILL.md
This is an unofficial scraper bundle. It is not affiliated with LinkedIn, AI Jobs, Built In, RemoteOK, Remotive, WeWorkRemotely, Himalayas, Hacker News, Y Combinator, or any listed employer.
Sources included
| Source key | Coverage |
|---|---|
linkedin | LinkedIn jobs, default location: United States |
ai_jobs_net | AI, ML and data jobs with United States location |
builtin | US tech and startup jobs from Built In |
remote_boards | RemoteOK, Remotive, WeWorkRemotely and Himalayas |
hackernews | Hacker News Who Is Hiring |
ycombinator_was | Y Combinator Work at a Startup |
Company ATS Actors like Greenhouse, Lever, Ashby and Workable are not included because they require buyer-supplied company lists. Wellfound is also excluded because the current source Actor is not public/priced, so external bundle users cannot reliably call it.
How the bundle works
This is a bundle Actor. Every selected source is scraped inside this Actor's own run — no separate child-actor runs, no stacked fees. Each source's records are mapped onto one shared schema, deduped by URL, and pushed as one merged output. Each source fails open independently: if one board errors or times out, the other sources still return.
Use sources to run a cheaper subset, keyword to filter sources that support free-text search, and location to override the default United States text for LinkedIn and AI Jobs.
Input example
{"keyword": "software engineer","location": "United States","maxItemsPerSource": 10,"maxItems": 50}
Output fields
Every row follows nomad-agent-job-row-v1, the one shape shared by all of
this fleet's job Actors. A row carries every field; null means the
source did not publish that fact, and locations: [] means no
usable location was parsed from the posting. Nothing is guessed.
{"schemaVersion": "nomad-agent-job-row-v1","recordType": "posting","source": "linkedin","id": "a1b2c3","url": "https://example.com/linkedin/jobs/a1b2c3","title": "Senior Backend Engineer","company": "Example Company","locations": ["Bilbao","Spain"],"postedAt": "2026-09-02T00:00:00Z","deadline": "2026-10-15","description": "The complete posting body as plain text, exactly as the source published it — never truncated.","descriptionHtml": null,"workType": null,"custom": {"schemaId": "nomad-agent-job-custom-american-jobs-bundle-v1","data": {"hiringContactName": "…","hiringContactTitle": "…","hiringContactUrl": "…"}}}
| Field | Meaning |
|---|---|
schemaVersion | Always "nomad-agent-job-row-v1". |
recordType | "posting" for a job, "diagnostic" for a row reporting something about the run itself. |
source | Which job source the posting came from, from the collector registry's vocabulary — not the Actor name. |
id | Stable identifier for the posting within source. |
url | Canonical public URL of the posting on the source site. |
title | Job title exactly as the source publishes it, untruncated. |
company | Employer name as published. |
locations | Places the role is based, most specific first — e.g. ["Bilbao", "Spain"]. |
postedAt | When the source published the posting, ISO-8601 UTC (YYYY-MM-DDTHH:MM:SSZ). |
deadline | Closing date for applications as an ISO-8601 calendar date (YYYY-MM-DD). |
description | The complete posting body as plain text — never truncated, never summarised. |
descriptionHtml | The posting body as the source's own markup, preserving lists, headings and links. |
workType | Working arrangement: "remote", "hybrid" or "onsite". |
custom | Facts only this source publishes, as {"schemaId", "data"}. |
A run also emits diagnostic rows — recordType: "diagnostic" with a
warnings array — when it has something to report, such as a source
returning nothing. They are never billed and are easy to filter out on
recordType.
Python client
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/american-jobs-bundle").call(run_input={"keyword": "engineer","maxItems": 50,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(len(items), items[:1])
cURL
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~american-jobs-bundle/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"keyword":"engineer","maxItems":50}'
Cost note
You pay only this bundle's pay-per-event pricing: one actor-start per run plus one result event per unique job delivered. All 6 sources are scraped in-process — there are no additional child-actor charges. Use sources, maxItemsPerSource and maxItems to control spend, and a "Maximum cost per run" limit is honored (the run stops delivering at the cap).
From the maker of Oink — an open-source, AI-powered job-search bot for Telegram that runs on these Actors. Try the free bot, get a managed instance at oinkjobsearch.com, or browse the full catalog of 50+ Actors.