Wellfound Jobs Search Scraper avatar

Wellfound Jobs Search Scraper

Pricing

from $2.99 / 1,000 wellfound job records

Go to Apify Store
Wellfound Jobs Search Scraper

Wellfound Jobs Search Scraper

Scrape startup job listings from Wellfound (formerly AngelList Talent). Extract job titles, companies, locations, equity and salary ranges, funding stages, and remote options for startup recruitment and market analysis.

Pricing

from $2.99 / 1,000 wellfound job records

Rating

0.0

(0)

Developer

Jobs API

Jobs API

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

3

Monthly active users

11 days ago

Last modified

Share

Wellfound public jobs search scraper

This Actor searches Wellfound's public role and location pages or reads one or more public job detail pages. It saves business facts published on each detail page as Dataset rows. The public listing is used for discovery; the Actor follows only a real next-page link and then reads the job detail page before emitting a record.

Each result contains the facts available on that job's public page. Optional fields are omitted when the employer does not publish them. You can choose a proxy in the input settings. If Wellfound requires sign-in, blocks access, or disallows the page in its robots rules, the Actor stops; it keeps any jobs already saved.

Modes

  • search uses a Wellfound role/location route. role and location accept a slug or a human-readable English name and are converted into safe route segments. Search follows up to maxPages pages, using only actual next links.
  • single reads exactly one URL from jobUrls.
  • multiple reads between one and 20 URLs from jobUrls.

Direct modes accept only the unchanged default role and location values and require maxPages to remain 1. A direct URL must be an HTTPS wellfound.com URL with the native /jobs/<numeric-id>-<lowercase-slug> path. Credentials, explicit ports, query strings, fragments, encoded path tricks, and alternate hosts are rejected. A trailing slash is accepted and removed in the canonical output URL.

Input fields

All top-level fields are typed and closed: unknown names and legacy aliases are rejected. “Required” below describes when a caller must supply a value; defaults are used when a field is omitted.

FieldTypeRequiredDefaultBounds or accepted valuesMeaning
modestringNosearchsearch, single, multipleChooses listing search or direct job-page input.
rolestringNosoftware-engineer1–100 characters; must form a nonempty safe route slugRole to search. Human names such as Software Engineer become software-engineer. Direct modes accept only the default unchanged.
locationstringNosan-francisco1–100 characters; must form a nonempty safe route slugSearch location. Human names such as San Francisco become san-francisco. Direct modes accept only the default unchanged.
jobUrlsarray of stringsYes in single and multipleNoneSingle: exactly 1; multiple: 1–20; each URL 1–256 characters and in the native Wellfound formExact job detail pages to read. Not accepted in search.
maxItemsintegerNo31–100Upper bound on matching detail records to store, including in direct modes.
maxPagesintegerNo11–20 in search; must be 1 in direct modesListing-page cap. Only source-provided next links are followed.
maxRequestsintegerNo201–200Hard cap across robots checks, listing pages, detail pages, and redirects.
experienceLevelstringNoNone1–100 characters; nonblankCase-insensitive phrase filter applied to published role, experience, and description facts after detail extraction.
salaryMinnumberNoNone0 or greater; must not exceed salaryMax when both are suppliedMinimum annual salary in USD. Only an explicitly published annual USD salary can match.
salaryMaxnumberNoNone0 or greater; must be at least salaryMin when both are suppliedMaximum annual salary in USD. Only an explicitly published annual USD salary can match.
remoteFilterstringNoNoneremote, hybrid, onsiteFilters using published workplace and location facts after detail extraction.
educationLevelstringNoNone1–100 characters; nonblankCase-insensitive phrase that must appear in a published education requirement or job description.
proxyConfigurationobjectNo{}Standard supported Apify SDK fields listed belowProxy options passed to the SDK. An empty object leaves routing to the SDK/runtime default.

A supplied filter is applied to both search-discovered jobs and direct URLs. A job is excluded when its published detail facts do not match. Salary thresholds do not convert currencies or pay periods: hourly, unknown-period, non-USD, or unpublished salary facts do not match a salary filter. Filters are applied after details are read; they do not add parameters to the Wellfound search URL.

proxyConfiguration

The empty object is valid. Only the standard fields below are accepted; empty apifyProxyGroups and proxyUrls arrays are valid. Proxy URL credentials are retained as supplied.

Nested fieldTypeRequiredDefaultBounds or accepted valuesMeaning
useApifyProxybooleanNoSDK/runtime defaulttrue or falseSelects the Apify proxy route according to SDK behavior.
apifyProxyGroupsarray of stringsNoSDK/runtime defaultUp to 20 names; each is 1–64 ASCII letters, digits, _, or -Apify proxy groups to request. An empty array is allowed.
apifyProxyCountrystringNoNoneExactly two ASCII lettersCountry code passed to the SDK; normalized to uppercase.
proxyUrlsarray of stringsNoSDK/runtime defaultUp to 20 URLs; each is 1–2048 characters and a valid HTTP(S) URL with a hostnameCustom proxy endpoints. Fragments, whitespace/control characters, backslashes, and invalid percent escapes are rejected. An empty array is allowed.

maxRequests is the overall public-request budget; it includes robots checks and redirects as well as listing and detail pages. Requests are sequential, paced by one second, and capped at 30 seconds each. Redirects are limited to three same-route, same-query hops. Listing/detail bodies are capped at 2 MiB and robots responses at 128 KiB. The Actor does not retry or switch to a direct connection after a proxy failure.

Input examples

The root INPUT.json, INPUT-single.json, and INPUT-multiple.json files are ready-to-use examples. The examples below show their complete shapes.

Search at the default role/location with a small result cap:

{
"mode": "search",
"role": "software-engineer",
"location": "san-francisco",
"maxItems": 2,
"maxPages": 1,
"maxRequests": 20
}

Read one exact public job page:

{
"mode": "single",
"jobUrls": [
"https://wellfound.com/jobs/4639821-software-engineer"
]
}

Read a list of exact public job pages:

{
"mode": "multiple",
"jobUrls": [
"https://wellfound.com/jobs/1503336-senior-full-stack-software-engineer",
"https://wellfound.com/jobs/4639821-software-engineer",
"https://wellfound.com/jobs/2715295-lead-product-focused-fullstack-web-engineer-performance-medicine"
]
}

Dataset fields

Each Dataset row is a business record with exactly the declared fields. jobId, title, and jobUrl are required; other fields are optional and appear only when the public detail page publishes them clearly. Absent facts stay absent. Descriptions preserve source whitespace; dates retain their published precision; a salary symbol alone does not create a currency code.

FieldMeaning
jobIdNative numeric Wellfound job ID.
titleSource job title, checked against the page heading when present.
jobUrlCanonical public detail URL for the same job ID.
jobReferenceA separate published posting code, only when distinct from the native numeric ID; has name and value.
descriptionComplete published description text, retaining paragraph, list, and preformatted whitespace.
descriptionHtmlComplete description markup after one structural entity decode.
descriptionSectionsDescription sections in source order; each may include heading, full text, and ordered bulletPoints.
jobImmediateStartPublished JobPosting immediate-start boolean; not inferred.
employmentTypePublished employment-type values, such as FULL_TIME.
workplacePublished locations and work arrangement; nested fields are detailed below.
compensationPublished minimum/maximum amount, period/unit, and visible salary label.
salaryCurrencyCurrency code explicitly published by the source; never inferred from a symbol.
experiencePublished experience wording and available month/year amounts.
educationRequirementsPublished education or credential requirements.
skillsSkills explicitly listed in JobPosting structured data.
industryIndustry values explicitly published for the job.
occupationalCategoryPublished occupational category values.
datePosted, validThroughPublished posting or expiration date at its available precision.
datePostedPrecision, validThroughPrecisionyear, month, day, or second; partial dates are not expanded into invented time.
postingAgeTextVisible posted-age label preserved as text, without calendar-date conversion.
eligibilityToWorkRequirementPublished work-eligibility statements; missing data does not imply a policy.
employerOverviewEmployer overview from structured data or the exact company header.
companyEmployer profile and paired company-section facts; nested fields are detailed below.
applyUrlURL from an explicit published Apply/Apply Now action. The job URL is never substituted.
directApplyPublished JobPosting direct-apply boolean; it does not prove an application action is available.
employmentBenefitsBenefits stated on the job posting, separate from company perks.
imageUrlsImage URLs published in JobPosting structured data.

workplace may contain locations (each with label, streetAddress, locality, region, postalCode, country, latitude, and longitude when published), locationSummary, source locationType values, derived isRemote only when clear, remoteWorkPolicy, visaSponsorship, relocation, and applicantLocationRequirements.

compensation may contain minAmount, maxAmount, unit, and displayText. experience may contain text, months, and years. Values are separate facts: amounts do not imply currency or a pay period, and the source label is kept independently.

company may contain name, logoUrl, website, profileUrl, locations, tagline, size, type, industries, categories, responseTime, scaleStage, ratingHighlights, badges, funding, perks, founders, previousEmployers, and business contacts. Company locations use the same address fields as job locations. A rating highlight may contain score and label. Funding may contain amountRaised, amountRaisedText, roundsCount, and ordered rounds; each round may have amount, amountText, series, date, datePrecision, and label. Perks pair name with full description; founders may have name, role, location, and overview; prior employers may have name and url; contacts may have type, name, email, telephone, url, and availableLanguage.

Example business record

This complete record is synthetic and illustrates the closed Dataset shape. Its .example.test domains and fictional employer/contact details are not real job leads.

{
"jobId": "9001001",
"title": "Data Engineer",
"jobUrl": "https://wellfound.com/jobs/9001001-data-engineer",
"jobReference": {
"name": "Posting code",
"value": "DATA-9001001"
},
"description": "Build reliable data products for a fictional company.\n\nWhat you will do\n\n• Design maintainable data pipelines.\n• Partner with product and engineering teams.\n\nExample configuration:\nSELECT '<example>';",
"descriptionHtml": "<p>Build reliable data products for a fictional company.</p><h2>What you will do</h2><ul><li>Design maintainable data pipelines.</li><li>Partner with product and engineering teams.</li></ul><pre><code>SELECT '&lt;example&gt;';</code></pre>",
"descriptionSections": [
{
"heading": "What you will do",
"text": "Design maintainable data pipelines.\nPartner with product and engineering teams.",
"bulletPoints": [
"Design maintainable data pipelines.",
"Partner with product and engineering teams."
]
},
{
"text": "Build reliable data products for a fictional company.\n\nExample configuration:\nSELECT '<example>';"
}
],
"jobImmediateStart": false,
"employmentType": [
"FULL_TIME"
],
"workplace": {
"locations": [
{
"label": "Denver",
"locality": "Denver",
"region": "Colorado",
"country": "United States"
},
{
"label": "Remote within Colorado",
"country": "United States"
}
],
"locationSummary": "Denver, Colorado • Remote within Colorado",
"locationType": [
"HYBRID"
],
"remoteWorkPolicy": "Hybrid schedule published by the employer",
"visaSponsorship": "Not available",
"relocation": "Not offered",
"applicantLocationRequirements": [
"Colorado, United States"
]
},
"compensation": {
"minAmount": 130000,
"maxAmount": 155000,
"unit": "YEAR",
"displayText": "$130,000–$155,000 per year"
},
"salaryCurrency": "USD",
"experience": {
"text": "3+ years of data engineering experience",
"months": 36,
"years": 3
},
"educationRequirements": [
"Bachelor's degree in computer science or equivalent experience"
],
"skills": [
"SQL",
"Python",
"Data modeling"
],
"industry": [
"Data infrastructure"
],
"occupationalCategory": [
"Data Engineer"
],
"datePosted": "2026-08",
"datePostedPrecision": "month",
"validThrough": "2026-10-31",
"validThroughPrecision": "day",
"postingAgeText": "Posted: 3 weeks ago",
"eligibilityToWorkRequirement": [
"Must be authorized to work in the United States"
],
"employerOverview": "Fable Harbor builds fictional tools that help small teams understand their data.",
"company": {
"name": "Fable Harbor",
"logoUrl": "https://assets.example.test/fable-harbor/logo.png",
"website": "https://fable-harbor.example.test",
"profileUrl": "https://wellfound.com/company/fable-harbor",
"locations": [
{
"label": "Denver office",
"streetAddress": "100 Example Avenue",
"locality": "Denver",
"region": "Colorado",
"postalCode": "80202",
"country": "United States"
}
],
"tagline": "Analytics tools for independent teams",
"size": "11–50 employees",
"type": "Private company",
"industries": [
"Data infrastructure",
"Software"
],
"categories": [
"B2B",
"SaaS"
],
"responseTime": "Responds within two weeks",
"scaleStage": "Seed",
"ratingHighlights": [
{
"score": 4.8,
"label": "Strong leadership"
}
],
"badges": [
"Strong leadership",
"B2B"
],
"funding": {
"amountRaised": 12000000,
"amountRaisedText": "$12M",
"roundsCount": 2,
"rounds": [
{
"amount": 8000000,
"amountText": "$8M",
"series": "Series A",
"date": "2025-04",
"datePrecision": "month",
"label": "Series A – Apr 2025"
},
{
"amount": 4000000,
"amountText": "$4M",
"series": "Seed",
"date": "2023",
"datePrecision": "year",
"label": "Seed – 2023"
}
]
},
"perks": [
{
"name": "Learning budget",
"description": "An annual allowance for courses and technical books."
},
{
"name": "Flexible time",
"description": "Plan your working hours with your team."
}
],
"founders": [
{
"name": "Avery Sample",
"role": "Co-founder and CEO",
"location": "Denver, Colorado"
}
],
"previousEmployers": [
{
"name": "Maple Systems",
"url": "https://maple-systems.example.test"
}
],
"contacts": [
{
"type": "employer",
"email": "careers@fable-harbor.example.test",
"telephone": "+1-555-0107"
},
{
"type": "Hiring",
"name": "Fable Harbor recruiting team",
"email": "recruiting@fable-harbor.example.test",
"url": "https://fable-harbor.example.test/jobs"
}
]
},
"applyUrl": "https://wellfound.com/jobs/9001001-data-engineer?autoOpenApplication=true",
"directApply": false,
"employmentBenefits": [
"Health coverage",
"Paid leave"
],
"imageUrls": [
"https://assets.example.test/fable-harbor/jobs/data-engineer.png"
]
}

Run summary

The only key-value record written is OUTPUT_SUMMARY. It has exactly these three fields:

{
"status": "SUCCEEDED",
"itemsStored": 2,
"isPartial": false
}

status is SUCCEEDED when at least one Dataset write is acknowledged and FAILED when none is. itemsStored counts only acknowledged Dataset writes. isPartial is true when a limit leaves jobs unprocessed, an unavailable or invalid job is skipped, or a later extraction, storage, or cleanup error occurs.