# Y Combinator Scraper - YC Companies, Jobs & Startup Directory (`tidytools/y-combinator-scraper`) Actor

All 6,000+ Y Combinator companies by batch, industry, location, status and team size, with founders, social links, launches and open jobs (salary, equity, visa). New-company and new-job alerts. $2 per 1,000 companies, $1 per 1,000 jobs.

- **URL**: https://apify.com/tidytools/y-combinator-scraper.md
- **Developed by:** [Yukai Lin](https://apify.com/tidytools) (community)
- **Categories:** Lead generation, Jobs, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Y Combinator Scraper do?

**Input:** YC batches, industries, locations, status or keywords (or a list of YC company links); choose companies or jobs. **Output:** one row per YC company (with founders' names, links and open jobs) or one row per open job (with salary, equity and visa). **Price:** $2 per 1,000 companies with profile details, $0.50 per 1,000 with directory fields only, $1 per 1,000 jobs; filtered-out and failed items are free; no start fee.

It exports the **Y Combinator startup directory** (all 6,000+ YC companies since 2005) as clean rows, and the **open jobs** those startups post on their YC pages:

- 🏢 **Companies**: name, batch (e.g. Fall 2026), status (Active, Acquired, Inactive, Public), one-liner, description, website and domain, team size, industry, sub-industry, tags, locations, regions, stage, hiring flag, YC top company flag, logo.
- 🔗 **Profile details** from each company's YC page: **founders' names and titles**, year founded, city and country, company LinkedIn, X, GitHub and Crunchbase links, YC group partner, open job titles, Launch YC posts and press links.
- 💼 **Jobs mode**: every open job of the matching companies with **salary range, equity range**, location, remote flag, role, specialty, minimum experience, **visa** requirement and skills.
- 🔎 **Filters**: batches (codes like W26, names like "Summer 2025" or a whole year), status, industries and tags, locations, keywords, hiring only, top companies, stage, team size; job role, job keywords, job location, minimum USD salary.
- 🔔 **Only new** for schedules: companies that are new in the directory, **changed status** (e.g. Active → Acquired) or **started hiring**; in jobs mode, jobs not seen before. Everything unchanged is skipped for free.

#### Why this Actor?

- **Companies, founders and jobs in one Actor**, with filters on both, instead of separate company and job scrapers.
- **Change alerts**: new batch companies, acquisitions and companies that start hiring, not only "new rows".
- **Fast and cheap**: the whole directory (6,269 companies) in 23 seconds for $3.13 with directory fields, or $2 per 1,000 companies with profile details; jobs $1 per 1,000.
- **Honest access**: our TidyTools user agent, ycombinator.com/robots.txt respected (only public company pages are read, about 2.5 per second), no logins.

#### Real results (3-4 October 2026)

- Default input (Fall 2026 + Summer 2026 batches, 20 companies with profile details): 341 companies matched, **20 returned in 11.9 seconds, $0.04**.
- Jobs mode, all 2026 batches, engineering roles: **200 jobs from 131 hiring startups in 55 seconds, $0.20**; 126 non-engineering jobs dropped for free. 174 of the 200 had a USD salary range, 18 were remote.
- The whole directory with directory fields only: **6,269 companies in 23 seconds, $3.13**.
- "Only new" on the Fall 2026 batch: first run 110 companies ($0.055), second run 0 changes, $0.
- Specific companies: Airbnb (Winter 2009, Public, 6,132 people, 3 founders, YC partner listed), Stripe (Summer 2009, 3 open jobs), Dropbox; an unknown name and an unknown slug came back as free `not_found` rows.

### Use cases

- **Sales and partnerships**: newest YC companies by industry and city, with website and founders' names, every batch as soon as it is listed.
- **Recruiting and job seekers**: all open YC startup jobs with salary, equity and visa, filtered by role and location; daily alerts for new jobs.
- **VC and market research**: batch composition by industry and region, status changes (acquired, inactive), hiring momentum.
- **Lead enrichment**: domain, LinkedIn and team size for a list of YC companies (put their YC links under "Specific companies").

### How to use it

1. **What to return**: companies or jobs.
2. Choose **batches** (W26, "Summer 2025", "2024" ...) and other filters, or list **specific companies** by YC link, slug or exact name. Lists can be pasted one per line or separated by `;`, `,` or tabs; a company listed twice in different spellings is read and charged once. Commas normally separate company names (`Airbnb, Stripe`). A limited CSV row such as `Airbnb, Winter 2009, San Francisco` selects only Airbnb when the first cell uniquely matches a directory company, the second is a YC batch, and no later cell identifies another YC company; the batch and later non-company cells are ignored. Use tabs for other spreadsheet layouts.
3. Companies mode: keep **Profile details** on for founders, links and jobs, or turn it off for the cheap directory export.
4. Jobs mode: optional **roles**, **job keywords**, **job locations**, **minimum USD salary**.
5. For alerts: turn on **Only new**, give a **Monitor name** and schedule the task (Apify Console → Schedules).

#### Input example

```json
{
    "mode": "jobs",
    "batches": ["2026", "2025"],
    "industries": ["B2B", "Developer Tools"],
    "jobRoles": ["eng"],
    "jobLocations": ["San Francisco", "Remote"],
    "minSalaryUsd": 150000,
    "maxResults": 300,
    "onlyNew": true,
    "monitorName": "yc-eng-jobs"
}
```

#### Output example

A company with profile details (real result, 4 October 2026, shortened):

```json
{
    "type": "company",
    "name": "Stripe",
    "slug": "stripe",
    "batch": "Summer 2009",
    "batchCode": "S09",
    "status": "Active",
    "oneLiner": "Economic infrastructure for the internet.",
    "website": "http://stripe.com",
    "domain": "stripe.com",
    "teamSize": 7000,
    "industry": "Fintech",
    "tags": ["Banking as a Service", "Fintech", "SaaS"],
    "locations": "San Francisco, CA, USA",
    "stage": "Growth",
    "isHiring": true,
    "topCompany": true,
    "yearFounded": 2009,
    "linkedinUrl": "https://www.linkedin.com/company/stripe/",
    "twitterUrl": "https://twitter.com/stripe",
    "githubUrl": "https://github.com/stripe",
    "founders": [
        { "name": "Patrick Collison", "title": "Founder/CEO", "isActive": true },
        { "name": "John Collison", "title": "Founder/President", "isActive": true }
    ],
    "founderNames": "Patrick Collison, John Collison",
    "openJobs": 3,
    "jobTitles": ["Frontend Engineer, Identity", "Machine Learning Engineer, Identity", "Head of Engineering, Identity Graph"],
    "news": [{ "title": "Stripe: 2023 CNBC Disruptor 50", "url": "https://www.cnbc.com/2023/05/09/stripe-disruptor-50.html", "date": "May 09, 2023" }],
    "ycUrl": "https://www.ycombinator.com/companies/stripe",
    "detailLevel": "profile",
    "charged": true
}
```

A job (jobs mode, shortened):

```json
{
    "type": "job",
    "jobId": "111785",
    "title": "Software Engineer",
    "company": "Volaren Inc.",
    "batch": "Fall 2026",
    "location": "San Francisco, CA, US / Remote (US)",
    "remote": true,
    "role": "Engineering",
    "specialty": "AI engineer",
    "salaryRange": "$50K - $150K",
    "salaryMin": 50000,
    "salaryMax": 150000,
    "salaryCurrency": "USD",
    "equityRange": "5.00%",
    "minExperience": "1+ years",
    "visa": "US citizen/visa only",
    "postedAgo": "9 days",
    "jobUrl": "https://www.ycombinator.com/companies/volaren-inc/jobs/KfqM968-software-engineer",
    "companyWebsite": "https://www.volaren.ai",
    "companyTeamSize": 4,
    "charged": true
}
```

#### What the fields mean

- **batch**: the YC batch name; **batchCode** (with profile details) YC's short code (W26, S25, F24, P26/X25 for Spring).
- **status**: YC's directory status. **change** (Only new): `new`, `status_changed` (with `previousStatus`) or `started_hiring`.
- **detailLevel**: `profile` (YC page read) or `directory` (directory fields only; also when a page could not be read, then `detailError` says why and the row is charged at the basic price).
- **founders**: names and titles shown on the company's YC page. Founders' personal profiles, bios and photos are not returned.
- **salaryMin / salaryMax / salaryCurrency**: parsed from the salary range; **postedAgo / lastActiveAgo** are YC's own relative times.
- **SUMMARY** (key-value store): companies and jobs returned, directory size and date, pages read, rows dropped per filter, free errors by `errorType`.

### How much does it cost?

| Event | Price | When |
|---|---|---|
| Company with profile | **$2.00 / 1,000** ($0.002 each) | one company with directory fields and its YC page details (founders, links, jobs, launches, news) |
| Company (directory fields) | **$0.50 / 1,000** ($0.0005 each) | one company with directory fields only (profile details off, or its page could not be read) |
| Job | **$1.00 / 1,000** ($0.001 each) | jobs mode: one open job after your filters |

**Free:** companies and jobs dropped by your filters, unchanged companies and seen jobs in "Only new" mode, invalid inputs, companies not found, repeated entries of the same company, and companies whose page cannot be read in jobs mode. **No start fee.** Larger Apify plans get the usual volume discount (Silver 10%, Gold and above 20%).

**Examples:** a new batch of about 200 companies with profiles: $0.40. Every open engineering job at 2025-2026 YC startups (a few hundred): under $1. A daily "Only new" check of a batch: usually $0.

For comparison (Apify Store, 4 October 2026): parsebird/yc-jobs-scraper $0.0028 per job (106 users in the last 30 days), nomad-agent/ycombinator-was-scraper $0.0025, scrapesage/ycombinator-scraper $0.003, haketa/ycombinator-companies-scraper $0.0025 per company, memo23/y-combinator-scraper and fatihtahta/y-combinator-directory-scraper $0.001, michael.g/y-combinator-scraper $0.15.

#### Control your cost

- **Max results** caps companies (newest first) or jobs.
- At the start the run logs the worst case and compares it with your **maximum charge per run**; when the next item could pass it, the run stops (`SUMMARY.status: LIMIT_REACHED`, `SUMMARY.notProcessed`).
- Every row has `charged: true` or `false`; free rows say "(not charged)". If Apify restarts the run, finished companies are not charged again.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tidytools~y-combinator-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"batches":["W26"],"industries":["Fintech"],"maxResults":50}'
```

**With AI agents (MCP):** connect Apify's MCP server (`https://mcp.apify.com?tools=tidytools/y-combinator-scraper`) to Claude, Cursor or any MCP client and ask, for example, "Which YC Summer 2026 companies build developer tools, and who founded them?". Minimal input: `{"batches": ["S26"], "industries": ["Developer Tools"]}`. Failed items are not charged and carry an `errorType`.

### Limitations

- **Directory source**: the company list comes from the open yc-oss dataset, rebuilt every day from YC's public directory, so a brand-new company can appear up to a day later. Profile details and jobs are read live from each company's public page on ycombinator.com.
- **Only publicly launched companies**: YC lists a company once it launches publicly; stealth companies are not in the directory.
- **Jobs** are the ones a company lists on its YC page (Work at a Startup). Applying needs a free YC account; this Actor does not log in or apply.
- **No emails**: YC pages do not show founders' emails, and this Actor does not guess them.
- **Team size and status** are what the company reports to YC and may lag reality.

### Responsible use

- The Actor returns company information and the founders' names and titles that YC publishes on each company's public page. It does not return founders' personal profiles, bios, photos, emails or phone numbers.
- Do you only need company data? Turn off **Founder names and titles** (`includeFounders`): founders, founderNames and founderCount are then left out.
- You are responsible for how you use the data: follow data-protection and anti-spam laws (GDPR, CAN-SPAM, CASL) when you contact people, and honour opt-out requests.

### FAQ

**Does the Actor collect usage data?** The Actor sends one anonymous usage counter per run (input type, item count range, outcome) to improve the tool; no URLs, content or account data.

**What if my input is wrong (unknown batch, status, stage, mode or job role)?** The run ends normally with one free `invalid_input` row that names the problem and the accepted values; nothing is read or charged. The same happens for a yes/no option, filter number or Max results that cannot be read (`"true"`, `"150,000"` and `"150k"` are read fine), so a typo never returns or charges more than you asked for. Names in "Specific companies" that are not in the directory give a free `not_found` row each, a name shared by several YC companies (e.g. "Apollo") gives a free `invalid_input` row listing their links, and the other companies are still returned. If the company directory cannot be loaded, the run ends the same way with a free `directory_unavailable` row.

**What if nothing matches my filters?** You get one free `no_results` row saying how many companies each filter dropped, and whether a batch you asked for is not in the directory yet (with the newest batches). In jobs mode it says which job filters dropped the jobs. An "Only new" run with nothing new ends without rows.

**I listed the same company twice (link, slug and name). Am I charged twice?** No. Every spelling of one company is read and charged once; the repeats are listed in `SUMMARY.duplicateInputs`. Commas still separate company lists (`Airbnb, Stripe`); a recognized `company, YC batch, other fields` CSV row selects one company as described above. Spreadsheet rows pasted with tabs use the first cell that is a YC link or company name.

**How do I get only the newest batch?** Put its code in Batches, e.g. `F26`, or "Fall 2026". A year (`2026`) covers all its batches.

**What do W, S, F, X and P mean?** Winter, Summer, Fall, and Spring (YC writes Spring as X25 and P26). Full names like "Summer 2025" work too.

**Can I track acquisitions?** Yes: schedule companies mode with "Only new". Companies whose status changes (for example to Acquired or Inactive) come back with `change: "status_changed"` and `previousStatus`.

**Why is a company missing?** It may not be publicly launched yet, or be newer than the daily directory: list its YC page link under "Specific companies" (with Profile details on) to read it directly.

**Is it allowed?** The Actor reads public YC company pages allowed by ycombinator.com/robots.txt, slowly, with an honest user agent, and returns only company information and the founders' names and titles YC publishes.

### Related Actors

- [SEC Form D Scraper](https://apify.com/tidytools/sec-form-d-scraper): companies that just raised money, from the SEC.
- [Job Search API](https://apify.com/tidytools/ats-job-search): jobs from 50,000+ company career sites (Greenhouse, Lever, Ashby ...).
- [Website Traffic Rank](https://apify.com/tidytools/website-traffic-rank): how popular a startup's website is.

# Actor input Schema

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

Companies: the YC directory with profile details. Jobs: every open job the matching companies list on their YC page (title, location, salary and equity range, experience, visa, skills).

## `batches` (type: `array`):

YC batches, e.g. "W26", "Summer 2025", "F24", "X25" (Spring), or a year like "2024" for all of its batches. Empty = all batches since 2005.

## `statuses` (type: `array`):

Keep only companies with these YC directory statuses. Empty = all.

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

Words matched in the company's industry, sub-industry and tags, e.g. "Fintech", "Healthcare", "B2B", "Developer Tools", "AI", "Robotics". A company matches if any word matches.

## `locations` (type: `array`):

Words matched in the company's locations and regions, e.g. "San Francisco", "New York", "United Kingdom", "India", "Remote".

## `keywords` (type: `array`):

Words matched in the name, one-liner, description and tags, e.g. "agents", "payments", "compliance".

## `hiringOnly` (type: `boolean`):

Keep only companies with open jobs on Work at a Startup (always on in jobs mode).

## `topCompaniesOnly` (type: `boolean`):

Keep only the companies on YC's top companies list.

## `stage` (type: `string`):

YC's own stage label of the company.

## `minTeamSize` (type: `integer`):

Keep companies with at least this many employees (YC's team size).

## `maxTeamSize` (type: `integer`):

Keep companies with at most this many employees.

## `companies` (type: `array`):

YC page links (https://www.ycombinator.com/companies/airbnb), slugs (airbnb) or exact names, one per line (or separated by ; or ,). The same company in several spellings is read and charged once. Replaces the filters above.

## `includeDetails` (type: `boolean`):

Read each company's YC page for founders, year founded, city and country, LinkedIn / X / GitHub / Crunchbase links, YC partner, open jobs, Launch YC posts and news ($0.002 per company). Off = directory fields only ($0.0005 per company). Always on in jobs mode.

## `includeFounders` (type: `boolean`):

Founders' names and titles as listed on the company's YC page. Personal profiles, bios and photos are not returned.

## `jobRoles` (type: `array`):

Keep only jobs in these roles. Empty = all roles.

## `jobKeywords` (type: `array`):

Words matched in the job title, specialty and skills, e.g. "founding engineer", "machine learning", "React".

## `jobLocations` (type: `array`):

Words matched in the job location, e.g. "San Francisco", "New York", "Remote", "London".

## `minSalaryUsd` (type: `integer`):

Keep only jobs whose USD salary range reaches at least this amount per year, e.g. 150000. Jobs without a USD salary range are dropped when this is set.

## `maxResults` (type: `integer`):

Most companies (companies mode, newest first) or most jobs (jobs mode) to return.

## `onlyNew` (type: `boolean`):

Companies mode: return only companies that are new in the directory, changed status (e.g. Active to Acquired) or started hiring since the last run of the same monitor; unchanged ones are skipped for free. Jobs mode: return only jobs not seen before.

## `monitorName` (type: `string`):

Name of the saved state (letters, digits, dashes). Use one name per schedule; empty = derived from the filters.

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

YC pages are read at about 2.5 per second in total whatever this value is; 3 is enough.

## `proxyConfiguration` (type: `object`):

Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account. Not needed normally.

## Actor input object example

```json
{
  "mode": "companies",
  "batches": [
    "Fall 2026",
    "Summer 2026"
  ],
  "hiringOnly": false,
  "topCompaniesOnly": false,
  "stage": "any",
  "includeDetails": true,
  "includeFounders": true,
  "maxResults": 20,
  "onlyNew": false,
  "monitorName": "",
  "maxConcurrency": 3
}
```

# Actor output Schema

## `companies` (type: `string`):

No description

## `jobs` (type: `string`):

No description

## `links` (type: `string`):

No description

## `full` (type: `string`):

No description

## `errors` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "batches": [
        "Fall 2026",
        "Summer 2026"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidytools/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 = {
    "batches": [
        "Fall 2026",
        "Summer 2026",
    ],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("tidytools/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 '{
  "batches": [
    "Fall 2026",
    "Summer 2026"
  ],
  "maxResults": 20
}' |
apify call tidytools/y-combinator-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidytools/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/4OfDed53gMCNUTw8c/builds/dEE8pZyhp8neqR4GG/openapi.json
