# Y Combinator Scraper (`futurizerush/y-combinator-scraper`) Actor

Collect public Y Combinator company profiles, founder links, and open job listings. Filter the directory by batch, industry, tags, region, or hiring status and export structured results.

- **URL**: https://apify.com/futurizerush/y-combinator-scraper.md
- **Developed by:** [Rush](https://apify.com/futurizerush) (community)
- **Categories:** AI, Lead generation, Jobs
- **Stats:** 41 total users, 0 monthly users, 100.0% runs succeeded, 5 bookmarks
- **User rating**: 3.56 out of 5 stars

## Pricing

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

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

Collect public Y Combinator company profiles, founder links, and open job listings. Filter the directory by batch, industry, tags, region, or hiring status and export structured results.

Use this Actor to research startups, compare YC batches, or find companies with published job openings. It collects matching public company profiles up to your requested limit and saves one company per dataset row.

### Quick start

1. Open the [YC company directory](https://www.ycombinator.com/companies), choose your filters, and copy its URL.
2. Set `maxItems` to the number of company profiles you want. Enable founders or open jobs if you need those details.
3. Start the Actor. Open **Run summary** to check whether collection is complete, then view or export the saved results.

The form starts with this input:

```json
{
  "url": "https://www.ycombinator.com/companies?batch=Fall%202025&isHiring=true",
  "maxItems": 10,
  "scrapeFounders": false,
  "scrapeOpenJobs": false
}
```

### Input

| Field | Default | Meaning |
| --- | --- | --- |
| `url` | Required | YC company directory URL, at most 4,096 characters. |
| `maxItems` | `0` | Integer from `0` to `10000`. A positive value limits saved company profiles; `0` or an omitted field means no requested limit. The form is prefilled with `10`. |
| `scrapeFounders` | `false` | Include current active founders and their public profile links. |
| `scrapeOpenJobs` | `false` | Include public job listings and links to full postings. |

Use exactly `https://www.ycombinator.com/companies`, optionally followed by `/` and a query string. Company profile URLs, other hosts, HTTP URLs, and fragments such as `#results` are not accepted.

#### Directory filters

Filters belong in the URL, not in separate input fields. Supported query keys are case-sensitive:

| Query keys | Accepted values |
| --- | --- |
| `query` | Search text. Use once. |
| `batch`, `tags`, `status`, `regions` | Values from the YC directory. Repeat the same key to include multiple values. |
| `industry` | Industry values from the YC directory. Repeat this key to include multiple values. The existing `industries` alias is also accepted, but use only one spelling in a URL. |
| `isHiring`, `top_company`, `nonprofit`, `app_video_public`, `demo_day_video_public`, `app_answers`, `question_answers` | `true` or `false`. Use each key once. |
| `team_size` | The YC size slider's JSON array of two strings, such as `["1","50"]`. Copy the encoded value from the directory URL and use it once. |

Repeated values for the same facet use **OR**; different facets use **AND**. For example, `batch=Fall%202025&batch=Summer%202025&isHiring=true` requests companies from either batch that also match the hiring filter.

The size slider accepts `1`, `5`, `10`, `25`, `50`, `100`, `250`, `500`, and `1,000+` as string endpoints, ordered from smaller to larger. `1,000+` is the open upper end. A URL example is `https://www.ycombinator.com/companies?team_size=%5B%2225%22%2C%22250%22%5D`.

Other query keys are rejected, except `utm_*` tracking keys, which are ignored. Each filter value is limited to 200 characters; values other than search text must not be empty. Copy available filter values from the directory rather than guessing them. A valid combination can match zero companies.

### Company results

Every saved company row includes these fields. Missing text is represented as `""`; fields marked nullable use `null` when information is unavailable. Optional web links also use empty text or `null` when a published link is malformed, with an explanation in `data_warnings`.

| Field | Type | Meaning |
| --- | --- | --- |
| `company_name` | String | Published company name. |
| `url` | URL | Public YC company profile. |
| `company_image` | String | Public logo URL, or empty text when unavailable or malformed. |
| `short_description` | String | Published one-line description. |
| `long_description` | String | Published full company description. |
| `batch` | String | YC batch. |
| `status` | String | Published company status. |
| `tags` | String array | Distinct published tags. |
| `company_location` | String | Published location. |
| `year_founded` | Integer or null | Published founding year. |
| `team_size` | Integer or null | Published team size. |
| `primary_partner` | String or null | Published YC partner name. |
| `website` | String | Company website URL, or empty text when unavailable or malformed. |
| `company_linkedin` | URL or null | Published company LinkedIn link, or `null` when unavailable or malformed. |
| `company_x` | URL or null | Published company X/Twitter link, or `null` when unavailable or malformed. |
| `is_hiring` | Boolean | Whether the public company profile lists open jobs. |
| `number_of_open_jobs` | Integer | Number of public job listings on that profile. |

Hiring status and job counts are included even when `scrapeOpenJobs` is `false`. They reflect listings on the public YC company profile, not all vacancies on the company's own website. Directory filters and company profiles can update at different times.

#### Optional data warnings

Malformed published web links are omitted and explained in `data_warnings`. This optional array of messages appears only when invalid optional links are found. Omitted website and logo links use `""`; omitted social links use `null`. The Actor does not invent corrected links. Incorrect field types still cause collection to fail.

#### Optional founder details

When `scrapeFounders` is `true`, `founders` contains the current active founders published on the profile:

| Field | Meaning |
| --- | --- |
| `id` | Public YC founder ID as an integer. |
| `name` | Published founder name. |
| `role` | Published title, or empty text when absent. Roles are not inferred. |
| `linkedin`, `x` | Published social profile URLs, or `null` when unavailable or malformed. |

This does not promise a complete historical list of everyone who founded or worked at the company.

#### Optional job listings

When `scrapeOpenJobs` is `true`, `open_jobs` contains the public listings on the company profile:

| Field | Meaning |
| --- | --- |
| `id` | Public job posting ID as an integer. |
| `title` | Published job title. |
| `description_url` | Link to the full posting. |
| `description` | Always `null`; full job descriptions are not collected. |
| `location` | Published job location, or empty text. |
| `salary` | Published salary range, or empty text. |
| `years_experience` | Published experience requirement, or empty text. |

An optional array is omitted when its setting is disabled. When enabled, an empty array means the public profile contains no applicable entries. Failed collection must not be interpreted as an empty founder or job list.

### Run summary and completeness

The **Run summary** link opens the `OUTPUT` record in the run's key-value store:

| Field | Meaning |
| --- | --- |
| `status` | `running`, `completed`, or `failed`. |
| `stopReason` | `completed`, `max_items`, `charge_limit`, or `error`. Read the final value after collection has stopped. |
| `matchedCompanies` | Number of matching public directory companies, or `null` if the total could not be established. |
| `savedCompanies` | Verified number of saved company profiles when `savedCountVerified` is `true`. Otherwise, the last confirmed count, which may be lower than the actual saved count. |
| `savedCountVerified` | Boolean. `true` when the saved count has been verified; `false` when stored results could not be reconciled and the last confirmed count may only be a lower bound. |
| `requestedMaxItems` | Your profile limit; `0` means no requested limit. |
| `complete` | `true` only when all matching public company profiles have been saved. |
| `error` | Explanation of a collection failure, when present. |

`status: "completed"` does not by itself mean the entire matching directory was collected. A stop at `max_items` or `charge_limit` can leave partial results; inspect `complete`, `stopReason`, and the counts together.

If a required directory or company profile cannot be collected or validated, the run reports failure instead of silently declaring success. Previously saved profiles remain available. Failed profiles are not replaced by placeholder rows. An interrupted or forcibly stopped run can leave its last summary at `running`; check the run status as well.

### Views and exports

- **Companies Overview** shows the main company fields.
- **Hiring overview** shows hiring fields for every saved company. It does not filter out companies without open jobs; use `isHiring=true` in your directory URL when you want that directory filter.
- **Full Details** includes the optional founder and job arrays when enabled, and `data_warnings` when malformed optional links were omitted.

Export results as JSON, CSV, or Excel from the dataset. JSON preserves nested founder and job arrays.

### FAQ

**Does omitting `maxItems` collect every matching company?**

It requests collection without a company limit, just like `maxItems: 0`. Availability, run limits, or errors can still stop collection. Check the Run summary before treating the dataset as complete.

**Why are there no companies?**

A completed run with `matchedCompanies: 0`, `savedCompanies: 0`, and `complete: true` indicates that the accepted filters matched no companies. A failed or unfinished run is not evidence of no matches.

**Why is a founder title, salary, or social link missing?**

Only published information is returned. Missing fields are left empty or null as documented above. Malformed optional web links are also omitted, with an explanation in `data_warnings`; titles, salaries, and corrected links are not invented.

**Why is `description` null for every job?**

The Actor collects job listings and posting links. Open `description_url` to read the full job description.

**Why is my URL rejected?**

Use the exact HTTPS directory address, remove any fragment, and keep only supported query keys. Copy the company-size range from YC's slider. Individual company URLs are not accepted as input.

**Do I need a YC account?**

The Actor collects public directory and company profile information. Private, account-only information is outside its scope.

### Public-data disclaimer

This Actor is an independent tool and is not affiliated with or endorsed by Y Combinator or the companies listed. It collects information published in the public YC directory and company profiles; it does not provide access to private records. Public profiles and job listings may be incomplete, outdated, changed, or removed. Verify important details at the linked source before using them for research, recruiting, or business decisions. You are responsible for following applicable terms, privacy requirements, and laws when collecting or using the data.

Claude Code, OpenClaw, Gemini, Antigravity, Codex, ChatGPT

# Actor input Schema

## `url` (type: `string`):

Choose filters in the YC company directory, then paste its URL here to research a batch, explore an industry, or find hiring companies. The directory uses industry for industry filters; industries is also accepted as an alias. Copy team-size ranges from the directory's slider. See the README for all supported filters.

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

Maximum number of matching company profiles to save. Use 0, or omit this field, for no requested limit. The form starts with 10. Collection may stop earlier if a run limit is reached or an error occurs; check the Run summary for completeness.

## `scrapeFounders` (type: `boolean`):

Include current active founders with public IDs, published titles, and available LinkedIn or X links. The founders array is omitted when this option is off. Roles are not inferred.

## `scrapeOpenJobs` (type: `boolean`):

Include public job IDs, titles, posting links, locations, and available salary and experience requirements. Full job descriptions are not collected. When off, the open_jobs array is omitted, but hiring status and job counts remain included.

## Actor input object example

```json
{
  "url": "https://www.ycombinator.com/companies?batch=Fall%202025&isHiring=true",
  "maxItems": 10,
  "scrapeFounders": false,
  "scrapeOpenJobs": false
}
```

# Actor output Schema

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

No description

## `hiring` (type: `string`):

No description

## `full` (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 = {
    "url": "https://www.ycombinator.com/companies?batch=Fall%202025&isHiring=true",
    "maxItems": 10,
    "scrapeFounders": false,
    "scrapeOpenJobs": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("futurizerush/y-combinator-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 = {
    "url": "https://www.ycombinator.com/companies?batch=Fall%202025&isHiring=true",
    "maxItems": 10,
    "scrapeFounders": False,
    "scrapeOpenJobs": False,
}

# Run the Actor and wait for it to finish
run = client.actor("futurizerush/y-combinator-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 '{
  "url": "https://www.ycombinator.com/companies?batch=Fall%202025&isHiring=true",
  "maxItems": 10,
  "scrapeFounders": false,
  "scrapeOpenJobs": false
}' |
apify call futurizerush/y-combinator-scraper --silent --output-dataset

```

## MCP server setup

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