Wellfound Jobs Scraper | Remote, Salary & Company Hiring Data avatar

Wellfound Jobs Scraper | Remote, Salary & Company Hiring Data

Pricing

from $1.00 / 1,000 dataset items

Go to Apify Store
Wellfound Jobs Scraper | Remote, Salary & Company Hiring Data

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

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.

FieldExample
jobId00000001
jobUrlhttps://wellfound.com/jobs/00000001-sample-role
jobSlugsample-role
jobTitleSample Platform Engineer
descriptionTextFull role description text appears here.
jobTypefull-time
primaryRoleTitleSoftware Engineer
compensation$100k - $150k
compensationMin100000
compensationMax150000
compensationCurrency$
hasCompensationtrue
locations["San Francisco"]
acceptedRemoteLocations["United States"]
remotetrue
companyNameSample Company
companyUrlhttps://wellfound.com/company/sample-company
companyLogoUrlhttps://photos.wellfound.com/startups/i/00000001-medium_jpg.jpg
companySizeSIZE_51_200
companyHighConceptSample company summary
allBadgeLabels["Actively Hiring", "Top Investors"]
postedAt2026-01-01T00:00:00Z
sourceUrlhttps://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

ParameterTypeDefaultDescription
modestringsearchChoose search for location search or url for pasted Wellfound links.
locationsarray["san-francisco"]Location slugs or names for search mode.
startUrlsarraysample URLsWellfound /jobs or /location/... URLs for URL mode.
keywordsarrayemptyKeeps rows where at least one term appears in the job, company, role, location, badge, compensation, or description text.
roleKeywordsarrayemptyKeeps rows where at least one term appears in the job title or primary role.
remoteOnlybooleanfalseKeeps only remote jobs.
requireCompensationbooleanfalseKeeps only jobs with compensation text.
activelyHiringOnlybooleanfalseKeeps only jobs with an actively hiring company badge.
maxItemsinteger20Maximum matching rows to save. Runs can return fewer rows when filters match fewer current jobs.
maxPagesintegeremptyMaximum pages to read per location or URL source. Leave empty to walk every result page; maxItems is the primary output cap.
proxyobjectApify residentialConnection settings. The default is recommended for Wellfound.
mcpConnectorsarrayemptyOptional connector ids for sending a concise summary into your apps.
notionParentPageUrlstringemptyRequired only for Notion page export.
maxNotifyListingsinteger50Maximum rows to send to each selected connector. Does not affect the dataset.
resumeFromRunIdstringemptyOptional 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.
incrementalModebooleanfalseDaily/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.
stateKeystringemptyOptional 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.
emitUnchangedbooleanfalseIncremental mode only. Also return jobs unchanged since the last run, marked UNCHANGED. Adds and bills extra rows you already have.
emitExpiredbooleanfalseIncremental 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:

FieldMeaning
changeTypeOne of NEW, UPDATED, UNCHANGED, REAPPEARED, EXPIRED.
changedFieldsNames of the fields that changed since the last run (empty for NEW/UNCHANGED/REAPPEARED/EXPIRED).
firstSeenAtWhen this job was first seen by this monitoring campaign.
lastSeenAtWhen 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.