# Wellfound jobs scraper for public startup jobs

> Wellfound jobs scraper for public startup jobs. Search by role, location or job URL. Get job IDs, salary text and descriptions. CSV or JSON.

URL: https://cliqtomedia.com/actors/wellfound-jobs-scraper/

Category: Jobs & hiring · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/wellfound-jobs-scraper?fpr=cliqto

Pick a role and a location, or paste a Wellfound job link. You get public startup jobs with stable IDs and salary text. Start with the small sample search first.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `{&quot;url&quot;…` in Start URLs. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Export public Wellfound startup jobs by role, location or job URL. Get one Dataset row per unique job, with stable IDs and the fields the source provides. Use the small prefilled search to check your first result. Filters or source access limits can leave fewer rows than your requested maximum.

- Reads public `/jobs`, role, location and exact-job pages with direct HTTPS.
- Builds role and location URLs from slugs, or accepts supported URLs.
- Removes duplicate numeric job IDs across pages and URLs. Keeps first-seen order and source information.
- Applies keyword, remote, employment-type and posting-age filters to fetched fields. It does not search a private API or a global database.
- Adds a public description from a bounded job-page request when needed.
- Records valid empty, partial, blocked, not-found and invalid outcomes in KVS.



## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Wellfound job listing | $0.00025 | One validated public Wellfound job listing saved to the default Dataset. |
| Start fee | $0.0133 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |

- One job: about $0.01.
- 1,000 jobs: about $0.26.
- Every day 100 jobs, for 30 days: about $1.15 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/wellfound-jobs-scraper?fpr=cliqto

## Questions

### Is this the official Wellfound API?

No. It reads public pages and is not linked to Wellfound.

### Do I need a Wellfound account?

No. There is no login, proxy or browser.

### Will I get the full row limit I set?

Not always. Filters and source limits can give fewer rows.

### Does a second run return only new jobs?

No. Each run is a fresh snapshot. Compare jobId in your own storage.

### Does the keyword search all Wellfound jobs?

No. `query` filters the fetched title, company, role and verified description. Use role/location routes to choose the source window. `remoteOnly` also filters fetched rows; it does not prove global remote-job coverage.

### Why can a job have no posting date or salary?

Those fields may not be published in the fetched source. Unknown values stay null. Pay is not converted across currencies or pay periods, and relative dates are not guessed as exact timestamps.

### Can I fetch company pages or use a proxy?

Company routes are accepted for honest diagnostics, but the current challenge check does not prove working company coverage. Proxy transports, login and CAPTCHA solving are unavailable. No proxy subscription is needed for direct public routes.

### Is a green run enough to trust the export?

Check both the Dataset and `RUN_SUMMARY`. `PARTIAL` can have useful rows; a valid `EMPTY` has none. A requested maximum and a source-reported total are not proof of complete coverage.

## Data fields

- `recordType` (string)
- `id` (string)
- `jobId` (string)
- `title` (string)
- `slug` (string)
- `jobUrl` (string)
- `companyId` (string)
- `companyName` (string)
- `companySlug` (string)
- `companyUrl` (string)
- `primaryRole` (string)
- `jobType` (string)
- `locations` (array)
- `acceptedRemoteLocations` (array)
- `remote` (boolean)
- `remoteKind` (string)
- `wfhFlexible` (boolean)
- `compensationText` (string)
- `salaryMin` (number)
- `salaryMax` (number)
- `salaryCurrency` (string)
- `equityMinPercent` (number)
- `equityMaxPercent` (number)
- `compensationParseStatus` (string)
- `experienceMinYears` (number)
- `experienceMaxYears` (number)
- `postedAt` (string)
- `postedAtSource` (string)
- `description` (string)
- `descriptionFormat` (string)
- `atsSource` (string)
- `badges` (array)
- `sourceUrl` (string)
- `sourceMode` (string)
- `sourcePage` (number)
- `observedAt` (string)
- `coverage` (string)

## Input settings

- `mode` (string): Detects the route automatically. A company-jobs challenge is reported as a terminal source result.
- `startUrls` (array): Optional public HTTPS Wellfound search, company-jobs or exact-job URLs. Leave empty to use the bounded public /jobs feed; roles and locations build their own search URLs.
- `roles` (array): Role slugs such as software-engineer. Combine with locations to build a public search URL.
- `locations` (array): Location slugs such as new-york.
- `remoteOnly` (boolean): Keep only rows with an explicit public remote signal. Unknown remote status is not included.
- `query` (string): Match fetched title, company, role and verified description text. This is a local filter over fetched pages.
- `jobType` (string): Filter fetched rows by employment type; any keeps all observed types.
- `postedWithinDays` (integer): Keep rows posted within this many days when the source provides an exact timestamp.
- `includeDescription` (boolean): Fetches one bounded exact job page when a listing page has no inline description; disable for link-first output.
- `maxItems` (integer): Maximum valid rows to write. The source or filters may return fewer rows.
- `maxPagesPerSeed` (integer): Maximum number of pages to read for each URL. The source may end earlier.
- `maxRequests` (integer): Hard run-wide request budget, including redirects, retries and optional detail requests.
- `requestTimeoutSecs` (integer): Timeout for each direct HTTPS request attempt.
- `requestDelayMs` (integer): Minimum delay between direct source requests. A source retry delay may extend it.
- `maxRetries` (integer): Retries temporary timeouts, connection errors, rate limits and 5xx responses.
- `transport` (string): AUTO and DIRECT use the supported direct HTTPS path. Proxy transports are not available.

## Step by step on Apify

1. Open Input in Apify Console. A new form suggests a small software engineer search in New York, with `maxItems: 3`, one page and eight request attempts.
2. Leave the suggested input for your first run. Use the default 1 GB memory and 300-second platform timeout. Check the maximum cost before you start.
3. Click Start. Open the Dataset and check `jobId`, `title`, `companyName` and `jobUrl`. Download CSV or JSON from the Dataset export menu.
4. Open `RUN_SUMMARY` in the Key-Value Store. Check `status`, `itemsEmitted`, `diagnosticCodes` and `terminationReasons` before using the data.

## Use cases

| Your task | Input | Useful fields and next step |
|---|---|---|
| Compare startup hiring in one place | `roles` and `locations` | Group `companyName`, `title` and `locations` in your exported CSV. |
| Build a public job-board feed | `startUrls`, bounded `maxItems` | Join on `jobId`; link to `jobUrl`; show missing values as unknown. |
| Check remote jobs | `remoteOnly: true` | Use `remoteKind` and `acceptedRemoteLocations` to see source limits. |
| Review published pay | A small role search | Keep `compensationText`; use parsed numbers only with their source currency and unit. |
| Verify a known listing | One exact `jobUrl` | Read `description`, `postedAt` and `RUN_DIAGNOSTICS`. A removed job is not a valid empty search. |

## Tips

- Use role slugs like software-engineer and location slugs like new-york.
- Company job pages can be blocked. Role and location searches work better.
- Check RUN_SUMMARY. A partial run can still have useful rows.

## Limits

This tool is independent of Wellfound and AngelList. Check the current Wellfound site and the rules that apply to your use. It does not grant permission to collect or reuse data beyond your rights.

- Supported search routes are `/jobs`, `/role/r/<slug>`, `/role/l/<role>/<location>` and `/location/<slug>`. Exact jobs use `/jobs/<numeric-id>-<slug>`; legacy company-prefixed exact URLs normalize to this route. Legacy `angel.co` must end on an allowed Wellfound route.
- A company route `/company/<slug>/jobs` can return a login/access challenge. The current Chime check returned 403. Successful company listing coverage is not supported by that evidence. Use a public search or exact-job URL instead.
- Only exact `wellfound.com` and legacy `angel.co` HTTPS hosts are accepted. Up to five allowlisted redirects are allowed. Private/service routes, credentials, arbitrary hosts and unsupported query parameters are rejected.
- The row cap is 1–1,000, but it is not a promise of 1,000 results. Pages stop on empty source state, repeated IDs, source page count or explicit limits. Collection counts unique candidates before local filters. A narrow filter can return fewer rows without scanning later pages.
- Source work has an internal 240-second deadline. A larger platform timeout does not extend it. A shorter timeout reserves 15 seconds for output. Valid rows collected before a deadline can survive with `PARTIAL` diagnostics.
- Default memory is 1 GB; 256–1024 MB is accepted. Lower memory can be slower. Invalid resources are recorded as `INVALID_RESOURCES`, not `INVALID_INPUT`.
- Normal output is a `public_page_subset`. Source totals are observations, not verified global totals. Jobs, order, page sizes and fields can change between requests. No permanent freshness or global completeness is promised.

## Sample result

```json
{
  "recordType": "JOB_LISTING",
  "id": "wellfound:4787364",
  "jobId": "4787364",
  "title": "Software Engineer",
  "jobUrl": "https://wellfound.com/jobs/4787364-software-engineer",
  "companyName": "Chalk",
  "jobType": "full-time",
  "locations": ["New York City", "San Francisco"],
  "remote": false,
  "compensationText": "$170k – $250k",
  "salaryMin": 170000,
  "salaryMax": 250000,
  "salaryCurrency": "USD",
  "postedAt": "2026-09-30T23:42:54.000Z",
  "description": "**About Chalk**",
  "descriptionFormat": "markdown",
  "sourceUrl": "https://wellfound.com/role/l/software-engineer/new-york",
  "sourceMode": "search",
  "sourcePage": 1,
  "observedAt": "2026-10-09T14:49:16.673Z",
  "coverage": "public_page_subset"
}
```

## Use it from code

Actor ID: `cliqtomedia/wellfound-jobs-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/wellfound-jobs-scraper").call(run_input={
    "mode": "auto",
    "startUrls": [
        {
            "url": "https://wellfound.com/role/l/software-engineer/new-york"
        }
    ]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~wellfound-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "auto", "startUrls": [{"url": "https://wellfound.com/role/l/software-engineer/new-york"}]}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/wellfound-jobs-scraper")
result = tool.invoke({"run_input": {"mode": "auto", "startUrls": [{"url": "https://wellfound.com/role/l/software-engineer/new-york"}]}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Reach out when the company is ready](https://cliqtomedia.com/actors/use-cases/buying-signals/): Know when a company hires, raises money or wins a contract. Reach out at the right moment.

## Similar tools

- [Lever Job Scraper](https://cliqtomedia.com/actors/lever-jobs-scraper/)
- [Ashby Jobs Scraper](https://cliqtomedia.com/actors/ashby-jobs-scraper/)
- [Greenhouse Jobs Monitor & Scraper](https://cliqtomedia.com/actors/greenhouse-jobs-monitor-scraper/)
- [Recruitee Job Snapshots & Changes](https://cliqtomedia.com/actors/recruitee-jobs-monitor-scraper/)
- [SmartRecruiters Jobs Monitor & Scraper](https://cliqtomedia.com/actors/smartrecruiters-jobs-monitor-scraper/)
- [BambooHR Jobs Monitor & Scraper](https://cliqtomedia.com/actors/bamboohr-jobs-monitor-scraper/)
