Y Combinator Companies, Batches & Founders avatar

Y Combinator Companies, Batches & Founders

Pricing

from $0.30 / 1,000 company returneds

Go to Apify Store
Y Combinator Companies, Batches & Founders

Y Combinator Companies, Batches & Founders

Scrape the Y Combinator startup directory as data. One row per company: name, website, one-liner, description, batch (W25), status, industry, tags, team size, region, launch date — filtered by batch, industry, status, region or keyword. Optionally adds founders and socials. No API key, no login.

Pricing

from $0.30 / 1,000 company returneds

Rating

0.0

(0)

Developer

Insight Solutions

Insight Solutions

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

The whole Y Combinator startup directory as a flat table. Every YC company — around 6,200 of them, from Summer 2005 to the current batch — with its name, website, one-liner, full description, batch, status, industry, tags, team size, region, location and launch date. Filter by batch (W25, S24), by industry, by status, by region, by tag, by whether the company is hiring, or by a full-text search across everything they wrote about themselves. Turn on includeFounders and each row also carries its founders with their LinkedIn and X profiles, the company's socials, the year it was founded, and its recent press.

No API key. No login. No scraping of anything a logged-out visitor cannot see. $0.50 per 1,000 companies, proxy included — the entire directory is about $3 — companies that could not be read are free, and a run that returns nothing costs nothing at all.

Try it in 30 seconds

Input — this is the Store prefill; paste it and run:

{
"batches": ["Winter 2025"],
"maxCompanies": 500
}

One batch, every company in it, four HTTP requests, a few seconds. W25 reaches the same batch, and so does Winter 2025.

Want all of it? {"maxCompanies": 10000} with no filters at all returns the whole directory. Want a slice? {"industries": ["Fintech"], "statuses": ["Active"], "isHiring": "yes"}. Want to search? {"queries": ["AI agents"]}.

Output — one row per company; the fields you will use most are name, batch, status, website and oneLiner (full list under Output reference). Anything that could not be read comes back as a free diagnostic row (ok: false, errorType, error) instead of a charge.

Price — $0.50 per 1,000 companies on the FREE tier (+ $0.001 per run, charged only after the first paid row); volume tiers are Scale $0.40 and Business $0.30 per 1,000, founder rows are $0.25 per 1,000, and a batch or industry name that does not exist, a filter set that matched nothing, a company page that has gone, a company the run never reached and a request the site blocked are all free. Pay-per-event, no API key, no browser, limited permissions — works over the Apify MCP server (mcp.apify.com) and with agentic (x402) payments.

From code — client.actor("insight.solutions/yc-companies-directory").call(run_input={…}) with apify-client, or POST https://api.apify.com/v2/acts/insight.solutions~yc-companies-directory/run-sync-get-dataset-items.

What comes back

One company row per company:

{
"ok": true,
"rowType": "company", // "company" | "founder" | "diagnostic"
"id": 271, // YC's own numeric ID — the join key
"name": "Airbnb",
"slug": "airbnb",
"url": "https://www.ycombinator.com/companies/airbnb",
"website": "http://airbnb.com",
"oneLiner": "Book accommodations around the world.",
"description": "Founded in August of 2008 and based in San Francisco, California, Airbnb is a trusted community marketplace for people to list, discover, and book unique accommodations around the world…",
"batch": "Winter 2009",
"batchShort": "W09", // YC's own abbreviation
"status": "Public", // "Active" | "Acquired" | "Public" | "Inactive"
"stage": "Growth", // "Early" | "Growth"
"industry": "Consumer",
"industries": ["Consumer", "Travel, Leisure and Tourism"],
"subindustry": "Consumer -> Travel, Leisure and Tourism",
"tags": ["Marketplace", "Travel"],
"regions": ["United States of America", "America / Canada"],
"location": "San Francisco, CA, USA",
"teamSize": 6132,
"launchedAt": "2012-01-17T09:00:56.000Z",
"isHiring": false,
"topCompany": true, // YC's own "top company" flag — 91 of 6,213
"nonprofit": false,
"formerNames": [], // every name it traded under before this one
"logoUrl": "https://bookface-images.s3.amazonaws.com/small_logos/3e9a0092…png",
"position": 2,
"query": null,
"batchFilter": "Winter 2009",
"source": "index", // "index" | "both" (both = its page was read too)
"scrapedAt": "2026-09-11T21:13:01.000Z",
"sourceUrl": "https://www.ycombinator.com/companies/airbnb"
}

With includeFounders: true the same row also carries:

{
"founders": [
{ "name": "Brian Chesky", "title": "Founder/CEO", "linkedin": "https://www.linkedin.com/in/brianchesky/", "twitter": "https://twitter.com/bchesky" },
{ "name": "Nathan Blecharczyk", "title": "Founder/CTO", "linkedin": "https://www.linkedin.com/in/blecharczyk/", "twitter": "https://twitter.com/nathanblec" },
{ "name": "Joe Gebbia", "title": "Founder/CPO", "linkedin": "https://www.linkedin.com/in/jgebbia/", "twitter": "https://x.com/jgebbia" }
],
"founderNames": "Brian Chesky, Nathan Blecharczyk, Joe Gebbia", // for spreadsheets
"founderCount": 3,
"yearFounded": 2008, // often earlier than the batch
"city": "San Francisco",
"country": "US",
"linkedin": "https://www.linkedin.com/company/airbnb/",
"twitter": "https://twitter.com/Airbnb",
"facebook": "https://www.facebook.com/airbnb/",
"crunchbase": "https://www.crunchbase.com/organization/airbnb",
"github": null,
"jobPostingCount": 0,
"newsItems": [ // YC's own curated press list, up to 10
{ "title": "Airbnb launches Airbnb Rooms listing category for budget travel", "url": "https://www.usatoday.com/…", "date": "May 03, 2023" }
],
"source": "both"
}

Add founderRows: true and each founder also gets a row of their own — company, companySlug, batch, name, title, linkedin, twitter — for when the person is your unit of analysis rather than the company.

Every row carries the same columns, so companies, founders and diagnostics export as one rectangular table.

Use cases

  • The complete YC list, kept fresh. One scheduled run gives you every company YC has funded, keyed on id, with a launchedAt you can diff. New batches appear automatically — the Actor reads the batch list from the directory itself rather than from a list baked into its code.
  • Sourcing and lead generation. 6,200 venture-backed companies with website, team size, stage, industry and location, filtered to the slice you sell to. teamSize plus batch is a decent proxy for "big enough to buy, young enough to move".
  • Recruiting. isHiring: "yes" is about 1,500 companies at any moment; includeFounders adds jobPostingCount and the founders' LinkedIn profiles. That is a candidate-side or a client-side pipeline, depending which way you are facing.
  • Market maps and competitor scans. queries: ["AI agents"] searches every company's own description, not just its name. Cross it with batches and you get the shape of a category over time.
  • Survivorship-free research. The directory lists over a thousand Inactive companies — YC's word for shut down — alongside 23 that went public. Most public "YC list" datasets quietly drop the failures. statuses: ["Inactive"] is the other half of the story.
  • Founder research. founderRows: true turns the directory into a table of several thousand YC founders with their titles and their public profiles.
  • Enrichment. formerNames is the field that reconciles YC's records against a CRM written three rebrands ago.

How it works, and why it keeps working

The YC directory is a React front end over a public Algolia search index. The search-only key that authorises it is handed to the browser in the page itself, and YC rotates it — the key that older public scrapers pass around answers Invalid Application-ID or API key today.

So this Actor reads the key from the page, every run, before it does anything else:

StepWhat it readsShape
1. Key discoveryycombinator.com/companiesHTML carrying window.AlgoliaOpts = {"app":…,"key":…}
2. Vocabularythe index, hitsPerPage: 0JSON. Every batch, industry, status, region and tag that exists, with counts — about 2 KB
3. Searchthe indexJSON. Up to 1,000 hits per query, with every field on this page's sample row
4. Company page (opt-in)ycombinator.com/companies/<slug>HTML with an Inertia data-page JSON blob: founders, socials, news

Three things catch a naive scraper here, and all three are handled:

The key is not yours to keep. If the page stops carrying it, the run finishes with zero results, an unavailable diagnostic row explaining exactly that and a status message naming the missing key, and bills nothing. It does not fall back to a stale key and return an empty dataset that looks like "YC has no companies".

Algolia will not serve past the 1,000th hit of any query. Ask for page 5 at 1,000 per page and you get HTTP 200, zero hits and a polite message about paginationLimitedTo. Most tools that scrape this directory silently stop at 1,000 companies. This one reads the batch facet's counts and runs one query per batch — 50 of them, merged and de-duplicated by company ID — because every batch YC has ever run is under 400 companies. That is how a no-filter run returns all 6,213 in about fifty requests.

A typo in a filter looks exactly like an empty result. Every batch, status, industry, region and tag you pass is checked against the list the directory itself returned seconds earlier. W205 does not silently return nothing; it produces a free invalid-input row saying "W205" is not a known batch. Did you mean "Winter 2025"?

Underneath: Apify proxy (datacenter by default — both endpoints answer it happily), one pinned session per parallel worker, 250–600 ms between a worker's requests. When an endpoint refuses an exit IP — HTTP 429 or 403 — that session is retired and the same request goes out once more from a different address. Retrying on an address that was just refused only deepens the block, so it is never done. If the second address is refused too, that batch stops, every row already delivered is kept, and one free blocked row says where it stopped.

How it compares

  • It reads the whole directory, not the first thousand. The 1,000-hit ceiling is the single thing that separates a complete YC dataset from a truncated one, and partitioning by batch is the only way past it that does not need a private API.
  • The search key is never hard-coded. Every published YC scraper that pins a key eventually returns an empty dataset without saying why. This one reads it fresh and says so loudly — an unavailable row and a status message — when it cannot.
  • Bad input is answered, not swallowed. An unknown batch or industry gets a free row naming the nearest valid values, drawn from the live facet lists.
  • Failures are free and legible. A dead company page, a filter that matched nothing, a block — each produces a diagnostic row with an errorType you can branch on, and no charge. A run whose filters were all usable but produced nothing — a filter set that matched no company, a search index that did not answer, a block — finishes SUCCEEDED with zero results, a status message that says so, and a free diagnostic row telling you why; nothing is charged, start fee included. A run finishes FAILED only when there was nothing usable to attempt (every value you gave for a filter is unknown to the directory), or the Actor itself hit an error.
  • A partial run is kept, not thrown away. Hit maxRunSecs or your charge ceiling halfway through and you keep every company already written.
  • Honest about what the public directory does not contain. No funding amounts, no valuations, no investor lists, no contact emails — see Limits, in detail, rather than as a footnote.
  • No login, ever. No YC account, no Bookface, no cookie jar, no session token. Public endpoints only, which is also why it runs under Apify's limited permissions.

Input reference

FieldTypeDefaultWhat it does
batchesarray["Winter 2025"]Batches to return: Winter 2025, W25, S13, X26 (Spring), F25 (Fall). Empty means every batch
queriesarray[]Full-text search across names, one-liners and descriptions. Each term is a separate search; results are merged and de-duplicated
industriesarray[]YC's industry taxonomy, parents and children in one list (B2B, Fintech, Payments, Climate)
statusesarray[]Active, Acquired, Public, Inactive
regionsarray[]United States of America, Europe, India, Remote, Fully Remote…
tagsarray[]YC's free-form labels: SaaS, Marketplace, Generative AI, Open Source
isHiringstring"any"any, yes or no. The API also accepts true / false / null
topCompaniesOnlybooleanfalseOnly YC's own "top companies" — 91 of 6,213
nonprofitOnlybooleanfalseOnly YC's nonprofits. Applied to the results, not in the query — see Limits
maxCompaniesinteger500Ceiling on company rows across the whole run. Max 10,000
sortBystring"default"default (YC's ranking) or launchDate (newest first)
includeFoundersbooleanfalseRead each company's own page too: founders, socials, year founded, city, open roles, press. One extra request per company
founderRowsbooleanfalseAlso emit one row per founder. Needs includeFounders
maxConcurrencyinteger4Searches, and company pages, in flight at once
maxRunSecsinteger240Wall-clock budget. Rows already written are kept and billed
proxyConfigurationobject{"useApifyProxy": true}Datacenter by default; switch to residential only if you see blocked rows

Filters combine as an intersection: several values inside one field are "any of these", and different fields are "and". {"batches": ["W25","S24"], "industries": ["B2B"], "isHiring": "yes"} is B2B companies from either batch that are hiring.

Output reference

ColumnRowsMeaning
ok, rowTypeallcompany, founder or a free diagnostic
id, name, slug, url, websitecompanyYC's ID, name, directory page and the company's own site
oneLiner, descriptioncompanyThe one-line pitch and the long description, as the founders wrote them
batch, batchShort, status, stagecompany, founderWinter 2009 / W09; Active Acquired Public Inactive; Early or Growth
industry, industries, subindustry, tagscompanyYC's taxonomy and its free-form labels
regions, location, city, countrycompanyWhere the company is, at three levels of precision
teamSize, launchedAt, yearFoundedcompanyHeadcount, when the profile went live, when the company was founded
isHiring, jobPostingCountcompanyWhether it is hiring, and how many roles are posted
topCompany, nonprofit, formerNames, logoUrlcompanyYC's flags, previous names, logo
hasDemoDayVideo, hasAppVideocompanyWhether those videos are public. The videos themselves are not returned
founders, founderNames, founderCountcompanyThe founders, nested and flattened. Needs includeFounders
linkedin, twitter, facebook, crunchbase, githubcompany, founderThe company's socials, or the founder's. Needs includeFounders
name, title, company, companySlugfounderThe person, their role, and the company they founded
newsItemscompanyUp to ten press mentions YC has curated
input, query, batchFilter, positionallWhich filter or search produced this row, and its rank in the merged result
error, errorTypediagnosticWhat went wrong, and a type to branch on
source, sourceUrl, scrapedAtallindex or both, the company's page, and when the row was written

errorType is one of invalid-input, no-results, not-found, blocked, timeout, unavailable.

Pricing

$0.50 per 1,000 companies. Pay-per-event, with proxy already inside that number — there is no separate proxy line on your bill for this Actor.

EventWhat triggers itFREEStarterScaleBusiness
Company returned (primary)One company row written to your dataset$0.0005$0.0005$0.0004$0.0003
Founder returnedOne founder row, when founderRows is on$0.00025$0.00025$0.00025$0.00025
Run startedOnce per run, after the first paid row$0.001$0.001$0.001$0.001

The whole directory. {"maxCompanies": 10000}, no filters: 6,213 companies × $0.0005 + $0.001 = $3.1075, from 52 requests in a couple of minutes.

One batch. {"batches": ["W25"]}: 166 × $0.0005 + $0.001 = $0.084, from four requests.

A hiring list, weekly. {"isHiring": "yes", "industries": ["B2B"], "maxCompanies": 1000}: about 840 rows = $0.421 a run, $1.82 a month.

With founders. includeFounders costs nothing extra per row — the company price is the same either way. It costs time: one page load per company, so 500 companies is about four minutes. founderRows: true on top adds roughly 2.2 founder rows per company at $0.00025 each.

What you are never charged for: a batch or industry name that does not exist, a filter set that matched nothing, a company page that has gone, a company the run never reached before maxRunSecs, or a request the site blocked. If a whole run comes back empty it finishes SUCCEEDED with zero results and a status message that says why ("0 companies. N diagnostic row(s) explain why …"), and bills nothing at all, start fee included.

Set ACTOR_MAX_TOTAL_CHARGE_USD on a run and the Actor stops fetching once the ceiling is in sight, rather than handing you rows it cannot bill or billing you for rows it cannot hand over. It finishes SUCCEEDED with the ceiling named in its status message, and everything already delivered is yours.

Limits, and the ones that might bite

This is the public directory, and the public directory is what YC chose to publish. There is no funding amount, no valuation, no round history, no investor list, no revenue, no headcount history and no founder email address in it — not because they are hard to scrape, but because they are not there. What is there is the sample row above: identity, category, status, size, place, time, and the founders' own public profiles. Anything claiming to be "YC data with funding" is joining this to another source.

Team size is self-reported and lags. YC updates it when the company does. Treat it as an order of magnitude, not a headcount.

status is coarse. Acquired does not say by whom or for how much. Inactive is YC's word for shut down and carries no date. Public is 23 companies.

The 1,000-hit ceiling is real, and partitioning is the whole answer to it. Every query — including each per-batch one — stops at 1,000 hits. It has never been reached by a batch query, because YC's largest batch is 398 companies, but a search term inside a single batch is also capped, and if YC ever runs a batch of over a thousand the run will report it rather than silently truncate.

nonprofitOnly is applied after the fact. nonprofit is a field on every company but not one of the index's filterable facets, so the run fetches the results and drops the rest. It costs the same requests as the unfiltered query and returns fewer rows.

includeFounders is one page load per company. A whole-directory run with it on is 6,265 requests and will not fit in the default maxRunSecs. Raise the budget, or filter first.

News items are YC's list, not a news feed. They are whatever YC curated onto the company's page, often years old, capped at ten.

Ordering is YC's, not yours. default is Algolia's relevance ranking for an empty query, which puts well-known companies first; launchDate is newest first. Neither is alphabetical, and maxCompanies cuts from the bottom of whichever you chose.

The upstream format may change. YC rewrites this front end periodically — it has been a Rails app, a Gatsby site and now a React/Inertia app — and the search key rotates on its own schedule. When a shape changes you get free unavailable or blocked diagnostic rows and a status message saying so rather than quietly wrong data, and a run that returns nothing bills nothing.

Rate and reliability. Requests go out through proxy sessions pinned per worker, one rotation per block, and 250–600 ms between requests of the same worker. Four in parallel is the default.

Use it from an AI agent, or from code

One JSON object in, one flat array out — the shape agent runtimes want. The Actor runs with limited permissions, uses pay-per-event pricing and never enters Standby, so it works over the Apify MCP server and with x402 agentic payments. The Integrations tab pushes results to Slack, a webhook, Zapier, Make, Google Sheets, Snowflake or BigQuery.

curl -X POST "https://api.apify.com/v2/acts/insight.solutions~yc-companies-directory/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"batches":["W25"],"maxCompanies":500}'
# pip install apify-client
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("insight.solutions/yc-companies-directory").call(run_input={
"industries": ["Fintech"],
"statuses": ["Active"],
"isHiring": "yes",
"maxCompanies": 1000,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["rowType"] == "company":
print(row["batchShort"], row["name"], row["teamSize"], row["website"])

Building an app with Lovable? Apify's Lovable connector runs any Actor from inside a Lovable project with your Apify token. Connect Apify in Lovable once, then ask it: "Use Apify to run insight.solutions/yc-companies-directory for a batch and industry I pick and build a searchable startup list around the results." At the default settings a run finishes well inside Lovable's 300-second synchronous limit, and every result is one JSON object per row, so the generated app needs no extra parsing. Usage bills to the Apify account whose token is connected.

FAQ

Do I need a YC account? No. Everything here is what a logged-out visitor sees at ycombinator.com/companies, read through the same public search index the page's own filters use.

How do I get the entire directory? Leave every filter empty and set maxCompanies to 10000. You will get about 6,200 rows, because that is how many there are.

Why is it about 6,200 and not "all YC companies ever"? Because the public directory lists the companies YC lists. A company that asked to be delisted is not there, and neither is one from a batch YC has not published yet.

How do I deduplicate between runs? On id, YC's own numeric company ID, which is also the search index's objectID. It survives renames; slug does not, which is what formerNames is for.

Can I get a company's funding, investors or revenue? Not from here — the public directory does not publish them. See Limits.

Are founder emails included? No. YC does not publish them, and this Actor does not guess at them. You get the founders' names, titles and their own public LinkedIn and X profiles.

Why did my batch name return nothing? It probably did not return nothing — check for an invalid-input diagnostic row, which names the nearest valid batches. W25 and Winter 2025 both work; W2025 works too; Spring 2026 is X26, not S26.

How fresh is it? Live. Every run reads the directory at that moment; nothing is cached between runs, and the batch list itself is read fresh so a new batch appears the day YC publishes it.

What happens if one batch fails? The other 49 still run. The failed one produces a free diagnostic row and the run finishes SUCCEEDED with the companies it did get. If nothing could be read, the run still finishes SUCCEEDED, with zero companies, a status message that says so and nothing billed at all. Only a filter set with nothing valid in it finishes FAILED.

  • Public pages and a public index only. The directory, its search index and each company's page are what ycombinator.com serves to any visitor. The Actor never logs in, never accepts cookies or session tokens, and never uses an API key belonging to anyone else — the search-only key it uses is the one the page hands every browser that loads it, read fresh on every run.
  • Founder names and profiles are personal data. They are published by YC and by the founders themselves, on purpose, as a public profile — but in most jurisdictions they remain personal data. Have a lawful basis before you use them for outreach, honour opt-outs, and check the marketing rules where you and the recipient are. This Actor returns no email addresses and no phone numbers.
  • Company descriptions belong to their companies. The one-liners and long descriptions are copyrighted text the founders wrote. Indexing, analysis, filtering and linking are the ordinary uses and are what this is built for; republishing them wholesale is your call and your responsibility.
  • Logo URLs are not a licence. logoUrl is the address YC serves the logo from. Trademarks belong to the companies.
  • Not affiliated with Y Combinator. "Y Combinator" and "YC" are trademarks of Y Combinator Management, LLC, used here only to describe which public pages this Actor reads.

Our other Actors

Every Insight Solutions Actor is pay-per-result with no browser, no login and no API key, and every one of them returns free diagnostic rows instead of billing for failures. Prices are per 1,000 results.

Video, audio & social

News, documents & the web

Business, finance & jobs

  • Congress & Insider Trades API — STOCK Act periodic transaction reports and SEC Form 4 insider trades in one schema.
  • Federal Contracts, Grants & Lobbying API — SAM.gov opportunities, USAspending awards, Grants.gov notices and Senate lobbying filings in one schema.
  • SEC EDGAR API — filings, XBRL financials and full-text search by ticker or CIK.
  • Clinical Trials & FDA API — ClinicalTrials.gov studies plus openFDA recalls, labels, approvals, 510(k)s and adverse-event reports.
  • Product & Vehicle Recalls API — CPSC, NHTSA, FDA and USDA recalls, vehicle complaints and ratings, plus a VIN decoder.
  • Career Site Jobs API — jobs straight from Greenhouse, Lever, Ashby, Workable and 10+ other ATS career sites.
  • Workday Jobs API — every posting on any Workday career site, with facets, search, posted dates and full descriptions.
  • New Job Postings Monitor — new, closed and changed postings on the career sites you watch.
  • Hiring Signals API — Open Roles & Hiring Surge by Company — one row per company per run: open roles, what opened and closed, department and seniority breakdowns, and a hiring-surge flag.
  • Remote Jobs API — RemoteOK, Remotive, We Work Remotely, Himalayas, Jobicy and more in one schema, deduplicated.
  • Shopify Products API — any Shopify store's catalogue, variants, prices and stock signals.
  • WooCommerce Products API — any WooCommerce store's catalogue, prices, variants and stock through its public Store API.
  • Shopify App Store API — Shopify App Store listings by category, collection or developer: pricing plans, ratings and merchant reviews.
  • Luma Events API — upcoming Luma events by city, category or calendar: dates, venue, price, capacity and organiser calendar, no host names.
  • Shopify Store Monitor — price drops, sales, restocks, sell-outs and new products on any Shopify store, one row per change.
  • Public Tenders API — EU TED, UK Find a Tender and Contracts Finder notices by keyword, CPV code, country, stage and deadline.
  • Nonprofit & IRS 990 Lookup API — search US nonprofits and get EIN, NTEE code and multi-year Form 990 financials.
  • OpenStreetMap Places API — businesses and points of interest by category and area from OpenStreetMap: name, address, coordinates, website, phone, opening hours.

Apps & games