Wellfound Jobs Scraper | Remote, Salary & Company Hiring Data
Pricing
from $1.00 / 1,000 dataset items
Wellfound Jobs Scraper | Remote, Salary & Company Hiring Data
Extract startup job listings from Wellfound.com with location, keyword, role, remote, compensation, company badge, and MCP connector export options.
Pricing
from $1.00 / 1,000 dataset items
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Wellfound Jobs Scraper
Extract startup job listings from Wellfound into a clean Apify dataset. The actor supports location search and direct Wellfound URL mode, then lets you narrow results by keywords, role terms, remote status, compensation availability, and company hiring badges. Each saved row includes job, company, compensation, location, remote, badge, and description fields where available.
Why This Scraper?
- Two clear modes: build searches from Wellfound locations or paste Wellfound URLs.
- Useful job fields in every row: title, company, URL, role, locations, remote status, compensation, and posting date.
- Company signals included when available: logo, company size, high concept, hiring status, investor badge, and responder badges.
- Full description text is included for location-search rows when Wellfound exposes it in the listing data.
- Output limits and filters apply in both modes, so pasted URL runs can still be narrowed.
- MCP connector export can send a concise job summary into Notion, Linear, Airtable, or Apify connectors while the full record stays in the dataset.
- Resume & recurring updates - turn on Incremental mode to get only NEW, UPDATED, and REAPPEARED jobs on every scheduled run, or use Resume from a previous run to continue one interrupted crawl. See "Incremental & Dedup Mode" below.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
jobId | 00000001 |
jobUrl | https://wellfound.com/jobs/00000001-sample-role |
jobSlug | sample-role |
jobTitle | Sample Platform Engineer |
descriptionText | Full role description text appears here. |
jobType | full-time |
primaryRoleTitle | Software Engineer |
compensation | $100k - $150k |
compensationMin | 100000 |
compensationMax | 150000 |
compensationCurrency | $ |
hasCompensation | true |
locations | ["San Francisco"] |
acceptedRemoteLocations | ["United States"] |
remote | true |
companyName | Sample Company |
companyUrl | https://wellfound.com/company/sample-company |
companyLogoUrl | https://photos.wellfound.com/startups/i/00000001-medium_jpg.jpg |
companySize | SIZE_51_200 |
companyHighConcept | Sample company summary |
allBadgeLabels | ["Actively Hiring", "Top Investors"] |
postedAt | 2026-01-01T00:00:00Z |
sourceUrl | https://wellfound.com/location/san-francisco |
How to Use
Search one location:
{"mode": "search","locations": ["san-francisco"],"maxItems": 20}
Search multiple locations with filters:
{"mode": "search","locations": ["san-francisco", "new-york"],"keywords": ["python", "platform"],"roleKeywords": ["engineer"],"requireCompensation": true,"maxItems": 25}
Use direct Wellfound URLs:
{"mode": "url","startUrls": [{ "url": "https://wellfound.com/location/san-francisco" },{ "url": "https://wellfound.com/jobs" }],"remoteOnly": true,"maxItems": 10}
Send a job digest into an app connector:
{"mode": "search","locations": ["london"],"maxItems": 10,"mcpConnectors": ["YOUR_CONNECTOR_ID"],"notionParentPageUrl": "https://www.notion.so/your-page","maxNotifyListings": 10}
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | Choose search for location search or url for pasted Wellfound links. |
locations | array | ["san-francisco"] | Location slugs or names for search mode. |
startUrls | array | sample URLs | Wellfound /jobs or /location/... URLs for URL mode. |
keywords | array | empty | Keeps rows where at least one term appears in the job, company, role, location, badge, compensation, or description text. |
roleKeywords | array | empty | Keeps rows where at least one term appears in the job title or primary role. |
remoteOnly | boolean | false | Keeps only remote jobs. |
requireCompensation | boolean | false | Keeps only jobs with compensation text. |
activelyHiringOnly | boolean | false | Keeps only jobs with an actively hiring company badge. |
maxItems | integer | 20 | Maximum matching rows to save. Runs can return fewer rows when filters match fewer current jobs. |
maxPages | integer | empty | Maximum pages to read per location or URL source. Leave empty to walk every result page; maxItems is the primary output cap. |
proxy | object | Apify residential | Connection settings. The default is recommended for Wellfound. |
mcpConnectors | array | empty | Optional connector ids for sending a concise summary into your apps. |
notionParentPageUrl | string | empty | Required only for Notion page export. |
maxNotifyListings | integer | 50 | Maximum rows to send to each selected connector. Does not affect the dataset. |
resumeFromRunId | string | empty | Optional previous run ID (or dataset ID) from this actor. Jobs already collected there (matched by jobId) are skipped, so the run returns only new ones. For recurring daily monitoring of the same search, use incrementalMode instead. |
incrementalMode | boolean | false | Daily/recurring monitoring of this same search. First run returns everything as NEW; later runs return only NEW/UPDATED/REAPPEARED by default. See "Incremental & Dedup Mode" below. |
stateKey | string | empty | Optional name for a monitoring campaign, so its incremental state stays stable or is deliberately shared. Auto-derived from your mode/locations/URLs/keywords/filters when left empty. |
emitUnchanged | boolean | false | Incremental mode only. Also return jobs unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have. |
emitExpired | boolean | false | Incremental mode only. Also return jobs from a previous run no longer found, marked EXPIRED, once a run has fully scanned the search (not capped, not a resume). Adds and bills extra synthetic rows. |
Incremental & Dedup Mode
Incremental mode (incrementalMode) is for a schedule (for example, daily): the actor remembers the previous run of the same search by itself, so you never paste a run ID. The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED jobs by default; duplicates and unchanged jobs are suppressed (and not charged). Turn on emitUnchanged or emitExpired only when you also want those rows returned (and billed for). State is isolated per mode/locations/startUrls/keywords/filter setup automatically; set stateKey to name or deliberately share a monitoring campaign.
This is a different tool from resumeFromRunId, which continues ONE specific interrupted run from a pasted run/dataset ID. Use resumeFromRunId after a run was cut off; use incrementalMode for a schedule that runs the same search again and again.
Every returned record in incremental mode also carries:
| Field | Meaning |
|---|---|
changeType | One of NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED. |
changedFields | Names of the fields that changed since the last run (empty for NEW/UNCHANGED/REAPPEARED/EXPIRED). |
firstSeenAt | When this job was first seen by this monitoring campaign. |
lastSeenAt | When this job was last seen. |
EXPIRED rows are only produced when a run fully scans the tracked search end to end (no maxItems cap hit, no resumeFromRunId, every source read to its natural end) and emitExpired is on. A capped or resumed run leaves the previous state untouched for those jobs rather than guessing they disappeared.
Example: run the same search every day and receive only changes:
{ "mode": "search", "locations": ["san-francisco"], "incrementalMode": true }
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"jobId": "00000001","jobUrl": "https://wellfound.com/jobs/00000001-sample-platform-engineer","jobSlug": "sample-platform-engineer","jobTitle": "Sample Platform Engineer","descriptionText": "Full role description text appears here.","descriptionLength": 39,"jobType": "full-time","primaryRoleTitle": "Software Engineer","compensation": "$100k - $150k","compensationMin": 100000,"compensationMax": 150000,"compensationCurrency": "$","hasCompensation": true,"hasEquity": false,"locations": ["San Francisco"],"acceptedRemoteLocations": ["United States"],"remote": true,"remoteKind": "remote","yearsExperienceMin": 3,"yearsExperienceMax": 7,"postedAtUnix": 1700000000,"postedAt": "2026-01-01T00:00:00Z","companyId": "00000001","companyName": "Sample Company","companySlug": "sample-company","companyUrl": "https://wellfound.com/company/sample-company","companyLogoUrl": "https://photos.wellfound.com/startups/i/00000001-medium_jpg.jpg","companySize": "SIZE_51_200","companyHighConcept": "Sample company summary","allBadgeLabels": ["Actively Hiring", "Top Investors"],"activelyHiring": true,"hasTopInvestors": true,"quickResponder": false,"topResponder": false,"sourceUrl": "https://wellfound.com/location/san-francisco","sourceLabel": "san-francisco","scrapedAt": "2026-01-01T00:00:00Z"}
Send Results Into Your Apps
The optional MCP connector inputs let you send a condensed, human-readable summary of each selected job into your connected apps. Authorize a connector under Apify > Settings > API & Integrations, select it in mcpConnectors, and set notionParentPageUrl when using Notion.
The connector export is a side output. It does not change the dataset, and connector write errors do not fail the run. The complete record always remains available in the Apify dataset.
Plan Requirement
For best reliability, keep the default Apify residential proxy setting. maxItems is a maximum cap, not a guaranteed count; a run can save fewer rows when the selected location, URL, keyword, and filters match fewer active jobs.