Wellfound Jobs Scraper avatar

Wellfound Jobs Scraper

Pricing

from $0.84 / 1,000 results

Go to Apify Store
Wellfound Jobs Scraper

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

Ibnu Adzim

Maintained by Community

Actor 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 OK to 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

  1. 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).
  2. 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.
  3. 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.
  4. 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"] }
}
FieldTypeDescription
rolesarrayRole 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.
locationsarrayLocation 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.
remotebooleanSearch 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.
searchUrlsarrayPaste Wellfound search URLs directly. Supported: /role/<role>, /role/r/<role>, /role/l/<role>/<location>, /location/<location>.
maxItemsPerSearchintegerStop after this many unique jobs per search. 0 = no cap. Counted after duplicates are removed. Default 100.
maxPagesPerSearchintegerCeiling on pages per search. Default 5. Each page returns 20 companies and roughly 12–56 jobs.
includeStartupsbooleanAlso 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.
includeJobDetailsbooleanFetch 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.
maxConcurrencyintegerRequests in flight. Default 3.
minRequestIntervalnumberSeconds between request starts — the real speed control. Default 0.8.
proxyConfigurationobjectApify 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
}
FieldTypeDescription
idstringWellfound's job id.
titlestringJob title as posted.
jobUrlstringDirect link to the posting.
primaryRoleTitlestringWellfound's normalised role for the job.
compensationstringPay range exactly as Wellfound displays it. Empty when undisclosed.
jobTypestringfull-time, contract, internship, …
remotebooleanWhether the posting is remote.
remoteConfigobjectRemote policy detail when the employer set one.
locationNamesarrayCities the job is open in.
acceptedRemoteLocationNamesarrayRegions accepted for remote applicants.
yearsExperienceMin / MaxintegerExperience band when stated.
liveStartAtintegerUnix timestamp the posting went live.
autoPostedbooleanWhether it was synced in automatically from the employer's system.
atsSourcestringWhich applicant-tracking system it came from (Greenhouse, Lever, …). Useful for deduping against other job feeds.
descriptionstringThe complete job description.
startupobjectThe hiring company — name, slug, headcount band, one-liner, logo, profile URL and badges.
searchedRole / searchedLocation / searchedRemote—Which search produced this row.
pageNumberintegerWhich 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
}
FieldDescription
totalJobCount / totalStartupCountWellfound's own totals, verbatim.
perPageCounts companies, not jobs — perPageCountsStartupsNotJobs flags this.
pageCountWellfound's page count, derived from the company total.
jobsReturnedUnique jobs this run actually returned.
duplicateJobsDroppedRows Wellfound repeated across pages and this actor removed.
stoppedBecausemax_items_reached, max_pages_reached, page_count_reached, no_new_rows, or page_wrapped_to_N.
filtersHeldtrue means Wellfound ran the search you asked for.
effectiveFiltersThe filters Wellfound actually applied.
totalJobCountExceedsReachableWellfound 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.

_errorMeaning
filters_droppedWellfound answered 200 but ran a different search — usually a role or city slug it does not recognise. The wrong rows were discarded.
not_foundWellfound has no page for that slug.
invalid_inputRefused before any request — a malformed slug, or remote combined with a location.
fetch_failedNetwork or server trouble after retries.
path_blockedThe 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. totalJobCount tells you how many exist; jobsReturned tells 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.