Wellfound Jobs Scraper — Salary, Stage, Investors & Ratings avatar

Wellfound Jobs Scraper — Salary, Stage, Investors & Ratings

Pricing

from $1.50 / 1,000 per job returneds

Go to Apify Store
Wellfound Jobs Scraper — Salary, Stage, Investors & Ratings

Wellfound Jobs Scraper — Salary, Stage, Investors & Ratings

Scrape Wellfound (AngelList) startup jobs by role, location or URL. Each row carries salary min/max, equity, remote policy, ATS source and the full description, plus the startup's size, stage, YC / top-investor / recently-funded flags and Glassdoor rating. Detail mode adds funding raised and geo.

Pricing

from $1.50 / 1,000 per job returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Wellfound (AngelList) Jobs Scraper

Startup jobs from Wellfound — formerly AngelList Talent — as one row per job with the hiring startup already joined onto it: salary and equity ranges as numbers, the company's size and stage, its YC / top-investor / recently-funded badges, its Glassdoor rating, and optionally the funding it has raised and the startup's own website domain.

The incumbent Wellfound actors ship about seven fields (job id, title, compensation string, remote flag, location, company name, company logo). This one ships 69 fields with no extra requests, and 107 with detail enrichment on.


What you get

One record per job posting. Every number below is measured from real runs on the Apify platform on 2026-09-03, not estimated — the run ids are in the fill tables.

{
"jobId": "4579450",
"title": "Software Engineer",
"jobUrl": "https://wellfound.com/jobs/4579450-software-engineer",
"jobType": "full-time",
"compensation": "$110k – $200k",
"salaryMin": 110000,
"salaryMax": 200000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salarySource": "detail-jsonld",
"equityText": "0.1% – 0.5%",
"equityMin": 0.1,
"equityMax": 0.5,
"locationNames": ["Santa Clara"],
"remote": true,
"acceptedRemoteLocationNames": ["United States"],
"postedAt": "2026-08-12T16:29:14.000Z",
"postedDaysAgo": 21,
"atsSource": "AtsIntegration::Greenhouse::Listing",
"atsVendor": "Greenhouse",
"yearsExperienceMin": 5,
"description": "Join us in pioneering the next generation of nuclear reactors! …",
"companyName": "Oklo",
"companySlug": "oklo",
"companySize": "201-500",
"companyHighConcept": "Making reactors people want",
"companyStage": "growth_stage",
"companyStageLabel": "Growth Stage",
"businessModel": "B2B",
"isYcFunded": true,
"hasTopInvestors": true,
"isRecentlyFunded": false,
"isGrowingFast": true,
"isActivelyHiring": true,
"glassdoorRating": 4.2,
"companyWebsiteUrl": "https://www.oklo.com",
"companyTotalRaisedText": "$333.2M",
"companyTotalRaisedUsd": 333200000,
"companyFundingRoundsCount": 5,
"companyLatestRoundName": "Series G",
"companyLatestRoundDate": "May 2019",
"companyLatestRoundAmountUsd": 123000000,
"visaSponsorship": "Not Available",
"relocation": "Not Allowed",
"jobLat": 37.3541,
"jobLon": -121.955,
"searchTotalJobCount": 4964,
"searchPageCount": 90,
"sourceUrl": "https://wellfound.com/role/software-engineer",
"page": 1
}

The four fields worth the price on their own

  1. salaryMin / salaryMax as integers. Wellfound prints "$170k – $200k • 0.2% – 0.4%". That string is parsed into salary numbers and an equity range — including , (lakh/crore) and Up to $170k forms — so you can sort and filter without writing a parser.
  2. companyWebsiteUrl — the startup's own domain (https://www.oklo.com), not a wellfound.com URL. That is the join key to your CRM, an enrichment API, or a domain-based email-pattern finder. 100% filled on the 60-row detail run.
  3. companyTotalRaisedUsd + companyLatestRoundName + companyLatestRoundDate. Real funding numbers, from the job page itself.
  4. glassdoorRating, leadershipRating, workLifeBalanceRating — cross-site employer quality, already on the row.

Input

FieldWhat it does
rolesWellfound role slugs, e.g. software-engineer, product-manager, data-scientist
locationsLocation slugs, e.g. san-francisco, new-york, austin. Crossed with roles
remoteOnlyUse the remote-only landing page (/role/r/<slug>) for role-only searches
startUrlsPaste Wellfound landing-page URLs directly. ?page= is stripped; pagination is handled
maxItemsStop after this many unique jobs. Default 200
maxPagesPerSeedDepth cap per seed. 20 jobs/page. 0 = crawl to the seed's own last page
fetchJobDetailsAdds one request per job for funding, geo, benefits, visa, structured salary
detailConcurrencyParallel detail requests (default 5)
includeDescriptionThe full markdown job description ships by default at no extra request
postedWithinDays · minSalary · onlyWithSalaryFreshness and pay filters
remoteFilter · companyStage · onlyRecentlyFunded · onlyYcFundedRow filters on the company signals
proxyConfigurationRESIDENTIAL + US by default. See "Proxies" below — this one matters

Role slug sizes measured live on 2026-09-02: software-engineer 4,964 jobs · product-manager 4,434 · sales-manager 2,849 · operations-manager 2,527 · account-manager 1,830 · data-analyst 1,022 · product-designer 754 · hr-manager 455 · growth-marketer 301 · financial-analyst 299 · ui-ux-designer 290 · graphic-designer 189. Location slugs work the same way (san-francisco alone: 2,955 jobs). Every row also carries searchTotalJobCount and searchPageCount, so the first run tells you exactly how big the next one can be.


Measured output — the default path (no detail requests)

Run Zweeuazw4l6X0nHMa, 2026-09-03: product-manager × san-francisco, 150 rows across 4 pages in 9 seconds, 5 requests, 0 blocks, 11 cross-page duplicates removed before billing. 69 fields per row, 41 of them 100% filled.

FieldFill
jobId title jobSlug jobUrl primaryRoleTitle jobType employmentType100%
remote liveStartAt postedAt postedDaysAgo autoPosted description descriptionLength100%
locationNames locationsText100%
companyId companyName companySlug companyUrl companySize companySizeRaw companyLogoUrl100%
isActivelyHiring isGrowingFast isRecentlyFunded hasTopInvestors isYcFunded isTopResponder100% (booleans, always decided)
searchRole searchLocation searchRemote roleDisplayName locationDisplayName searchTotalJobCount searchTotalStartupCount searchPageCount sourceUrl page scrapedAt100%
companyHighConcept99%
badges (raw array of every company badge)98%
compensation85%
salaryMin salaryMax salaryCurrency salarySource84%
companyOtherJobIds (other open roles at the same startup)81%
atsSource atsVendor (Greenhouse / Ashby / Workable / Lever)77%
companyStage companyStageLabel70%
businessModel (B2B / B2C / B2B/B2C)61%
responseSpeed (how fast the company replies to applicants)26%
remoteKind remoteWfhFlexible27%
valuationTier (1B+ / 500M+)27%
acceptedRemoteLocationNames25%
equityText hasEquity15%
yearsExperienceMin14%
glassdoorRating13%
equityMin equityMax11%
leadershipRating9%
workLifeBalanceRating8%
salaryPeriod0% on this path — by design. The list route prints a range with no period. Detail enrichment fills it
yearsExperienceMax0%. Wellfound exposes the field and left it empty on all 210 platform rows and 381 offline rows audited

The badge-derived percentages are facts about the market, not gaps in the scraper: only 13% of these startups have a Glassdoor rating on Wellfound, and only 15% publish equity. Where the signal exists it is on the row.

Measured output — with fetchJobDetails on

Run ZGmVf8iMiSrsuMNfi, 2026-09-03: software-engineer, 60 rows, 60/60 detail pages fetched successfully, 62 requests, 0 blocks, 0 rate limits, 60 seconds. 107 fields per row, 50 at 100%.

Detail fieldFillWhat it is
companyWebsiteUrl100%the startup's own domain — the CRM/enrichment join key
datePostedIso100%exact ISO timestamp (the list route gives a unix epoch)
employmentTypeNormalized100%schema.org FULL_TIME / INTERN / CONTRACTOR
industry · companyMarkets[]100%"Clean Energy, Renewable Energies, Nuclear Energy" → array
descriptionHtml · canonicalUrl · directApply100%
visaSponsorship · relocation100%"Not Available" / "Allowed" — the two questions every candidate list needs
companyEmployeesText100%"501-1000 Employees"
companyHqLat companyHqLon companyHqCountry98%
companyHqRegion97%
salaryMin salaryMax salaryCurrency salaryPeriod95%structured integers + YEAR, from the JSON-LD
companyHqCity93%
jobLat jobLon jobCountry92%
jobRegion85%
companyTotalRaisedText · companyFundingRoundsCount · companyFundingUrl73%"$333.2M", "5 rounds"
jobBenefits · companyPerks[]70%benefit list with the company's own blurb per perk
companyTotalRaisedUsd67%333200000 — parsed integer, null when "Undisclosed amount"
jobCity65%
companyLatestRoundName companyLatestRoundLetter companyLatestRoundDate companyEarlierRoundsShown65%"Series G", "G", "May 2019", 4
postedAgoText62%"2 weeks ago"
companyLatestRoundAmountUsd58%123000000
recruiterActivity47%"Recruiter recently active"
hiresRemotelyIn40%
jobLocationType37%TELECOMMUTE
applicantLocationRequirement28%
validThrough0%schema.org field Wellfound leaves empty; shipped for completeness

Funding is a real number, not a badge. 40 of the 60 rows carried a dollar amount raised ($678.5M Klaviyo, $492M YipitData, $333.2M Nextdoor, $85M Mirage…). The remaining rows are companies Wellfound shows as "Undisclosed amount" or with no funding card at all — those come back null, never guessed.


Coverage, pagination and duplicates — read this before setting maxItems

Wellfound paginates with ?page=N, 20 jobs per page, and the page payload reports its own page count — which this actor reads, so it stops at the last real page instead of guessing. Past the end Wellfound wraps back to page 1 rather than 404ing; the payload echoes the page it actually served, so the wrap is detected and the seed ends cleanly.

Contiguous pages overlap. Measured across the four multi-page platform runs: 45 duplicate job rows out of 505 raw rows (8.9%, per-run 4.8% / 6.8% / 10.3% / 13.8%). Every duplicate is dropped by job id before the row is delivered, so you are never charged for a job twice — not within a page, not across pages, not across seeds in the same run.

Coverage comes from fanning out: roles × locations builds one seed per pair, remoteOnly switches to the remote-only corpus, and startUrls takes any landing page you build in the browser.


Proxies — the honest version

Datacenter proxies do not work on Wellfound. Residential does. Measured 2026-09-02 across 12 fresh sessions against one identical URL:

Apify BUYPROXIES94952 (datacenter) 3/12 clean — 75% Cloudflare 403
Apify RESIDENTIAL-US 10/12 clean — 0 Cloudflare 403s; both misses were
proxy transport errors, not blocks

A three-URL smoke test on datacenter came back 200/200/200 and would have looked fine — and then failed three quarters of its pages in production. So RESIDENTIAL + US is the default here, the actor rotates its proxy session on every block or error and retries, and the five platform runs behind this README recorded 0 Cloudflare 403s and 0 rate limits across 106 requests (2 proxy transport errors, both recovered by the retry).

Two more things you should know rather than discover:

  • Rate limiting is real on a single IP. Six concurrent detail fetches from one residential IP earned HTTP 429 within seconds. The actor backs off up to 20s on a 429 (not just rotating — a rate limit needs time as well as a new IP) and jitters detail requests.
  • A block is never reported as "no results". If a run cannot read a page, it says so — with the request count, the 403 count and the 429 count — and exits cleanly. An empty dataset from this actor means the filters matched nothing, and it will say that instead.

Pricing

Pay per event, no platform-usage pass-through, no actor-start fee.

EventPriceWhen
job-scraped$0.0015 per jobeach unique job delivered to your dataset
job-detail-enriched$0.0008 per jobonly when fetchJobDetails is on, only on a successful detail fetch

1,000 jobs with the full company card = $1.50. The same 1,000 with funding, geo and structured salary = $2.30. Duplicates are never billed, and rows are delivered with the budget-aware push, so delivered always equals billed — verified on run D1s2jquAGrcfqUSdd: 30 dataset items, chargedEventCounts {job-scraped: 30, job-detail-enriched: 30}.


Honest limits

  • No recruiter names, emails or phone numbers. Wellfound does not publish them on these pages and this actor does not invent them. What you get is the company's own domain, which is the correct input to an email-pattern or enrichment step.
  • /company/<slug> is Cloudflare-walled (403 on home IP, three residential sessions and a datacenter session on 2026-09-02), so the company profile route is not used. Everything company- related here — including funding — comes from the job pages, which are open.
  • Funding is what Wellfound shows on the job page. Total raised, round count and the latest round name/date/amount, at 58-73% fill. Full round-by-round history and investor names live behind the walled profile route and are not promised here.
  • salaryPeriod is only asserted when detail enrichment is on. The list route prints "₹15,000 – ₹17,000" and "$110k – $200k" in the same slot with no period, so it is left null rather than guessed. salarySource always tells you where a salary number came from.
  • yearsExperienceMax and validThrough measured 0%. They exist in Wellfound's own payloads and were empty on every row measured. They ship as null columns rather than being silently dropped.
  • Company signals reflect the market. 13% Glassdoor rating, 15% equity, 70% stage — those are the real fill rates on Wellfound, not scraper misses.
  • isBookmarked is deliberately not emitted. It is viewer-scoped and always false for an anonymous crawler; shipping it would be a fake column.

https://wellfound.com/robots.txt (fetched 2026-09-02, 964 bytes) allows every route this actor touches. Its Disallow list is account, embed and form paths:

Disallow: /_jobs/ Disallow: /auth/ Disallow: /cdn-cgi/
Disallow: /documents/ Disallow: /embed/ Disallow: /jobs/applications
Disallow: /jobs/signup Disallow: /onboarding Disallow: /profile/edit
Disallow: /profile/resume Disallow: /projects/ Disallow: /re/
Disallow: /recruit/dashboard Disallow: /search Disallow: /social/share_modal
Disallow: /u/ Disallow: /*?role=* Disallow: /*?jobId=* (query-parameter forms)

This actor reads /role/<slug>, /role/r/<slug>, /role/l/<role>/<location>, /location/<slug> and /jobs/<id>-<slug> — none of which appear above. Note Disallow: /*?role=* is the query-parameter form (?role=); the path form /role/… is a different URL and is not matched. /jobs/applications and /jobs/signup are disallowed and are never touched; individual job pages /jobs/<id>-<slug> are not.

Only public, logged-out pages are read. No login, no cookies from the target site, no CAPTCHA solving, no personal candidate data. Job postings are employer-published listings. You are responsible for how you use the output, including under GDPR/CCPA where applicable.

FAQ

Do I need a Wellfound account or API key? No. Everything comes from public pages.

How many jobs can I get? The 12 role slugs linked from Wellfound's own footer sum to ~19,900 job slots, plus 10+ location slugs and role × location combinations. Every row reports searchTotalJobCount for its seed so you can size the next run exactly.

Is the description included? Yes — the complete markdown description, on the default path, at no extra request (100% fill, typically 2-4 KB per job).

What does salarySource mean? listing-display = parsed from Wellfound's displayed range. detail-jsonld = taken from the job page's schema.org baseSalary, which is authoritative and carries the period. Detail enrichment upgrades a row from the first to the second.

Can I monitor new postings? Yes — schedule the actor with postedWithinDays: 1 and a role or location seed. postedAt and postedDaysAgo are on every row.

Why is Wellfound also called AngelList? Wellfound is the renamed AngelList Talent. Same jobs, same companies, wellfound.com URLs.