# Y Combinator Companies Scraper - $0.90 per 1,000 (`dami_studio/ycombinator-companies-scraper`) Actor

Filter the YC startup directory by batch (W24, S23), industry, region, tag or status and get one row per company: pitch, batch, status, team size, founded year, location, website, tags, and founder names with LinkedIn links. $0.90 per 1,000. No key, no login, no browser.

- **URL**: https://apify.com/dami\_studio/ycombinator-companies-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 company scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Y Combinator Companies Scraper

Ask for a batch (`W24`, `S23`, `F24`), an industry, a region, a tag or a status, and you get back
the YC companies that match, one row each. If you already know which companies you want, paste their
profile URLs instead and skip the searching.

A row carries the one-line pitch and the long description, the batch, whether the company is active,
acquired, public or inactive, its team size, founding year, location, website, industries and tags.
Founders come with it: name, title, and a LinkedIn link where the founder published one.

It reads the public search index the directory itself uses. No account, no API key, no browser.

### Price

$0.90 per 1,000 companies, plus a $0.0005 start fee per run.

| Companies | Total |
|---|---|
| 100 | $0.0905 |
| 1,000 | $0.9005 |
| 10,000 | $9.0005 |

One `company-scraped` event per company row. That's the only per-row charge. Free: the sample row
an empty run writes, and every diagnostic row — a filter that matched nothing, a profile URL that
doesn't exist, a network problem. Those all carry `"charged": false`. Companies that already
appeared earlier in the same run are dropped before they're charged, so a company matching two of
your filters costs you once.

Filter the dataset on `charged == true` and the count equals the number of events you were billed
for.

### Input

```json
{
  "batches": ["W24", "S23"],
  "industries": ["B2B"],
  "statuses": ["Active"],
  "maxItems": 50
}
```

| Field | What it does |
|---|---|
| `batches` | Short (`W24`, `S23`, `F24`, `P25`) or long (`Winter 2024`). Up to 60 per run. Each batch is a separate query and the row budget is split between them. |
| `industries` | The directory's own labels: `B2B`, `Consumer`, `Healthcare`, `Fintech`, `Industrials`, `Education`, `Climate`. Several values are OR'd. |
| `regions` | `United States of America`, `Europe`, `India`, `Latin America`, `Africa`, `Remote`. Also OR'd. |
| `tags` | Profile tags: `Artificial Intelligence`, `SaaS`, `Developer Tools`, `Marketplace`, `Open Source`. |
| `statuses` | Any of `Active`, `Acquired`, `Public`, `Inactive`. Empty means all four. |
| `searchTerms` | Free text over names, pitches and descriptions. Each term is searched on its own and can be combined with the filters. |
| `companyUrls` | Profile URLs or bare slugs, up to 500 per run, if you'd rather look companies up than search for them. |
| `allCompanies` | Sweep the whole directory instead of filtering. Pair it with a high `maxItems`. |
| `isHiring` | Only companies flagged as hiring on their card. |
| `topCompaniesOnly` | Only the ones the directory marks as top companies. |
| `nonprofitOnly` | Only the non-profits. |
| `includeFounders` | On by default. This is what reads each company's own profile page, and it's the only source of `yearFounded`, `founders`, `city`, `country` and the social links. Turn it off for a faster run. Price per company is the same either way. |
| `maxItems` | Total rows across everything you asked for, split evenly. Default 20, ceiling 7,000. |
| `proxyUrls` | Leave empty. It's here for people who already pay for proxy servers and want traffic to leave through them. |

Run it with empty input and you get one labelled sample row, free, so you can see the shape before
spending anything.

### Output

```json
{
  "ok": true,
  "charged": true,
  "recordType": "company",
  "query": "Winter 2014",
  "name": "Cruise",
  "slug": "cruise",
  "oneLiner": "Self-driving cars.",
  "longDescription": "Cruise is building the world's most advanced, all-electric, self-driving car technology...",
  "batch": "Winter 2014",
  "batchCode": "W14",
  "status": "Acquired",
  "teamSize": 3000,
  "yearFounded": 2013,
  "location": "San Francisco, CA, USA",
  "city": "San Francisco",
  "country": "US",
  "regions": ["United States of America", "America / Canada", "Remote"],
  "website": "http://getcruise.com",
  "ycProfileUrl": "https://www.ycombinator.com/companies/cruise",
  "industry": "Industrials",
  "industries": ["Industrials", "Automotive"],
  "subindustry": "Industrials -> Automotive",
  "tags": ["Autonomous Delivery", "Machine Learning", "Climate", "AI"],
  "founders": [
    {
      "name": "Kyle Vogt",
      "title": "Founder/CEO",
      "linkedinUrl": "https://www.linkedin.com/in/kylevogt/",
      "twitterUrl": null,
      "bio": "Kyle started Cruise in 2013, eventually selling it to GM for $1 billion."
    }
  ],
  "founderNames": "Kyle Vogt, Daniel Kan",
  "founderCount": 2,
  "linkedinUrl": "https://www.linkedin.com/company/getcruise/",
  "twitterUrl": "https://twitter.com/Cruise",
  "facebookUrl": "https://www.facebook.com/cruiseautomation/",
  "crunchbaseUrl": "https://www.crunchbase.com/organization/cruise",
  "githubUrl": null,
  "logoUrl": "https://bookface-images.s3.amazonaws.com/small_logos/b9aae9....png",
  "formerNames": [],
  "isHiring": false,
  "nonprofit": false,
  "topCompany": true,
  "stage": "Growth",
  "launchedAt": "2013-11-20T20:18:37.000Z",
  "companyId": "590",
  "scrapedAt": "2026-08-16T19:48:58.631Z"
}
```

A few fields worth explaining:

- `batch` and `batchCode` are the same thing twice: `Winter 2024` and `W24`. Companies with no batch
  on record read `Unspecified`.
- `teamSize` is whatever the company last reported, not a live headcount.
- `location` is the free-text string on the directory card. `city` and `country` come from the
  profile page, so they're `null` when `includeFounders` is off.
- `founders` is an array of `{name, title, linkedinUrl, twitterUrl, bio}`. `founderNames` is the same
  names joined with commas, for spreadsheets that choke on nested arrays.
- `launchedAt` is when the company first appeared on the directory, not when it was founded. That's
  `yearFounded`.
- `companyId` is the directory's own numeric id as a string. It's stable across runs, so use it as
  your key when you re-run.

### How the row budget is split

The search index answers at most 1,000 hits for any one query. That only matters if you ask for more
than that, and it's handled two ways:

Several batches in one run get a query each, so ten batches and 200 rows gives you twenty companies
per batch rather than two hundred from the first one. A batch smaller than its share just returns
fewer; the leftover isn't handed to the others.

Set `allCompanies` with `maxItems` above 1,000 and the run walks the batch list itself, newest
first. The biggest batch holds under 400 companies, so no single query ever hits the ceiling and the
whole directory (roughly 6,200 companies) is reachable in one run.

Free-text terms work the same way — equal share each, and a company already delivered by an earlier
term is skipped instead of charged twice.

### Limits

- Companies only. Job postings, launches, news and demo-day videos aren't in scope.
- `yearFounded` is only as complete as the directory. About four companies in five publish one; the
  rest read `null`.
- A company that lists no founders publicly comes back with an empty `founders` array. In a sample of
  50 companies spanning 2005–2025 that was about one in twenty-five, mostly the oldest and newest
  entries.
- Founder emails aren't published anywhere on the directory, so they aren't in the output and no
  attempt is made to guess them.
- Some long-dormant entries from the earliest batches have no pitch and no tags, so `oneLiner` and
  `tags` can be empty on those.
- Team size, hiring flag and status are a snapshot at read time. If the company edits its profile a
  minute later, your row is already stale.
- `Unspecified` shows up in batch, region and industry on older entries. That's what the directory
  holds, not a scraping failure.
- A single filter combination that genuinely matches more than 1,000 companies and isn't split by
  batch will stop at 1,000.
- Turn `includeFounders` off and `yearFounded`, `founders`, `city`, `country` and the social links
  all come back `null`. Those live on the profile page, not the directory card.
- Hard ceilings: 7,000 rows per run, 60 values per filter list, 500 company URLs per run.
- The directory is the only source. Funding amounts, valuations, revenue and investor lists aren't
  published there, so they aren't here either.

### Rows you'll see

Three kinds, easy to tell apart:

- Real rows: `"charged": true`, `"recordType": "company"`.
- The sample row: `"_sample": true`, `"charged": false`. Exactly one, only on an empty run.
- Diagnostics: `"_diagnostic": true`, `"charged": false`, plus an `errorCode` — `NO_RESULTS`,
  `NOT_FOUND`, `NETWORK`, `RATE_LIMITED`, `TIME_BUDGET`. Each carries a plain-English `error` and the
  `query` or `inputUrl` it belongs to.

A blocked or broken target produces a diagnostic row and the run still finishes as succeeded. A
failed run would still bill the start fee, which would mean paying to be told something went wrong.

### Questions

**How do I get a whole batch?** Put it in `batches` and set `maxItems` above its size. The biggest
batch to date holds just under 400 companies.

**How do I get every company?** Tick `allCompanies` and set `maxItems` to 7000. The run walks the
batch list newest first and stops when it runs out of companies or budget.

**Can I get founder emails?** No. The directory doesn't publish them. You get names, titles, and
LinkedIn and X profiles where the founder linked one.

**Do I need a proxy?** No. The run brings its own egress and that cost is already in the price.

**Can I schedule it?** Yes. Nothing is held between runs. Diff on `companyId` to see what's new.

# Actor input Schema

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

YC batches to pull, written either short (W24, S23, F24, P25) or long (Winter 2024, Summer 2023). Leave empty to search across every batch. Each batch is queried separately, so ten batches and 100 rows gives you ten companies from each.

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

Filter by the industry labels the directory itself uses, for example B2B, Consumer, Healthcare, Fintech, Industrials, Education, Infrastructure, Marketing, Security, Climate. Several values are combined with OR.

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

Filter by the region labels the directory uses, for example United States of America, Europe, India, Latin America, Remote, Canada, Africa, Southeast Asia. Several values are combined with OR.

## `tags` (type: `array`):

Filter by the free-form tags on a company profile, for example Artificial Intelligence, SaaS, Developer Tools, Marketplace, Generative AI, Open Source, Health Tech. Several values are combined with OR.

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

Keep only companies with these statuses. Leave empty for all four.

## `searchTerms` (type: `array`):

Free-text search across company names, pitches and descriptions, for example "robotics", "climate", "payments in Africa". Each term is searched separately and can be combined with the filters above.

## `companyUrls` (type: `array`):

Look up specific companies instead of searching. Paste full profile URLs (https://www.ycombinator.com/companies/doordash) or bare slugs (doordash). Up to 500 per run.

## `allCompanies` (type: `boolean`):

Sweep the entire directory instead of filtering. Combine it with a high row limit; the run walks batch by batch, newest first. Remember you pay per company.

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

Keep only companies flagged as hiring on their directory card.

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

Keep only the companies the directory marks as top companies.

## `nonprofitOnly` (type: `boolean`):

Keep only the non-profit organisations in the directory.

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

On by default. Reads each company's own profile page as well, which is what fills in founder names and titles, the year the company was founded, its city and country, and its LinkedIn, X, Facebook, Crunchbase and GitHub links. Turn it off for a faster, lighter run when you only need the directory card. The price per company is the same either way.

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

Total number of companies to return in this run, shared evenly across your batches and search terms. Default 20, hard ceiling 7,000 (the directory holds about 6,200). Keep it low while you are testing - you pay per company.

## `proxyUrls` (type: `array`):

Leave this empty. By default the run rotates a large pool of addresses that cost you nothing per gigabyte. Fill it in only if you specifically want the traffic to leave through proxy servers you already pay for, in the form http://user:pass@host:port.

## Actor input object example

```json
{
  "batches": [
    "W24",
    "S23"
  ],
  "maxItems": 20
}
```

# Actor output Schema

## `results` (type: `string`):

Every row in the default dataset: name, oneLiner, batch, status, teamSize, yearFounded, location, website, ycProfileUrl, founderNames, industry, tags, longDescription, batchCode, slug, city, country, regions, industries, subindustry, founders, founderCount, linkedinUrl, twitterUrl, facebookUrl, crunchbaseUrl, githubUrl, logoUrl, formerNames, isHiring, nonprofit, topCompany, stage, launchedAt, companyId, query, inputUrl, scrapedAt. An empty, blocked or unmatched run returns a single uncharged row explaining what happened instead.

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

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

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

```

## MCP server setup

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