# Y Combinator · YC · Only $1💰 · Jobs & Companies scraper (`memo23/y-combinator-scraper`) Actor

💰 $1/1K One actor for Y Combinator jobs (Work at a Startup) and companies (Startup Directory). Paste any YC URL — auto-routed — or use filters. Companies in ~2 s per 100, clean schema. Optional founder enrichment: LinkedIn/Twitter URLs, company socials, open jobs. Full batch history to 2005.

- **URL**: https://apify.com/memo23/y-combinator-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Lead generation, Agents
- **Features:** Limited permissions
- **Stats:** 326 total users, 64 monthly users, 98.0% runs succeeded, 4 bookmarks
- **User rating**: 4.62 out of 5 stars

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Y Combinator Scraper — Jobs + Companies + Founders

<p align="center"><img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/yc-logo.png" alt="Y Combinator Scraper" width="180"/></p>

**Y Combinator data, structured. Jobs, companies, founders, socials — one actor, nothing to set up.**

Scrape both surfaces of `ycombinator.com` from a single Apify actor: **jobs** (Work at a Startup) and **companies** (Startup Directory). Auto-routes any YC URL to the right scraper, or compose a query from filters.

> 💰 **Jobs and companies from one actor, at one per-result rate.** Most YC scrapers cover only one of the two surfaces, so covering both usually means paying for two. No login or API key needed. JSON or CSV out. Current rate on the **Pricing** tab.

### How it works

![How Y Combinator Scraper Works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-yc.png)

***

### ✨ Why use this scraper?

- **Two surfaces, one actor.** Jobs (Work at a Startup) and Companies (Startup Directory) in the same dataset, distinguishable by row shape (`jobId` vs `slug`).
- **Fast company lookups** — about 2 s for 100 companies. Clean, structured fields with no scraping artefacts (no leaked alt text, no concatenated values).
- **Rich output schemas.** ~33 fields per job (salary parsed into min/max/currency, equity, founders with bios, exact `datePosted`). ~26 fields per company (batch, industries, regions, team size, stage, status, top-company / hiring / nonprofit flags).
- **Optional founder enrichment** with proper `name` / `title` separation (e.g. `Brian Chesky` / `Founder/CEO`, not split-on-whitespace), plus LinkedIn + Twitter URLs per founder and company-level socials (linkedin, twitter, facebook, crunchbase, github).
- **Optional open-jobs enrichment** per company, with cleanly separated `title` / `salary` / `location` / `equity` / `experience` fields.
- **Multi-keyword company discovery** — pass several keywords; each runs as its own search and the results merge, with every company listed once.
- **Full YC batch history** back to Summer 2005.

***

### What makes this richer than alternatives

| Capability | This actor | Other YC scrapers on Apify Store |
|---|---|---|
| **Pricing** | One per-result rate covering both surfaces | Usually two actors, billed separately |
| **Surfaces covered** | Jobs **+ Companies** (one actor, two row shapes) | Jobs only on most |
| **Company speed** | About 2 s for 100 companies, nothing to set up | Slower, page by page |
| **Founder enrichment** | LinkedIn + Twitter URLs, separate `name` / `title` fields, optional toggle | Often missing or whitespace-split |
| **Salary parsing** | `salaryMin`, `salaryMax`, `salaryCurrency` parsed numerically | Raw display string only |
| **Multi-keyword discovery** | Several keywords in one run, each company listed once | Single keyword only |
| **Batch history** | Back to Summer 2005 (every YC cohort) | Recent batches only |
| **Output options** | JSON or CSV (`data.csv` auto-exported) | JSON only |
| **Monitoring mode** | Per-user dedup for incremental scheduled runs | Not supported |

***

### Overview

Built for recruiters, sourcers, BD/sales teams, investors, and anyone doing market research on YC-backed startups. The actor produces a heterogeneous dataset: each row is either a **job posting** or a **company profile**. You can run jobs and companies in the same job (mix URLs of both kinds), and tell them apart in downstream tooling by the presence of `jobId` (jobs) vs `slug` (companies).

Companies mode returns about 100 companies in 2 seconds. Jobs mode returns each posting in full, with salary, equity, the company profile and its founders on each row.

***

### Supported inputs

#### Jobs URLs

| Pattern | What it does |
|---|---|
| `/jobs` | YC's curated jobs index (~20 jobs) |
| `/jobs/role/{role}` | All jobs in a role (`software-engineer`, `designer`, `product-manager`, `operations`, `marketing`, `sales-manager`, `recruiting-hr`, `support`, `science`) |
| `/jobs/role/{role}/{location}` | Role + location (`san-francisco`, `new-york`, `los-angeles`, `seattle`, `austin`, `chicago`, `india`, `remote`) — see [how the location filter matches](#how-the-location-filter-matches) |
| `/jobs/location/{location}` | Location-only listing |
| `/companies/{co}/jobs/{job}` | A single job-detail page |

#### Companies URLs

| Pattern | What it does |
|---|---|
| `/companies` | All companies, page after page up to `maxItems` |
| `/companies?batch=…&industry=…&query=…&isHiring=true&top_company=true&minEmployeeSize=10%2B&maxEmployeeSize=100` | Companies search with any combination of filters |
| `/companies/{slug}` | Single-company lookup (e.g. `…/companies/airbnb`) |

#### Filter form (when no URLs)

`mode` = `jobs` (default) or `companies`. Then the matching filter set:

- **💼 Jobs**: `role`, `location`.
- **🏢 Companies**: `queries[]`, `topCompany`, `isHiring`, `nonprofit`, `batch[]`, `industries[]`, `regions[]`, `minEmployeeSize`, `maxEmployeeSize`.

***

### 🎯 Use cases

| Team | Typical use |
|---|---|
| **Recruiters / talent sourcing** | Pull active YC job postings filtered by role + city, watch for new postings in `monitoringMode` |
| **Investors / VCs** | Track company batches, stages, and team sizes across every YC cohort back to 2005 |
| **BD / sales** | Build a target list of YC companies by industry, region, employee size; enrich with founder LinkedIns for outreach |
| **Founder / market research** | Discover companies by keyword across the full directory; find similar / competitive companies to map a market |
| **Data engineering / pipelines** | Schedule daily runs into a warehouse for YC startup intelligence; `monitoringMode` keeps datasets incremental |

***

1. **You provide YC URLs (Option A) or filters (Option B).** Mix Jobs and Companies URLs freely; the actor routes each one.
2. **Jobs URLs** return the postings in the listing (up to `maxItems`), each with its full description, salary, equity and company details. A location in the URL keeps only the jobs whose location matches it.
3. **Companies URLs** return the companies that match the filters (up to `maxItems`): AND across filter types, OR within one (two batches = companies from either batch). Several keywords in one run are merged, with each company listed once.
4. **Optional company enrichment.** With `scrapeFounderDetails` or `scrapeOpenJobs` on, each company row also gets its founders and socials and/or its open jobs.
5. **Output to dataset.** Job rows and company rows go into the same dataset; jobs are also exported as `data.csv` / `data.json`.

***

### Quick start

```jsonc
// Recent SF software-engineering jobs
{ "mode": "jobs", "role": "software-engineer", "location": "san-francisco", "maxItems": 50 }

// Top hiring B2B companies from the last two batches, 100-500 employees
{ "mode": "companies", "batch": ["Spring 2026", "Winter 2026"], "industries": ["B2B"],
  "minEmployeeSize": "100+", "maxEmployeeSize": "500", "isHiring": true, "topCompany": true,
  "maxItems": 100 }

// Multi-keyword company discovery (results merged + deduped by company id)
{ "mode": "companies", "queries": ["dev tools", "observability", "feature flags"], "maxItems": 50 }

// Companies + founder/social/jobs enrichment (each toggle adds one extra lookup per company)
{ "mode": "companies", "batch": ["Spring 2026"], "isHiring": true,
  "scrapeFounderDetails": true, "scrapeOpenJobs": true, "maxItems": 25 }

// Or skip the form and paste any YC URL — the actor auto-routes
{ "startUrls": [
    "https://www.ycombinator.com/jobs/role/software-engineer/san-francisco",
    "https://www.ycombinator.com/companies?batch=Spring%202026&industry=Healthcare",
    "https://www.ycombinator.com/companies/airbnb"
  ], "maxItems": 50 }
```

***

### Input configuration

The form is two collapsible sections — **alternatives, not steps**:

**Three top-level sections.** Option A and Option B are alternatives; Run options apply to both regardless of which you pick.

- **Option A | Search by URL 🔗 — Jobs or Companies (recommended)** — `startUrls[]`. If non-empty, Option B is ignored.
- **Option B | Configure with Filters 🎛️** — used only when Option A is empty. Field titles inside the panel are prefixed by category:
  - `Mode` — `"jobs"` (default) or `"companies"`.
  - `💼 Jobs · …` — `role`, `location`.
  - `🏢 Companies · …` — `queries[]`, `topCompany`, `isHiring`, `nonprofit`, `batch[]`, `industries[]`, `regions[]`, `minEmployeeSize`, `maxEmployeeSize`.
  - `🙌 Companies Enrich · …` — `scrapeFounderDetails`, `scrapeOpenJobs` (each adds one extra lookup per company, so runs take longer).
- **Run options ⚙️ — applies to both** — shared run-time settings:
  - `maxItems` — **per-URL output cap** (default 100). Each entry in `startUrls` (Option A) and each filter run (Option B) gets its own quota of this many records. Pasting 3 URLs with `maxItems=100` returns up to 300 rows total. Free-tier accounts are capped at 100 per URL regardless.
  - `maxPages` — pagination depth: max listing pages per URL (default 10). Jobs scraper only; Companies mode keeps going automatically until its per-URL `maxItems` quota is hit.
  - `monitoringMode`, `maxConcurrency`, `minConcurrency`, `maxRequestRetries`, `proxy` — Jobs scraper only. Companies mode ignores them.

Multi-select filters (`batch[]`, `industries[]`, `regions[]`) use **AND across attributes, OR within**. Leaving the `"All …"` defaults selected means no filter.

Non-paying users are capped at 100 items and have `monitoringMode` disabled.

***

### How the location filter matches

A location in a jobs URL (or the `location` field) keeps the jobs whose `location` text contains it. Special cases: `remote` matches anything containing "Remote"; `india` matches the country (`/\b(india|IN)\b/i`). Cities use a case-insensitive substring match against the slug with `-` replaced by space.

A job listed as `"San Francisco, CA, US / Remote (US)"` matches both the `san-francisco` and `remote` slugs.

***

### Output overview

Heterogeneous dataset — job rows and company rows have different shapes but share the same dataset. Distinguish by:

- presence of `jobId` (jobs) vs `slug` (companies)
- or the `url` path (`/companies/{co}/jobs/{job}` vs `/companies/{slug}`).

***

### Output samples

#### Job row (truncated for display)

Captured with `startUrls=["https://www.ycombinator.com/jobs/role/software-engineer/san-francisco"], maxItems=1`:

```jsonc
{
  "title": "Systems Engineer",
  "companyName": "Substack",
  "roleCategory": "Engineering",
  "roleSubcategory": "Devops",
  "jobType": "Full-time",
  "experience": "6+ years",
  "location": "San Francisco, CA, US / New York, NY, US",
  "visaSponsorship": "",
  "salaryMin": 185000,
  "salaryMax": 225000,
  "salaryCurrency": "USD",
  "salaryRange": "$185K - $225K",
  "equity": "",
  "postedAgo": "2 days",
  "datePosted": "2025-09-11T18:28:34Z",
  "url": "https://www.ycombinator.com/companies/substack/jobs/gD334As-systems-engineer",
  "jobId": "gD334As-systems-engineer",
  "description": "Substack is building a new economic engine for culture …",
  "descriptionHtml": "<p>Substack is building …</p>",
  "ycBatch": "W18",
  "companyStatus": "Active",
  "companyFounded": 2017,
  "companyTeamSize": 90,
  "companyLocation": "San Francisco",
  "companyWebsite": "https://substack.com",
  "companyUrl": "https://www.ycombinator.com/companies/substack",
  "companySlug": "substack",
  "companyDescription": "Start a newsletter. Build your community. …",
  "founders": [
    { "name": "Chris Best",      "role": "Co-founder & CEO at Substack…" },
    { "name": "Hamish McKenzie", "role": "COO" },
    { "name": "Jairaj Sethi",    "role": "👋🏽" }
  ],
  "scrapedAt": "2026-05-02T10:49:39.558Z"
}
```

#### Company row, with both enrichment toggles on (truncated)

Captured with `startUrls=["https://www.ycombinator.com/companies/airbnb"], scrapeFounderDetails=true, scrapeOpenJobs=true`:

```jsonc
{
  "id": 271,
  "slug": "airbnb",
  "name": "Airbnb",
  "url": "https://www.ycombinator.com/companies/airbnb",
  "batch": "Winter 2009",
  "industry": "Consumer",
  "subindustry": "Consumer -> Travel, Leisure and Tourism",
  "industries": ["Consumer", "Travel, Leisure and Tourism"],
  "regions":    ["United States of America", "America / Canada"],
  "allLocations": "San Francisco, CA, USA",
  "oneLiner": "Book accommodations around the world.",
  "teamSize": 6132,
  "status": "Public",
  "stage": "Growth",
  "topCompany": true,
  "isHiring": false,
  "nonprofit": false,
  "launchedAt": "2012-01-17T09:00:56.000Z",
  "website": "http://airbnb.com",
  "tags": ["Marketplace", "Travel"],
  "formerNames": [],
  "appVideoPublic": false,
  "demoDayVideoPublic": false,
  "founders": [
    {
      "name": "Brian Chesky", "title": "Founder/CEO",
      "linkedinUrl": "https://www.linkedin.com/in/brianchesky/",
      "twitterUrl":  "https://twitter.com/bchesky",
      "isActive": true, "hasEmail": true
    },
    { "name": "Nathan Blecharczyk", "title": "Founder/CTO", "linkedinUrl": "…", "twitterUrl": "…" },
    { "name": "Joe Gebbia",         "title": "Founder/CPO", "linkedinUrl": "…", "twitterUrl": "…" }
  ],
  "socials": {
    "linkedin":   "https://www.linkedin.com/company/airbnb/",
    "twitter":    "https://twitter.com/Airbnb",
    "facebook":   "https://www.facebook.com/airbnb/",
    "crunchbase": "https://www.crunchbase.com/organization/airbnb"
  },
  "openJobs": [],
  "scrapedAt": "2026-05-02T10:49:25.606Z"
}
```

***

### Output fields

#### Jobs row (~33 fields)

| Field | Description |
|---|---|
| `title` | Posting title. |
| `companyName` | Company display name. |
| `roleCategory`, `roleSubcategory`, `jobType` | E.g. `Engineering`, `Devops`, `Full-time`. |
| `experience` | Minimum experience asked for. |
| `location` | Job location as YC shows it. |
| `visaSponsorship` | `"Will sponsor"` if offered, else empty. |
| `salaryMin`, `salaryMax`, `salaryCurrency` | Parsed numeric range and currency (`USD`/`GBP`/`EUR`/`INR`). |
| `salaryRange` | Salary as the listing shows it (`"$185K - $225K"`). |
| `equity` | Equity range as YC shows it. |
| `postedAgo` | How long ago the job was posted (e.g. `"2 days"`). |
| `datePosted` | ISO date and time the job was posted; empty when YC gives none. |
| `applyUrl` | Direct apply link (the YC OAuth bridge to workatastartup.com). |
| `url`, `jobId` | Posting URL (`https://www.ycombinator.com/companies/{co}/jobs/{id}`) and YC's job id, e.g. `gD334As-systems-engineer`. |
| `description`, `descriptionHtml` | Full description as text and as HTML (preserves newlines). |
| `ycBatch` | YC batch (e.g. `S21`, `W18`). |
| `companyTagline`, `companyStatus`, `companyFounded`, `companyTeamSize`, `companyLocation` | One-liner, status, year founded, team size and location. |
| `companyWebsite`, `companyLogo`, `companyUrl`, `companySlug` | External website, logo URL, YC profile URL and slug. |
| `companyDescription` | The company's long description from its YC profile. |
| `founders` | Array of `{ name, role }`; `role` is the founder's bio, else their title, else `"Founder"`. |
| `scrapedAt` | ISO timestamp of when the row was produced. |

#### Companies row (~26 fields, plus enrichment fields)

| Field | Description |
|---|---|
| `id`, `slug`, `name` | YC company id, slug, display name. |
| `url` | Profile URL (`https://www.ycombinator.com/companies/{slug}`). |
| `batch` | E.g. `"Winter 2009"`, `"Spring 2026"`. |
| `industry`, `subindustry`, `industries[]` | Top-level industry, second-level subindustry, full industries array. |
| `regions[]` | HQ region tags. |
| `allLocations` | Free-form location string. |
| `oneLiner`, `longDescription` | Short tagline and full description. |
| `teamSize` | Headcount or `null`. |
| `status` | `"Active"` / `"Acquired"` / `"Public"` / `"Inactive"` / etc. |
| `stage` | YC's stage label: `"Early"` / `"Growth"` / `"Public"` / etc. |
| `topCompany`, `isHiring`, `nonprofit` | Booleans. |
| `launchedAt` | ISO datetime (converted from epoch). |
| `website` | External company website. |
| `logo` | Small-logo URL from YC's S3. |
| `tags[]` | Free-form YC tags. |
| `formerNames[]` | Past company names if YC has them. |
| `appVideoPublic`, `demoDayVideoPublic` | Whether YC's videos are publicly available. |
| `scrapedAt` | ISO timestamp. |

**With `scrapeFounderDetails: true`:**

| Field | Description |
|---|---|
| `founders[]` | `{ name, title, bio, linkedinUrl, twitterUrl, avatarUrl, isActive, hasEmail }`. `name` and `title` are properly separated. |
| `socials` | `{ linkedin, twitter, facebook, crunchbase, github }` (non-empty values only). |
| `appVideoUrl`, `demoDayVideoUrl` | Direct video URLs when YC has them and they're public. |

**With `scrapeOpenJobs: true`:**

| Field | Description |
|---|---|
| `openJobs[]` | `{ jobId, title, url, type, roleCategory, roleSubcategory, salaryRange, equity, location, experience, applyUrl, postedAgo, visaSponsorship }`. |

***

### Monitoring mode

When `monitoringMode` is enabled (jobs only), the actor only emits jobs whose numeric id has not been seen in previous runs by the same Apify user. Useful for:

- Tracking new YC job postings as they appear
- Building a historical archive without re-scraping
- Keeping downstream notifications free of duplicates

The actor maintains a per-user Key-Value store keyed `YC-JOBS-SEEN-{apifyUserId}`. On each run with `monitoringMode: true`, every listing job is checked against this store; new ids are added (with a small stub: `id`, `url`, `title`) and only those new jobs are enqueued for detail scraping. Reset by deleting the corresponding KV store from the Apify console.

`monitoringMode` is currently jobs-only. Companies-mode dedup is planned but not implemented.

***

### Local development

```bash
npm install
npm run start:dev   # runs src/main.ts via tsx
npm run build       # tsc to dist/
npm run lint        # eslint src/
```

Local input is read from `storage/key_value_stores/default/INPUT.json`. For fully isolated runs set `APIFY_LOCAL_STORAGE_DIR` and `CRAWLEE_STORAGE_DIR` to a temp path.

***

### Limitations / known gaps

- **Single-company URL** returns the one company whose slug matches, so 1 row max regardless of `maxItems`.
- **Companies mode ignores `monitoringMode`** — dedup is jobs-only for now.
- **`maxItems` is per URL, not global.** With 5 startUrls and `maxItems=100`, total output can be up to 500 rows (100 per URL). Set the cap accordingly to control cost.
- **Multi-`queries` budget** is shared across keywords *within a single companies search URL/filter run*. If `maxItems` is small, later keywords may not fire (the first keyword fills the quota and the remaining keywords don't run).
- **Companies enrichment cost** — `scrapeFounderDetails` and `scrapeOpenJobs` each add one extra lookup per company. For 100 companies, expect ~10–20 seconds extra per toggle.

***

### ❓ FAQ

**Can I scrape both jobs and companies in the same run?**
Yes. Mix any `/jobs/...` and `/companies...` URLs in `startUrls`; each one auto-routes. `maxItems` is **per URL**, not global — pasting 5 URLs with `maxItems=100` can return up to 500 rows total.

**Do I need to set up a proxy?**
No. The defaults work out of the box. The proxy setting only affects the Jobs scraper; Companies mode ignores it.

**What does the Jobs `location` slug actually filter on?**
A case-insensitive substring of the slug (with `-` → ` `) against each job's `location` string. `remote` matches anything containing "Remote"; `india` matches the country code `IN` or the word `India`.

**Can I get founders' LinkedIn URLs?**
Yes — set `scrapeFounderDetails: true`. Each founder row includes `linkedinUrl` and `twitterUrl` from the company's YC profile.

**Does `scrapeOpenJobs` overlap with running Jobs mode?**
Different surface. `scrapeOpenJobs` enriches a company row with that company's open postings. Jobs mode (or a `/jobs/...` URL) returns each job as its own row in the dataset.

**What's `monitoringMode` and when should I use it?**
Jobs-only flag that dedupes against a per-user KV store of seen job ids. Use it for scheduled runs that should only emit new postings.

**Can I use the actor with a single-company URL like `/companies/airbnb`?**
Yes. It returns exactly one row, the company whose slug matches, regardless of `maxItems`.

**How do I control cost?**
Use `maxItems` strictly — both modes stop emitting once that ceiling is hit. Disable both enrichment toggles if you don't need founders/socials/jobs — they make runs slower.

***

### Support

- File an issue or a feature request via the Apify Console **Issues** tab on the actor page.
- Custom integrations (different output shape, additional filters, scheduled feeds into a warehouse) — open an issue describing the use case.

***

### Additional Services

Need a Y Combinator dataset shaped to your pipeline? Custom integrations available:

- **Custom output schemas** — alternative field names, flattened nested structures, filtered subsets for warehouse loaders.
- **Webhook delivery** — push new YC jobs or company changes to Slack, Discord, your CRM, or any HTTP endpoint.
- **Scheduled feeds** — daily/weekly runs into Postgres, BigQuery, Snowflake, S3, or Google Sheets.
- **Bundled scrapers** — combine YC data with LinkedIn, Crunchbase, or AngelList for a multi-source pipeline.
- **Private / dedicated builds** — your own version of the actor with niche filters, custom enrichment, or different rate behavior.

Reach out via the [Apify Issues tab](https://apify.com/memo23/y-combinator-scraper/issues) or [contact memo23 on Apify](https://apify.com/memo23).

***

### Explore More Scrapers

Looking for related job, recruiting, or startup-intelligence data? Other actors by the same maintainer:

- [**HiringCafe Scraper**](https://apify.com/memo23/apify-hiring-cafe-scraper) — All HiringCafe job postings with company info, salary, remote/location filters
- [**Stepstone Search Scraper**](https://apify.com/memo23/stepstone-search-cheerio-ppr) — DACH + EU jobs by URL or keywords
- [**LinkedIn Jobs Scraper**](https://apify.com/memo23/linkedin-jobs-scraper) — Public LinkedIn job listings by keyword + location
- [**Glassdoor Reviews**](https://apify.com/memo23/glassdoor-scraper-ppr) — Company reviews + ratings + interview reports
- [**Capterra Reviews Scraper**](https://apify.com/memo23/capterra-scraper) — B2B SaaS reviews + scoring + competitor analysis

***

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/y-combinator-scraper`).

**Purpose:** Scrapes both YC surfaces — jobs (Work at a Startup) and companies (Startup Directory) — from one actor, with optional founder/social and open-jobs enrichment.

**Minimal input:**

```json
{
  "mode": "jobs",
  "role": "software-engineer",
  "location": "san-francisco",
  "maxItems": 25
}
```

URL mode variant: `{ "startUrls": ["https://www.ycombinator.com/companies/airbnb"], "maxItems": 25 }` (any `/jobs/...` or `/companies...` URL, auto-routed).

**Output:** heterogeneous dataset — one row per job OR company (tell apart by `jobId` vs `slug`). Job rows: `jobId`, `title`, `url`, `companyName`, `companySlug`, `ycBatch`, `jobType`, `roleCategory`, `salaryRange`, `salaryMin`, `salaryMax`, `salaryCurrency`, `equity`, `location`, `postedAgo`, `experience`, `description`, `founders[]` (`name`, `role`), `datePosted`, `companyWebsite`, `scrapedAt`. Company rows: `id`, `slug`, `name`, `url`, `batch`, `industry`, `industries[]`, `regions[]`, `oneLiner`, `teamSize`, `status`, `stage`, `topCompany`, `isHiring`, `nonprofit`, `launchedAt`, `website`, `tags[]`, `scrapedAt`, plus enrichment `founders[]` (`name`, `title`, `linkedinUrl`, `twitterUrl`), `socials` (`linkedin`, `twitter`, `facebook`, `crunchbase`, `github`), `openJobs[]`.

**Behaviors an agent should know:**

- `maxItems` is a **per-URL / per-filter-run** cap (default 100), not global — 3 start URLs at `maxItems=100` returns up to 300 rows; free-tier accounts are capped at 100 per URL.
- `startUrls` (Option A) overrides the filter form (Option B) entirely when non-empty.
- `proxy`, concurrency, retries, and `monitoringMode` apply to Jobs mode only; Companies mode ignores them.
- `scrapeFounderDetails` and `scrapeOpenJobs` (companies mode) each add one extra lookup per company and make runs slower; a single `/companies/{slug}` URL returns exactly one row regardless of `maxItems`.
- `monitoringMode` (jobs only) emits only job ids not seen in prior runs by the same Apify user.
- Billed per returned row; see the Pricing tab on the actor page.

### ⚠️ Disclaimer

This Actor accesses publicly available data on Y Combinator's website (`ycombinator.com`) for legitimate research, market intelligence, and business-analysis purposes. Use of this Actor must comply with Y Combinator's Terms of Service and all applicable laws, including data protection regulations (GDPR, CCPA, etc.). "Y Combinator" and "YC" are trademarks of Y Combinator Management, LLC. This Actor is not affiliated with, endorsed by, or sponsored by Y Combinator. The Actor's authors are not responsible for any misuse. Users must:

- Avoid overloading YC's website
- Not use scraped data to violate user privacy or any terms
- Use the data in compliance with applicable jurisdictions
- Not republish scraped content in violation of copyright

We do not store any scraped data; the Actor returns it directly to your Apify dataset for your authorized use.

***

### SEO Keywords

y combinator scraper, ycombinator scraper, yc jobs scraper, work at a startup scraper, yc companies scraper, yc startup directory scraper, yc batch scraper, y combinator api alternative, yc data extraction, yc founder scraper, ycombinator founders linkedin, yc startup intelligence, startup data scraping, yc recruiter tool, yc lead generation, yc sales prospecting, yc batch winter 2026, yc spring 2026, yc demo day scraper, yc graduates list, y combinator json export, y combinator csv export, apify yc scraper, b2b startup database, vc lead generation

***

### License

ISC. See [`package.json`](package.json).

# Actor input Schema

## `startUrls` (type: `array`):

Any YC URL. Auto-routed by path. Mix Jobs and Companies URLs freely. The two URLs prefilled below are sample defaults — clear them and paste your own when running.

**Jobs URLs:**

- `https://www.ycombinator.com/jobs` (curated index)
- `https://www.ycombinator.com/jobs/role/{role}` (e.g. `…/jobs/role/software-engineer`)
- `https://www.ycombinator.com/jobs/role/{role}/{location}` (e.g. `…/jobs/role/software-engineer/san-francisco`)
- `https://www.ycombinator.com/jobs/location/{location}` (e.g. `…/jobs/location/new-york`)
- `https://www.ycombinator.com/companies/{co}/jobs/{job}` (single job detail)

**Companies URLs:**

- `https://www.ycombinator.com/companies` (all companies)
- `https://www.ycombinator.com/companies?batch=Spring%202026&industry=B2B&query=fintech` (filtered search)
- `https://www.ycombinator.com/companies/{slug}` (e.g. `…/companies/airbnb` — single-company lookup)

## `mode` (type: `string`):

Pick a target surface; the matching filter fields below will be used. Jobs uses the role/location selectors; Companies uses the keyword/batch/industry/region/size block.

## `role` (type: `string`):

Used when Mode = Jobs and Start URLs is empty. YC role category.

## `location` (type: `string`):

Used when Mode = Jobs. City slugs match the city name in each job's location string; `remote` matches anything containing 'Remote'; `india` matches the country.

## `queries` (type: `array`):

Used when Mode = Companies. One or more keywords (product category, market, technology, location, …). Each keyword runs as its own search; the results are merged and every company appears once. Empty = no keyword filter.

## `topCompany` (type: `boolean`):

Only companies Y Combinator lists among its Top Companies. Off keeps every company the other filters match.

## `isHiring` (type: `boolean`):

Only companies whose YC profile shows they are hiring now, handy for sourcing and sales lists.

## `nonprofit` (type: `boolean`):

Only companies YC marks as nonprofit. Off returns for-profit and nonprofit companies together.

## `batch` (type: `array`):

Cohorts to include, such as Winter 2026 or Summer 2025. Keep All Batches to search every cohort.

## `industries` (type: `array`):

Sectors to include, such as Fintech or Healthcare. Keep All industries to search every sector.

## `regions` (type: `array`):

Where the company is based. Keep Anywhere for no location limit.

## `minEmployeeSize` (type: `string`):

Team size floor. '1+' keeps companies of any size.

## `maxEmployeeSize` (type: `string`):

Team size ceiling. '1000+' keeps the largest companies too.

## `scrapeFounderDetails` (type: `boolean`):

Companies mode only. Adds one extra lookup per company, so runs take longer. Adds `founders[]` (name, title, bio, linkedinUrl, twitterUrl, avatarUrl, isActive, hasEmail) plus `socials` (linkedin, twitter, facebook, crunchbase, github), `appVideoUrl`, `demoDayVideoUrl`.

## `scrapeOpenJobs` (type: `boolean`):

Companies mode only. Adds one extra lookup per company, so runs take longer. Adds `openJobs[]` (title, role, location, salary, equity, experience, applyUrl, posted-ago).

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Best-effort.

## `maxItems` (type: `integer`):

**Per-URL cap.** Each entry in Start URLs (Option A) and each filter run (Option B) gets its own quota of this many records. Pasting 3 URLs with `maxItems=100` returns up to 300 rows total (100 per URL). Free-tier accounts are capped at 100 per URL regardless.

## `monitoringMode` (type: `boolean`):

Jobs scraper only: only jobs whose numeric id has not been stored in your Key-Value store yet are enqueued (per Apify user id). Useful for scheduled runs that should only emit new postings.

## `maxConcurrency` (type: `integer`):

Jobs scraper only: max parallel requests.

## `minConcurrency` (type: `integer`):

Jobs scraper only: min parallel requests to keep active.

## `maxRequestRetries` (type: `integer`):

Jobs scraper only: retries before a request is marked failed.

## `proxy` (type: `object`):

Proxy for the Jobs scraper. The default works out of the box. Companies mode ignores this setting.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.ycombinator.com/jobs/role/software-engineer/san-francisco",
    "https://www.ycombinator.com/companies?batch=Spring%202026&industry=B2B"
  ],
  "mode": "jobs",
  "role": "",
  "location": "",
  "queries": [],
  "topCompany": false,
  "isHiring": false,
  "nonprofit": false,
  "batch": [
    "All Batches"
  ],
  "industries": [
    "All industries"
  ],
  "regions": [
    "Anywhere"
  ],
  "minEmployeeSize": "1+",
  "maxEmployeeSize": "1000+",
  "scrapeFounderDetails": false,
  "scrapeOpenJobs": false,
  "enrichEmails": false,
  "maxItems": 100,
  "monitoringMode": false,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 3,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.ycombinator.com/jobs/role/software-engineer/san-francisco",
        "https://www.ycombinator.com/companies?batch=Spring%202026&industry=B2B"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/y-combinator-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        "https://www.ycombinator.com/jobs/role/software-engineer/san-francisco",
        "https://www.ycombinator.com/companies?batch=Spring%202026&industry=B2B",
    ],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/y-combinator-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.ycombinator.com/jobs/role/software-engineer/san-francisco",
    "https://www.ycombinator.com/companies?batch=Spring%202026&industry=B2B"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call memo23/y-combinator-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/y-combinator-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SrIfcdrKs6VJr7M8W/builds/TaPbuMl7qAmNQxpND/openapi.json
