DEV Community

Gio Rich
Gio Rich

Posted on

How to pull the whole Y Combinator company directory into a spreadsheet (with founders) in 10 seconds

I built this actor; it's a paid tool on Apify with a free trial credit.

Y Combinator lists every company it has funded at ycombinator.com/companies: about 6,300 startups with batch, status, industry, team size, location and tags, and a page per company with founders and social links. It's a great lead list and a great market map, but the site only lets you scroll and click. There's no export.

I'm an 18-year-old engineering student, and I wrapped the directory in an actor called Y Combinator Companies Scraper. This post shows how to call it from Python and Node, what the data looks like, and one small project: a founder outreach list for the latest batch.

How it works, briefly

The YC directory is a search UI on top of a public search index. The actor reads the current search key from the page, queries the index with the same filters the website uses (batch, status, industries, regions, tags, hiring, top company, team size), and splits big result sets by batch because the index returns at most 1,000 hits per query. No browser, no login. The whole directory downloads in about 10 seconds.

With includeDetails: true it also opens each company's YC page and adds founders (name, title, LinkedIn/Twitter URL), the company's LinkedIn, Twitter/X, Crunchbase and GitHub links, year founded, city, country and open job titles. That's one extra request per company, still 5-10 companies per second.

Python example

pip install apify-client
Enter fullscreen mode Exit fullscreen mode
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("rel8ble/yc-companies-scraper").call(run_input={
    "batches": ["W25", "S25"],
    "statuses": ["Active"],
    "industries": ["B2B"],
    "teamSizeMin": 2,
    "teamSizeMax": 50,
    "includeDetails": True,
    "maxResults": 0,
})

for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    founders = ", ".join(f["name"] for f in c.get("founders", []))
    print(c["batchShort"], c["name"], c["website"], c["teamSize"], founders)
Enter fullscreen mode Exit fullscreen mode

Node example

npm install apify-client
Enter fullscreen mode Exit fullscreen mode
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const run = await client.actor('rel8ble/yc-companies-scraper').call({
    query: 'AI agents',
    statuses: ['Active'],
    sortBy: 'launch_date',
    maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const c of items) console.log(c.batchShort, c.name, c.oneLiner, c.website);
Enter fullscreen mode Exit fullscreen mode

What a result looks like

{
    "id": 30355,
    "name": "assistant-ui",
    "ycUrl": "https://www.ycombinator.com/companies/assistant-ui",
    "website": "https://assistant-ui.com",
    "oneLiner": "Open Source React.js Library for AI Chat",
    "batch": "Winter 2025",
    "batchShort": "W25",
    "status": "Active",
    "industry": "B2B",
    "subindustry": "Infrastructure",
    "tags": ["Developer Tools", "Generative AI", "Chat", "Web Development", "AI Assistant"],
    "regions": ["United States of America", "America / Canada"],
    "locations": "San Francisco, CA, USA",
    "teamSize": 3,
    "launchedAt": "2025-02-06T20:25:28.000Z",
    "isHiring": false,
    "yearFounded": 2024,
    "city": "San Francisco",
    "country": "US",
    "linkedinUrl": "https://linkedin.com/company/assistant-ui",
    "twitterUrl": "https://x.com/assistantui",
    "githubUrl": "https://github.com/assistant-ui",
    "founders": [
        { "name": "Simon Farshid", "title": "Founder/CEO", "linkedinUrl": "https://linkedin.com/in/simon-farshid", "twitterUrl": "https://twitter.com/simonfarshid", "isActive": true }
    ],
    "openJobsCount": 0,
    "launchesCount": 1
}
Enter fullscreen mode Exit fullscreen mode

A small project: founder outreach list for the newest batch

Say you sell a developer tool and want to reach technical founders from the most recent batch who are building infrastructure or dev tools. Three filters do it:

run = client.actor("rel8ble/yc-companies-scraper").call(run_input={
    "batches": ["S26"],
    "statuses": ["Active"],
    "tags": ["Developer Tools", "Infrastructure", "Open Source"],
    "includeDetails": True,
    "maxResults": 0,
})

import csv
rows = []
for c in client.dataset(run["defaultDatasetId"]).iterate_items():
    for f in c.get("founders", []):
        rows.append({
            "company": c["name"], "website": c["website"], "one_liner": c["oneLiner"],
            "team_size": c["teamSize"], "founder": f["name"], "title": f["title"],
            "linkedin": f["linkedinUrl"], "company_linkedin": c["linkedinUrl"],
        })

with open("yc_founders.csv", "w", newline="", encoding="utf-8") as fh:
    w = csv.DictWriter(fh, fieldnames=rows[0].keys())
    w.writeheader(); w.writerows(rows)
print(len(rows), "founders")
Enter fullscreen mode Exit fullscreen mode

One row per founder, with the company context next to it. At $1 per 1,000 companies, a whole batch costs about 25 cents.

Things I learned building it

  • Filters are exact-match on YC's labels. "Fintech" works, "fin tech" doesn't. The README lists every industry, region and tag with its company count, so you can copy them.
  • The 1,000-hit cap is real but invisible to you: the actor splits by batch automatically (the biggest batch, Winter 2022, has 398 companies).
  • Fill rates on the full directory: website 99%, one-liner 97%, description 93%, team size 98%, tags 86%. With details: company LinkedIn 97%, Twitter/X 70%, GitHub 33%, Crunchbase 10%.
  • Founder data is what YC publishes: names, titles, LinkedIn/Twitter URLs. No emails, no photos. The actor deliberately drops the avatar and email-availability fields that the page carries.

If something breaks or a field is wrong, the Issues tab on the actor page reaches me directly.

Y Combinator Companies Scraper on Apify


This article was drafted with AI and published by me.

Top comments (2)

Collapse
 
veristria profile image
StackShortlist •

A founder list for the latest batch is a good small project, since new companies are the ones still choosing their tools. Splitting the results by batch to get around the per-query limit is a neat detail too. Once you have the list, how do you decide which founders are worth writing to first?

Collapse
 
kevinhall profile image
Kevin Hall •

Nice that it runs without a browser, and the per-batch split to get around the 1,000-hit cap is a tidy detail. For the founder outreach idea, one check worth building in: a founder block is only as fresh as the company page, and small companies lose people faster than directories update. Status Active helps, but I would also confirm the founder's own profile still lists that company before anything goes out. For W25 and S25 it is mostly fine, the older the batch the more it matters. Good first project for an 18-year-old, by the way.