Wellfound Jobs Scraper (AngelList)
Scrape Wellfound (AngelList) startup jobs by role, city or remote: full Markdown description, salary, company badges. $0.085 per 1,000 jobs.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
roleSlugs,searchQueries,locationSlugs(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.000085 per job = $0.085 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Job returned | Charged once per unique real Wellfound job row returned. Sample and diagnostic rows are never charged. | $0.000085 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-10, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
roleSlugs | Wellfound role slugs, for example software-engineer, product-manager, data-scientist. Plain phrases are slugified, and wellfound.com/role/{slug} URLs are accepted. | array |
searchQueries | Alias for role slugs. 'Data Scientist' becomes data-scientist. | array |
locationSlugs | Optional Wellfound location slugs, for example san-francisco, new-york, london. Each role is crawled once per location using wellfound.com/role/l/{role}/{location}. Write the city the way Wellfound's own addresses do: a slug it has no page for, such as nyc or remote, comes back as one uncharged row and no jobs. | array |
remoteOnly | Use Wellfound's remote role pages (wellfound.com/role/r/{role}) and keep only listings flagged remote. Ignored when location slugs are supplied. A role with no remote page on Wellfound comes back as one uncharged row. | boolean |
jobTypes | Keep only these Wellfound job types. Observed values: full-time, part-time, contract, internship, cofounder. | array |
locationFilters | Keep only jobs whose location or accepted remote location contains one of these strings. Case-insensitive substring match. | array |
keywords | Keep only jobs whose title, company or description contains one of these strings. Case-insensitive substring match. | array |
seniorOnly | Keep only jobs whose title says Senior, Sr, Staff, Principal, Lead or Head of, or that ask for at least 5 years of experience. Wellfound states the years on only some jobs, which is why the title counts too. Jobs left out are not charged. | boolean |
minSalaryUsd | Keep only jobs whose salary is posted in US dollars and starts at this amount or more, for example 150000. A $140k to $180k job is left out at 150000. Jobs paid in another currency, or with no salary shown, are left out too. Jobs left out are not charged. | integer |
excludeCompanies | Company names, Wellfound company slugs such as keeper-tax, or wellfound.com/company/{slug} addresses. Their jobs are left out and not charged. | array |
maxItems | Maximum unique job rows to return and charge for. | integer |
maxPagesPerSource | Listing pages to walk for each role (or role and location pair). Each page carries roughly 40 to 49 jobs. | integer |
maxRetries | Wellfound 403s a share of requests. Each attempt uses a new proxy session and a different browser fingerprint. | integer |
requestTimeoutSecs | Maximum duration of each network request. | integer |
What you get
A structured dataset — each result includes fields like:
titlecompanyNamelocationsremotejobTypecompensationpostedAtjobUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
Wellfound Remote Engineering Jobs
Find remote engineering jobs on Wellfound: title, company, location, salary when shown and the apply link.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Wellfound Jobs Scraper: startup jobs with the full description, by role or city
Give it a Wellfound role like software-engineer, add a city or switch on remote, and every listing comes back as a row. The whole job description in Markdown, not a teaser. The salary and the equity as separate fields. The company with its size, its tagline and its Wellfound badges. And the exact minute the job went live.
The description arriving with the listing is what makes this cheap to run: one page request carries roughly 40 to 49 complete jobs, so 200 jobs is five requests rather than 205. What it cannot reach is a company's own jobs page on Wellfound, which needs a login.
| Input | Wellfound role slugs, optionally with cities or remote |
| Output | One row per job, description included |
| Ceiling | 5,000 jobs per run |
| Account needed | None, no login and no cookie |
| Price | $0.085 per 1,000 jobs, flat on every plan |
💼 What Wellfound Jobs Scraper does
It walks Wellfound's role pages. wellfound.com/role/software-engineer on its own, or wellfound.com/role/l/software-engineer/san-francisco when you add a city, or the remote pages when you switch Remote only on.
Each page is read in full and turned into one row per job. A listing that appears under two of your roles is written once and billed once.
Six filters run on your side after the rows arrive, and anything they drop is not billed: job type, a substring match on location, a substring match on keywords, senior roles only, a minimum salary in US dollars, and companies to leave out. One warning about the keyword filter. It looks at the title, the company and the whole description, so a short needle like go or ai keeps nearly every row. Use a phrase.
📥 What you give it
{
"roleSlugs": ["software-engineer", "product-manager"],
"locationSlugs": ["san-francisco"],
"jobTypes": ["full-time"],
"keywords": ["python"],
"maxItems": 200,
"maxPagesPerSource": 5
}
| Field | Default | What it is |
|---|---|---|
roleSlugs | none, the form starts with software-engineer | Wellfound role slugs. A plain phrase is slugified, so Data Scientist becomes data-scientist, and a full wellfound.com/role/<slug> URL works too. |
searchQueries | none | The same thing under another name, if you prefer phrases. |
locationSlugs | none | City slugs such as san-francisco, new-york, london. Each role is walked once per city. Write the city the way Wellfound's own addresses do: a slug it has no page for, such as nyc or remote, comes back as one uncharged BAD_INPUT row and no jobs. |
remoteOnly | false | Use Wellfound's remote pages and keep only listings flagged remote. Ignored when you give cities. A role with no remote page comes back as one uncharged BAD_INPUT row. |
jobTypes | none | Keep only these: full-time, part-time, contract, internship, cofounder. |
locationFilters | none | Keep only jobs whose location or accepted remote location contains one of these strings. |
keywords | none | Keep only jobs whose title, company or description contains one of these. Read the warning above. |
seniorOnly | false | Keep only jobs whose title says Senior, Sr, Staff, Principal, Lead or Head of, or that ask for 5 or more years. Wellfound states the years on only some jobs, so the title counts too. |
minSalaryUsd | none | A yearly amount in US dollars, such as 150000. Keeps jobs whose posted range starts at or above it, so $140k – $180k is left out at 150000. Jobs paid in another currency, or with no salary shown, are left out too. |
excludeCompanies | none | Company names, slugs such as keeper-tax, or wellfound.com/company/ addresses. Their jobs are left out. |
maxItems | 100 | Unique job rows to return and charge for, up to 5,000. This is your spending cap. |
maxPagesPerSource | 5 | Listing pages per role, or per role and city pair, up to 60. Each page carries roughly 40 to 49 jobs. |
maxRetries | 6 | How many times to try a listing page that does not come back, up to 12. |
requestTimeoutSecs | 25 | How long a single request may take, 5 to 60. |
proxyConfiguration | none | Optional. Leave it empty for a normal run. Your own server URLs are used exactly as given. |
📤 What you get back
A real row from a recent run, with the description cut short. The real one runs to several thousand characters:
{
"ok": true,
"_sample": false,
"jobId": "4639821",
"title": "Software Engineer",
"jobUrl": "https://wellfound.com/jobs/4639821-software-engineer",
"companyName": "Checkr",
"companyUrl": "https://wellfound.com/company/checkr",
"companySlug": "checkr",
"companyTagline": "The only background check company using artificial intelligence and machine learning",
"companySize": "SIZE_501_1000",
"companyLogoUrl": "https://photos.wellfound.com/startups/i/395014-2a2164ef6a8cd5954eb970228e62ce15-medium_jpg.jpg?buster=1692326450",
"companyBadges": ["Actively Hiring", "Responds within two weeks", "B2B", "Scale Stage", "Top Investors", "YC Funded", "Valuation $1B+", "Highly rated"],
"primaryRoleTitle": "Software Engineer",
"jobType": "full-time",
"remote": false,
"remoteKind": null,
"locations": ["Denver", "San Francisco"],
"remoteLocations": [],
"compensation": "$150k – $176k",
"salaryText": "$150k – $176k",
"equityText": null,
"yearsExperienceMin": null,
"description": "As a Software Engineer at Checkr, you will work on high-impact engineering projects that help build a fairer future for all. ...",
"postedAt": "2026-08-27T20:06:24.000Z",
"autoPosted": false,
"atsSource": null,
"sourceUrl": "https://wellfound.com/role/software-engineer",
"page": 1,
"scrapedAt": "2026-09-14T05:47:49.550Z"
}
| Field | What it is |
|---|---|
description | The whole description in Markdown, as Wellfound stores it. |
compensation, salaryText, equityText | compensation is Wellfound's raw string, for example $135k – $175k • 0.05% – 0.25%. The other two are that string split in half. Nothing is invented, and nothing is turned into numbers. |
companySize, companyBadges | Wellfound's own enum such as SIZE_11_50, and its own labels such as YC Funded or Top Investors. |
remote, remoteKind, locations, remoteLocations | Whether it is remote, Wellfound's ONSITE_OR_REMOTE or REMOTE_ONLY enum, the office cities, and the countries a remote role accepts. |
postedAt | The exact time the listing went live, in UTC. |
autoPosted, atsSource | Whether it came in from an applicant tracking system, and which one. |
jobId | Stable. Use it as your dedupe key across runs. |
How often each field was filled, measured on a 200-row run on 10 August 2026 across two roles and 83 companies:
| Field | Filled |
|---|---|
title, jobUrl, companyName, companySize, companyBadges, jobType, description, postedAt | 100% |
companyTagline | 97.5% |
compensation, salaryText | 92.5% |
locations | 87.0% |
atsSource | 80.0% |
remoteKind | 28.5% |
yearsExperienceMin | 21.5% |
equityText | 14.5% |
Those move with the roles you pick. Equity is the one to watch: most posters leave it blank, and it is left blank here rather than guessed.
🧾 Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A job | ok: true and _sample: false | yes |
| The sample row | _sample: true and a _notice | no |
| A diagnostic | ok: false, _diagnostic: true and an errorCode | no |
Run it with no role and you get the sample row. It is a real-looking listing, and in the Console's table view it sits there looking like data, so filter on _sample rather than trusting your eyes.
| Code | What it means |
|---|---|
BAD_INPUT | A role or city slug could not be used, either because it could not be read or because Wellfound has no page for it. Check the spelling against the address of the page on Wellfound. |
NO_RESULTS | The role pages were read and no job survived your filters. |
BLOCKED | A listing page never came back after all its attempts. One code covers every cause here, a refusal, a timeout and a server error alike. Run it again. |
A page that fails is one uncharged row, and the run carries on with the rest.
▶️ How to run it
1. Open Wellfound Jobs Scraper and click Try for free. 2. Put one or more role slugs into Role slugs. 3. Add Location slugs, or switch on Remote only, if you want to narrow it. 4. Set Maximum jobs, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.085 per 1,000 jobs. Flat on every Apify plan, no volume tiers.
One charge per unique job row. The same listing found under two roles is billed once, rows dropped by your filters are not billed, and neither is the sample row or a diagnostic row. There is no second charge for the description, because it arrives with the listing.
💡 What people use it for
- Watching who is hiring in a role and a city, on a schedule, and diffing on
jobId. - Building a list of startups that are actively hiring, using
companyBadgesandcompanySize. - Salary research on a role, from the raw
salaryTextacross a few hundred listings. - Feeding whole descriptions into a model to pull out the stack, the seniority or the benefits.
- Finding remote roles that accept your country, using
remoteLocations.
🚧 What it does not do
- No company jobs pages.
wellfound.com/company/<slug>/jobsneeds a Wellfound login, so that
input is not offered rather than offered and broken.
- No recruiter contacts and no candidate profiles. It does not apply to anything either.
- No salary normalisation. Wellfound publishes a string and you get the string, plus its salary
and equity halves.
- The location and keyword filters are plain substring matches, so short keywords keep nearly
everything.
- Only what a role page lists. There is no search box behind this, so a job with an unusual
title may sit under a role you did not think to ask for.
- Rows are a snapshot. A listing can be filled or pulled after it was read, and
postedAttells
you how old it already was.
🧭 Which job scraper do you need?
| If you want | Use |
|---|---|
| Startup jobs from Wellfound, with the full description | This one |
| Jobs in Germany, Austria and Switzerland | XING Jobs Scraper |
| Jobs in Germany, Austria, the UK, the Netherlands or Belgium | StepStone Jobs Scraper |
| Jobs in France | HelloWork Jobs Scraper |
| Hackathons, internships and student jobs in India | Unstop Scraper |
❓ Questions people ask
What is a role slug? The last part of a Wellfound role URL. wellfound.com/role/software-engineer gives you software-engineer. Pasting the whole URL works.
Do I really get the full description? Yes, in Markdown, on every job row. The median in the measured run was 4,663 characters.
How many jobs are on a page? Roughly 40 to 49. Maximum pages per role decides how deep it goes, and deep paging works: page 20 and page 60 both returned jobs in testing.
Can I filter to remote jobs? Switch on Remote only. It uses Wellfound's remote pages and drops anything not flagged remote. Not every role has one, and a role without it comes back as one uncharged BAD_INPUT row.
Why did I get fewer jobs than I asked for? Either the role ran out of pages, or your filters dropped rows. Neither costs you anything. A strict mix of filters can use up Maximum pages per role before it finds enough, so raise that to look deeper.
Is the sample row charged? No, and nor is any diagnostic row.
Is this legal? These are public job listings. They name companies rather than people, but treat anything personal in a description with the same care. Apify's write-up on scraping and the law is a good start, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the role slug you used and the run ID. The errorCode on the diagnostic row usually names the problem on its own.