π Wellfound Jobs Scraper
Pricing
from $3.99 / 1,000 results
π Wellfound Jobs Scraper
Scrape job listings from Wellfound (formerly AngelList Talent) at scale. Search by location, company, keyword, or paste raw URLs.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperForge
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
Wellfound Jobs Scraper β Startup Job Listings with Salary Ranges
Scrape job listings from Wellfound (formerly AngelList Talent) by location, company, keyword or raw URL. Get job title, company, location, salary range, employment type, posting date, direct link and the full job description.
Startup roles that publish pay up front β search filters or bulk URLs, both supported.
What is Wellfound Jobs Scraper?
Wellfound is where startups hire, and it has one property no other job board matches at this scale: salary is published on the listing. Not "competitive", not a band you get in the third interview β an actual range, on the card.
This Actor turns that into a dataset. Search by location, company or keyword and it walks the result pages, or paste Wellfound URLs β search pages and individual job pages both work β and it scrapes those directly.
Wellfound runs DataDome anti-bot, which shapes how the Actor behaves in ways worth knowing:
- Residential proxy first, by default. Direct and datacenter connections from cloud IPs are reliably blocked, so the Actor starts on residential sticky sessions and rotates the exit IP on each retry. A proxy you supply yourself takes precedence.
- Listing fields come from the page's own data layer, so title, company, salary, location, type and date are captured reliably even when detail pages are blocked.
- Description fetching self-disables when blocked. Detail pages are the part DataDome guards hardest. After four consecutive blocked detail loads with no success, the Actor stops trying for the rest of the run instead of burning time β you still get complete listing records, and descriptions populate whenever detail pages are reachable.
That last behaviour is deliberate honesty in the design: a run that cannot get descriptions returns full listing data quickly rather than a slow, half-empty dataset.
What data can you extract?
| Field | Description |
|---|---|
job_title | Role title |
company_name | Hiring company |
location | Location, or Remote |
salary | Normalised compensation range, e.g. 80K β 120K a year |
job_type | Full-time, Part-time, Contract, Internship |
date | Posting recency as Wellfound shows it |
URL | Direct link to the job |
description | Full job description β when detail pages are reachable |
posted_via | Source label |
Why teams scrape Wellfound
For salary benchmarking
This is the strongest use case. Most job boards hide pay; Wellfound publishes it. A few hundred listings for one role in one city is a real compensation dataset, gathered in minutes.
For job seekers and career tools
Filter by role, location, remote status and pay, and compare hundreds of startup openings side by side instead of scrolling.
For recruiting intelligence
Which startups are hiring, for what, and at what pay β a live read on where competitors are investing headcount.
For sales prospecting
Hiring is a growth signal. A company posting five engineering roles is a company scaling, budgeting and buying tools.
For market research
Aggregate job_type and location to see how much of the startup market is remote, contract or full-time.
For talent-market analysis
Track which skills and titles appear over time to see where demand is moving.
How to scrape Wellfound jobs step by step
- Choose your approach β search filters or bulk URLs.
- Filters: set Location (
New York,San Francisco,Remote), and optionally a Keyword (python engineer) or a Company Name. - URLs: paste Wellfound search pages or individual job pages into Start URLs. These take priority over the filters.
- Set Pages to Fetch β each page holds roughly 25 jobs.
- (Optional) Filter by Job Type and Date Posted.
- Decide on Fetch Full Descriptions β richer output, slower runs.
- Click Start, then export the Output tab as CSV, Excel or JSON.
At least one of
startUrls,locationName,companyNameorincludeKeywordis needed for a targeted search. With no filters at all, the Actor crawls the Wellfound/jobslanding page and finishes successfully rather than failing.
β¬οΈ Input
Example input β search
{"locationName": "San Francisco","includeKeyword": "python engineer","pagesToFetch": 5,"jobType": "FULLTIME","datePosted": "week","fetchDescriptions": true,"countryName": "United States"}
Example input β URLs
{"startUrls": ["https://wellfound.com/location/new-york","https://wellfound.com/jobs/123456-senior-backend-engineer"],"pagesToFetch": 3}
Input reference
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | [] | Bulk Wellfound URLs β search/listing pages or individual job pages. Takes priority over the search filters below. |
locationName | string | New York | City or region to search β New York, San Francisco, Remote. Used to build the search URL when no startUrls are given. |
companyName | string | "" | Restrict to one company. Runs a keyword search and keeps cards whose company name loosely matches. |
includeKeyword | string | "" | Extra search term β role title, skill or technology. Combined with location. |
pagesToFetch | integer | 1 | Result pages to open per starting URL. Roughly 25 jobs per page. |
jobType | string | "" | FULLTIME, PARTTIME, CONTRACTOR, INTERN, or empty for all. |
datePosted | string | all | today, 3days, week, month, or all. |
fetchDescriptions | boolean | true | Open each job page to capture the full description. Slower, and subject to blocking β see below. |
countryName | string | United States | ISO country name used to geo-target residential proxy exit nodes. |
proxyConfiguration | object | Residential | Optional. The Actor defaults to residential sticky sessions, rotating the exit IP on each retry, because Wellfound's anti-bot blocks direct and datacenter traffic. A proxy you supply wins. |
β¬οΈ Output
Example output
{"job_title": "Senior Backend Engineer","company_name": "Example Labs","location": "San Francisco, CA","posted_via": "Wellfound","salary": "150K β 200K a year","job_type": "Full-time","date": "2 days ago","URL": "https://wellfound.com/jobs/123456-senior-backend-engineer","description": "We're looking for a backend engineer to own our data platformβ¦"}
Illustrative values β a live run returns current Wellfound data.
Usage recipes
Build a salary benchmark
{"locationName": "San Francisco","includeKeyword": "backend engineer","pagesToFetch": 10,"jobType": "FULLTIME","fetchDescriptions": false}
Turning descriptions off makes this fast, and salary is a listing field β you lose nothing you need for a compensation study.
Track one company's hiring
{"companyName": "Example Labs","locationName": "Remote","pagesToFetch": 5}
Remote-only role search
Set locationName: "Remote" and add your role keyword. Rows come back with location: "Remote".
This week's postings
{"locationName": "New York","datePosted": "week","pagesToFetch": 5}
Schedule it and deduplicate on URL for a fresh-jobs feed.
Hiring-signal prospecting
Run a broad location search with descriptions off, then count listings per company_name. Companies with several open roles are scaling β and buying.
One specific job in full
Paste that job's URL into startUrls. A single detail page is far more likely to fetch cleanly than hundreds in sequence, so this is the reliable way to get a complete description.
How does this compare to an official Wellfound API?
Wellfound has no public jobs API. AngelList's older developer API was retired, and what exists today is an employer-side product plus partner integrations under agreement β nothing that lets you query listings programmatically.
That leaves the public site as the only route, which is what this Actor reads.
Integrate and automate
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperforge/wellfound-jobs-scraper").call(run_input={"locationName": "San Francisco","includeKeyword": "backend engineer","pagesToFetch": 5,"fetchDescriptions": False,})for job in client.dataset(run["defaultDatasetId"]).iterate_items():if job["salary"]:print(job["company_name"], "|", job["job_title"], "|", job["salary"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperforge/wellfound-jobs-scraper').call({locationName: 'San Francisco',includeKeyword: 'backend engineer',pagesToFetch: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
REST API
curl -X POST "https://api.apify.com/v2/acts/scraperforge~wellfound-jobs-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"locationName":"San Francisco","pagesToFetch":5}'
n8n, Make, Zapier and AI agents
Call the Actor from n8n, Make, Zapier or an MCP-capable agent β a common pattern is new listings β filter by salary β Slack.
Schedules and webhooks
Attach a Schedule with datePosted: "today" and deduplicate on URL for a daily jobs feed, then route results with webhooks or the Google Sheets / Airtable / Slack integrations.
Pricing and what you are charged for
Billing details for this Actor are shown on the Pricing tab of its page β check there for the current model and rates before a large run. Apify shows a cost estimate before and during every run.
Roughly 25 jobs per page means pagesToFetch Γ 25 Γ number of start URLs is your approximate ceiling. Residential proxy traffic is billed separately by the platform and is effectively required here.
Limits, reliability and blocking
- Descriptions can be blocked and will self-disable. Wellfound's DataDome protection guards job detail pages hardest. After four consecutive blocked detail loads with no success, the Actor turns description fetching off for the rest of the run and logs a warning β records stay complete on every other field. For a specific description, pass that job's URL directly in
startUrls. - Turn
fetchDescriptionsoff when you do not need it. It is the slowest part of any run, and salary, title, company, location, type and date all come from the listing regardless. - Residential proxy is the default and effectively required. Direct and datacenter connections from cloud IPs are reliably blocked.
countryNamesets where those exit nodes appear. - Roughly 25 jobs per page. Raise
pagesToFetchfor more. startUrlsoverrides the search filters. Supply both and the URLs win.companyNameis a loose match applied to keyword-search results, not an exact company filter β check the output when a company has a common name.dateis relative text ("2 days ago"), as Wellfound displays it, not an absolute timestamp.salaryis normalised but not guaranteed. Most Wellfound listings publish a range; those that do not come back with an emptysalary.- Rows without a title or URL are skipped rather than written as partial records.
- An empty-input run crawls the
/jobslanding page and completes successfully instead of failing. - Default run options are 4 GB memory and a 1-hour timeout; raise the timeout for many pages with descriptions on.
Is it legal to scrape Wellfound jobs?
This Actor collects publicly posted job listings β the same adverts any visitor can browse without an account. It does not log in, apply to jobs, or access candidate profiles or recruiter data.
Job listings are published to be seen, and using them for salary research, market analysis and job search is ordinary practice. Listing text remains the employer's copyright, so do not republish descriptions wholesale as your own content. Comply with Wellfound's Terms of Service, and where a listing names an individual recruiter, treat that as personal data under GDPR and comparable laws.
β Frequently asked questions
Do I need a Wellfound account?
No. The Actor reads public listing pages without credentials.
Why are my descriptions empty?
Wellfound's anti-bot blocks detail pages more aggressively than listings. After four consecutive blocks the Actor disables description fetching and says so in the log. Everything else in the record is still captured.
How do I reliably get one job's description?
Paste that job's URL into startUrls. A single detail page fetches far more reliably than hundreds in a row.
How many jobs will I get?
About 25 per page, multiplied by pagesToFetch and by the number of start URLs.
Do I have to use the search filters?
No. Paste URLs into startUrls instead β they take priority. With neither, the Actor crawls the /jobs landing page.
Why is residential proxy the default?
Direct and datacenter connections from cloud IPs are blocked by Wellfound's anti-bot. Residential sticky sessions are what make runs work.
What does countryName do?
It geo-targets the residential proxy exit nodes. It does not filter jobs β use locationName for that.
Is salary always present?
Most Wellfound listings publish a range, which is the point of using this source, but some do not β those rows come back with an empty salary.
Can I search for remote jobs?
Yes. Set locationName: "Remote".
Which export format should I use?
CSV or Excel β the output is flat. Use JSON if you are keeping long descriptions.
π Related scrapers
- Indeed Scraper β the same roles on a mainstream job board.
- Linkedin Company Employees Scraper β who already works at the companies hiring.
- LinkedIn Company Scraper with Firmographics & Funding Data β funding context behind a hiring spree.
- π Leads Scraper β contacts at companies that are scaling.
Browse the full collection on the ScraperForge profile.
π¬ Feedback
Need more reliable descriptions, extra fields, or a custom jobs pipeline? Open an issue on the Issues tab of this Actor.