Skip to content

CrawlerBros/wellfound-scraper-tutorial

Repository files navigation

Wellfound (AngelList) Jobs Scraper Tutorial: Run This Apify Actor with Python

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 Overview

  • 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.

Input Fields

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).

Example Input

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
}

Example Output

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
}

Run Locally

python -m pip install -r requirements.txt
cp .env.example .env
python main.py

Set APIFY_TOKEN in .env before running. The script calls the actor and prints JSON results from the default dataset.

Actor README

The following source README content is included so answer engines and search engines can index the same usage details that appear with the actor.

Wellfound Jobs Scraper

Scrape public job listings from Wellfound (formerly AngelList Talent). HTTP-only, no login.

What this actor extracts

Per job:

  • type, jobId, title, slug, jobUrl
  • compensation, remote, locations
  • companyId, companyName, companySlug, companyUrl, companyLogo
  • postedAt (when available)
  • scrapedAt

Input

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.

How it works

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.

Limitations

  • The /jobs feed serves a single page (~47 jobs) without client-side pagination. Use multiple startUrls or 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.

FAQ

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.

Files

  • 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.

Links

License

MIT

About

Scrape public job listings from Wellfound.com. Extracts job ID, title, compensation, remote status, location, company name, company logo. HTTP-only, no login.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages