# Y Combinator Companies Scraper — Batch, Industry & Hiring (`northbell/y-combinator-companies-scraper`) Actor

Every Y Combinator company from the official directory: batch, industry, team size, location, website, hiring status and status (active, acquired, public, inactive). Filter by batch, industry, region or status. Run again to see new companies, acquisitions, team growth and hiring changes. No login.

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

## Pricing

from $0.40 / 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.
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

## Y Combinator Companies Scraper

Read the official Y Combinator company directory and get one clean row per company: **batch, industry, team size, location, website, hiring status and status (active, acquired, public or inactive)** with its one-liner and description. Filter by batch, industry, region, status or hiring, or search by text. **$0.50 per 1,000 companies** — the whole directory is about 6,300 companies, so a complete pull is about $3.15 — no login, no API key.

Run it again — or put it on a schedule — and every row also tells you **what changed since the last run**: which companies are new, which changed status (for example `Active -> Acquired`), how much the team size moved and who started or stopped hiring. The directory only shows today's picture; this keeps the history for you.

### What you get

| Field | What it is |
|---|---|
| `name`, `id`, `slug`, `url`, `logoUrl` | the company and its page in the YC directory |
| `oneLiner`, `longDescription` | the tagline and the full description from the directory, with **email addresses and phone numbers removed** |
| `batch`, `batchCode`, `launchedAt` | batch (`Summer 2024`, code `S24`); `launchedAt` is the directory's launch timestamp for the company's profile — for the oldest companies that is not the founding date (Stripe and Airbnb both show January 2012) |
| `status`, `stage` | `Active`, `Acquired`, `Public` or `Inactive`; `Early` or `Growth` |
| `industry`, `industries`, `subindustry`, `tags`, `regions` | the directory's own classification (`B2B`, `Fintech`, `Healthcare`…), tags (`SaaS`, `Developer Tools`…) and region tags (`Europe`, `India`, `Fully Remote`…) |
| `location`, `locations` | `locations` lists every place the directory gives (`San Francisco, CA, USA`, `Remote`…); `location` is the first one that is not `Remote` |
| `teamSize` | team size as the directory shows it |
| `isHiring`, `jobsUrl` | whether the directory marks the company as hiring, and the link to its YC jobs page when it does |
| `website`, `domain` | the company website (the directory's `utm_` tracking parameters removed) and its bare domain (`stripe.com`) |
| `topCompany`, `nonprofit` | the directory's flags |
| `isNew`, `previousRunAt` | `true` when the company appeared since your last run (see Notes for when this is known), and the run that last saw this company |
| `previousStatus`, `statusChanged` | the status last time, and `Active -> Acquired` style text when it changed (otherwise `null`) |
| `previousTeamSize`, `teamSizeChange` | the team size last time, and the difference (positive = grew, `0` = same) |
| `previousIsHiring`, `hiringChanged` | hiring last time, and `true` when it changed |
| `observedAt`, `type` | when the row was read; `company`, or `error` for something that could not be read (never charged) |

### Run it again and again

- **On a schedule** — save your input as a task and add a **Schedule**: the same filters every week. Send each run to Google Sheets, Slack or email with an integration on the task.
- **Watch for changes** — Keep the same input on the schedule. Each run is its own dataset with the date it ran, so the series builds up run by run and you can compare one day with the last.
- **In bulk** — Pick several **Batches**, **Industries** or **Regions** in one run.

### Use it for

- **Lead lists** — every YC company in a batch, industry or region, with its website and domain, ready for enrichment
- **Hiring signals** — companies that are hiring right now (`onlyHiring`), with the link to their YC jobs page
- **Market maps and research** — who was acquired, went public or shut down, per batch and industry
- **Watching the directory** — schedule a weekly run and filter the dataset to `isNew`, `statusChanged` or `hiringChanged`

### Input

```json
{ "batches": ["S24", "W24"], "status": ["Active"], "onlyHiring": true, "maxCompanies": 500 }
```

| Input | What it does |
|---|---|
| `batches` | `W24`, `S24`, `F25`, `P25` (W winter, P spring, S summer, F fall) or `Summer 2024`. Empty = every batch |
| `industries`, `regions` | only companies in at least one of these, spelled as the directory spells them (`Fintech`, `Europe`, `France`…). An unknown name stops the run and lists the options |
| `status` | any of `Active`, `Acquired`, `Public`, `Inactive` |
| `onlyHiring` | only companies marked as hiring |
| `query` | free text, like the search box on ycombinator.com/companies |
| `maxCompanies` | stop after this many (default 1,000, up to 7,000). Newest batch first |

Filters are combined with AND; several values inside one filter are combined with OR. The previous run is remembered in a named key-value store (`yc-companies-state`) in your Apify account, so the second run of the same Actor already shows changes.

### Pricing

**$0.50 per 1,000 companies**, plus $0.01 per run. Error rows are free. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing. A run that stops because a batch, industry or region name is not in the directory is not charged at all. Reading the whole directory (6,281 companies on 2026-10-08) costs about $3.15.

### Notes

- Public data only: what anyone sees on ycombinator.com/companies without signing in. **Companies only: no founder or people records, and no email addresses or phone numbers** (those are removed from descriptions). The descriptions are the companies' own text, so some of them mention their founders by name; the Actor does not read founder profiles or add person fields.
- **Order and limits.** The directory's search returns at most 1,000 results per query, so the Actor reads it batch by batch, newest batch first, and `maxCompanies` cuts the list in that order. On 2026-10-08 the directory already listed a few companies in Winter 2027 and Summer 2027, so those come first.
- **What the directory held on 2026-10-08:** 6,281 companies in 51 batches — 4,343 Active, 1,086 Inactive, 829 Acquired, 23 Public — and 1,495 marked as hiring.
- **Fields that are not always filled** (of the 6,281 companies on 2026-10-08): `oneLiner` 6,122, `longDescription` 5,859, `website` 6,237, `teamSize` 6,171 (the directory shows `0` for 137 companies and nothing for 110), `location` 6,087 (42 companies list only `Remote`, 152 list no place at all), `tags` 5,418. Missing values are `null` or an empty list, never guessed. `batchCode` is `null` for the one entry whose batch is `Unspecified` (Y Combinator itself).
- **Changes since the last run.** On the first run every since-last-run field is `null`. After that they are filled for every company an earlier run saw, and `previousRunAt` is the run that last saw that company. `isNew` is `true` only for a batch that an earlier run read **in full, without industry/region/status/hiring/text filters** and that no later run read in part; otherwise it is `null`, because a company missing from a partial read is not necessarily new. A run with filters or a `maxCompanies` cut that touches a batch makes its `isNew` unknown again until a later run reads the whole batch. To get reliable `isNew` values, make your first run unfiltered (or at least all batches you care about) and filter afterwards.
- **`regions` is a filter, not a ranking.** It matches the region tags in the directory. A live run with `France` returned 87 companies, the same number the directory reports for that tag.
- The company text (`oneLiner`, `longDescription`) is written by the companies; inline HTML, entities and invisible characters (zero-width spaces) are cleaned, nothing is rewritten.

Related Actors by northbell: [Jobs API](https://apify.com/northbell/job-aggregator-scraper) (pick **Industries** → Y Combinator companies), [LinkedIn Company Growth Scraper](https://apify.com/northbell/linkedin-company-growth-scraper), [Company Lookup by Domain](https://apify.com/northbell/company-lookup-by-domain).

### For AI agents

`{"batches": ["S24"], "maxCompanies": 5}` returns 5 company rows from Summer 2024. `{"onlyHiring": true, "status": ["Active"], "industries": ["Fintech"]}` returns active, hiring fintech companies. Rows have `type`: `company` or `error`; each `company` row has `name`, `batch`, `status`, `industry`, `teamSize`, `isHiring`, `website`, `domain` and the since-last-run fields.

# Actor input Schema

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

One batch per line: W24, S24, F25 or P25 (W winter, P spring, S summer, F fall), or a full name such as Summer 2024. Leave empty for every batch, newest first.

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

Only companies in at least one of these industries, as the directory spells them: B2B, Consumer, Healthcare, Fintech, Industrials, Education, Real Estate and Construction, Government, Infrastructure, Security, Marketing, Sales, Payments, Insurance, Energy and more (one per line). Unknown names stop the run and list the options.

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

Only companies tagged with at least one of these regions in the directory, for example Europe, India, France, Germany, United Kingdom, Latin America, Fully Remote (one per line). This is the Region filter of ycombinator.com/companies: it matches the region tags the directory gives each company.

## `status` (type: `array`):

Only companies with one of these statuses. Leave empty for all.

## `onlyHiring` (type: `boolean`):

Only companies the directory marks as hiring. Each row then carries a link to its YC jobs page.

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

Free text matched against company name, one-liner, description and tags, the same search box as on ycombinator.com/companies. Combine with the filters above.

## `maxCompanies` (type: `integer`):

Stop after this many companies. Newest batch first, so a small number gives you the most recent companies. The whole directory is about 6,300 companies.

## Actor input object example

```json
{
  "batches": [
    "S24",
    "W24"
  ],
  "onlyHiring": false,
  "maxCompanies": 1000
}
```

# Actor output Schema

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

Y Combinator companies with batch, industry, team size, hiring status and changes since the last run.

# 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": [
        "S24",
        "W24"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("northbell/y-combinator-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": [
        "S24",
        "W24",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("northbell/y-combinator-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": [
    "S24",
    "W24"
  ]
}' |
apify call northbell/y-combinator-companies-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northbell/y-combinator-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/ogFh1GKz7C0Tehj2N/builds/JWasfna1rPNu9G2cI/openapi.json
