# Y Combinator Companies Scraper - YC Startup Directory (`rjmacarthy/ycombinator-companies-scraper`) Actor

Export the Y Combinator startup directory (6,000+ companies): filter by batch, industry, region, status, hiring and team size. Optional company details: founding year, company socials, open jobs, founder names. Only-new mode for new-batch alerts.

- **URL**: https://apify.com/rjmacarthy/ycombinator-companies-scraper.md
- **Developed by:** [rj](https://apify.com/rjmacarthy) (community)
- **Categories:** Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 companies

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 Companies Scraper - YC Startup Directory with Batch, Industry & Hiring

Export the whole [Y Combinator startup directory](https://www.ycombinator.com/companies) (about 6,400 companies, every batch from Summer 2005 to the latest one) to JSON, CSV or Excel. Filter by **batch, industry, region, status, hiring, team size, top companies and nonprofits**, or paste specific YC company URLs. Optionally open each company page for its **founding year, company LinkedIn / X / Crunchbase / GitHub links, open jobs and founders' names and titles**.

Why this one: it reads a fresh directory search key at the start of every run (so it doesn't break when YC rotates it), and splits big exports batch by batch to get past the directory's 1,000-results-per-search cap, so a full export returns every company. There's no start fee: you pay $0.001 per company. An **Only new companies** mode turns it into an alert for new batch members.

### What data can you get

| Field | Example | Notes |
|---|---|---|
| `name`, `slug`, `url` | F2, `f2`, https://www.ycombinator.com/companies/f2 | YC profile URL |
| `website` | http://f2.ai | |
| `oneLiner`, `longDescription` | "The AI platform for private markets investors" | |
| `batch`, `batchShort` | Summer 2025, S25 | |
| `status`, `stage` | Active, Early | Active / Acquired / Public / Inactive |
| `industry`, `subindustry`, `industries`, `tags` | B2B, \["B2B", "Engineering, Product and Design"], \["AI"] | |
| `regions`, `location` | \["United States of America", "Remote"], "New York City, NY, USA" | |
| `teamSize` | 15 | as listed on YC |
| `isHiring`, `topCompany`, `nonprofit` | true, false, false | |
| `launchedAt` | 2025-11-10T15:49:41.000Z | when the company was published in the directory |
| `logoUrl`, `formerNames`, `id`, `scrapedAt` | | `id` is YC's stable company id |
| **With Fetch company details:** | | |
| `yearFounded` | 2025 | |
| `linkedinUrl`, `twitterUrl`, `facebookUrl`, `crunchbaseUrl`, `githubUrl` | https://www.linkedin.com/company/f2aihq | the **company's** own profiles |
| `openJobsCount`, `jobs` | 3, \[{ title, url, location, type, role, salaryRange }] | jobs listed on the YC page |
| `founders` | \[{ "name": "…", "title": "Founder/CEO" }] | name and title only |
| `detailsStatus` | ok | `not-requested`, `ok` or `failed` |

### Use cases

- **Lead lists and market maps**: every YC fintech, healthcare or developer-tools startup in a region, with team size and website.
- **New-batch alerts**: schedule a daily run with *Only new companies* and get just the companies added to the directory since the last run.
- **Recruiting and job hunting**: hiring YC startups with their open roles, salary ranges and job links.
- **Investor and VC research**: track batches, status changes (acquired, public, inactive) and the YC Top Companies list.
- **Enrichment**: look up a list of YC company URLs and add the company's socials, founding year and founders' titles.

### How to use

1. Pick filters (all optional) or paste company URLs.
2. Set **Max companies** (0 = no limit).
3. Turn on **Fetch company details** only if you need the company-page fields: it costs one extra event per company and is slower.
4. Run, then download the dataset as JSON, CSV, Excel or HTML.

The latest batch (Summer 2025, first 15 companies):

```json
{ "batches": ["Summer 2025"], "maxItems": 15 }
```

Active fintech startups in Europe:

```json
{ "industries": ["Fintech"], "regions": ["Europe"], "statuses": ["Active"], "maxItems": 50 }
```

Hiring healthcare startups from Winter 2026, with open jobs and company links:

```json
{ "batches": ["W26"], "industries": ["Healthcare"], "isHiring": true, "fetchDetails": true, "maxItems": 8 }
```

The whole directory, newest batches first:

```json
{ "maxItems": 0 }
```

Specific companies:

```json
{ "startUrls": ["https://www.ycombinator.com/companies/airbnb", "https://www.ycombinator.com/companies/stripe"], "fetchDetails": true }
```

Batches can be written in full (`Summer 2025`) or in YC's short form (`S25`, `W24`, `X25` for Spring, `F24` for Fall). Industry and region names are matched case-insensitively against the directory's own filter values. Unknown values are reported in the log.

### Output example

One item from a real run with *Fetch company details* on (long description shortened):

```json
{
  "id": 31163,
  "name": "Opalite Health",
  "slug": "opalite-health",
  "url": "https://www.ycombinator.com/companies/opalite-health",
  "website": "http://opalitehealth.com/",
  "oneLiner": "Helping Healthcare Providers Speak Any Language",
  "longDescription": "Opalite makes it easy for healthcare providers to communicate with non-English speaking patients ...",
  "batch": "Winter 2026",
  "batchShort": "W26",
  "status": "Active",
  "stage": "Early",
  "industry": "Healthcare",
  "subindustry": "Healthcare",
  "industries": ["Healthcare"],
  "tags": [],
  "regions": ["United States of America", "America / Canada", "Remote", "Partly Remote"],
  "location": "San Francisco, CA, USA",
  "teamSize": 3,
  "isHiring": true,
  "topCompany": false,
  "nonprofit": false,
  "launchedAt": "2026-01-13T17:27:04.000Z",
  "logoUrl": "https://bookface-images.s3.amazonaws.com/small_logos/486a2091ac156a249fa74de7d7c575fedb03c889.png",
  "formerNames": ["Calliope"],
  "yearFounded": 2025,
  "linkedinUrl": "https://www.linkedin.com/company/opalite-health/",
  "twitterUrl": null,
  "facebookUrl": null,
  "crunchbaseUrl": null,
  "githubUrl": null,
  "openJobsCount": 1,
  "jobs": [
    {
      "title": "Founding Technical GTM",
      "url": "https://www.ycombinator.com/companies/opalite-health/jobs/bNedVAD-founding-technical-gtm",
      "location": "San Mateo, CA, US",
      "type": "Full-time",
      "role": "Sales",
      "salaryRange": "$70K - $200K"
    }
  ],
  "founders": [{ "name": "Alex Mehregan", "title": "Founder/CTO" }],
  "detailsStatus": "ok",
  "scrapedAt": "2026-11-06T12:25:53.105Z"
}
```

Without *Fetch company details*, the detail fields are `null` and `detailsStatus` is `not-requested`. Every item has the same keys.

### Pricing

Pay per event, no start fee:

| Event | Price | When |
|---|---|---|
| `company` | $0.001 | every company in the output |
| `company-details` | $0.001 | each company whose YC page was read with *Fetch company details* |

Worked examples:

- 1,000 companies ≈ **$1.00**
- the whole directory (≈ 6,400 companies) ≈ **$6.40**
- 1,000 companies with details ≈ **$2.00**

A company page that can't be read is not charged as `company-details` (the item says `detailsStatus: "failed"`). With *Only new companies*, companies seen in earlier runs are skipped and not charged. The Actor respects your **Maximum cost per run** and stops cleanly when it is reached.

### Tips and limits

- Without details, a run is fast: the search API returns up to 1,000 companies per request. In testing, 1,106 companies (split over 45 batches) took 46 seconds at 1 request per second, and the full directory takes about a minute at the default speed.
- With details, the Actor reads one page per company (2 per second by default), so 1,000 companies take about 8-10 minutes.
- Results come in the directory's default order. Exports bigger than 1,000 companies are fetched batch by batch, newest batch first.
- `teamSize`, `isHiring`, `regions` and the rest are what YC lists. Companies update these themselves, so some are out of date.
- **Only new companies:** the first run saves its output as the baseline. Set **Max companies** to 0 on that run, otherwise companies beyond the limit will show up as "new" next time. Use a different **State key** for each monitor.
- A company URL that isn't in the public directory any more is listed under `notFound` in the run summary. The rest of the run carries on.
- `jobs` lists the roles shown on the company's YC page. Applying needs a Work at a Startup account.

### FAQ

**Is it legal?** The Actor reads only public pages and the same public search index the YC directory uses in your browser, and it follows ycombinator.com's robots.txt. It collects company-level business data. You are responsible for using the data in line with the laws that apply to you (e.g. GDPR) and YC's terms.

**Does it collect personal data?** No harvesting. Founders appear only as the name and job title YC shows on the company page. Founders' bios, personal LinkedIn/X profiles, photos, e-mails and phone numbers are never collected. The social links in the output belong to the company.

**Do I need a proxy?** Normally no. If ycombinator.com ever rate-limits your runs, enable Apify Proxy (datacenter). Residential proxies are not supported: if you pick the RESIDENTIAL group, the Actor logs a warning and uses datacenter proxy instead.

**Why do my industry or region values return nothing?** They must match the directory's filter values (case doesn't matter). The run log lists valid values when one is unknown.

**What's in the run summary?** The `RUN_SUMMARY` record in the key-value store holds the total number of matches, companies output, details read or failed, URLs not found, warnings and request statistics.

### Integrations

Use the results anywhere through the [Apify API](https://docs.apify.com/api/v2), the Apify JavaScript and Python clients, or integrations with **Make, Zapier, n8n, Google Sheets, Slack** and webhooks. AI agents can call the Actor through the [Apify MCP server](https://mcp.apify.com). Schedule it in Apify Console for daily new-company alerts.

### Changelog

- **0.1** (November 2026): first release. Filters for batch, industry, region, status, hiring, team size, top companies and nonprofits. Company URL lookup, company details, and only-new mode.

### Ready-to-run examples

- [Find active Y Combinator fintech startups in Europe](https://apify.com/rjmacarthy/ycombinator-companies-scraper/examples/yc-fintech-startups-europe)
- [Export the Y Combinator Top Companies list](https://apify.com/rjmacarthy/ycombinator-companies-scraper/examples/yc-top-companies-list)

### More scrapers by the same developer

- [Luma Events Scraper: Tech, AI & Crypto Events by City](https://apify.com/rjmacarthy/luma-events-scraper)
- [Meetup Events Scraper - Search Events & Groups by Topic & City](https://apify.com/rjmacarthy/meetup-events-scraper)
- [AliExpress Scraper - Product Search, Prices, Ratings & Details](https://apify.com/rjmacarthy/aliexpress-scraper)
- [Apple App Store Scraper: Apps, Search & Reviews](https://apify.com/rjmacarthy/app-store-scraper)
- [AutoScout24 Scraper - Used Car Listings & Prices (Europe)](https://apify.com/rjmacarthy/autoscout24-scraper)
- [Bing Search Scraper: Organic Results, Ads & Related Searches](https://apify.com/rjmacarthy/bing-search-scraper)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

### Support

Found a bug or need a field? Open an issue on the Actor's **Issues** tab and include the run ID.

# Actor input Schema

## `query` (type: `string`):

Free-text search over company names, one-liners and descriptions, like the search box on ycombinator.com/companies (e.g. "AI agents", "payments"). Leave empty to list everything that matches the filters.

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

YC batches to include. Full names ("Summer 2025") or YC's short form ("S25", "W24", "X25" = Spring 2025, "F24" = Fall 2024). Empty = all batches.

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

Industries or sub-industries as shown in the directory filter, e.g. "Fintech", "Healthcare", "B2B", "Payments", "Security". Case-insensitive. A company matches if it has any of them.

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

Regions or countries as shown in the directory filter, e.g. "United States of America", "Europe", "India", "Remote". Case-insensitive. A company matches if it has any of them.

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

Only companies with one of these statuses. Empty = all.

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

Only companies with open jobs on Work at a Startup.

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

Only companies on YC's Top Companies list.

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

Only nonprofit organisations.

## `teamSizeMin` (type: `integer`):

Only companies with at least this many employees (as listed on YC). Empty = no minimum.

## `teamSizeMax` (type: `integer`):

Only companies with at most this many employees. Empty = no maximum.

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

Look up specific companies instead of searching: YC company URLs such as https://www.ycombinator.com/companies/airbnb (or just the slug "airbnb"). When set, the search text and filters above are ignored.

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

Stop after this many companies. 0 = no limit (the whole directory is about 6,400 companies).

## `fetchDetails` (type: `boolean`):

Also open each company's YC page to add the founding year, the company's own LinkedIn / X (Twitter) / Facebook / Crunchbase / GitHub links, open jobs (title, URL, location, salary range) and founders' names and titles. Charged as an extra 'company-details' event per company. Founders' personal profiles, bios and contact details are never collected.

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

Remember which companies were already output and only output (and charge for) companies that are new since the previous run with the same state key. The first run outputs the current matches (up to Max companies) as the baseline - set Max companies to 0 on that run so later runs don't report old companies as new. Ideal for scheduled alerts on new batch members.

## `stateKey` (type: `string`):

Name of the 'seen companies' memory used by Only new companies. Use a different key for each monitor (e.g. "s26-fintech").

## `maxRequestsPerSecond` (type: `integer`):

Politeness limit per host (company pages and the search API). The default is fine for most runs.

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

Not needed normally. Enable Apify Proxy (datacenter) if ycombinator.com blocks or rate-limits your runs. Residential proxies are not supported: if you pick the RESIDENTIAL group the Actor logs a warning and uses Apify datacenter proxy instead.

## Actor input object example

```json
{
  "query": "",
  "batches": [
    "Summer 2025"
  ],
  "industries": [],
  "regions": [],
  "statuses": [],
  "isHiring": false,
  "topCompaniesOnly": false,
  "nonprofit": false,
  "startUrls": [],
  "maxItems": 15,
  "fetchDetails": false,
  "onlyNew": false,
  "stateKey": "default",
  "maxRequestsPerSecond": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per company: batch, status, industries, regions, team size, hiring flag and links.

## `companiesFull` (type: `string`):

Every field, including company details, open jobs and founders when Fetch company details is on.

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

Counts, filters used, not-found URLs, request statistics and warnings.

# 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": [
        "Summer 2025"
    ],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/ycombinator-companies-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": ["Summer 2025"],
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("rjmacarthy/ycombinator-companies-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": [
    "Summer 2025"
  ],
  "maxItems": 15
}' |
apify call rjmacarthy/ycombinator-companies-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rjmacarthy/ycombinator-companies-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/sqUJjX2Oqk2QNt8qJ/builds/YZi1oPmpSfwarodHu/openapi.json
