Wellfound Startup Job Scraper
Pricing
from $2.99 / 1,000 results
Wellfound Startup Job Scraper
Scrape startup jobs from Wellfound (AngelList Talent) with full job descriptions, salary and equity bands, company size, funding stage and YC/top-investor signals — plus incremental change tracking and notifications. No account needed.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
Corvuslab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Wellfound Startup Job Scraper 🚀
Extract structured startup job data from Wellfound (formerly AngelList Talent) — with full job descriptions, salary and equity bands, company size, funding stage, and Y Combinator / top-investor signals.
No Wellfound account, cookie or session token required. Every job comes back with its complete description included — not truncated, not empty, at no extra per-job fee.
Great for job-market research, startup lead generation, compensation and equity benchmarking, recruiting intelligence, and feeding live startup jobs into dashboards or AI agents.
✨ Key features
- 📄 Full descriptions on every job, for free — every listing arrives with its
complete description, in text, markdown and HTML. No enrichment toggle, no second
per-job fee, no empty
descriptionfield. - 💰 Salary and equity, parsed —
"$135k – $175k • 0.05% – 0.25%"becomessalaryMin,salaryMax,salaryCurrency,equityMin,equityMax, plus asalaryHiddenflag. Filter on any of them. - 🏢 Startup firmographics — company size band, funding stage (early / growth / scale), $1B+ / $500M valuation flags, tagline, logo and profile URL.
- 🟠 Y Combinator & top-investor flags —
isYCombinator,hasTopInvestors,isGrowingFast,isActivelyHiring,isQuickResponderas first-class booleans you can filter on. - 🎯 Role × location searches — combine any number of roles and locations; every pair runs as its own search and results are deduplicated by job ID.
- 🔍 Filters that actually apply to descriptions — because the full text is already in hand, keyword, salary, equity and experience filters are exact, and filtered-out jobs never reach your bill.
- ♻️ Incremental mode — recurring runs emit only what changed. Unchanged jobs are recognised before any enrichment, so you skip the work and the per-result fee.
- 🔁 Repost & change tracking — every record carries
changeType(NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED), plus repost detection. - 🏢 Lead-generation mode —
companyOnlyModeemits one record per company withjobCountand sample titles, ideal for building a startup prospect list. - 🔔 Notifications — push matching jobs to Telegram, Slack, Discord, WhatsApp or any webhook (n8n, Make, Zapier).
- 🪶 AI-friendly output —
compactmode, description truncation, single-format descriptions andexcludeEmptyFieldsfor lean records in LLM and MCP pipelines.
📥 Input
Everything is optional — run it with no input at all and it scrapes software engineering jobs.
| Field | Type | Description |
|---|---|---|
query | string | Keyword, e.g. "rust engineer". Picks the closest role pages and is enforced against every title and description. |
roles | array | Wellfound role pages: software-engineer, product-manager, data-scientist, … Each runs as its own search. |
location | array | san-francisco, new-york, remote, united-states, … Paired with every role. |
remote | boolean | Search the remote-only variant of each role page. |
searchUrls | array | Paste any Wellfound search URL to reach slugs not in the dropdowns. |
startUrls | array | Alias of searchUrls; both are merged and deduplicated. |
maxResults | integer | Total jobs to output. 0 = no limit (capped at 5,000). Default 100. |
maxPages | integer | Depth bound per search. Each page returns ~25–56 jobs. Default 25. |
includeKeywords / excludeKeywords | array | Keep or drop jobs matching these terms (title, description, role, company). |
jobType | enum | full-time, part-time, contract, internship, cofounder. |
experienceLevel | enum | entry (0–2 yrs), mid (2–5), senior (5–8), staff (8+). |
salaryMin / salaryMax | integer | Salary band bounds in the listed currency. 0 = no bound. |
equityMin | number | Minimum maximum-equity grant, in percent. |
remoteOnly | boolean | Drop anything not flagged remote. |
excludeLocations | array | Drop jobs whose locations mention these, e.g. India. |
companySize | array | Headcount bands, e.g. SIZE_11_50, SIZE_51_200. |
yCombinatorOnly | boolean | Only companies carrying Wellfound's YC badge. |
fromDate / toDate | string | Posting-date window (YYYY-MM-DD, toDate inclusive). |
maxAgeMinutes | integer | Only jobs posted within N minutes — pairs with a schedule for a live feed. |
customFilters | array | Rules over any output field, e.g. [{"field":"companyStage","operator":"equals","value":"early_stage"}]. |
enrichDetail | boolean | Adds company website, industry, employment type and map coordinates. Not needed for descriptions. Costs one extra request per job, so large runs take considerably longer — budget roughly maxResults × requestDelayMs. |
includeDetails | boolean | Alias of enrichDetail. |
extractContacts | boolean | Best-effort extractedEmails / extractedPhones from descriptions. |
companyOnlyMode | boolean | One record per company instead of per job. |
descriptionFormat | enum | all, text, markdown, html. |
descriptionMaxLength | integer | Truncate descriptions (0 = full text). |
compact | boolean | Core fields only, for AI agents and MCP. |
excludeEmptyFields | boolean | Drop null and empty fields. |
incrementalMode | boolean | Emit only new / changed jobs on recurring runs. |
stateKey | string | Names the tracking state; auto-derived if blank. |
emitUnchanged / emitExpired | boolean | Also emit UNCHANGED / EXPIRED records. |
skipReposts | boolean | Drop jobs re-listed under a new ID. |
telegramToken + telegramChatId | string | Notify Telegram. |
slackWebhookUrl / discordWebhookUrl | string | Notify a Slack / Discord webhook. |
whatsappPhoneNumberId + whatsappAccessToken + whatsappTo | string | Notify WhatsApp via Meta Cloud API. |
webhookUrl + webhookHeaders | string / object | POST structured JSON anywhere. |
notificationLimit | integer | Jobs listed per message (1–20, default 5). |
notifyOnlyChanges | boolean | With incremental mode, alert only on changes. Default true. |
requestDelayMs | integer | Delay between requests — this is what sets the request rate. Default 600 ms; raise it if you ever see blocks, lower it to trade safety margin for speed. |
pageConcurrency | integer | Search pages fetched at once (1–20, default 4). Overlaps the waiting between pages; requestDelayMs still caps the rate. |
proxyConfiguration | object | Leave as-is unless you have a specific reason to change it. |
Example input
{"roles": ["software-engineer"],"location": ["san-francisco", "new-york"],"maxResults": 200,"salaryMin": 150000,"equityMin": 0.1,"excludeKeywords": ["intern"],"yCombinatorOnly": true}
📤 Output
Each job is pushed to the run's default dataset. Example record (abridged):
{"id": "3317746","title": "Software Engineer","url": "https://wellfound.com/jobs/3317746-software-engineer","compensation": "$135k – $175k • 0.05% – 0.25%","salaryMin": 135000,"salaryMax": 175000,"salaryCurrency": "USD","salaryHidden": false,"equityMin": 0.05,"equityMax": 0.25,"jobType": "full-time","postedAt": "2026-07-26T09:38:57Z","locationNames": ["San Francisco"],"acceptedRemoteLocationNames": ["United States"],"remote": true,"remoteKind": "ONSITE_OR_REMOTE","wfhFlexible": false,"yearsExperienceMin": 3,"primaryRoleTitle": "Software Engineer","atsSource": "AtsIntegration::Greenhouse::Listing","autoPosted": false,"description": "Mission\n\nKeeper is an AI-powered human-in-the-loop service…","descriptionMarkdown": "### Mission\n\nKeeper is an AI-powered…","descriptionHtml": "<h3>Mission</h3><p>Keeper is an AI-powered…</p>","companyId": "6809417","companyName": "Keeper","companySlug": "keeper-tax","companyUrl": "https://wellfound.com/company/keeper-tax","companyLogo": "https://photos.wellfound.com/startups/i/6809417-….jpg","companyTagline": "File your complex taxes confidently","companySize": "SIZE_11_50","companySizeLabel": "11-50","companyStage": "early_stage","companyValuation": null,"companyBadges": ["Actively Hiring", "B2C", "Early Stage", "Top Investors", "Y Combinator"],"isYCombinator": true,"hasTopInvestors": true,"isGrowingFast": false,"isActivelyHiring": true,"matchedSearch": "role=software-engineer","source": "wellfound","scrapedAt": "2026-07-29T09:15:22Z"}
With enrichDetail on, each record also gains companyWebsite, companyIndustry,
employmentType, experienceRequirements, directApply, latitude, longitude and
the postal address fields.
With incrementalMode on, each record gains changeType, trackedHash, stateKey,
firstSeenAt, lastSeenAt, isRepost and repostOfId.
🔄 Switching from another Wellfound scraper?
Records also carry portalUrl, detailUrl and salaryEquityMin — aliases of url,
url and equityMin — and the input accepts startUrls and includeDetails. Point
your existing pipeline at this actor and it should run unchanged, with the descriptions
and company fields filled in rather than null.
♻️ Recurring monitoring
Wellfound expires inactive postings aggressively, so most listings are days old at most — which makes it a good target for scheduled runs.
Turn on incrementalMode, give it a stateKey, and schedule the actor. The first run
stores a baseline; every run after that emits only jobs that are new, updated or
reappeared.
Measured back-to-back on a 117-job search: the first run billed 117 results, the second billed 0 — and cost 43 % less to run, because unchanged jobs are recognised before any enrichment. Over a day, what you pay for is the genuine churn (typically 5–15 % of listings) instead of the whole result set again.
⚠️ Set
maxResultshigh enough to cover your entire search. Wellfound reshuffles its listing pages between requests, so a run that stops at 300 of 5,000 jobs sees a different slice every time and everything looks new. Incremental mode only pays off when each run covers the same, complete result set.
Pair it with maxAgeMinutes: 60 on an hourly schedule for a near-real-time feed, and
with notifications to get the jobs pushed straight to Slack or Telegram.
💡 Use cases
- 🔎 Job hunting — track new startup roles matching your stack, salary floor and equity expectations, delivered to Telegram the moment they appear.
- 🏢 Lead generation —
companyOnlyModeturns a search into a list of startups that are actively hiring, with size, stage and investor quality attached. - 💰 Compensation research — parsed salary and equity bands across roles, locations and funding stages.
- 🧠 Recruiting intelligence — see which companies are hiring, how fast they're
growing, and which ATS they use (
atsSource). - 📊 Market analysis — role demand, remote share and pay trends over time.
- 🤖 AI agents & MCP —
compactoutput with truncated descriptions keeps LLM context small and cheap.
💰 How much does it cost to scrape Wellfound?
Pay-per-event — two events, nothing else. A small fee when the run starts, then a fee per job record you actually receive.
| Event | Price |
|---|---|
| Actor start | $0.005 per run |
| Job record | $2.99 per 1,000 results ($0.00299 each) |
| Run | Cost |
|---|---|
| 10 results | $0.035 |
| 25 results | $0.080 |
| 100 results | $0.304 |
| 200 results | $0.603 |
| 500 results | $1.500 |
| 1,000 results | $2.995 |
There is no separate compute or proxy bill — platform usage is on us, so the numbers above are the whole cost of a run.
$0.00299 buys the complete record, including the full job description in text,
markdown and HTML. There is no enrichment surcharge and no per-description fee:
enrichDetail adds company website, industry and coordinates at the same per-result
price. You only pay for jobs you receive — every filter (keywords, salary, equity,
experience, location, customFilters) discards non-matching jobs before they are
billed, and Apify's per-run cost limit is honoured — the run stops cleanly at your
ceiling rather than overshooting it.
📉 Example: recurring monitoring savings
Monitoring a search of 250 jobs, once a day for 30 days. Without incremental mode every run re-emits all 250 records:
30 × ($0.005 + 250 × $0.00299) = $22.58 / month
With incrementalMode on, the first run stores a baseline and every later run emits —
and charges for — only jobs that are new, updated or reappeared. What you pay for is the
genuine churn:
| Daily churn | Records billed per run | Cost per run | Month (1 baseline + 29 runs) | Saving |
|---|---|---|---|---|
| No incremental mode | 250 | $0.75 | $22.58 | — |
| 5% — stable niche | ~13 | $0.04 | $1.98 | 91% |
| 15% — moderate | ~38 | $0.12 | $4.15 | 82% |
| 30% — fast-moving | ~75 | $0.23 | $7.40 | 67% |
Most role × location searches sit in the 5–15% band, so a daily watch on a 250-job search typically lands between $2 and $4 a month instead of $22.58.
This is measured, not modelled: on a back-to-back test of a 117-job search the first run billed 117 results and the second billed 0, because unchanged jobs are recognised before any enrichment happens. A run that finds nothing new costs the $0.005 start fee and nothing else.
⚠️ Keep
maxResultshigh enough to cover the whole search and identical between runs — see Recurring monitoring above for why.
❓ FAQ
Do I need a Wellfound account? No. Everything scraped is publicly visible job data.
Are job descriptions really included by default?
Yes — and this is the main difference from the alternatives. Every job comes back with its
complete description at no extra request and no extra fee. You do not need enrichDetail
to get it, and it is never truncated unless you ask for that with descriptionMaxLength.
Why do some jobs have no salary?
Because Wellfound has none to show. Those records carry salaryHidden: true and null
salary bounds. Setting salaryMin drops them, since they cannot be shown to clear it.
How many results can I get? Up to 5,000 per run. Individual searches vary — a broad role page can hold thousands of jobs, a narrow role × city pair a few hundred. The log prints each search's true total before it starts walking.
Can I search for any keyword?
Yes, via query. Note that Wellfound exposes no public keyword search, so the keyword
selects the closest role pages and is then enforced against every title and description.
For an exact taxonomy match prefer roles; to reach an unusual page, paste its URL into
searchUrls.
Can I run this on a schedule?
Yes. Combine Apify's scheduler with incrementalMode so each run costs only the changes.
Can I use this scraper through an MCP server? Yes. Apify's Actors MCP Server exposes this actor as a tool that Claude, ChatGPT, Cursor, VS Code and any other MCP client can call directly — no wrapper code to write.
- Endpoint — point your client at the hosted Apify MCP server,
then select this actor with the
toolsparameter or in the visual configurator. - Auth — sign in with OAuth, or send your Apify token as a bearer token in the Authorization header.
- Per-client setup — see the Apify MCP documentation.
This actor is built for that pipeline: turn on compact, set a descriptionMaxLength,
pick a single descriptionFormat and add excludeEmptyFields, and each job comes back
as a lean record that will not blow up a context window.
Does it work with the Apify API and integrations? Yes — REST API, JavaScript and Python clients, plus Zapier, Make, Google Sheets, Slack and the Apify MCP server for AI assistants.
Is scraping Wellfound legal? This actor collects only publicly available data. Scraping public information is generally lawful, but you remain responsible for how you use it — review Wellfound's terms and any applicable law (GDPR and similar) before you do.