Wellfound Jobs Scraper
Pricing
from $0.78 / 1,000 job listings
Wellfound Jobs Scraper
Scrape Wellfound (AngelList) startup jobs by role, location or both, remote-only, with optional full detail: description, structured salary, company website. No login, no browser.
Scrape Wellfound (formerly AngelList Talent) startup jobs by role, by location, or both -- with optional full job detail (description, structured salary, company website). Plain HTTP, no login, no browser, no proxy needed for listings.
Why
Wellfound has no public API. This reads its own server-rendered pages, verified live from a home IP and from Apify's direct, datacenter and residential IPs.
- Any role or location works, not just the ~12 roles / ~10 cities
Wellfound links in its navigation.
backend-engineer,kubernetes,berlin,toronto,singaporewere all verified. Type a name; it is lowercased and hyphenated for you. - Role x location is a real combined filter (Wellfound's own
/role/l/<role>/<location>listing), not two searches intersected after the fact. Give both lists and every pair is scraped. - Remote-only is honest about what exists. Wellfound has a remote listing
per role, and a global remote feed -- but none per location. So
remoteOnlyworks with roles alone, or with nothing else set (global feed), and is rejected withlocationSlugsinstead of silently ignored. - Detail is parsed from structured data: every job page embeds a
schema.org
JobPostingblock, so salary comes back as real numbers (currency / min / max / unit), not scraped text. - Duplicates are dropped across sources, and
maxJobscounts unique jobs.
Input
| Field | Type | Default | Description |
|---|---|---|---|
roleSlugs | string[] | -- | Roles, e.g. software-engineer, Product Manager. |
locationSlugs | string[] | -- | Locations, e.g. san-francisco, berlin. Alone: all roles there. With roleSlugs: each pair. |
remoteOnly | boolean | false | Remote jobs only. Roles alone, or no lists (global remote feed). Not allowed with locationSlugs. |
maxPagesPerSource | integer | 5 | Listing pages per role/location (~30-50 jobs each; popular roles run 40-90+ pages). |
maxJobs | integer | 100 | Stop after this many unique jobs in total. |
scrapeJobDetail | boolean | false | Also open each job for description, structured salary, date posted, industry, company website/logo. |
At least one of roleSlugs, locationSlugs or remoteOnly is required.
Output
One dataset row per job.
Always: id, slug, url, title, companyName, companySlug,
employmentType, salaryText, equityText, locationText, postedText,
source (which role/location it came from), sourcePage.
salaryText, equityText and locationText are the strings Wellfound shows
("$100k – $180k", "0.05% – 0.25%", "Remote only • Canada + 3") and are
null when a job doesn't show that item. Enable scrapeJobDetail for
structured numbers.
With scrapeJobDetail: description (simple HTML), datePosted (ISO),
industry, companyWebsite, companyLogo, locations, salaryCurrency,
salaryMin, salaryMax, salaryUnit, and detailError (set, with the detail
fields null, if that job's page could not be read).
Pricing
Pay-Per-Event, standard tiered ladder (FREE/BRONZE/SILVER/GOLD/PLATINUM/DIAMOND = 100/92/85/78/72/68%):
| Event | FREE tier |
|---|---|
job-listing-scraped (per job row) | $0.001 |
job-detail-scraped (per job whose detail was read) | $0.002 |
A job with full detail costs $0.003 at the FREE tier. A failed detail fetch is not charged.
Known limitations
- No company profile data (size, funding, about page): Wellfound returns
403 for
/company/...on every IP tier tested, including residential. - No salary / equity / experience / job-type filters: they exist only in Wellfound's interactive search, which sits behind a Cloudflare challenge. Filter the output instead.
- Detail pages are sometimes refused (403) through Apify's datacenter proxy
tier while working on direct and residential; the actor retries, and reports
detailErrorif it still fails. - Listing counts move as Wellfound updates;
postedTextis relative ("1 week ago") -- usescrapeJobDetailfor an exactdatePosted.