Wellfound Jobs Scraper extracts job listings from Wellfound, including job titles, company names, locations, salary ranges, skills, employment types, job descriptions, and application URLs. Ideal for recruitment, job market research, salary analysis, and hiring insights.
Variant of the Wellfound Jobs Scraper focused on the hiring company rather than the job posting. A strict superset: every original input key still works and every original output field is still emitted with the same value.
Added
Company profile rows (type: "company", isChild: true) — one per hiring startup, carrying companyId, companySlug, companyUrl, companyLogo, companySize + a human companySizeLabel, and the companyTagline high-concept line. Mirrored into a separate wellfound-companies-<runId> dataset. The base shipped a company name string only.
Badge-derived startup signals — companyStage (early/growth/scale/public), isYCBacked, hasTopInvestors, isGrowingFast, isActivelyHiring, isB2B, isB2C, valuationTier, responderSpeed, plus raw badgeTypes / badgeLabels / badgesCaptured. The base discarded every Badge entity in the payload.
openRolesInRun, roleTitlesInRun and jobIdsInRun per company.
Every job row now carries its company's profile inline, so jobs can be filtered by stage or team size without a join.
maxItems capping job rows only; company rows are children and are neither counted nor charged.
Uncharged accounting rows with a typed errorReason so a blocked target is visible instead of silent.
Declared the previously undocumented requestDelay and headless inputs.
Fixed
Job detail pages were always judged anti-bot-blocked. The readiness gate required a __NEXT_DATA__ element containing apolloState, which job detail pages never have — they are server-rendered with a schema.org ld+json block instead. Every successful detail load was counted as a block, and after four of them the run printed a false "Wellfound is blocking you" warning and permanently disabled description fetching. The gate now accepts either payload and validates the ld+json block by parsing it (@type == "JobPosting"), so a half-streamed blob is not mistaken for a finished page.
An anti-bot stub is now recognised by its small document size and short-circuits the readiness wait instead of burning the full timeout.
Proxy retries are skipped once a target has pushed a row, so a mid-target retry cannot duplicate a billed row.
Not collected (documented rather than faked)
Exact headcount, funding rounds, amount raised, founders, founded-year and named investors exist only on wellfound.com/company/<slug>, which is anti-bot walled to logged-out traffic. Company industry and website live in the job page's schema.org block, which measured as a 2.5 KB anti-bot stub on 9/9 attempts from cloud infrastructure across 3 job URLs and 3 residential exit IPs — an enrichment pass for them was built, measured at 0/7 companies, and removed rather than shipped as permanently-null columns. Badge ratings are real but too sparse (~20%) to ship. Search/listing pages are unaffected by any of this, and every shipped field comes from them.