πŸš€ Wellfound Jobs Scraper avatar

πŸš€ Wellfound Jobs Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
πŸš€ Wellfound Jobs Scraper

πŸš€ 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

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

9 days ago

Last modified

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?

FieldDescription
job_titleRole title
company_nameHiring company
locationLocation, or Remote
salaryNormalised compensation range, e.g. 80K – 120K a year
job_typeFull-time, Part-time, Contract, Internship
datePosting recency as Wellfound shows it
URLDirect link to the job
descriptionFull job description β€” when detail pages are reachable
posted_viaSource 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

  1. Choose your approach β€” search filters or bulk URLs.
  2. Filters: set Location (New York, San Francisco, Remote), and optionally a Keyword (python engineer) or a Company Name.
  3. URLs: paste Wellfound search pages or individual job pages into Start URLs. These take priority over the filters.
  4. Set Pages to Fetch β€” each page holds roughly 25 jobs.
  5. (Optional) Filter by Job Type and Date Posted.
  6. Decide on Fetch Full Descriptions β€” richer output, slower runs.
  7. Click Start, then export the Output tab as CSV, Excel or JSON.

At least one of startUrls, locationName, companyName or includeKeyword is needed for a targeted search. With no filters at all, the Actor crawls the Wellfound /jobs landing page and finishes successfully rather than failing.


⬇️ Input

{
"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

FieldTypeDefaultDescription
startUrlsarray[]Bulk Wellfound URLs β€” search/listing pages or individual job pages. Takes priority over the search filters below.
locationNamestringNew YorkCity or region to search β€” New York, San Francisco, Remote. Used to build the search URL when no startUrls are given.
companyNamestring""Restrict to one company. Runs a keyword search and keeps cards whose company name loosely matches.
includeKeywordstring""Extra search term β€” role title, skill or technology. Combined with location.
pagesToFetchinteger1Result pages to open per starting URL. Roughly 25 jobs per page.
jobTypestring""FULLTIME, PARTTIME, CONTRACTOR, INTERN, or empty for all.
datePostedstringalltoday, 3days, week, month, or all.
fetchDescriptionsbooleantrueOpen each job page to capture the full description. Slower, and subject to blocking β€” see below.
countryNamestringUnited StatesISO country name used to geo-target residential proxy exit nodes.
proxyConfigurationobjectResidentialOptional. 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
}

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 ApifyClient
client = 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 fetchDescriptions off 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. countryName sets where those exit nodes appear.
  • Roughly 25 jobs per page. Raise pagesToFetch for more.
  • startUrls overrides the search filters. Supply both and the URLs win.
  • companyName is a loose match applied to keyword-search results, not an exact company filter β€” check the output when a company has a common name.
  • date is relative text ("2 days ago"), as Wellfound displays it, not an absolute timestamp.
  • salary is normalised but not guaranteed. Most Wellfound listings publish a range; those that do not come back with an empty salary.
  • Rows without a title or URL are skipped rather than written as partial records.
  • An empty-input run crawls the /jobs landing 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.

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.


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.