# Ycombinator $0.8💰  Companies Scraper (`abotapi/ycombinator-com-scraper`) Actor

Pull every ycombinator.com company across every batch, with founders, social URLs, application Q\&A, demo-day video, photos, and partner. Filter by 14 dimensions or paste any /companies search URL straight from your browser.

- **URL**: https://apify.com/abotapi/ycombinator-com-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Developer tools, Lead generation, Automation
- **Features:** Limited permissions
- **Stats:** 23 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 3.00 out of 5 stars

## Pricing

from $0.80 / 1,000 results

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 Scraper: Startup Directory, Founders, Jobs & Launches

Y Combinator Scraper turns the YC startup directory into structured data. Get 50+ fields per company, including founders, social links, application details, open job postings, news mentions and Launch YC product launches. Filter across 14 dimensions in a form, or paste any /companies search or company URL straight from your browser, then export to JSON, CSV or Excel, or pull it through the API.

### Why This Scraper?

- **Deep company profiles.** 50+ fields per company when detail fetching is on: founders with bio, title and social links, LinkedIn, Twitter, Crunchbase, GitHub and Facebook URLs, demo-day and application videos, application answers, photos, and the primary YC partner.
- **Open roles and coverage.** Job postings with title, location, salary range, equity range, visa notes and an apply URL, plus news mentions and Launch YC product launches.
- **14 filter dimensions.** Free-text query, batch, industry, subindustry, region, tag, status, funding stage, hiring-only, top-ranked, nonprofit, and public-media flags, all combinable in one search.
- **Two ways in.** Build filters in the input form, or paste any /companies search or company URL copied from a browser (multiple URLs supported in one run).
- **Streaming output.** Each company is written to the dataset as soon as it's collected, so a stopped run still keeps everything found so far.
- **Resumable at two levels.** A killed or migrated run picks itself back up automatically without re-charging for companies already saved, and a brand-new run can continue a previous one by ID.
- **Built for monitoring.** Incremental mode tracks a saved search over time and labels each row new, updated, unchanged, reappeared or expired.

### Use Cases

- **Recruiting and talent sourcing:** filter hiring companies by industry, region or stage and pull their open roles in one pass.
- **Investor and market research:** scan a batch or stage for company counts, industries and funding stage mix.
- **Sales and partnership prospecting:** build lead lists by industry, region or tag, with founder names and company sites.
- **Founder benchmarking and competitive tracking:** compare peer companies in the same subindustry or batch.
- **Journalism and content:** track Launch YC announcements and news mentions as they appear.
- **Recurring monitoring:** schedule a saved search and get only the companies that are new, changed, or newly listed since the last run.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `id` | `12345` |
| `slug` | `"example-co"` |
| `name` | `"Example Co"` |
| `url` | `"https://www.ycombinator.com/companies/example-co"` |
| `oneLiner` | `"One sentence company pitch."` |
| `website` | `"https://example.com"` |
| `batch` | `"W24"` |
| `batchName` | `"Winter 2024"` |
| `status` | `"Active"` |
| `stage` | `"Seed"` |
| `industry` | `"B2B"` |
| `tags` | `["SaaS", "AI"]` |
| `regions` | `["United States of America", "Remote"]` |
| `teamSize` | `8` |
| `yearFounded` | `2024` |
| `isHiring` | `true` |
| `topCompany` | `false` |
| `founders` | `[{fullName: "Founder Name", title: "CEO", bio: "Sample bio.", linkedinUrl: "...", twitterUrl: "...", isActive: true}]` |
| `founderCount` | `2` |
| `jobPostings` (+ `description`, `remote` when **Fetch full job descriptions** is ON) | `[{title: "Senior Engineer", location: "Remote", salaryRange: "...", equityRange: "...", visa: "Open to all", applyUrl: "..."}]` |
| `jobPostingCount` | `9` |
| `newsItems` | `[{title: "Article title", url: "...", date: "Jan 01, 2026"}]` |
| `launches` | `[{title: "Launch announcement title", body: "Body of the Launch YC post."}]` |
| `scrapedAt` | `"2026-01-01T00:00:00.000Z"` |

Every company record also carries `objectID`, `subindustry`, `industries` (a list), `allLocations`, `launchedAt`, `nonprofit`, `formerNames`, `logoUrl`, `smallLogoUrl`, `location`, `city`, `cityTag`, `country`, `linkedinUrl`, `twitterUrl`, `facebookUrl`, `crunchbaseUrl`, `githubUrl`, `demoDayVideoUrl`, `appVideoUrl`, `appAnswers`, `freeResponseAnswers`, `primaryGroupPartner`, `companyPhotos`, `hasAppVideo`, `hasDemoDayVideo`, `hasQuestionAnswers`, `jobsUrl`, `newsUrl`, `newsCount` and `launchCount`. For companies found through a search or pasted search URL, a run with detail fetching turned off still fills in the search-facing fields (name, url, one-liner, batch, status, stage, industry, tags, regions, website), but leaves the social and video links, application answers, the primary partner, year founded and city as null, and founders, job postings, news items, launches and photos as empty lists (counts 0); turn detail fetching on to populate them. Pasted company URLs are loaded from the profile page only, so they never get `stage`, `regions`, `industries` or `launchedAt`, their `isHiring` and `topCompany` flags always read false, and with detail fetching off they carry little more than the slug.

### How to Use

1. Pick a **mode**: `search` (build filters below) or `url` (paste one or more /companies links).
2. In search mode, set the filters you need. In URL mode, paste search links, company links, or a mix.

**URL mode: supported URL shapes.** Leaving `urls` untouched in URL mode now scrapes one example of each shape below (previously nothing was scraped by default); clear the list or paste your own URLs to narrow it.

| Shape | Example | Behaviour |
| --- | --- | --- |
| Search with batch filter | `https://www.ycombinator.com/companies?batch=Winter%202026` | Batch filter applied |
| Search with text + sort | `https://www.ycombinator.com/companies?query=ai%20agents&sortBy=created_at_desc` | Text query; `created_at_desc` sorts by newest launch |
| Search with boolean filters | `https://www.ycombinator.com/companies?isHiring=true&top_company=true` | Hiring / top-company filters |
| Paginated search | `https://www.ycombinator.com/companies?page=2` | `page` is not a result offset; the search is walked from its first page and the scope counts as partial (no EXPIRED rows are produced) |
| Industry page | `https://www.ycombinator.com/companies/industry/fintech` | Industry filter (unknown industry: skipped with a warning). Previously this ran an unfiltered all-companies search |
| Location page, country or area | `https://www.ycombinator.com/companies/location/india` | Region filter. Previously unfiltered |
| Location page, city | `https://www.ycombinator.com/companies/location/san-francisco` | City text search narrowed to companies whose location lists that city. Previously unfiltered |
| Company page | `https://www.ycombinator.com/companies/airbnb` | One company |
| Numeric company id | `https://www.ycombinator.com/companies/531` | Resolved to the company (the `slug` field then carries the numeric id) |
| Apex host | `https://ycombinator.com/companies/stripe` | Same as the www form |
| Company jobs page | `https://www.ycombinator.com/companies/dropbox/jobs` | Treated as the company page (jobs are included with detail fetching) |
| Founders directory | `https://www.ycombinator.com/companies/founders` | Not supported: skipped with a warning, never scraped as a company |

Search-mode `industries` and `regions` also accept plain names in any letter case (for example `fintech`, `india`); a value that is not in the known list is searched as written and logged with a warning.
3\. Turn **Fetch full detail page** on for founders, social links, jobs, news and launches, or off for a faster, search-only pull.
4\. Set **Max companies** (and optionally **Max search pages**) to control run size and cost, then click **Start**.

**Most-recent batches with full enrichment:**

```json
{
  "mode": "search",
  "batches": ["Winter 2026", "Spring 2026"],
  "fetchDetails": true,
  "maxListings": 100
}
```

**AI agent companies in B2B, hiring only:**

```json
{
  "mode": "search",
  "query": "ai agents",
  "industries": ["B2B"],
  "tags": ["Artificial Intelligence", "AI"],
  "isHiring": true,
  "fetchDetails": true,
  "maxListings": 50
}
```

**Top-ranked companies that are public or acquired, across all batches:**

```json
{
  "mode": "search",
  "topCompany": true,
  "statuses": ["Public", "Acquired"],
  "fetchDetails": true,
  "maxListings": 0
}
```

**URL mode, multiple links pasted at once:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.ycombinator.com/companies?batch=Winter%202024",
    "https://www.ycombinator.com/companies?batch=Summer%202024",
    "https://www.ycombinator.com/companies/example-co"
  ],
  "fetchDetails": true
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/ycombinator-com-scraper").call(run_input={
    "mode": "search",
    "isHiring": True,
    "fetchDetails": True,
    "maxListings": 25,
})
for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["name"], company["url"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/ycombinator-com-scraper').call({
  mode: 'search',
  isHiring: true,
  fetchDetails: true,
  maxListings: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Resume and recurring updates

- **Resume from a previous run** (`resumeFromRunId`) continues one interrupted run in a brand-new run: paste its run or dataset ID and this run skips every company already saved there (matched by `objectID`), so it only appends new companies. A killed or migrated run also checkpoints itself automatically and picks back up in the same run without any input, and without re-charging for companies it already collected.
- **Incremental mode** (`incrementalMode`) is for a search or URL set you run on a schedule. Each company is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `EXPIRED`, or `REAPPEARED`. `EXPIRED` is only produced after a run that scanned the entire tracked search or URL set with no cap, no page limit and no `resumeFromRunId` cutting it short, and only with `emitExpired` on (a search with more than 1000 matches is only scanned in full when the run has no item cap, or a cap above 1000: it is then split into per-batch slices, newest batch first; a capped run or a search that cannot be split never writes `EXPIRED`, and neither does a run resumed after a migration whose slice list changed in between); a capped or partial run leaves the previous state untouched instead of guessing. `REAPPEARED` can only happen to a company that a prior complete scan already marked `EXPIRED`, and it shows up again on a later run, so it never appears unless `emitExpired` has been used at least once for that search. `stateKey` names or shares the stored baseline; leave it empty and one is derived automatically from your filters or URLs. Do not combine `resumeFromRunId` with an `incrementalMode` search that already has saved state, the two solve different problems and the run stops with an error if they conflict. With incremental mode off, output is exactly as before.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each company, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. If the picker is empty, you haven't authorized a connector yet.
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (filters) or `url` (paste links). The other mode's fields are ignored. |
| `query` | string | none | Free-text search across name, one-liner and description. Leave blank to match all companies. One search can list at most its first 1000 matches. When a search matches more than 1000 companies and the item limit is unlimited or above 1000, it is walked as one slice per batch, newest batch first, so results arrive batch by batch rather than in one global sort. With a smaller item limit it stays a single search in your chosen sort order. |
| `batches` | array | none (prefill: `["Winter 2026", "Spring 2026"]`) | YC batch names. Accepts long form (`Winter 2024`) or short codes (`W24`). Leave empty for all batches. |
| `industries` | array | none | Top-level industry, e.g. B2B, Consumer, Healthcare, Fintech. Multiple values are OR'd. |
| `subindustries` | array | none | Refined industry tag, e.g. `Fintech -> Payments`. Multiple values OR'd. |
| `regions` | array | none | HQ region or country, e.g. `United States of America`, `Europe`, `Remote`. Multiple values OR'd. |
| `tags` | array | none | Topic tags, e.g. `SaaS`, `Artificial Intelligence`, `Developer Tools`. Multiple values OR'd. |
| `statuses` | array | none | One or more of Active, Inactive, Acquired, Public. |
| `stages` | array | none | One or more of Seed, Early, Growth. |
| `isHiring` | boolean | `false` | Only companies with active job postings. |
| `topCompany` | boolean | `false` | Only YC top-ranked companies. |
| `nonprofit` | boolean | `false` | Only nonprofit companies. |
| `hasDemoDayVideo` | boolean | `false` | Only companies with a public demo-day video. |
| `hasAppVideo` | boolean | `false` | Only companies whose application video is public. |
| `hasAppAnswers` | boolean | `false` | Only companies whose application answers are public. |
| `sortBy` | string | `relevance` | `relevance` or `launch-date-desc` (newest launched first). |
| `urls` | array | one example of every supported shape (see table below) | URL mode only. Any supported YC URL, one or more. Leaving it untouched in URL mode scrapes one example of each shape. |
| `fetchDetails` | boolean | `true` | Adds founders, social URLs, application Q\&A, video URLs, photos, partner, jobs, news, launches, year founded and city. |
| `fetchJobDetails` | boolean | `false` | Also fetch each open job's full description text and a remote flag (one extra page fetch per posting; needs `fetchDetails` on). |
| `maxListings` | integer | `20` | Cap on total companies. `0` = unlimited (the entire matching search or URL set). |
| `maxPages` | integer | none (prefill `0`; both mean unlimited) | Optional bound on search pages walked per query. Leave empty or `0` to walk every result page until `maxListings` is hit or the results end. |
| `resumeFromRunId` | string | none | Paste a previous run ID or dataset ID to continue a full walk across separate runs, skipping companies already saved there. |
| `incrementalMode` | boolean | `false` | Track a recurring search or URL set and label each row's `changeType`. |
| `stateKey` | string | none | Names the saved baseline this run compares against. Leave empty to auto-derive one from your filters or URLs. |
| `emitUnchanged` | boolean | `false` | Also return, and bill, companies with no detected change. |
| `emitExpired` | boolean | `false` | Also return, and bill, companies no longer found, but only after a run that scanned the full tracked search with nothing cutting it short. |
| `ignoreFieldsForChanges` | array | none | Incremental mode only. Field names (or dotted paths such as `founders.linkedinUrl`) left out when deciding whether a company changed; they are still returned in every row. `scrapedAt` is always ignored. Changing the list never causes a one-time wave of `UPDATED` rows. |
| `proxy` | object | Apify Proxy (datacenter) | Connection settings. Residential is supported as an upgrade if you ever see throttling. |
| `mcpConnectors` | array | none | Optional: send a summary of each company to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | none | Notion connector only: page under which company pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

#### Output tabs

The Output tab has five views: **Companies** (one row per company), **Founders** (one row per founder), **Open jobs** (one row per job posting, needs company details on), **Changes (incremental mode)**, and a **Run summary** (rows per search, the number of company URLs, and whether the scan was complete, written to the key-value store record `OUTPUT` on every run). Founder and job rows are views over the company rows, not extra dataset items, so billing is unchanged.

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "id": 12345,
  "slug": "example-co",
  "objectID": "12345",
  "name": "Example Co",
  "url": "https://www.ycombinator.com/companies/example-co",
  "oneLiner": "One sentence company pitch.",
  "longDescription": "Longer multi-paragraph description from the application.",
  "website": "https://example.com",
  "batch": "W24",
  "batchName": "Winter 2024",
  "status": "Active",
  "stage": "Seed",
  "industry": "B2B",
  "subindustry": "B2B -> Productivity",
  "industries": ["B2B", "Productivity"],
  "tags": ["SaaS", "AI"],
  "regions": ["United States of America", "Remote"],
  "allLocations": "San Francisco, CA, USA; Remote",
  "teamSize": 8,
  "yearFounded": 2024,
  "launchedAt": 1700000000,
  "isHiring": true,
  "topCompany": false,
  "nonprofit": false,
  "logoUrl": "https://bookface-images.s3.us-west-2.amazonaws.com/logos/0000000000000000000000000000000000000000.png",
  "location": "San Francisco, CA, USA",
  "city": "San Francisco",
  "country": "United States",
  "linkedinUrl": "https://www.linkedin.com/company/example-co",
  "twitterUrl": "https://twitter.com/example_co",
  "crunchbaseUrl": "https://www.crunchbase.com/organization/example-co",
  "githubUrl": "https://github.com/example-co",
  "primaryGroupPartner": {
    "id": 1,
    "fullName": "Partner Name",
    "url": "https://www.ycombinator.com/people/partner-name",
    "avatarUrl": "https://example-cdn.ycombinator.com/avatars/partner.jpg"
  },
  "founders": [
    {
      "fullName": "Founder Name",
      "title": "CEO",
      "bio": "Founder bio text.",
      "linkedinUrl": "https://www.linkedin.com/in/founder-name",
      "twitterUrl": "https://twitter.com/founder_name",
      "isActive": true
    }
  ],
  "founderCount": 1,
  "jobPostings": [
    {
      "title": "Senior Engineer",
      "location": "Remote",
      "type": "Full-time",
      "role": "eng",
      "salaryRange": "$140K - $180K",
      "equityRange": "0.10% - 0.50%",
      "visa": "Open to all",
      "applyUrl": "https://www.workatastartup.com/jobs/0000"
    }
  ],
  "jobPostingCount": 1,
  "newsItems": [
    { "title": "Article title", "url": "https://example.com/article", "date": "Jan 01, 2026" }
  ],
  "newsCount": 1,
  "launches": [
    { "title": "Launch announcement title", "body": "Body of the Launch YC post." }
  ],
  "launchCount": 1,
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}
```

### Plan Requirement

An Apify plan with proxy access is required, and the default Apify datacenter proxy is enough: in our checks the directory and company pages loaded on datacenter with no blocking, so residential is not needed. For large or frequent runs, or if you ever see requests being refused, you can switch the **Proxy** setting to residential. If your account has no proxy access, the run stops with: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required". On a free plan, where residential is unavailable, the run logs "Apify free plans do not include residential proxies" and continues on a backup connection. Cost scales with the number of rows returned, so **Max companies** is your cost cap. **Fetch full detail page** adds one extra page fetch per company, which makes runs slower but does not change the per-row price.

### FAQ

#### How much does it cost?

You pay per company returned. The **Pricing** tab shows the current rates. Use **Max companies** to cap the cost of any run, and turn **Fetch full detail page** off for a faster, lighter, search-only pull.

#### Is it legal to scrape Y Combinator?

This actor collects only publicly available startup-directory data. You are responsible for how you use it: follow Y Combinator's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Company facts are generally not protected, but logos, photos and founder bios may carry their own rights.

#### Can I get only new or changed companies on a schedule?

Yes. Schedule the actor from the **Schedules** tab with the same filters or URLs each time, and turn on **Incremental mode**. Each run then labels every company `NEW`, `UPDATED`, `UNCHANGED` (not returned unless you turn that on), and, only after a run that scans the whole tracked search with nothing cutting it short (a search over 1000 matches is split into per-batch slices, newest batch first, only when the item limit is unlimited or above 1000; a capped run or one that cannot be split never writes `EXPIRED`), `EXPIRED`. A company only comes back as `REAPPEARED` if an earlier complete scan had already marked it `EXPIRED` and it shows up again later.

#### What's the difference between "Resume from a previous run" and "Incremental mode"?

**Resume from a previous run** continues one specific interrupted or capped run: paste its run or dataset ID and this run appends only the companies it hasn't already saved. **Incremental mode** is for monitoring the same search or URL set over time on a schedule; it remembers state itself and classifies every row. Don't combine the two for a search that already has saved incremental state, the run stops with an error rather than guessing which baseline to use.

#### Why did my run fail instead of returning an empty dataset?

An empty dataset usually means your filters or URLs matched nothing, or requests were quietly refused for part of the run; this actor does not fail the whole run for that, it saves whatever it managed to collect, which can be nothing. Try loosening your filters or running again. If not a single results page could be loaded, the run ends FAILED (not empty) with "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search." An actual failed run happens only for a handful of clear input problems: a **Resume from a previous run** ID that doesn't match any run or dataset this account can read, combining that field with an incremental search that already has saved state, or **URL mode** with no usable URL. A malformed entry, a non-Y Combinator address, an unknown industry page or the founders directory is skipped with a warning that names it, and the run fails only when no usable URL is left (an explicitly empty list included), so check the log if rows are missing.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more leads data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>📇 <a href="https://apify.com/abotapi/betalist-com-scraper"><b>BetaList Scraper</b></a><br>Scrape BetaList.com startup profiles with founder and contact enrichment. Extract startup...</td><td>🛒 <a href="https://apify.com/abotapi/dealroom-co-scraper"><b>Dealroom.net Scraper</b></a><br>Scrape Dealroom.net market maps, company lookup results, live signals, and newly founded...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/remoteok-com-scraper"><b>RemoteOK Jobs Scraper</b></a><br>Scrape RemoteOK jobs by keyword or job URL. Extract title, company, location, remote...</td><td>📇 <a href="https://apify.com/abotapi/product-hunt-launches-scraper"><b>Product Hunt</b></a><br>Extract producthunt.com data including products, launches, keyword search results, maker...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/f6s-directory-scraper"><b>F6S Scraper</b></a><br>Extract structured data from F6S.com. Scrape funding programs, startup accelerators...</td><td>💼 <a href="https://apify.com/abotapi/myworkdayjobs-scraper"><b>Workday Jobs Scraper</b></a><br>Scrape job postings from any Workday-hosted careers site on Myworkdayjobs.com. Paste...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/ycombinator-com-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Search mode = configure filters below. URL mode = paste any /companies search URL already refined in a browser (recommended for complex filters).

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

Optional keyword search across company name, one-liner, and description. Leave blank to match all companies.

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

Filter by YC batch. Accepts full names (Winter 2024, Summer 2023) or short codes (W24, S23, F25, X26 for Spring). Multiple values are OR'd. Leave empty for all batches.

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

Top-level industry. Multiple values are OR'd.

## `subindustries` (type: `array`):

Refined industry tag (e.g. 'Fintech -> Payments', 'Healthcare -> Therapeutics'). Multiple values OR'd. See ycombinator.com/companies for the full list.

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

HQ region or country. Examples: 'United States of America', 'Europe', 'Remote', 'India', 'Latin America'. Multiple values OR'd.

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

Topic tags. Examples: 'SaaS', 'Artificial Intelligence', 'Developer Tools', 'Marketplace', 'Crypto / Web3'. Multiple values OR'd.

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

Company status filter. Multiple values OR'd.

## `stages` (type: `array`):

Funding / maturity stage. Multiple values OR'd.

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

Only return companies with active job postings.

## `topCompany` (type: `boolean`):

Only YC top-ranked companies (~91 of ~5,800).

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

Only nonprofit companies (~42 of ~5,800).

## `hasDemoDayVideo` (type: `boolean`):

Only companies with a public demo-day video.

## `hasAppVideo` (type: `boolean`):

Only companies whose YC application video is public.

## `hasAppAnswers` (type: `boolean`):

Only companies whose YC application answers are public.

## `sortBy` (type: `string`):

Results are ordered by 'relevance' by default; 'launch-date-desc' surfaces the newest companies first.

## `urls` (type: `array`):

One or more YC URLs: search pages (/companies?batch=..., ?query=...\&sortBy=created_at_desc, ?isHiring=true\&top_company=true, ?page=N, ?industry=Healthcare, ?regions=Europe, ?tags=SaaS), industry pages (/companies/industry/fintech), location pages (/companies/location/san-francisco or /india), and company pages (/companies/airbnb, /companies/dropbox/jobs, numeric /companies/531, apex-host ycombinator.com). The founders directory is not supported and is skipped with a warning. Filter-mode fields above are ignored.

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

When ON (default), the scraper fetches each company's profile page and adds founders, social URLs (LinkedIn, Twitter, Crunchbase, GitHub, Facebook), application Q\&A, demo-day video, photos, partner, jobs, news, launches, year founded, city. Adds ~1 HTTP call per company. Turn OFF only if you want a fast SERP-only run.

## `fetchJobDetails` (type: `boolean`):

When ON, each open job posting also gets its full description text and a remote flag (one extra page fetch per posting; needs 'Fetch full detail page' ON). Skills, salary, equity, experience and visa are always included in jobPostings. Default OFF.

## `maxListings` (type: `integer`):

Maximum number of companies to collect. 0 = unlimited (all ~5,800 across the public index).

## `maxPages` (type: `integer`):

Optional bound on search pages walked per query (each page returns up to 100 hits). Leave empty to walk every result page until maxListings is hit or the result set ends.

## `proxy` (type: `object`):

Proxy for outbound traffic. Apify datacenter (default) is fast and cheap and works for this site. Residential is supported as an upgrade if you ever see throttling.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Companies already collected there (matched by objectID) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. Do not combine with Incremental mode below unless this is the very first incremental run for a new state key — the two solve different problems (one interrupted run vs. recurring monitoring of the same search).

## `incrementalMode` (type: `boolean`):

For a search/URL set you run on a schedule (e.g. daily). The actor remembers the companies it saw last time and labels every row's `changeType`: NEW, UPDATED, UNCHANGED, REAPPEARED, or EXPIRED (only when 'Emit expired' is on). Distinct from 'Resume from a previous run' above, which continues one interrupted run instead of tracking a recurring search. Off by default so a normal run's output shape is unchanged.

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

Names the saved baseline this run compares against. Leave empty to auto-derive one from your filters/URLs (so two different searches never share a baseline). Set your own value if you want multiple scheduled runs of the SAME search to intentionally share one baseline, or to give a search a stable name across small filter tweaks.

## `emitUnchanged` (type: `boolean`):

When ON, incremental mode also pushes companies with no detected change (changeType=UNCHANGED). Off by default: a quiet run returns only what's new or changed. Turning this on returns — and bills — a row for every tracked company, every run.

## `emitExpired` (type: `boolean`):

When ON, incremental mode pushes a changeType=EXPIRED row for any previously-tracked company no longer found, but ONLY after a run that scanned the full tracked search with no cap/page limit cutting it short and no resumeFromRunId (a partial scan can never prove a company is really gone). Off by default: this also bills one extra row per expired company.

## `ignoreFieldsForChanges` (type: `array`):

Field names to leave out when deciding whether a company changed, so a change in them alone never produces an UPDATED row (they are still returned in every row). Use a top-level name such as `photos`, or a dotted path such as `founders.linkedinUrl` to ignore a key inside every element of a list. `scrapedAt` is always ignored. Changing this list never causes a one-time wave of UPDATED rows.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "query": "ai agents",
  "batches": [
    "Winter 2026",
    "Spring 2026"
  ],
  "isHiring": false,
  "topCompany": false,
  "nonprofit": false,
  "hasDemoDayVideo": false,
  "hasAppVideo": false,
  "hasAppAnswers": false,
  "sortBy": "relevance",
  "urls": [
    "https://www.ycombinator.com/companies?batch=Winter%202026",
    "https://www.ycombinator.com/companies?query=ai%20agents&sortBy=created_at_desc",
    "https://www.ycombinator.com/companies?isHiring=true&top_company=true",
    "https://www.ycombinator.com/companies?industry=Healthcare",
    "https://www.ycombinator.com/companies?regions=Europe",
    "https://www.ycombinator.com/companies?tags=SaaS",
    "https://www.ycombinator.com/companies?page=2",
    "https://www.ycombinator.com/companies/industry/fintech",
    "https://www.ycombinator.com/companies/location/san-francisco",
    "https://www.ycombinator.com/companies/location/india",
    "https://www.ycombinator.com/companies/airbnb",
    "https://www.ycombinator.com/companies/531",
    "https://ycombinator.com/companies/stripe",
    "https://www.ycombinator.com/companies/dropbox/jobs"
  ],
  "fetchDetails": true,
  "fetchJobDetails": false,
  "maxListings": 20,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `founders` (type: `string`):

No description

## `jobs` (type: `string`):

No description

## `changes` (type: `string`):

No description

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

No description

# 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 = {
    "mode": "search",
    "batches": [
        "Winter 2026",
        "Spring 2026"
    ],
    "urls": [
        "https://www.ycombinator.com/companies?batch=Winter%202026",
        "https://www.ycombinator.com/companies?query=ai%20agents&sortBy=created_at_desc",
        "https://www.ycombinator.com/companies?isHiring=true&top_company=true",
        "https://www.ycombinator.com/companies?industry=Healthcare",
        "https://www.ycombinator.com/companies?regions=Europe",
        "https://www.ycombinator.com/companies?tags=SaaS",
        "https://www.ycombinator.com/companies?page=2",
        "https://www.ycombinator.com/companies/industry/fintech",
        "https://www.ycombinator.com/companies/location/san-francisco",
        "https://www.ycombinator.com/companies/location/india",
        "https://www.ycombinator.com/companies/airbnb",
        "https://www.ycombinator.com/companies/531",
        "https://ycombinator.com/companies/stripe",
        "https://www.ycombinator.com/companies/dropbox/jobs"
    ],
    "fetchDetails": true,
    "maxPages": 0,
    "proxy": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/ycombinator-com-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 = {
    "mode": "search",
    "batches": [
        "Winter 2026",
        "Spring 2026",
    ],
    "urls": [
        "https://www.ycombinator.com/companies?batch=Winter%202026",
        "https://www.ycombinator.com/companies?query=ai%20agents&sortBy=created_at_desc",
        "https://www.ycombinator.com/companies?isHiring=true&top_company=true",
        "https://www.ycombinator.com/companies?industry=Healthcare",
        "https://www.ycombinator.com/companies?regions=Europe",
        "https://www.ycombinator.com/companies?tags=SaaS",
        "https://www.ycombinator.com/companies?page=2",
        "https://www.ycombinator.com/companies/industry/fintech",
        "https://www.ycombinator.com/companies/location/san-francisco",
        "https://www.ycombinator.com/companies/location/india",
        "https://www.ycombinator.com/companies/airbnb",
        "https://www.ycombinator.com/companies/531",
        "https://ycombinator.com/companies/stripe",
        "https://www.ycombinator.com/companies/dropbox/jobs",
    ],
    "fetchDetails": True,
    "maxPages": 0,
    "proxy": { "useApifyProxy": True },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/ycombinator-com-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 '{
  "mode": "search",
  "batches": [
    "Winter 2026",
    "Spring 2026"
  ],
  "urls": [
    "https://www.ycombinator.com/companies?batch=Winter%202026",
    "https://www.ycombinator.com/companies?query=ai%20agents&sortBy=created_at_desc",
    "https://www.ycombinator.com/companies?isHiring=true&top_company=true",
    "https://www.ycombinator.com/companies?industry=Healthcare",
    "https://www.ycombinator.com/companies?regions=Europe",
    "https://www.ycombinator.com/companies?tags=SaaS",
    "https://www.ycombinator.com/companies?page=2",
    "https://www.ycombinator.com/companies/industry/fintech",
    "https://www.ycombinator.com/companies/location/san-francisco",
    "https://www.ycombinator.com/companies/location/india",
    "https://www.ycombinator.com/companies/airbnb",
    "https://www.ycombinator.com/companies/531",
    "https://ycombinator.com/companies/stripe",
    "https://www.ycombinator.com/companies/dropbox/jobs"
  ],
  "fetchDetails": true,
  "maxPages": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false
}' |
apify call abotapi/ycombinator-com-scraper --silent --output-dataset

```

## MCP server setup

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