# YC Jobs Scraper (`deriverge/yc-jobs-scraper`) Actor

Open jobs at Y Combinator startups from Work at a Startup, with salary and equity as numbers, visa terms, required experience and the company's batch and team size. Filter by role, location, visa sponsorship or batch, or schedule it to return only new jobs.

- **URL**: https://apify.com/deriverge/yc-jobs-scraper.md
- **Developed by:** [deriverge s.r.o.](https://apify.com/deriverge) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 jobs

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

## YC Jobs Scraper

YC Jobs Scraper collects the open jobs that Y Combinator startups post on Work at a Startup, one row per job: title, role, location, salary and equity as numbers, visa terms, experience and skills, with the company's batch, one-liner, team size and website. It reads the jobs page of every YC company marked as hiring, about 1,480 companies in September 2026. The form opens with Engineering selected, so **Start** gives you 50 jobs. YC shows only how long ago a job went up, so posting dates are approximate. It costs $1.00 per 1,000 jobs on the Free plan ($0.50 on Business), and the $5 of monthly credit in Apify's Free plan covers about 5,000 jobs.

### What data does it return?

| Field | Description |
|---|---|
| `title`, `url` | Job title as the company wrote it, and the job's page on ycombinator.com. |
| `company`, `companySlug` | Company name and its slug on ycombinator.com, e.g. `orca-aerospace`. The slug works in **Companies**. |
| `companyBatch`, `companyBatchName` | YC batch as a code and in words: `S26` and `Summer 2026`. |
| `companyOneLiner`, `companyTeamSize` | What the company does in one line, and how many employees it lists in the YC directory. |
| `companyIndustry`, `companyStatus` | Industry, such as `Fintech` or `Industrials`, and the company's status, such as `Active` or `Public`. |
| `companyWebsite`, `companyLocation` | The company's own website and where it is based, with several places separated by semicolons: `San Francisco, CA, USA; Remote`. |
| `role`, `roleType` | Job family, such as `Engineering`, `Operations` or `Sales`, and the specialty, e.g. `Machine learning`. `roleType` is empty on about half of the jobs. |
| `jobType` | `Full-time`, `Internship`, `Contract` or, rarely, `Co-founder`. |
| `location`, `remote` | Where the job is based, as the company typed it (`San Francisco, CA, US / Remote (US)`), and `true` when that text includes Remote. |
| `salaryMin`, `salaryMax`, `salaryCurrency` | Salary range as numbers in the posted currency. `salaryText` keeps the original, e.g. `$175K - $350K`. |
| `salaryPeriod` | What the figures are per: `year` for most jobs, `month` or `hour` when the job says `/ monthly` or `/ hourly`. Empty when the figures have no period and are too small for a year. |
| `equityMin`, `equityMax` | Equity range in percent: `1.00% - 2.00%` becomes `1` and `2`. `equityText` keeps the original. |
| `minExperience`, `minYears` | Required experience as written (`3+ years`, `Any (new grads ok)`) and as a number of years, where `0` means new graduates are welcome. |
| `visa`, `visaSponsorship` | Visa terms as YC shows them, and `true` only when they read `Will sponsor`. |
| `skills` | Skills the company tagged, e.g. `Python` or `Torch/PyTorch`. Empty on about three quarters of the jobs. |
| `postedAgo`, `postedDaysAgo` | Age of the job as YC shows it (`15 days`, `about 1 month`) and as an approximate number of days. |
| `description`, `interviewProcess` | Full job description in Markdown and the interview process, filled when **Include the full job description** is on. |
| `applyUrl` | Application link on Work at a Startup, where candidates sign in with a YC account. |

### How to scrape YC jobs

1. Choose job families in **Roles**. Clear the field to get all 11 of them, from Engineering and Design to Recruiting & HR and Legal.
2. Narrow the jobs with **Job types**, **Remote jobs only**, **Visa sponsorship only**, **Minimum salary (USD per year)**, **Maximum years of experience required** and **Posted within the last N days**. Enter `0` years to see jobs open to new graduates.
3. Add places to **Locations (any of)**. They are matched against the location text, so `London` finds London jobs and `US` finds every job with US in its location.
4. Use **Keywords (any of)** and **Exclude keywords** for words in the title, skills, company name or one-liner, such as `founding` or `python`.
5. Limit the companies with **YC batches** (`S26`, `W26` or `Summer 2025`), **Industries** (`Fintech`, `Healthcare`, `Developer Tools`) or **Companies** (slugs such as `stripe`, or company page links). Only those companies are opened, so the run also finishes sooner.
6. Turn on **Include the full job description** if you need the text and the interview process, then click **Start**. Jobs land in the **Output** tab in batches as the companies are read, and download as CSV, Excel or JSON.

Through the API, **Roles** takes codes such as `eng`, `product` or `science`. This input asks for engineering and science jobs at S26 and F26 companies that sponsor visas and take new graduates:

```json
{
  "roles": ["eng", "science"],
  "visaSponsorship": true,
  "maxYearsRequired": 0,
  "batches": ["S26", "F26"],
  "includeDescription": true,
  "maxItems": 300
}
```

### Example output

One job from a run on 30 September 2026. The full description was off in that run, so `description` and `interviewProcess` are empty.

```json
{
  "key": "yc-job:107693",
  "jobId": "107693",
  "title": "Founding Flight Software Engineer",
  "url": "https://www.ycombinator.com/companies/orca-aerospace/jobs/eMihWDs-founding-flight-software-engineer",
  "applyUrl": "https://account.ycombinator.com/authenticate?continue=https%3A%2F%2Fwww.workatastartup.com%2Fapplication%3Fsignup_job_id%3D107693&defaults%5BsignUpActive%5D=true&defaults%5Bwaas_company%5D=35525",
  "company": "Orca Aerospace",
  "companySlug": "orca-aerospace",
  "companyUrl": "https://www.ycombinator.com/companies/orca-aerospace",
  "companyWebsite": "https://orcaaerospace.com/",
  "companyBatch": "F26",
  "companyBatchName": "Fall 2026",
  "companyOneLiner": "AI spacecraft operators that lives onboard the vehicle",
  "companyTeamSize": 3,
  "companyIndustry": "Industrials",
  "companyLocation": "San Francisco, CA, USA",
  "companyStatus": "Active",
  "role": "Engineering",
  "roleType": "Embedded systems",
  "jobType": "Full-time",
  "location": "San Francisco, CA, US / Remote (US)",
  "remote": true,
  "salaryMin": 100000,
  "salaryMax": 200000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$100K - $200K",
  "equityMin": 0.25,
  "equityMax": 2,
  "equityText": "0.25% - 2.00%",
  "minExperience": "1+ years",
  "minYears": 1,
  "visa": "US citizen/visa only",
  "visaSponsorship": false,
  "skills": [
    "C++",
    "Python",
    "Linux"
  ],
  "postedAgo": "28 days",
  "postedDaysAgo": 28,
  "description": null,
  "interviewProcess": null,
  "logo": "https://bookface-images.s3.amazonaws.com/small_logos/afa6ce6fe3345bb9e7b6296e9877371ada8e2155.png"
}
```

### How much does it cost to scrape YC jobs?

| | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| 1,000 jobs | $1.00 | $0.80 | $0.65 | $0.50 |

You pay only for the events in the table. There is no start fee, and compute time and proxies are included.

A run over every hiring company returns about 6,000 jobs, which costs $6.00 on the Free plan and $3.00 on Business. Jobs removed by a filter and jobs already sent in new-only mode are not charged, and the full description is included in the price.

### Limits

- Only companies that the YC directory marks as hiring are read. To read a company without that mark, list it in **Companies**; its jobs page is opened anyway.
- `postedDaysAgo` turns YC's wording into days: `about 1 month` becomes `30` and `over 1 year` becomes `426`, so **Posted within the last N days** can be off by weeks for older jobs. Jobs stay up for a long time: in September 2026 a quarter of them had been posted a year or more earlier.
- About 6% of salaries are monthly or hourly, such as `$6K - $9K / monthly` or `$20 - $50 / hourly`. `salaryPeriod` marks them, and **Minimum salary** compares them as yearly amounts (12 months or 2,080 hours).
- Some companies leave out the K: one listed its full-time engineering jobs as `$110 - $160` in September 2026. Such figures stay as written with an empty `salaryPeriod`, and **Minimum salary** drops those jobs.
- About one job in five has no salary, and **Minimum salary** drops those. Salaries in `INR`, `GBP`, `EUR`, `CAD` and a few other currencies are compared at fixed approximate rates; the row keeps the original currency.
- A placeholder lower bound such as `$1 - $200K` leaves `salaryMin` empty, and a placeholder salary such as `₹1 INR` leaves both figures empty.
- The form starts **Maximum rows** at 50. Through the API a run stops at 10,000 jobs unless you set `maxItems`.

### New YC jobs every morning

Turn on **Return only jobs new since the last run**, give the run a **Watch name** such as `yc-engineering` (a saved task has one already) and schedule it daily. The first run returns every matching job and stores the IDs it has read. Each later run returns only jobs whose ID is missing from that snapshot, so you pay for each job once. When a run stops at **Maximum rows**, the jobs it did not get to stay out of the snapshot, and the next run returns them. The run's key-value store also gets a `CHANGES` record with the number of new jobs and, when the run read every company, the jobs that are no longer listed.

### FAQ

#### Is it legal to scrape YC jobs?

YC publishes these job pages on ycombinator.com for anyone to read without an account. The list of hiring companies comes from yc-oss, an openly published copy of the YC company directory. The actor keeps facts about the job and the company and leaves out the hiring manager's name that YC shows with a job. You are responsible for how you use the data, including republishing job texts.

#### How do I find jobs that sponsor a visa?

Turn on **Visa sponsorship only**. It keeps jobs whose `visa` reads `Will sponsor`, about one job in nine in September 2026. Three quarters say `US citizen/visa only`, and `US citizenship/visa not required` appears mostly on jobs outside the US, in cities such as London or Bengaluru.

#### How long does a full run take?

Reading every hiring company takes about 1,500 page requests and a few minutes. With the full description on, each matching job adds one more page, so the same run takes several times longer.

### Related scrapers

- [Ashby Jobs Scraper](https://apify.com/deriverge/ashby-jobs-scraper)
- [Career Site Jobs Search](https://apify.com/deriverge/career-site-jobs-search)

### Support

This actor is built and maintained by deriverge s.r.o., a software company based in the Czech Republic. If a run fails or a field you need is missing, please open an issue in the **Issues** tab or write to us at info@deriverge.com. We respond in English and Czech. Runs can be scheduled in Apify Console or started from the **API** tab, which has examples for Python, JavaScript and cURL and works with Make, Zapier, n8n and the Apify MCP server. If the actor saves you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/deriverge/yc-jobs-scraper/changelog.md

# Actor input Schema

## `roles` (type: `array`):

Keep only these job families. Leave empty for all.

## `jobTypes` (type: `array`):

Keep only these types. Leave empty for all.

## `remoteOnly` (type: `boolean`):

Keep only jobs whose location includes Remote.

## `locations` (type: `array`):

Keep only jobs whose location mentions one of these, for example "San Francisco", "New York", "London" or "US".

## `visaSponsorship` (type: `boolean`):

Keep only jobs where the company says it will sponsor a visa.

## `minSalary` (type: `integer`):

Keep only jobs whose published top of range reaches this amount. Salaries in other currencies are compared at approximate rates; jobs without a published salary are dropped.

## `maxYearsRequired` (type: `integer`):

Keep only jobs that ask for at most this many years. Use 0 for jobs open to new graduates.

## `postedWithinDays` (type: `integer`):

Keep only jobs posted recently. YC shows the age as text (about 1 month), so this is approximate.

## `keywords` (type: `array`):

Keep only jobs whose title, skills, company name or one-liner contain one of these, for example "python", "founding" or "AI".

## `excludeKeywords` (type: `array`):

Drop jobs whose title, skills, company name or one-liner contain any of these.

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

Only companies from these batches, as S25, W26 or Summer 2025. Leave empty for all.

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

Only companies in these industries or tags, for example Fintech, B2B, Healthcare or Developer Tools.

## `companies` (type: `array`):

Only these companies, as YC slugs (stripe) or company page links. Leave empty for every hiring YC company.

## `includeDescription` (type: `boolean`):

Opens each matching job to add its full description and interview process. Slower; the price is the same.

## `newOnly` (type: `boolean`):

Keeps a snapshot per watch name (or per saved task) and returns only jobs that were not there before. Schedule it daily for a job alert.

## `watchName` (type: `string`):

Name of the snapshot used by the new-only mode, for example "yc-engineering". Runs from a saved task get one automatically.

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

Hard cap on returned jobs. The run stops reading companies as soon as it has this many.

## Actor input object example

```json
{
  "roles": [
    "eng"
  ],
  "remoteOnly": false,
  "visaSponsorship": false,
  "includeDescription": false,
  "newOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

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

One row per job with the salary and equity as numbers, visa, experience, skills and company details.

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

Jobs that appeared and jobs that closed compared with the previous run of the same task or watch name.

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

Companies read, jobs found, how many each filter dropped, and request counts.

# 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 = {
    "roles": [
        "eng"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("deriverge/yc-jobs-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 = {
    "roles": ["eng"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("deriverge/yc-jobs-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 '{
  "roles": [
    "eng"
  ],
  "maxItems": 50
}' |
apify call deriverge/yc-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,deriverge/yc-jobs-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/8XNOI39C72dEgBwEa/builds/maBtU05VZAvuIeL1m/openapi.json
