# Wellfound Jobs Scraper - Startup Jobs, Salary & Equity (`mina_safwat/wellfound-jobs-scraper`) Actor

Scrapes startup jobs from Wellfound (formerly AngelList Talent). Paste a Wellfound role, location or remote jobs link and get every job with salary range, equity, location, remote policy, experience, full description and the startup's name, size, stage and badges.

- **URL**: https://apify.com/mina_safwat/wellfound-jobs-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Wellfound Jobs Scraper do?

**Wellfound Jobs Scraper** collects **startup jobs from [Wellfound](https://wellfound.com)** (formerly AngelList Talent). Paste a Wellfound jobs page, for a role, a role in a city, remote jobs or all jobs in a place, and get every job as a clean row: **title, salary range as numbers with its currency, equity range, locations, remote policy, years of experience, posting date, job type and the full description**. Each job also carries its **startup's name, tagline, size, stage (early, growth, scale or public), logo and badges** such as "YC Funded", "Top Investors" or "Valuation $1B+".

Try it with the prefilled link: open the Actor, click **Start**, and 40 software engineer jobs in San Francisco are ready in a few seconds. Running on the Apify platform also gives you API access, scheduled runs, integrations (Google Sheets, Make, Zapier, Slack, webhooks) and run monitoring.

### Why scrape Wellfound?

- **Startup salary and equity benchmarking.** Wellfound asks startups to show pay and equity. The Actor turns "$100k – $165k • 1.0% – 3.0%" into numbers you can sort and average, in USD, EUR, GBP, INR and every other currency Wellfound shows.
- **Find funded startups that are hiring.** Every job comes with the startup's stage, size and badges, so you can filter for early-stage companies with top investors, or for fast-growing ones.
- **Recruitment and sales leads.** See which startups are hiring for which roles, where and how fast.
- **Job aggregation.** Feed a niche job board, newsletter or Slack channel with fresh startup jobs and full descriptions.
- **Monitoring.** Schedule a daily run on a role or city page and keep only the job IDs you have not seen.

### How to scrape Wellfound jobs

1. Open Wellfound's job pages for a role or a place, for example [wellfound.com/role/l/software-engineer/san-francisco](https://wellfound.com/role/l/software-engineer/san-francisco), [wellfound.com/role/r/product-manager](https://wellfound.com/role/r/product-manager) (remote) or [wellfound.com/location/berlin](https://wellfound.com/location/berlin). You can find them under **Find Jobs** and in Wellfound's "Browse" links at the bottom of every page.
2. Copy the address from your browser's address bar.
3. Paste it into **Wellfound links**. Add as many links as you like, one per line. Single job links work too.
4. Set **Max jobs per link**.
5. Click **Start**, then download the results as JSON, CSV, Excel or HTML.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "startUrls": [
        "https://wellfound.com/role/l/software-engineer/san-francisco",
        "wellfound.com/role/r/data-scientist",
        { "url": "https://wellfound.com/location/london" },
        "https://wellfound.com/jobs/4787364-software-engineer"
    ],
    "maxResults": 100
}
```

| Field | What it does |
|---|---|
| `startUrls` | Wellfound links, one per line (see the table below). `https://` is optional, and API callers can also send `{"url": "…"}` objects. Required. |
| `maxResults` | Stops after this many jobs from each link. A Wellfound page holds about 40 jobs, so 40 reads one page. Single job links always give one job. Default: 100. |

#### Which Wellfound links work?

| Page | Link | Example |
|---|---|---|
| A role, everywhere | `/role/<role>` | `https://wellfound.com/role/data-scientist` |
| A role in a city, region or country | `/role/l/<role>/<place>` | `https://wellfound.com/role/l/software-engineer/san-francisco` |
| Remote jobs for a role | `/role/r/<role>` | `https://wellfound.com/role/r/product-manager` |
| All jobs in a place | `/location/<place>` | `https://wellfound.com/location/berlin` |
| All remote jobs | `/remote` | `https://wellfound.com/remote` |
| One job | `/jobs/<id>-<name>` | `https://wellfound.com/jobs/4787364-software-engineer` |

A link with `?page=3` starts reading from page 3. Links on `www.wellfound.com` and the old `angel.co` address work as well.

Two kinds of Wellfound links **cannot** be read, and are listed in the run's `FAILED_INPUTS` record with the reason instead:

- **Company pages** (`/company/<name>` and `/company/<name>/jobs`) sit behind Wellfound's Cloudflare security check.
- **The job search** at `/jobs?…` with your own filters needs a login and a captcha. Use the role and place pages above instead: they hold the same jobs.

### Output

Each job becomes one row. Here is a real one from the prefilled link, with the description shortened:

```json
{
    "jobId": "3272257",
    "title": "Software Engineer",
    "jobUrl": "https://wellfound.com/jobs/3272257-software-engineer",
    "role": "Software Engineer",
    "jobType": "full-time",
    "compensation": "$130k – $210k • 0.05% – 0.2%",
    "salaryMin": 130000,
    "salaryMax": 210000,
    "currency": "USD",
    "equity": "0.05% – 0.2%",
    "equityMinPercent": 0.05,
    "equityMaxPercent": 0.2,
    "locations": [
        "San Francisco"
    ],
    "remote": false,
    "remoteKind": "ONSITE",
    "acceptedRemoteLocations": [],
    "experienceMinYears": 1,
    "postedAt": "2026-08-21T16:30:58Z",
    "companyName": "Agave API",
    "companySlug": "agave-api",
    "companyUrl": "https://wellfound.com/company/agave-api",
    "companyTagline": "Field and finance, finally in sync",
    "companySize": "11-50",
    "companyStage": "Early Stage",
    "companyLogo": "https://photos.wellfound.com/startups/i/8975809-f5a0e955b727f464139fce4f861b53ec-medium_jpg.jpg?buster=1657053965",
    "companyBadges": [
        "Actively Hiring",
        "Top 10% of responders",
        "Responds within a few days",
        "Early Stage",
        "Top Investors",
        "YC Funded"
    ],
    "description": "## About the role\n\n**tl;dr**: Fresh off a $15M Series A led by Accel (total funding now $20M+), Agave is experiencing hockey-stick growth. We're looki...",
    "descriptionText": "About the role\n\ntl;dr: Fresh off a $15M Series A led by Accel (total funding now $20M+), Agave is experiencing hockey-stick growth. We're looking for...",
    "sourceUrl": "https://wellfound.com/role/l/software-engineer/san-francisco",
    "scrapedAt": "2026-10-11T07:42:54Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. The Output tab has two views: **Jobs** (the main columns) and **Full details**.

### Data fields

| Field | Description |
|---|---|
| `jobId` | Wellfound's job ID, the number in the job's link. |
| `title` | Job title. |
| `jobUrl` | Link to the job on Wellfound. |
| `role` | The job's main role as Wellfound files it, for example "Software Engineer" or "DevOps". Empty for single job links, whose page does not show it. |
| `jobType` | `full-time`, `contract`, `internship` or `cofounder`. |
| `compensation` | Pay and equity exactly as Wellfound shows them, for example "$100k – $165k • 1.0% – 3.0%". Empty when the job shows neither. |
| `salaryMin`, `salaryMax` | The yearly pay range as whole numbers, for example 100000 and 165000. "k" means thousands and Indian "L" (lakh) means 100,000. Empty when no pay is shown. |
| `currency` | The pay's currency code, such as `USD`, `EUR`, `GBP`, `INR`, `CAD` or `AUD`. |
| `equity` | The equity as shown: a range such as "1.0% – 3.0%", or "No equity". Empty when the job does not say. |
| `equityMinPercent`, `equityMaxPercent` | The equity range as numbers, in percent (1.0 means 1%). Empty for "No equity" and when not shown. |
| `locations` | The places the job is based in, for example \["New York City", "San Francisco"]. Remote jobs can list a base city or country too, for example \["United States"]. Empty only when Wellfound names no place. |
| `remote` | `true` when the job can be done remotely. |
| `remoteKind` | The employer's remote policy as Wellfound names it: `ONSITE`, `REMOTE` or `ONSITE_OR_REMOTE`. Empty when the employer did not set one (about half of jobs); `remote` is always filled. |
| `acceptedRemoteLocations` | Where remote applicants may live, for example \["United States"]. Empty when there is no limit or the job is not remote. |
| `experienceMinYears` | The minimum years of experience asked for. Empty when not given. |
| `postedAt` | When the job was posted, in UTC (ISO 8601). |
| `companyName`, `companySlug`, `companyUrl` | The startup, its short name on Wellfound and its Wellfound page. |
| `companyTagline` | The startup's one-line pitch. |
| `companySize` | Number of employees as a range: `1-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1001-5000` or `5000+`. |
| `companyStage` | `Early Stage`, `Growth Stage`, `Scale Stage` or `Public Stage`. Empty for single job links and startups without one. |
| `companyLogo` | The startup's logo. |
| `companyBadges` | Wellfound's badges for the startup, for example "YC Funded", "Top Investors", "Valuation $1B+", "Growing fast", "B2B", "Actively Hiring" or "Responds within a week". Empty for single job links. |
| `description` | The full job description in Markdown (bold, links and lists kept). |
| `descriptionText` | The same description as plain text. |
| `sourceUrl` | The link you pasted that found this job. |
| `scrapedAt` | When the job was collected, in UTC. |

### How much does it cost to scrape Wellfound?

The Actor uses **pay-per-event** pricing: you pay a small fixed price for each job saved, and the exact price is on the **Pricing** tab. Full descriptions and startup details are included at no extra charge.

You are never charged for links that return nothing: a page with no jobs, a role or place Wellfound does not know, or a link it cannot read is listed in the run's `FAILED_INPUTS` record instead. If you set a maximum cost for a run, the Actor stops as soon as it is reached.

### Tips for scraping Wellfound

- **Pick the narrowest page.** `/role/l/<role>/<place>` gives you only the jobs you want, so you pay only for those.
- **How many jobs can a page give?** Wellfound lists 20 startups per page with up to 3 of each startup's matching jobs, so a full page holds about 25–55 jobs. The totals Wellfound states (for example "771 jobs") also count the extra jobs of startups with more than 3 openings, so the Actor collects somewhat fewer jobs than the stated total. To reach a startup's other jobs, add links for its other roles or places.
- **Monitor new jobs.** Schedule the Actor to run daily on the same links and drop job IDs you already have. Wellfound's pages can be up to about a day old.
- **Each job is saved once per run**, even when several of your links list it.
- **Speed.** About 1,000 jobs take well under a minute.

### FAQ, disclaimers and support

**Why can't I scrape a company's page?** Wellfound puts company pages behind a Cloudflare security check that only a real browser passes. Single job links and the role and place pages are not behind it, and they carry the startup's name, tagline, size, stage and badges.

**What happens with a role or place Wellfound doesn't know?** Wellfound then sends the link elsewhere (for example from `/role/l/software-engineer/atlantis` to `/role/software-engineer`) or shows "page not found". The Actor does not follow it, so you never get jobs you did not ask for: the link is listed in `FAILED_INPUTS` with the address Wellfound suggested.

**What happens to links that return nothing?** They are not saved as rows, so you are not charged for them. Each is listed with its reason in the `FAILED_INPUTS` record of the run's key-value store, and the run's status message gives the counts. A run fails only when Wellfound could not be reached for any of your links. If Wellfound stops answering partway through a link, the jobs read so far are kept and the status message says how many links stopped early.

**Is it legal to scrape Wellfound?** This Actor collects job listings that startups publish publicly so that people can find and apply for them. It does not log in and collects no candidate data. Wellfound's robots.txt asks crawlers to stay away from its search pages; this Actor reads only the public role, place and job pages. Job descriptions can still contain recruiters' names and contact details written by the employer, and their text is the employer's. You are responsible for making sure your use complies with Wellfound's terms and with the laws that apply to you, such as privacy and copyright rules for republishing listings. If in doubt, ask a lawyer.

**Found a problem or need something custom?** Open an issue on the **Issues** tab and we will look into it. Custom scrapers and job data feeds are available on request.

# Actor input Schema

## `startUrls` (type: `array`):

One link per line. Paste a Wellfound jobs page: a role (https://wellfound.com/role/data-scientist), a role in a place (https://wellfound.com/role/l/software-engineer/san-francisco), remote jobs for a role (https://wellfound.com/role/r/product-manager), all jobs in a place (https://wellfound.com/location/berlin) or all remote jobs (https://wellfound.com/remote). Single job links (https://wellfound.com/jobs/4787364-software-engineer) work too, and links without https:// are fine. Company pages (/company/...) and the logged-in search (/jobs?...) cannot be read; they are listed in the FAILED_INPUTS record.

## `maxResults` (type: `integer`):

Stops after this many jobs from each link. A Wellfound page holds about 40 jobs (20 startups with up to 3 jobs each), so 40 reads one page. Single job links always give one job.

## Actor input object example

```json
{
  "startUrls": [
    "https://wellfound.com/role/l/software-engineer/san-francisco"
  ],
  "maxResults": 40
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://wellfound.com/role/l/software-engineer/san-francisco"
    ],
    "maxResults": 40
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/wellfound-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://wellfound.com/role/l/software-engineer/san-francisco"],
    "maxResults": 40,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/wellfound-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://wellfound.com/role/l/software-engineer/san-francisco"
  ],
  "maxResults": 40
}' |
apify call mina_safwat/wellfound-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mina_safwat/wellfound-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hzzJnCZ0wYkcu2999/builds/sbwyZ91qlb8DCxbbJ/openapi.json
