Careers Page Scraper — Open Roles from Any Company's Site
Pricing
from $0.60 / 1,000 job postings
Careers Page Scraper — Open Roles from Any Company's Site
Give company domains, get their open roles. Finds each careers site, recognises the platform — 14 hosted ATSs, Eightfold, Phenom, Jibe, iCIMS, Google and Amazon — and falls back to the structured data on the company's own pages. One normalized row per job. No browser, no key.
Pricing
from $0.60 / 1,000 job postings
Rating
0.0
(0)
Developer
Insight Solutions
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Company domain in, open roles out. Give this Actor a list of company domains — netflix.com, cvshealth.com, costco.com — and it finds each company's careers site, recognises the platform it runs on, and returns every open role as one normalized row: title, department, location, country, remote flag, employment type, seniority, salary when published, posted date, job and apply URLs, a teaser, and the full description when you ask for it.
It reads the platforms the big employers actually use — Eightfold, Phenom, Jibe and iCIMS career sites, Google Careers, Amazon Jobs — and the 14 hosted applicant tracking systems of our ATS Jobs API (Greenhouse, Lever, Ashby, Workday, SAP SuccessFactors and 9 more). Where no platform is recognised, it reads the structured data on the company's own careers pages: schema.org JobPosting (JSON-LD or microdata), __NEXT_DATA__, job links, job feeds and the sitemap. HTTP only — no browser, no login, no API key — and it never reads LinkedIn, Indeed or Glassdoor.
No recruiter contacts, by design: names, e-mail addresses and phone numbers are removed from every description. $1.00 per 1,000 job postings plus $1.00 per 1,000 careers sites resolved on the FREE tier; a company we cannot resolve is free.
Already have board slugs (greenhouse:stripe)? ATS Jobs API is the direct route. Want one row per company with hiring velocity and a surge flag? That is Hiring Signals API. Have company domains and no idea what they run? This one. Want startup jobs by role and city, with salary, equity and company stage? That is Wellfound Startup Jobs API.
Try it in 30 seconds
This is the Store prefill; paste it and run:
{ "companies": ["netflix.com", "cvshealth.com", "stripe.com", "shopify.com", "ramp.com", "cloudflare.com"], "maxJobsPerCompany": 100 }
Six companies on five routes: Netflix on Eightfold, CVS Health on Phenom, Shopify's own careers pages (microdata JobPosting), Stripe and Cloudflare on Greenhouse, and Ramp on Ashby. In our offline test suite they give 65 jobs and 6 careers sites — the fixtures hold one page of each platform's answer; a live run reads every page up to 100 jobs per company (Netflix lists about 400, CVS Health about 19,000, Stripe about 750).
Only remote engineering roles posted this month, across a target list:
{ "companies": ["netflix.com", "pepsico.com", "google.com", "spotify.com"], "keywords": "engineer", "remoteOnly": true, "postedWithinDays": 30 }
A careers page or a board you already know works too:
{ "companies": ["https://www.shopify.com/careers", "eightfold:explore.jobs.netflix.net?domain=netflix.com", "greenhouse:stripe"], "includeDescriptions": true }
From code — client.actor("insight.solutions/careers-page-jobs-api").call(run_input={"companies": ["netflix.com"]}) with apify-client, or POST https://api.apify.com/v2/acts/insight.solutions~careers-page-jobs-api/run-sync-get-dataset-items.
What comes back
A job row (from the captured CVS Health answer; null and empty columns cut, 49 locations shortened to two):
{"rowType": "job","input": "cvshealth.com","company": "CVS Health","companyDomain": "cvshealth.com","platform": "phenom","jobId": "R1065518","title": "Senior Data Engineer","url": "https://jobs.cvshealth.com/us/en/job/R1065518/Senior-Data-Engineer","applyUrl": "https://cvshealth.wd1.myworkdayjobs.com/CVS_Health_Careers/job/IL---Work-from-home/Senior-Data-Engineer_R1065518/apply","department": "Innovation and Technology","team": "Data and Analytics","location": "Work at Home, Illinois, United States (+48 more locations)","locations": [{ "city": null, "region": "Illinois", "country": "United States", "isRemote": true, "note": null },{ "city": null, "region": "Alabama", "country": "United States", "isRemote": true, "note": null }],"country": "US","isRemote": true,"workplaceType": "remote","employmentType": "FullTime","seniority": "senior","postedAt": "2026-10-29T00:00:00.000+0000","descriptionTeaser": "We are looking for a Senior Data Engineer to design and implement data pipelines supporting analytical and data science workloads. …","skills": ["sql", "data modeling", "data pipeline development", "python", "etl", "…"],"scrapedAt": "2026-11-03T12:00:00.000Z"}
A site row, one per company resolved, after its jobs (from the captured Netflix answer):
{"rowType": "site","input": "netflix.com","company": "Netflix","companyDomain": "netflix.com","platform": "eightfold","careersUrl": "https://explore.jobs.netflix.net/careers","resolvedBy": "registry","jobCount": 138,"jobsReturned": 10,"departments": ["Engineering", "Data & Insights"],"countries": ["US", "PL"],"remoteShare": 0.5,"requests": 2}
A company that could not be read comes back as a free diagnostic row naming what was tried and what was found — careers-page-not-found, careers-page-not-supported, no-jobs-parsed (with platformHints[]: what the pages are built on), robots-disallowed, blocked, rate-limited or timeout — and the last row of every run is a free summary.
Use cases
- Account-based sales and recruiting agencies — which target accounts are hiring, for what, where: a domain list in, a table of open roles out, whatever careers platform each company runs.
- Hiring-watch boards — schedule it weekly over a watchlist of large employers and chart roles per department, per country, remote share.
- Market and competitive research — where a company is building teams (
departments[],countries[]on the site row), and which skills it asks for (skills[]on Phenom sites). - Job aggregators and niche boards — first-party postings straight from the employer's own site, with the employer's own job and apply URLs, no reposted copies.
- Data enrichment — add "careers platform" and "open roles" to a company list: the site row alone says which platform a company uses and how many roles it lists.
How it compares
- Company domain in, every platform we recognise, structured data for the rest, no browser. You do not need to know whether a company runs Eightfold, Phenom, Workday or its own site; the Actor works it out, cheapest way first, and says how (
resolvedBy). - The platforms' own data, not guesses at the HTML. Eightfold, Phenom, Jibe and Amazon are read from the JSON their own careers sites load; Google Careers from the data embedded in its results pages; the 14 ATSs from their public job feeds; a company's own pages from the schema.org
JobPostingmarkup it publishes for search engines. - One row shape across 20 platforms and four kinds of structured data, the same row shape as ATS Jobs API, so the two can be loaded into one table.
- Honest about what it cannot read. A JavaScript-only careers site, an API that answers only its own site's session, a bot wall: each is a free diagnostic row that says which, never a charge and never a workaround.
- No recruiters. Contact names, e-mail addresses and phone numbers are removed from descriptions, and the visitor blocks some platforms echo are never read.
Which careers platforms are recognised
Platform (platform) | How it is recognised | How it is read | Fields beyond the common set |
|---|---|---|---|
eightfold — Eightfold | *.eightfold.ai, or a careers page carrying Eightfold's assets and config (Netflix: explore.jobs.netflix.net) | GET /api/apply/v2/jobs?domain=…&start=…&num=10&query=…, 10 a page; descriptions from /api/apply/v2/jobs/<id> with includeDescriptions | team = business unit, workplaceType, postedAt/updatedAt |
phenom — Phenom | the page's phApp config (widgetApiEndpoint, refNum) | one POST <host>/widgets with the site's own refineSearch body, 10 a page | skills[] (the platform's own extraction), descriptionTeaser, team = sub-category |
jibe — Jibe (iCIMS career sites) | window._jibe = { "cid": … } on the page, or a *.jibeapply.com host (Costco, PepsiCo) | GET <host>/api/jobs?page=N&keywords=…, 10 a page | full description in the list. Intermittent: in our live tests both Jibe sites answered every request for two runs, then HTTP 403 to Apify datacenter IPs on page 1 — results from Jibe sites may come and go (a free blocked row when they refuse) |
icims — iCIMS classic boards | a <client>.icims.com/jobs host or link | the board's own HTML listing (/jobs/search?ss=1&in_iframe=1), "Page N of M"; posting pages' JSON-LD with includeDescriptions. iCIMS boards' robots.txt disallows automated clients (PepsiCo's, seen live), so an iCIMS company normally comes back as a free robots-disallowed row — a company with a Jibe site over its iCIMS board is read through the Jibe site instead | department = job function, teaser |
google-careers — Google Careers | google.com/about/careers, careers.google.com | the results page's embedded data (AF_initDataCallback, ds:1): the first page only, 20 jobs per run — google.com's robots.txt disallows the results with a page= parameter | full description in the list |
amazon-jobs — Amazon Jobs (experimental) | amazon.jobs | GET /en/search.json?…&result_limit=100, 100 a page | team = business category, teaser |
greenhouse, lever, ashby, workable, recruitee, smartrecruiters, teamtailor, personio, breezy, workday, jazzhr, bamboohr, rippling, successfactors | a board link on the company's careers pages, a board URL or slug, or the bundled registry | exactly as ATS Jobs API reads them — the same adapter code | salary where the ATS publishes it |
structured-data | schema.org JobPosting (JSON-LD or microdata) on the careers page, or on the detail pages its job links lead to (Shopify) | the page, then each posting page — at most maxJobsPerCompany, and none after three detail pages in a row carry no JobPosting | salary* from baseSalary, employmentType, postedAt |
next-data | a __NEXT_DATA__ (or plain-JSON window.__NUXT__) array of job-shaped objects | the page itself, no extra request | whatever the array names |
sitemap | job-posting URLs in the site's sitemap.xml (an index is narrowed to three partitions of at most 5 MB, job-named ones first) | each posting page, as for structured-data | as structured-data |
job-feed | an RSS or Atom feed the careers page links whose title says jobs | the feed's items that link to a posting | postedAt from the item |
Large employers already verified (zero requests to resolve): Netflix (Eightfold), CVS Health (Phenom), Costco and PepsiCo (Jibe), Google and Alphabet (Google Careers), Amazon (Amazon Jobs), The Home Depot (Workday), Shopify and Spotify (their own pages), plus every company in ATS Jobs API's bundled registry (Stripe, Cloudflare and NVIDIA among them).
Looked at, and honestly not readable: Apple (jobs.apple.com builds its results in the browser and its search API answers an empty list without the site's own session), Walmart (its search API answers a "Redirecting…" page instead of data), SpaceX (a script-only application with no job data in the page). These come back as a free careers-page-not-supported row at no request.
How a company is resolved
Cheapest first, one platform per company, and the answer is cached for 30 days in the run's key-value store, so a repeat run skips straight to the jobs.
- The entry is already a board —
greenhouse:stripe,eightfold:explore.jobs.netflix.net?domain=netflix.com,phenom:jobs.cvshealth.com/us/en,jibe:careers.costco.com,icims:uscareers-pepsico.icims.com,google-careers:,amazon-jobs:, or a board URL (boards.greenhouse.io/…,*.myworkdayjobs.com/…,*.eightfold.ai,*.icims.com,*.jibeapply.com).resolvedBy: input-board. - Known sites and the registry — the large employers above and ATS Jobs API's bundled board registry, by domain. No request.
resolvedBy: registry. Then the site cache (cache). - The careers URL you gave, read for a platform or an ATS board link (
careers-url). - The 14 ATSs: ATS Jobs API's own detection reads
/careers,/jobs,/,careers.<domain>/,/company/careersand/about/careersfor a board link (five seconds a page, 30 seconds in all) —ats-detection. A page that is an enterprise careers site wins over an ATS link it carries (a Phenom site links its Workday apply flow). - Enterprise platforms: the same pages (served from the run's cache, no second request) and up to four careers links found on them —
jobs.<domain>,<brand>jobs.com,lifeat<brand>.com— read for Eightfold, Phenom, Jibe, iCIMS, Google Careers and Amazon Jobs (platform-detection). - Structured data on the careers pages read:
JobPostingnodes,__NEXT_DATA__, job links and their detail pages, job feeds, then the sitemap (structured-data). - Nothing: a free
careers-page-not-foundrow (no page answered;candidatesTried[]) orno-jobs-parsed(pages were read and nothing was recognised;platformHints[]says what they are built on —next.js,angular,taleo,workday,client-rendered— so you can pass the right board).
robots.txt is read once per site per run and honoured for every page: a disallowed page is never requested, and a company whose careers pages are all disallowed is a free robots-disallowed row. Requests to any one host go one at a time and at least one second apart — further apart when the host's robots.txt declares a Crawl-delay (honoured up to 10 seconds; pepsicojobs.com and careers.costco.com ask for 5). A platform's JSON API is paced by its host's Crawl-delay too, though robots.txt rules gate pages only.
Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
companies | string[] | prefill: 6 companies | Company domains, careers-page URLs or boards, up to 500 companies. An entry listed twice is read once. |
keywords | string | "" | Sent to the platforms that search (Eightfold, Phenom, Jibe, iCIMS, Google Careers, Amazon Jobs); elsewhere every word must appear in the title. |
locations | string[] | [] | Keep a job when its location text or a parsed city, region or country contains one of these. |
countries | string[] | [] | ISO codes or country names; a US state or Canadian province implies its country. An unknown value is ignored and reported in a free row. |
remoteOnly | boolean | false | Only jobs the platform marks remote (never inferred from the title). |
postedWithinDays | integer | 0 | 0–3,650. Jobs posted within this many days; a job with no posting date is kept. |
includeDescriptions | boolean | false | The full description as plain text (at most 20,000 characters). One detail request per job where the list carries none (Eightfold, Phenom, iCIMS). |
maxJobsPerCompany | integer | 500 (prefill 100) | 1–5,000 postings read per company. |
maxPages | integer | 20 | 1–100 result or listing pages per company. |
maxConcurrency | integer | 6 | 1–10 companies at once; requests to one host are always sent one at a time. |
maxRunSecs | integer | 240 | 30–3,600. Rows already returned are kept — and billed — when it runs out; each company never reached gets a free timeout row. |
proxyConfiguration | object | { "useApifyProxy": true } | Careers pages and platform APIs go through it; Apify datacenter by default. The 14 ATSs' public job feeds are read direct, as ATS Jobs API reads them. |
A run with nothing usable — no company, more than 500, or no entry that is a domain, a careers URL or a board — finishes FAILED before a single request, with a free invalid-input row saying why. Anything else finishes SUCCEEDED: a run whose companies all came back as diagnostics says "N companies, no careers site resolved" and bills nothing.
Output reference
Every row has the same columns, null where a column does not apply, so the dataset exports as one table. rowType is job, site, diagnostic or summary.
On every row: ok, rowType, input (your entry, as typed), company, companyDomain, platform, scrapedAt.
Job rows (paid, the primary event) — the ATS Jobs API row under these names: jobId, title, url, applyUrl, department, team, location (as published), locations[] (city, region, country, isRemote, note), city, country (ISO code when recognised), isRemote, workplaceType (remote · hybrid · onsite), employmentType (FullTime · PartTime · Contract · Temporary · Internship · Volunteer · Other), seniority (from the title), salaryMin, salaryMax, salaryCurrency, salaryPeriod (only when the platform publishes structured pay), postedAt, updatedAt, description (with includeDescriptions: plain text, at most 20,000 characters, contacts removed), descriptionTeaser (at most 300 characters), skills[] (Phenom).
Site rows (paid, one per company resolved, after its jobs): careersUrl, resolvedBy, jobCount (the platform's own total when it gives one, else jobs read), jobsReturned, departments[], countries[], remoteShare, requests (what the company cost; pages served from the run's cache are not counted), note (why fewer were read than listed: a cap, the deadline, the maximum charge).
Diagnostic rows (free): errorType, error, careersUrl, candidatesTried[], platformHints[], requests.
Summary row (free, last): note (the status message), jobsReturned, requests, stats (companies, sites resolved, jobs read, returned, filtered and de-duplicated, platforms, diagnostics by type, what was charged).
errorType | Meaning |
|---|---|
careers-page-not-found | No careers page of the company answered, or the platform's board is gone; candidatesTried[] lists what was tried. |
careers-page-not-supported | A careers site this Actor cannot read without a browser or the site's own session (Apple, Walmart, SpaceX, an API that answers a web page instead of data, a cut-off answer). |
no-jobs-parsed | Careers pages were read and carry nothing this Actor recognises; platformHints[] says what they are built on. |
robots-disallowed | robots.txt disallows this Actor on the company's careers pages; they were not read. |
blocked | A bot wall (HTTP 403 on first contact, a challenge page). One request was made; walls are never worked around. |
rate-limited | The site refused the run with HTTP 429, or with a plain 403 after it had already served this run (a results page or two). One request was made, nothing was retried; try again later — the jobs read before it are kept, and the site row's note says where it stopped. |
timeout | maxRunSecs ran out before the company was reached or resolved. |
invalid-input | An entry or a value that cannot be used. When nothing usable is left, the run is FAILED. |
Pricing
| Event | What it is | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|---|
actor-start | Once per run, only after the run has returned a paid row | $0.001 | $0.001 | $0.001 | $0.001 |
job | One open role returned | $0.001 | $0.001 | $0.0008 | $0.0006 |
site | One company whose careers site was resolved, after its jobs | $0.001 | $0.001 | $0.001 | $0.001 |
$1.00 per 1,000 job postings plus $1.00 per 1,000 careers sites resolved; a company we can't resolve is free.
| Run | Cost |
|---|---|
| The prefill as the offline test suite runs it — 65 jobs, 6 sites | $0.072 |
| The prefill live at 100 jobs per company (≈ 430 jobs, 6 sites) | ≈ $0.44 |
| 25 large employers at 200 jobs each (the example task) | ≈ $5.03 |
| The same at GOLD | ≈ $3.03 |
| 100 company domains, 60 resolved, 80 jobs each | ≈ $4.86 |
| 50 domains, none resolvable | $0.00, SUCCEEDED |
Charging is charge-after-push: rows are in your dataset before the event is recorded. A company's jobs are checked against ACTOR_MAX_TOTAL_CHARGE_USD together with its site row before anything is pushed; when the budget cannot cover them all, the jobs it can cover are returned, the site row says so, and the run stops cleanly — never a row past the ceiling. Never charged: diagnostics, the summary, filtered-out postings, duplicates, a company we could not resolve, and a run that returns nothing (start fee included). A company that resolved but has no role matching your filters is one site event: that is the answer ("Netflix lists nothing matching").
Limits
- JavaScript-only careers sites without structured data are not readable. A site that draws its job list in the browser from an API this Actor does not know, and publishes no
JobPostingmarkup, job links, feed or sitemap entries, comes back asno-jobs-parsedwithplatformHints[]. SpaceX is the captured example. - Some enterprise APIs answer only their own site's session: Apple's search API returns an empty list, Walmart's a redirect page. They are named in
careers-page-not-supportedrows, not worked around. - iCIMS boards disallow automated clients in robots.txt, so a company that hires only through an iCIMS board is a free
robots-disallowedrow; the iCIMS reader is kept for boards that allow it. - Google Careers: 20 jobs per run — the first results page (newest matching your
keywords); robots.txt disallows the later pages, so they are never requested. Narrow withkeywordsto reach the roles you want. - Paced, so not instant: one request at a time and at least one second apart per host, or the host's robots.txt
Crawl-delay(up to 10 s). A company read through 10 result pages takes at least 9 s — at a 5-secondCrawl-delay, 45 s; a structured-data company with 25 detail pages at least 25 s. Companies run in parallel (maxConcurrency). - Amazon Jobs is experimental. Its search answer was cut short in our captures; when the full answer does not arrive, the run says so in a free row rather than returning half a page.
- Bot walls end the company. One request, a free
blockedrow; no proxy rotation, no browser, no retry. - Jibe sites (iCIMS career sites) are intermittent. In our live tests careers.costco.com and www.pepsicojobs.com served full runs, then answered HTTP 403 to Apify datacenter IPs on the first request after a few runs in an hour. Expect some runs to return a free
blockedrow for them; space runs hours apart. - Repeated runs can be rate-limited. A careers site that served the first runs of the hour may refuse the next (
rate-limited, free). Schedule watchlists hours apart, not minutes. - The 14 ATS feeds are read direct with a 60-second request timeout (a board with full descriptions — Stripe's on Greenhouse — is several megabytes); a board slower than that is a free
careers-page-not-foundrow naming the timeout. - Pages, not the whole site.
maxPageslisting or result pages andmaxJobsPerCompanypostings per company. A platform's own total is injobCounteven when fewer were read. - Structured data is as good as the site publishes it. A posting page without
JobPostingmarkup gives a row with the title and location its listing link shows, and the rung stops opening detail pages after three in a row carry none. - Keywords: the platforms that search match them their own way (often descriptions too); elsewhere every word must appear in the title.
- One platform per company. A company that runs two careers sites (one per region) is read through the first found; pass the second as its own entry.
- Salaries only where the platform publishes structured pay (Greenhouse, several ATSs,
JobPosting.baseSalary); never parsed out of prose. - Not affiliated with Eightfold, Phenom, iCIMS, Google, Amazon, any ATS vendor, or any employer whose postings you retrieve. Names are used descriptively, to say which public pages are read.
Use it from an AI agent, or from code
One JSON object in, one flat array out — the shape agent runtimes want. The Actor runs with limited permissions and pay-per-event pricing, so it works over the Apify MCP server (mcp.apify.com) and with agentic (x402) payments. The Integrations tab pushes results to Slack, a webhook, Zapier, Make, Google Sheets, Snowflake or BigQuery, and Apify Schedules run it unattended — weekly with postedWithinDays: 7 is a "new roles at my accounts" feed.
curl -X POST "https://api.apify.com/v2/acts/insight.solutions~careers-page-jobs-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"companies":["netflix.com","costco.com"],"keywords":"engineer","maxJobsPerCompany":50}'
# pip install apify-clientfrom apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("insight.solutions/careers-page-jobs-api").call(run_input={"companies": ["netflix.com", "cvshealth.com", "pepsico.com"],"countries": ["US"],"maxJobsPerCompany": 200,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row["rowType"] == "job":print(row["company"], row["title"], row["location"], row["postedAt"], row["url"], sep=" | ")elif row["rowType"] == "site":print(f'{row["company"]}: {row["jobCount"]} roles on {row["platform"]} ({row["careersUrl"]})')
Building an app with Lovable? Apify's Lovable connector runs any Actor from inside a Lovable project with your Apify token. Connect Apify in Lovable once, then ask it: "Use Apify to run insight.solutions/careers-page-jobs-api on my target accounts and build a hiring-watch board around the results." A run of a handful of companies finishes well inside Lovable's 300-second synchronous limit at the default settings, and every result is one JSON object per row, so the generated app needs no extra parsing. Usage bills to the Apify account whose token is connected.
FAQ
How is this different from ATS Jobs API and Hiring Signals API? ATS Jobs API reads 14 hosted ATS boards; give it board slugs and it is the most direct route. Hiring Signals API turns those boards into one row per company per run, with what changed and a surge flag. This Actor starts from a company domain whose platform you do not know, reads the enterprise careers platforms and companies' own sites those two do not cover, and uses ATS Jobs API's own adapter code for the 14 ATSs, so the rows line up.
Why did a company I know is hiring come back no-jobs-parsed?
Its careers site draws its jobs in the browser from an API we do not recognise and publishes no structured data. platformHints[] says what the pages are built on; if it names an ATS (workday, taleo, successfactors) or you can see the board URL in an apply link, pass that board or URL directly.
Why does the site row say 138 when 10 jobs came back?
jobCount is the platform's own total; jobsReturned is what this run returned after maxJobsPerCompany, maxPages and your filters. The note says when a cap or the deadline cut it short.
Does it read job descriptions?
A short teaser always (at no extra request), the full text with includeDescriptions. On Eightfold, Phenom and iCIMS that is one extra request per job, so leave it off for counts and titles.
Is a cached resolution ever wrong? A company that moves platforms is re-resolved when its cached board stops answering. The cache records only which careers site a company uses, never postings, and expires after 30 days.
Can I get only what is new?
Schedule it with postedWithinDays: 7. For a true diff against the last run (opened, closed, changed), use Hiring Signals API on the boards this Actor finds.
Why is my keyword search returning roles without the word in the title? On platforms that search (Eightfold, Phenom, Jibe, iCIMS, Google Careers, Amazon Jobs) the keyword goes to their own search, which also matches descriptions. Everywhere else it is matched against titles.
Legal and data-protection notes
- Public pages only. Every source is a careers page, careers API or job feed any anonymous visitor's browser loads. The Actor never logs in, never sends cookies or session tokens, never accepts credentials and needs no API key.
- No recruiter contacts by design. Recruiter, hiring-manager and employee names, e-mail addresses (
mailto:links, plain and obfuscated), phone numbers and personal profile links are removed from every description and teaser before a row is written; a sentence that points the reader at a named person ("contact …", "reach out to …", "Recruiter: …") is cut whole. The visitor and candidate blocks some platform APIs echo are never read. Salary ranges are kept: they are attributes of the job. - robots.txt is respected on every page we fetch — careers pages, listing pages, posting pages, sitemaps and feeds — read once per site per run and evaluated per RFC 9309 against our user-agent token (
apifycareerspagejobsapi) and*.Crawl-delayis honoured for every host but the ATS feeds, up to 10 seconds. The platforms' JSON job APIs (Eightfold, Phenom, Jibe, Amazon) and the ATS job feeds are public feeds rather than pages and are treated the way ATS Jobs API treats them.Crawl-delayis honoured for every host but the ATS feeds (up to 10 seconds; at least one second between any two requests to a host); the ATS feeds are read direct, without the proxy, as ATS Jobs API reads them. - No bot walls are bypassed. A wall is one request and a free
blockedrow; a site that starts refusing mid-run is a freerate-limitedrow (the jobs already read are kept). Requests to a host honour its robots.txtCrawl-delay, up to 10 seconds, and are never less than a second apart. - Never LinkedIn, Indeed or Glassdoor, and no other job aggregator: only the employer's own careers site and the platform it runs on.
- You are the controller of what you do next. If you combine this data with personal data or contact people based on it, GDPR, CCPA and similar obligations are yours.
- Not affiliated with, endorsed by or sponsored by Eightfold, Phenom, iCIMS, Google, Amazon, any ATS vendor, or any employer named. Names and trademarks are used descriptively.
Our other Actors
Every Insight Solutions Actor is pay-per-result with no browser, no login and no API key, and every one of them returns free diagnostic rows instead of billing for failures. Prices are per 1,000 results.
Video, audio & social
- YouTube Transcript Scraper & API — Captions to Text, SRT & VTT — captions as timed segments, text, SRT or VTT, with language fallback and translation.
- YouTube Comments Scraper — Comments & Replies with Likes — comments and replies with likes, pinned and hearted flags, newest or top sort.
- YouTube Channel Scraper — Videos, Shorts & Search — a channel's videos, Shorts and live streams, plus YouTube search.
- Podcast Search, Episodes & Charts API — Apple Podcasts search, charts and full episode feeds.
- Bluesky Scraper — profiles, posts, followers and follows from the public AT Protocol API.
- Telegram Channel Scraper — Posts, Views & Stats — posts, views and channel stats from public Telegram channels.
- Substack Scraper — posts with full free text, comments and publication profiles.
- Sponsor & Advertiser Finder — YouTube, Podcasts & Newsletters — which brands sponsor which YouTube channels, podcasts and Substack newsletters, with promo codes, offers and sponsor links, company-level only.
- Google Ads Transparency Center API — Advertisers & Ads — every ad a verified advertiser runs on Google, from the Ads Transparency Center, by brand name, AR id or domain: format, first and last shown, days shown and preview links, individuals excluded.
- Hacker News API — stories, comments, users, front page and a structured "Who is hiring?" parser from the official HN APIs.
- GitHub Trending & Repo Scraper — Stars, Releases & Search — repository facts, trending lists, releases and search, no token needed for small runs.
- Discourse Forum Scraper — Topics, Posts & Categories — topics, posts and categories from any Discourse community via its own JSON endpoints, usernames only.
News, documents & the web
- Google News Scraper — Search, Topics & Real Article URLs — news search and topic feeds with the publisher's real URL decoded.
- Website to Markdown Converter & API — for LLMs & RAG — any site as clean Markdown, text and heading-aware chunks.
- WordPress Scraper — Posts & Pages from Any WP Site, No Login — posts and pages from any WordPress site as clean text or Markdown, with categories, tags and images.
- Website Metadata Extractor — Schema.org, Open Graph & JSON-LD — any URL's meta tags, Open Graph, Twitter cards, hreflang, feeds, JSON-LD and microdata, with normalised Product, Article, Event and FAQ entities.
- Subdomain Finder — Certificate Logs & DNS, No API Key — every subdomain of a domain from certificate-transparency logs, resolved over DNS, with an optional live HTTP check.
- Internet Archive Scraper & API — Search, Metadata & Files — archive.org search, item metadata, files and reviews.
- Wayback Machine Scraper — Archived URLs, Snapshots & Diffs — archived URL inventories, snapshots and text diffs between dates.
- Website Technology Detector — Tech Stack Checker & Lookup — the tech stack behind any site, with the evidence for each detection.
- Domain Lookup API — DNS, WHOIS/RDAP, SSL & Providers — DNS, RDAP registration, TLS certificate and HTTP facts in one row per domain.
- SEO Audit Tool — Sitemap Crawl & On-Page Checker — sitemap crawl with on-page checks, structured data and broken-link reports.
- Keyword Suggestions Tool & API — Google, Bing & Amazon — Google, YouTube, Bing, Amazon and eBay autocomplete with alphabet and question expansions.
- Website Contact Scraper — Email, Phone & Socials Extractor — emails, phone numbers and social profiles from any list of websites.
- Company Email Finder — Published Emails & Phones by Name — company names in, each one's verified website with its business emails, phone numbers and social profiles out.
- Web Search Results API — Bing and DuckDuckGo organic results with snippets, no key, no browser.
- Company Enrichment API — a domain in, a company profile out: firmographics, contacts, tech stack, DNS and hiring signal.
- Company Dossier API — one company in, twelve sections out: profile, tech, contacts, DNS, open roles, news, SEC filings, federal awards, recalls, YC batch and apps.
- Press Release Scraper — GlobeNewswire, PR Newswire & More — GlobeNewswire and PR Newswire releases plus any newsroom feed, by keyword, company, ticker or subject.
- Federal Register API — rules, proposed rules, notices and the Public Inspection desk with dockets, comment deadlines and CFR references.
- Academic Papers Search API — OpenAlex, Crossref, arXiv and PubMed in one row per paper: abstract, citations, open-access PDF, authors and venue.
- RSS & Atom Feed Monitor — any RSS, Atom or JSON feed (or an OPML file) in, only the new items out, with keyword filters and a webhook.
- Website Change Monitor — watch any pages, diff the text between runs, get change rows with added/removed lines, keyword alerts and a webhook.
- Wikipedia & Wikidata API — article text, search, daily pageviews and Wikidata entity facts, any language edition.
Business, finance & jobs
- Congress Trades Tracker API — STOCK Act PTRs + SEC Form 4 — STOCK Act periodic transaction reports and SEC Form 4 insider trades in one schema.
- Federal Contracts, Grants & Lobbying API — SAM.gov opportunities, USAspending awards, Grants.gov notices and Senate lobbying filings in one schema.
- SEC EDGAR API — filings, XBRL financials and full-text search by ticker or CIK.
- Litigation Signals API — Lawsuits, Settlements & Investigations — lawsuits, settlements and investigations per public company from SEC 10-K, 10-Q and 8-K disclosures, press wires and SEC, FTC and DOJ notices, company-level only.
- Startup Funding Rounds API — SEC Form D, Wires & News — who just raised money: one row per funding round from SEC Form D filings, press wires and Google News, with amount, round, investors, industry and state, company-level only.
- Clinical Trials & FDA API — ClinicalTrials.gov studies plus openFDA recalls, labels, approvals, 510(k)s and adverse-event reports.
- Product & Vehicle Recalls API — CPSC, NHTSA, FDA and USDA recalls, vehicle complaints and ratings, plus a VIN decoder.
- YC Companies List & Directory Scraper — Batches & Founders — the YC directory with founders and social links, filterable by batch, industry and hiring status.
- Job Scraper for Greenhouse, Lever, Ashby & 10+ ATS Career Sites — jobs straight from Greenhouse, Lever, Ashby, Workable and 10+ other ATS career sites.
- Workday Jobs Scraper — All Postings from Any Workday Site — every posting on any Workday career site, with facets, search, posted dates and full descriptions.
- Job Postings Monitor — New & Closed Roles, Hiring Alerts — new, closed and changed postings on the career sites you watch.
- Hiring Signals API — Open Roles & Hiring Surge by Company — one row per company per run: open roles, what opened and closed, department and seniority breakdowns, and a hiring-surge flag.
- Wellfound Jobs Scraper — Startup Roles, Salary & Equity — startup jobs from Wellfound's role listings, by role and city or remote: salary and equity as shown, remote policy, experience, and each startup's size, stage and badges, no recruiter contacts.
- Remote Jobs API — RemoteOK, Remotive, We Work Remotely, Himalayas, Jobicy and more in one schema, deduplicated.
- Shopify Products Scraper — Catalogue, Prices & Stock — any Shopify store's catalogue, variants, prices and stock signals.
- WooCommerce Products Scraper — Prices, Variants & Stock — any WooCommerce store's catalogue, prices, variants and stock through its public Store API.
- Price Tracker & Monitor — Any Retailer's Prices & Stock — price, stock, list price and discount from any product URL, read from the page's structured data, with price-drop and restock rows between runs.
- Rightmove Scraper — UK Listings for Sale & Rent by Area — UK property for sale and to rent by area from Rightmove's own search API: price, bedrooms, type, tenure, size, coordinates, photos, status and the agent branch, one row per listing.
- Shopify App Store Scraper — Apps, Pricing, Ratings & Reviews — Shopify App Store listings by category, collection or developer: pricing plans, ratings and merchant reviews.
- Luma Events Scraper — Events by City, Category & Calendar — upcoming Luma events by city, category or calendar: dates, venue, price, capacity and organiser calendar, no host names.
- Eventbrite Scraper — Events by City, Category & Organizers — upcoming Eventbrite events by city, category, online or organiser, with the organising companies behind them: dates, venue, price, ticket status, followers and website, no browser, individuals never named.
- Meetup Scraper — Upcoming Events & Group Stats — upcoming events of the Meetup groups you name, and the groups themselves: dates, venue, RSVPs, fee, member count, topics and ratings, no member data.
- Shopify Store Monitor — price drops, sales, restocks, sell-outs and new products on any Shopify store, one row per change.
- Shopify Store Finder — Discover & Verify Stores by Niche — Shopify stores by niche and country, each verified on its own storefront, with product count, currency, country, price range and sample products.
- Public Tenders API — EU TED, UK Find a Tender and Contracts Finder notices by keyword, CPV code, country, stage and deadline.
- Nonprofit Lookup & IRS 990 API — EIN, Financials, NTEE — search US nonprofits and get EIN, NTEE code and multi-year Form 990 financials.
- OpenStreetMap Places API — businesses and points of interest by category and area from OpenStreetMap: name, address, coordinates, website, phone, opening hours.
Apps & games
- App Store & Google Play Reviews Scraper — Ratings & Replies — reviews from both stores with ratings, versions and developer replies.
- App Store Top Charts & App Search API — Apple top charts by country and genre, plus app search and details.
- App Store Keyword Rank Tracker — where any app ranks for any keyword on the App Store and Google Play, with rank changes and ASO suggestions.
- Steam Reviews Scraper — Reviews & Game Details — Steam reviews with playtime, helpfulness and game details.
- Steam Game Data API — prices, tags, review scores, live player counts and top charts.
- Sports Scores & Schedules API — scores, schedules, standings, teams and headlines for the NFL, NBA, MLB, NHL, soccer and more, no key.
- App Store Monitor — App Store and Google Play listings watched between runs: new versions with release notes, price, rating and listing changes, one row per change.