# Wellfound All-in-One API (`romy/wellfound-all-in-one-api`) Actor

Always-on REST API for Wellfound (AngelList) startup jobs: browse by role, location or both, remote-only, and full job detail with structured salary. No login, no browser.

- **URL**: https://apify.com/romy/wellfound-all-in-one-api.md
- **Developed by:** [Romy](https://apify.com/romy) (community)
- **Categories:** Jobs, Developer tools
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.78 / 1,000 job listing items

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Wellfound All-in-One API

Unofficial, always-on REST API for Wellfound (wellfound.com, formerly AngelList
Talent) startup job listings: browse by role, by location, by both together,
remote-only, or fetch full job detail. No account, login, app or device
needed for any endpoint here.

### Why

Wellfound has no public JSON API -- this wraps its own server-rendered pages,
verified live (2026-09-23) from a home IP and from Apify's own direct,
datacenter and residential proxy IPs. Every filter below was live-tested and
classified as a real filter or confirmed non-existent before being exposed
here -- nothing is guessed from the UI alone.

- **Role and location slugs are open, not a curated list.** Wellfound's nav
  only links ~12 roles and ~10 locations, but arbitrary slugs work fine --
  verified live with `backend-engineer`, `devops-engineer`, `kubernetes`,
  `berlin`, `toronto`, and more. A slug is the lowercase, hyphenated form of
  the role/location name; an unrecognized one 404s.
- **The combined role+location filter is real**, but it lives at a different
  URL shape than you'd guess: `/role/l/:role/:location`, not a query string.
  Query-string filters (`?role=`, `?location=` on `/jobs` or on `/role/r/:slug`)
  were live-tested and confirmed **inert** -- silently ignored, not an error --
  so this API doesn't offer them.
- **Remote-only is role-specific, not location-specific.** `/role/r/:slug`
  (a real, separately-paginated subset) exists; the equivalent for location
  (`/location/r/:slug`) does not -- live-tested, 404. Use `/jobs/remote` for
  global remote listings across every role instead.
- **No salary/equity/job-type/experience/company-stage filter parameters
  exist** as crawlable URLs -- checked directly in the page UI, not assumed.
  Those only exist in Wellfound's interactive client-side search, which is
  gated by a Cloudflare Turnstile challenge and out of scope here.
- **Company profile pages are not available.** `wellfound.com/company/:slug`
  returns 403 on every IP tier tested, including residential from a home
  network. Job detail responses still carry company name, website and logo
  (from the job's own embedded structured data), just not company
  size/funding/about-page content.
- **Job detail is parsed from real structured data**, not fragile HTML
  scraping: every job page embeds a schema.org `JobPosting` JSON-LD block
  (full description, structured salary, employment type, company info,
  date posted) that this API parses directly.

### Endpoints

#### Jobs

##### `GET /jobs/by-role`

One page of job listings for a role slug (any location, or remote-only with `remoteOnly=true`). Each item is a listing-level summary (title, company, salary/equity range, location text, employment type, posted date) -- call /job for the full description and structured salary from any given result.

| Param        | Required | Description                                                                                                                                                                                                                                                                                                                                                                 |
| ------------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `slug`       | yes      | Role slug, as it appears in a Wellfound "Jobs by Role" URL (wellfound.com/role/ROLE). Not limited to a curated list -- live-verified 2026-09-23 that arbitrary slugs work (e.g. "backend-engineer", "devops-engineer", "kubernetes", "berlin", "toronto"), derived by lowercasing the title and joining words with hyphens. An unrecognized slug returns 404, not an error. |
| `page`       | no       | Listing page number, 1-based (default 1). Popular role/location combinations can run 40-90+ pages.                                                                                                                                                                                                                                                                          |
| `remoteOnly` | no       | If true, only remote-eligible jobs for this role (maps to wellfound.com/role/r/ROLE, a real, separately-paginated subset -- roughly half the page count of the non-remote-filtered listing for the same role, verified live). Default false (all jobs for the role, any location).                                                                                          |

Billed per item returned (`job-listing-scraped` event); an empty result is free.

##### `GET /jobs/by-location`

One page of job listings for a location slug (any role). There is no remote-only variant of this endpoint -- live-verified: wellfound.com/location/r/SLUG 404s. Use /jobs/remote for global remote jobs.

| Param  | Required | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `slug` | yes      | Location slug, as it appears in a Wellfound "Jobs by Location" URL (wellfound.com/location/LOCATION). Global, not US-only (e.g. "berlin", "singapore", "toronto" all verified working). Not limited to a curated list -- live-verified 2026-09-23 that arbitrary slugs work (e.g. "backend-engineer", "devops-engineer", "kubernetes", "berlin", "toronto"), derived by lowercasing the title and joining words with hyphens. An unrecognized slug returns 404, not an error. |
| `page` | no       | Listing page number, 1-based (default 1). Popular role/location combinations can run 40-90+ pages.                                                                                                                                                                                                                                                                                                                                                                            |

Billed per item returned (`job-listing-scraped` event); an empty result is free.

##### `GET /jobs/by-role-location`

One page of job listings for a role AND a location together (wellfound.com/role/l/ROLE/LOCATION). This is a real, separately-paginated combined filter -- not a client-side intersection of two calls.

| Param      | Required | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ---------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `role`     | yes      | Role slug, as it appears in a Wellfound "Jobs by Role" URL (wellfound.com/role/ROLE). Not limited to a curated list -- live-verified 2026-09-23 that arbitrary slugs work (e.g. "backend-engineer", "devops-engineer", "kubernetes", "berlin", "toronto"), derived by lowercasing the title and joining words with hyphens. An unrecognized slug returns 404, not an error.                                                                                                   |
| `location` | yes      | Location slug, as it appears in a Wellfound "Jobs by Location" URL (wellfound.com/location/LOCATION). Global, not US-only (e.g. "berlin", "singapore", "toronto" all verified working). Not limited to a curated list -- live-verified 2026-09-23 that arbitrary slugs work (e.g. "backend-engineer", "devops-engineer", "kubernetes", "berlin", "toronto"), derived by lowercasing the title and joining words with hyphens. An unrecognized slug returns 404, not an error. |
| `page`     | no       | Listing page number, 1-based (default 1). Popular role/location combinations can run 40-90+ pages.                                                                                                                                                                                                                                                                                                                                                                            |

Billed per item returned (`job-listing-scraped` event); an empty result is free.

##### `GET /jobs/remote`

One page of globally remote job listings across every role (wellfound.com/remote).

| Param  | Required | Description                                                                                        |
| ------ | -------- | -------------------------------------------------------------------------------------------------- |
| `page` | no       | Listing page number, 1-based (default 1). Popular role/location combinations can run 40-90+ pages. |

Billed per item returned (`job-listing-scraped` event); an empty result is free.

##### `GET /job`

Full detail for one job, parsed from the schema.org JobPosting structured data Wellfound embeds on every job page: `description` (simple HTML -- paragraphs, lists, links -- as Wellfound itself stores it, not plain text), structured salary (currency/min/max), employment type, datePosted, and company name/website/logo. Company SIZE/funding/about-page data is NOT available -- wellfound.com/company/:slug pages return 403 on every IP tier tested, including residential.

| Param  | Required | Description                                                                                                                                                                                                                                                               |
| ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `slug` | yes      | Full job slug: the "ID-title-words" segment after wellfound.com/jobs/ (as returned in the `slug` field by any /jobs/by-\* or /jobs/remote listing call). The bare numeric id alone does NOT resolve -- live-verified: wellfound.com/jobs/{id} without the title slug 404s. |

Billed once per successful request (`job-detail-scraped` event).

### Pricing

Pay-Per-Event. Listing endpoints (`/jobs/by-role`, `/jobs/by-location`,
`/jobs/by-role-location`, `/jobs/remote`) are billed per job item returned --
an empty page (e.g. past the last page) is free. `/job` (full detail) is
billed once per successful call.

### Known limitations

- No cursor/keyset pagination beyond what Wellfound's own `?page=N` exposes;
  popular role/location combinations run 40-90+ pages.
- Company profile data (size, funding, about page) is not available --
  see "Why" above.
- Listing-page fields (salary/equity/location text) are display strings as
  Wellfound renders them (e.g. `"$100k – $180k"`, `"Remote only • Canada + 3"`),
  not normalized numbers -- call `/job` for structured salary
  (currency/min/max) on any result you need to sort or filter on precisely.
- `/job`'s `description` field is simple HTML (paragraphs, lists, links) as
  Wellfound itself stores it, not plain text -- strip tags client-side if you
  need plain text.

# Actor input Schema

## Actor input object example

```json
{}
```

# Actor output Schema

## `info` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("romy/wellfound-all-in-one-api").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("romy/wellfound-all-in-one-api").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 '{}' |
apify call romy/wellfound-all-in-one-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,romy/wellfound-all-in-one-api"
        }
    }
}
```

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/BHSzgcLdhzjkmQFeD/builds/k5auiD3otikd6Nrok/openapi.json
