Scrapers

Wellfound companies

Company plus jobs scraper for Wellfound (formerly AngelList Talent). Uses an anti-fingerprint Firefox engine to defeat DataDome and Cloudflare in one pass. Reads the Apollo and Next data blobs embedded in the page rather than walking the rendered DOM.

Updated today

Overview

At a glance
Worker
ultron-wellfound-jobs
Runtime
Python, anti-fingerprint Firefox engine, headless by default
Targets
wellfound.com/company/<slug>
Defenses
DataDome + Cloudflare. Both defeated by the same browser.
Proxy
Residential US (mandatory)
Default delay
3000 ms, +50% jitter

Input schema

.actor/INPUT_SCHEMA.jsonjson
1{
2 "companySlugs": ["openai", "anthropic", "linear"],
3 "headless": true,
4 "proxyConfiguration": {
5 "useApifyProxy": true,
6 "apifyProxyGroups": ["RESIDENTIAL"],
7 "apifyProxyCountry": "US"
8 },
9 "requestDelayMs": 3000
10}

Crawl flow

src/__main__.pypy
1# Per slug:
2# 1. URL = f"https://wellfound.com/company/{slug}"
3# 2. Open URL in the anti-fingerprint browser. Wait for the page to
4# fully render so Next has populated the data blobs.
5# 3. Read window.__APOLLO_STATE__ via page.evaluate. This is the
6# canonical source for company + jobs metadata.
7# 4. Fall back to __NEXT_DATA__ when Apollo is missing for an account.
8# 5. Push kind="company" with the canonical fields.
9# 6. For every job in the Apollo cache, push kind="job" with role
10# + comp + location + remoteOk + applyUrl.
11# 7. Sleep requestDelayMs + 50% jitter between company pages.

Output shape

dataset-row.jsonjson
1// kind === "company"
2{
3 "kind": "company",
4 "source": "wellfound",
5 "slug": "linear",
6 "name": "Linear",
7 "tagline": "The issue tracker you will enjoy using.",
8 "employeeRange": "51-200",
9 "fundingStage": "Series C",
10 "totalRaisedUsd": 130000000,
11 "hqLocation": "San Francisco, CA",
12 "remotePolicy": "Remote-first",
13 "tech": ["TypeScript", "React", "Postgres"],
14 "scrapedAt": "2026-05-19T12:00:00Z"
15}
16
17// kind === "job"
18{
19 "kind": "job",
20 "source": "wellfound",
21 "companySlug": "linear",
22 "jobId": "j-9382",
23 "title": "Senior Backend Engineer",
24 "location": "Remote, US-only",
25 "remoteOk": true,
26 "salaryMinUsd": 180000,
27 "salaryMaxUsd": 240000,
28 "equityMinBps": 10,
29 "equityMaxBps": 50,
30 "applyUrl": "https://wellfound.com/jobs/9382-...",
31 "publishedAt": "2026-05-12T00:00:00Z"
32}

Anti-bot strategy

DefenseCounter
DataDome challengeAnti-fingerprint browser carries enough real DOM signal.
Cloudflare bot scoringSame browser, residential US IP, no automation signals.
__APOLLO_STATE__ obfuscation (occasional)Fall back to __NEXT_DATA__ which exposes the same fields.
Per-IP throttling3000 ms floor, jittered. Empirically stable.

Webhook contract

actor.jsonjson
1{
2 "eventTypes": ["ACTOR.RUN.SUCCEEDED", "ACTOR.RUN.FAILED", "ACTOR.RUN.TIMED_OUT", "ACTOR.RUN.ABORTED"],
3 "requestUrl": "https://scraper-webhook.51ultron.com/apify",
4 "payload": { "actorName": "wellfound-jobs", "source": "wellfound", "datasetId": "<id>" }
5}

File map

actors/wellfound-jobs
.actor
actor.json
INPUT_SCHEMA.json
src
__main__.py
Dockerfile
requirements.txt
README.md