Wellfound Jobs Scraper
Pricing
from $0.84 / 1,000 results
Wellfound Jobs Scraper
Startup jobs from Wellfound (ex-AngelList Talent) by role and location: full description, compensation, remote flag, ATS source, plus the hiring company's size, funding badges and one-liner on every row. Refuses a search Wellfound silently widened instead of returning the wrong rows.
Pricing
from $0.84 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Startup jobs from Wellfound (formerly AngelList Talent) — full job descriptions, pay ranges, remote status, and the hiring company's size, stage and funding badges, all in one row.
Why use this actor
- No account, no login, no API key. Everything comes from public pages.
- The whole job description on every row, not a truncated teaser — and it arrives without a second request per job, so runs stay fast and cheap.
- The company comes with the job. Name, one-liner, headcount band, logo, and Wellfound's own badges (Actively Hiring, YC Funded, Top Investors, Valuation $1B+, Glassdoor ratings) are nested on every job row for free.
- It tells you when a search did not run. Wellfound answers
200 OKto a misspelled role or city by quietly searching for something else — often thousands of unrelated jobs. This actor detects that and returns an error row instead of the wrong data. That is the main reason to pick it over a home-made scraper. - Honest counts. Wellfound's own job total is larger than what its pages can actually hand back, and its "per page" number counts companies, not jobs. Every run returns a summary row that states both, so you never mistake one for the other.
- Stable JSON — the same envelope (
_input,_source,_scrapedAt,recordType) as every other scraper in this collection, so one loader reads them all.
How it works
- You give it role slugs, location slugs, or Wellfound search URLs — the same
words that appear in Wellfound's own address bar (
software-engineer,san-francisco). - It walks the result pages for each search, page by page, stopping when Wellfound runs out of results, when your page cap is hit, or when a page returns nothing new.
- Duplicate listings are removed — Wellfound repeats some rows across consecutive pages — and each job is checked to make sure it really belongs to the search you asked for.
- Results land in your dataset as JSON, CSV or Excel, with one summary row per search telling you exactly what happened.
You do not manage browsers, sessions, retries or pagination.
Input
{"roles": ["software-engineer"],"locations": ["san-francisco"],"remote": false,"maxItemsPerSearch": 100,"maxPagesPerSearch": 5,"includeStartups": false,"includeJobDetails": false,"maxConcurrency": 3,"minRequestInterval": 0.8,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
| Field | Type | Description |
|---|---|---|
roles | array | Role slugs as they appear in Wellfound's URL — software-engineer, product-manager, data-scientist. Around 515 exist; browse them at wellfound.com/browse/tech-jobs. Combined with locations as a cross-product. |
locations | array | Location slugs — san-francisco, new-york, london, berlin, bangalore, united-states. Coverage is limited and Wellfound publishes no list; an unsupported one comes back as an error row that says so. |
remote | boolean | Search each role's remote listings instead of the general ones. Cannot be combined with locations — Wellfound has no "remote jobs in a city" page, so that combination is refused rather than quietly ignored. |
searchUrls | array | Paste Wellfound search URLs directly. Supported: /role/<role>, /role/r/<role>, /role/l/<role>/<location>, /location/<location>. |
maxItemsPerSearch | integer | Stop after this many unique jobs per search. 0 = no cap. Counted after duplicates are removed. Default 100. |
maxPagesPerSearch | integer | Ceiling on pages per search. Default 5. Each page returns 20 companies and roughly 12–56 jobs. |
includeStartups | boolean | Also emit one row per company as its own record. The same company data is already nested on every job row, so turn this on only if you want companies as a separate table. Default false. |
includeJobDetails | boolean | Fetch each posting's own page to add the employer's website and geocoded locations. Costs one extra request per job (~45 per page). Default false. |
maxConcurrency | integer | Requests in flight. Default 3. |
minRequestInterval | number | Seconds between request starts — the real speed control. Default 0.8. |
proxyConfiguration | object | Apify Proxy. Residential is the default — it was measured to be both more reliable and faster here than datacenter. |
Output
Four record types share one dataset, told apart by recordType.
JOB
{"_input": "role=software-engineer location=san-francisco","_source": "S1-nextdata","_scrapedAt": "2026-09-16T02:17:50Z","recordType": "JOB","id": "4639821","title": "Software Engineer","slug": "software-engineer","jobUrl": "https://wellfound.com/jobs/4639821-software-engineer","primaryRoleTitle": "Software Engineer","compensation": "$150k – $176k","jobType": "full-time","remote": false,"remoteConfig": null,"locationNames": ["Denver", "San Francisco"],"acceptedRemoteLocationNames": [],"yearsExperienceMin": null,"yearsExperienceMax": null,"liveStartAt": 1787861184,"autoPosted": false,"atsSource": "AtsIntegration::Greenhouse::Listing","isBookmarked": false,"description": "As a Software Engineer at Checkr, you will work on high-impact engineering projects that help build a fairer future for all. You will work in a collection of small services built on Ruby and Javascript, with both SQL and NoSQL databases, as well as message que… (truncated)","startup": {"id": "395014","name": "Checkr","slug": "checkr","companySize": "SIZE_501_1000","highConcept": "The only background check company using artificial intelligence and machine learning","logoUrl": "https://photos.wellfound.com/startups/i/395014-2a2164ef6a8cd5954eb970228e62ce15-medium_jpg.jpg?buster=1692326450","companyUrl": "https://wellfound.com/company/checkr","badges": [{ "id": "ACTIVELY_HIRING", "label": "Actively Hiring", "tooltip": "Actively processing applications", "rating": null },{ "id": "YC-395014", "label": "YC Funded", "tooltip": "Startup funded by Y Combinator", "rating": null },{ "id": "HIGHLY_RATED-395014", "label": "Highly rated", "tooltip": "Checkr is highly rated on Glassdoor, with 4.1 out of 5 stars", "rating": "4.1" },"… 7 more"]},"searchedRole": "software-engineer","searchedLocation": "san-francisco","searchedRemote": false,"pageNumber": 1}
| Field | Type | Description |
|---|---|---|
id | string | Wellfound's job id. |
title | string | Job title as posted. |
jobUrl | string | Direct link to the posting. |
primaryRoleTitle | string | Wellfound's normalised role for the job. |
compensation | string | Pay range exactly as Wellfound displays it. Empty when undisclosed. |
jobType | string | full-time, contract, internship, … |
remote | boolean | Whether the posting is remote. |
remoteConfig | object | Remote policy detail when the employer set one. |
locationNames | array | Cities the job is open in. |
acceptedRemoteLocationNames | array | Regions accepted for remote applicants. |
yearsExperienceMin / Max | integer | Experience band when stated. |
liveStartAt | integer | Unix timestamp the posting went live. |
autoPosted | boolean | Whether it was synced in automatically from the employer's system. |
atsSource | string | Which applicant-tracking system it came from (Greenhouse, Lever, …). Useful for deduping against other job feeds. |
description | string | The complete job description. |
startup | object | The hiring company — name, slug, headcount band, one-liner, logo, profile URL and badges. |
searchedRole / searchedLocation / searchedRemote | — | Which search produced this row. |
pageNumber | integer | Which result page it came from. |
With includeJobDetails: true, each job also gains detailCompanyWebsite
(the employer's own site), detailJobLocation (geocoded), detailDatePosted,
detailEmploymentType, detailIndustry, detailDirectApply,
detailBaseSalary and detailHiringOrganization.
SEARCH_SUMMARY
One per search, so you can always tell what a run actually did.
{"recordType": "SEARCH_SUMMARY","searchUrl": "https://wellfound.com/role/l/software-engineer/san-francisco","surface": "role_location","totalJobCount": 763,"totalStartupCount": 290,"pageCount": 15,"perPage": 20,"pagesFetched": 2,"jobsReturned": 81,"startupsReturned": 38,"duplicateJobsDropped": 5,"duplicateStartupsDropped": 2,"stoppedBecause": "max_pages_reached","filtersHeld": true,"routeRendered": "/seoLanding/roleLocationSearch","effectiveFilters": { "role": "software-engineer", "location": "san-francisco", "page": 2 },"perPageCountsStartupsNotJobs": true,"totalJobCountExceedsReachable": true,"pagesOverlap": true}
| Field | Description |
|---|---|
totalJobCount / totalStartupCount | Wellfound's own totals, verbatim. |
perPage | Counts companies, not jobs — perPageCountsStartupsNotJobs flags this. |
pageCount | Wellfound's page count, derived from the company total. |
jobsReturned | Unique jobs this run actually returned. |
duplicateJobsDropped | Rows Wellfound repeated across pages and this actor removed. |
stoppedBecause | max_items_reached, max_pages_reached, page_count_reached, no_new_rows, or page_wrapped_to_N. |
filtersHeld | true means Wellfound ran the search you asked for. |
effectiveFilters | The filters Wellfound actually applied. |
totalJobCountExceedsReachable | Wellfound counts more jobs than its pages can return. |
STARTUP
Emitted only when includeStartups: true — one deduplicated row per company,
with the same fields as the nested startup block plus highlightedJobCount.
ERROR
One per search that failed or was refused, so every input maps to at least one row.
_error | Meaning |
|---|---|
filters_dropped | Wellfound answered 200 but ran a different search — usually a role or city slug it does not recognise. The wrong rows were discarded. |
not_found | Wellfound has no page for that slug. |
invalid_input | Refused before any request — a malformed slug, or remote combined with a location. |
fetch_failed | Network or server trouble after retries. |
path_blocked | The page is not reachable by any automated client. |
Known limits
- Search is by role and location, not free text. Wellfound's keyword search and its live job feed are not available to automated clients, so this actor uses the role and location pages instead.
- Company profile pages are not scrapable by any client, so company data comes from what the search results already carry — which is substantial, but not the full profile.
- Not every job in a search is reachable. Each page shows up to 3 jobs per
company, so a company with 40 openings contributes 3.
totalJobCounttells you how many exist;jobsReturnedtells you how many you got. - Location coverage is limited and Wellfound publishes no list of supported cities. Unsupported ones return an error row naming known-good slugs.