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
5.0
(1)
Developer
Corvuslab
Maintained by CommunityActor stats
1
Bookmarked
7
Total users
2
Monthly active users
11 hours ago
Last modified
Categories
Share
What does Wellfound Startup Job Scraper do?
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.
📚 What data can you extract from Wellfound?
Every record carries 80 fields, grouped like this:
| Group | What you get |
|---|---|
| Core listing | title, slug, portalUrl, detailUrl, jobType, employmentType, liveStartAt, wfhFlexible, yearsExperienceMin, yearsExperienceMax, primaryRoleTitle, atsSource …and 19 more |
| Contacts & demand signals | extractedEmails, extractedPhones |
| Company | companyId, companyName, companySlug, companyUrl, companyLogo, companyTagline, companySize, companySizeLabel, companyStage, companyValuation, companyBadges, companyWebsite …and 1 more |
| Pay & budget | compensation, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryMinDetail, salaryMaxDetail, salaryHidden, equityMin, salaryEquityMin, equityMax |
| Location | locationNames, acceptedRemoteLocationNames, remote, remoteKind, latitude, longitude, addressLocality, addressRegion, addressCountry, stateKey |
| Description | experienceRequirements, description, descriptionMarkdown, descriptionHtml |
| Dates & change tracking | postedAt, autoPosted, changeType, firstSeenAt, lastSeenAt |
Every field is nullable — missing values come back as null. Compact mode returns
the core fields only for lean AI/MCP payloads, and excludeEmptyFields drops empties
entirely.
✨ 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.
🚀 How to scrape Wellfound
- Open the Actor and enter a role or keyword (e.g.
product designer), or paste a Wellfound URL you already have. - Add the filters you care about — location, remote, role type and the startup attributes.
- Set Max results and choose whether to fetch full details for each listing.
- (Optional) Turn on incremental mode and a notification channel, then schedule it from the Schedules tab.
- Click Start, then export as JSON, CSV or Excel — or pull the results from the API.
No login and no setup: it runs out of the box.
📉 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:
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 | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | 95 % |
| 15 % | 1,000 | 150 | 85 % |
| 30 % | 1,000 | 300 | 70 % |
Most role × location searches sit in the 5–15% band, so a daily watch on a 250-job search typically bills 85–95% less than re-scraping the whole search every day.
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 bills the run-start fee and nothing else.
⚠️ Keep
maxResultshigh enough to cover the whole search and identical between runs — see Recurring monitoring above for why.
⚙️ 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.
♻️ How to monitor Wellfound with incremental mode
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.
🔔 How to set up Wellfound alerts
Get pinged the moment a matching record appears. Fill in only the channels you want:
| Channel | What to configure |
|---|---|
| ✈️ Telegram | telegramToken (from @BotFather) + telegramChatId |
| 💬 Slack | slackWebhookUrl (Incoming Webhook URL) |
| 🎮 Discord | discordWebhookUrl (channel webhook URL) |
| 🪝 Webhook | webhookUrl receives structured JSON — ideal for n8n / Make / Zapier |
Credentials are secret inputs — encrypted at rest, masked in the UI and never written to the run log. Every channel fires independently, so a broken channel can't stop the scrape or the others. Pair incremental mode with notify only about changes to hear only about genuinely new records, with no duplicates across runs.
💡 What can you do with Wellfound data?
- 🔎 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?
This Actor uses Apify's pay-per-event model: a small fee when a run starts, plus a per-record fee. See the Actor's Pricing tab for the current numbers — they're rendered live, so this page never goes stale.
Two things cut your bill further:
- Site-side filters — records you filtered out are never fetched and never billed.
- Incremental mode — after the baseline run you pay only for what actually changed.
| Daily churn | of 1,000 tracked | billable records | you save |
|---|---|---|---|
| 5 % | 1,000 | 50 | 95 % |
| 15 % | 1,000 | 150 | 85 % |
| 30 % | 1,000 | 300 | 70 % |
Pay-per-event — two events, nothing else. A small fee when the run starts, then a fee per job record you actually receive.
There is no separate compute or proxy bill — platform usage is on us, so the numbers above are the whole cost of a run.
One per-record fee buys the whole job — description in text, markdown and HTML, salary and
equity bands, and the company panel. There is no enrichment surcharge and no per-description
fee. 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.
🔌 Integrations & export
Export to JSON, CSV, Excel or an HTML table, or pull from the REST API and the JavaScript / Python clients. Runs on a schedule, connects to Google Sheets, Slack, Make, Zapier and n8n, and works as an MCP tool for AI agents — compact mode keeps token usage small.
🔗 Using the API
Run this Actor from your own code. Example with the Apify Python client:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("corvuslab/wellfound-scraper").call(run_input={"query": "example","maxResults": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
It also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.
❓ 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 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.
Keywords: wellfound scraper · wellfound.com scraper · angellist jobs scraper · startup jobs scraper · wellfound jobs api · tech startup hiring data · equity salary data · y combinator jobs · venture-backed startup jobs · recruitment sourcing · lead generation · job market research · job monitoring · export to CSV/Excel/JSON · MCP tool for AI agents