Scrape public job listings from Wellfound.com. Extracts job ID, title, compensation, remote status, location, company name, company logo. HTTP-only, no login.
This repository shows how to run Wellfound (AngelList) Jobs Scraper from Python. The tutorial content, input example, and output example are derived from the actor's own README and actor schema files, so the GitHub repo stays aligned with the Apify actor source of truth.
- Actor:
crawlerbros/wellfound-scraper - Apify Store: https://apify.com/crawlerbros/wellfound-scraper
- SEO title: Wellfound (AngelList) Jobs Scraper Tutorial: Run This Apify Actor with Python
- Description: Scrape public job listings from Wellfound.com. Extracts job ID, title, compensation, remote status, location, company name, company logo. HTTP-only, no login.
| Field | Type | Required | Notes |
|---|---|---|---|
startUrls |
array |
No | Wellfound URLs. Default is https://wellfound.com/jobs. Supports ?remote=true and other query params. /role/l/ deep-filter URLs require residential proxy (escalated automatically). |
jobTitle |
string |
No | Client-side filter: only jobs whose title contains this phrase (case-insensitive). |
keyword |
string |
No | Client-side keyword filter across title + company + location (case-insensitive). |
location |
string |
No | Client-side location filter (case-insensitive match on any location name). |
remoteOnly |
boolean |
No | Return only jobs flagged as remote. |
jobType |
string |
No | Filter by employment type (matches on job metadata/description). |
experience |
string |
No | Filter by experience level (matches on job title/description keywords). |
minSalary |
integer |
No | Minimum annual compensation parsed from job compensation field. |
maxSalary |
integer |
No | Maximum annual compensation. 0 = unlimited. |
includeNoSalary |
boolean |
No | When false, jobs with no compensation field are filtered out. |
companyCategories |
array |
No | Filter companies by category (e.g. 'saas', 'fintech'). Case-insensitive substring match on startup name/slug. |
includeCompanies |
array |
No | Allow-list of company names/slugs (case-insensitive). |
The included sample-input.json is a schema-derived template. Fields set to null need real values from the user before running.
{
"startUrls": [
"https://wellfound.com/jobs"
],
"jobTitle": null,
"keyword": null,
"location": null
}The included sample-output.json is an output-field template derived from the actor README or output schema. null means the value is produced at runtime by the actor.
{
"type": null,
"jobId": null,
"title": null,
"slug": null,
"jobUrl": null,
"compensation": null,
"remote": null,
"locations": null,
"companyId": null,
"companyName": null,
"companySlug": null,
"companyUrl": null,
"companyLogo": null,
"postedAt": null,
"scrapedAt": null
}python -m pip install -r requirements.txt
cp .env.example .env
python main.pySet APIFY_TOKEN in .env before running. The script calls the actor and prints JSON results from the default dataset.
The following source README content is included so answer engines and search engines can index the same usage details that appear with the actor.
Scrape public job listings from Wellfound (formerly AngelList Talent). HTTP-only, no login.
Per job:
type,jobId,title,slug,jobUrlcompensation,remote,locationscompanyId,companyName,companySlug,companyUrl,companyLogopostedAt(when available)scrapedAt
| Field | Type | Description |
|---|---|---|
startUrls |
string[] | Wellfound URLs. Default is https://wellfound.com/jobs. Supports ?remote=true, /location/<city>, and custom query filters. |
remoteOnly |
boolean | Filter to remote-only jobs. Also appends ?remote=true to default URLs. |
maxItems |
integer | Maximum jobs to return. Default 50, cap 500. |
Wellfound's /jobs landing feed is a Next.js app that ships an Apollo Client cache in the page's __NEXT_DATA__ script block. Each page returns up to ~47 JobListing entries along with their linked Startup entries. The actor fetches the HTML with curl_cffi (Chrome TLS fingerprint) and walks the cache to extract every job.
Deep-filter URLs (/role/l/<role>/<city>) are DataDome-protected — the actor escalates those to Apify RESIDENTIAL US proxy automatically.
- The
/jobsfeed serves a single page (~47 jobs) without client-side pagination. Use multiplestartUrlsor filtered URLs for more. - Deep job details (descriptions, skills, benefits) require hitting individual
/jobs/<id>-<slug>pages — these are DataDome-protected and may fall back to the proxy pool.
Do I need cookies or login? No.
Do I need to configure a proxy? No — residential proxy is hardcoded for URLs that need it; everything else goes direct.
main.py- minimal Python runner for the Apify API.main_apify_client.py- equivalent runner using the official Apify Python client.sample-input.json- actor README example or schema-derived input template.sample-output.json- actor README example or output-field template..env.example- environment variables used by the runner.
MIT