# YC Jobs Scraper: Y Combinator Startup Jobs, Salary & Equity (`datasmithlab/yc-jobs-scraper`) Actor

Y Combinator startup jobs with salary and equity as numbers, visa sponsorship, YC batch, company size and industry. Role, location, batch, salary and visa filters, full descriptions, new-jobs-only monitoring. No login, no personal data.

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

## Pricing

from $0.90 / 1,000 job listings

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: Y Combinator Startup Jobs, Salary & Equity

Export jobs at **Y Combinator startups** from their public YC job pages, with **salary and equity ranges parsed into numbers**, visa and experience requirements, the company's YC batch, team size and industry, and the full job description.

No login, no browser, no personal data.

### What you get

- **Numbers, not text.** `$140K - $210K` becomes `salaryMin: 140000`, `salaryMax: 210000`, `salaryCurrency: "USD"`, plus a yearly equivalent for monthly pay. `0.25% - 2.00%` becomes `equityMinPercent: 0.25`, `equityMaxPercent: 2`. USD, EUR, GBP, INR and CAD ranges are recognised.
- **Company context in every row.** YC batch (e.g. `W24`), one-liner, website, team size, year founded, HQ, industries, LinkedIn page and status.
- **Full descriptions** as Markdown and plain text, plus the interview process when the company lists one.
- **Filters:** roles, keywords, locations, remote only, visa (will sponsor / not required / US only), job type, YC batches, posted within, minimum yearly salary and currency, exclude words in the title.
- **Only new jobs.** Turn on *Only new jobs since last run* and schedule it daily or weekly for job alerts.
- **Reports** in the run's key-value store: `COMPANIES` (every company read, with status and job counts) and `HEALTH` (companies discovered, failures, empty-field ratios).

### Three ways to run it

| You want | Set |
|---|---|
| Jobs at specific YC companies | **Companies**: names or links, e.g. `Stripe`, `https://www.ycombinator.com/companies/brex` |
| A quick sweep of who is hiring | Leave Companies empty, **Discovery: Fast**. Reads YC's job listing pages: about 300 hiring companies and ~2,400 jobs |
| Every YC company | **Discovery: Full**. Also checks each company in YC's company sitemap (6,000+). Most complete, but slow |

Filters narrow the output; *Roles* also narrows which listing pages Fast discovery reads.

#### How long a run takes

Pages are read one at a time with a pause in between, so run time grows with the number of pages:

| Run | Typical time |
|---|---|
| A few companies, or Fast with a low *Max jobs* | under a minute |
| Fast, every job, descriptions off | about 7 minutes |
| Fast, every job, descriptions on | 30 to 45 minutes |
| Full, descriptions off | 1.5 to 2 hours |
| Full, descriptions on | 2.5 to 3 hours |

Descriptions need one extra page per job, so they are the main cost in time (not in price). For a full sweep, run it once with *Include descriptions* off, then run again with descriptions on for just the companies you care about. The default timeout is 4 hours; long runs save their *Only new jobs* memory as they go, so a stopped run never re-charges you for jobs you already received.

### Output example

```json
{
  "id": "yc:94746",
  "title": "Applied AI Engineer",
  "company": "Infer",
  "companyBatch": "S21",
  "companyOneLiner": "Operating system for insurance agencies",
  "companyTeamSize": 9,
  "role": "Engineering",
  "roleSpecificType": "Machine learning",
  "employmentType": "Full-time",
  "location": "Bengaluru, KA, IN / Bengaluru, Karnataka, IN",
  "isRemote": false,
  "minExperience": "3+ years",
  "visa": "US citizenship/visa not required",
  "salaryText": "₹2M - ₹5M INR",
  "salaryMin": 2000000, "salaryMax": 5000000, "salaryCurrency": "INR", "salaryPeriod": "annual",
  "equityMinPercent": 0.01, "equityMaxPercent": 0.2,
  "postedAgo": "5 months", "postedDaysAgo": 150,
  "descriptionText": "About us\n\nInfer is building the operating system for insurance agencies...",
  "url": "https://www.ycombinator.com/companies/infer/jobs/1DhbYdF-applied-ai-engineer"
}
```

### Good to know

- **Posting dates are approximate.** YC only shows relative ages ("24 days", "about 2 months"), so `postedDaysAgo` and the *Posted within* filter are approximate.
- **Unclear salaries are not guessed.** A range without a unit such as `€75 - €95` keeps its numbers but gets no yearly value, so salary filters skip it. The original text is always in `salaryText`.
- **Applying.** `url` and `applyUrl` point to the job's page on ycombinator.com; YC asks candidates to sign in there to apply.
- **Not every YC company posts on YC.** Some hire only through their own careers page. Those companies show `jobs: 0` in the `COMPANIES` report.
- **Personal data.** Founder and hiring-manager names are never collected. Rows contain job and company data only.
- **Polite by design.** Pages are read one at a time with a pause between requests, and only pages YC's robots.txt allows. YC's own company search is not used.

### Pricing

Pay per job returned plus a small start fee per run. Descriptions are included at the same price.

### Feedback

Missing a field or a filter? Open an issue on this Actor's page. We read every one and reply.

*Not affiliated with or endorsed by Y Combinator.*

# Actor input Schema

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

YC company names or links, e.g. Stripe, Ramp or https://www.ycombinator.com/companies/brex. Leave empty to discover hiring YC companies automatically.

## `discovery` (type: `string`):

Used when Companies is empty. Fast reads YC's job listing pages (about 300 hiring companies, ~2,400 jobs, ~7 minutes without descriptions). Full also checks every company in YC's company sitemap (6,000+ companies, 1.5 to 3 hours) for complete coverage.

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

Leave empty for all roles.

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

Keep jobs where any keyword appears as a whole word in the title, role, skills, company or description (description needs 'Include descriptions').

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

Keep jobs whose location contains one of these, e.g. San Francisco, New York, IN, Remote.

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

Only jobs whose location includes Remote.

## `visa` (type: `array`):

Filter by the visa line YC shows on each job.

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

Leave empty for all types.

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

Only companies from these batches, e.g. W24, S23, F24, X25 or 'Winter 2024'.

## `postedWithin` (type: `string`):

YC shows how long ago a job was posted ('24 days', 'about 2 months'); the filter uses that.

## `minYearlySalary` (type: `integer`):

Top of the salary range, converted to yearly (monthly x12). Jobs without a salary are dropped when set. Combine with Salary currency.

## `salaryCurrency` (type: `string`):

Only jobs paying in this currency (jobs without a salary are dropped).

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

Drop jobs whose title contains any of these words (whole-word match).

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

Full job description (Markdown and plain text) and interview process. One extra page per job, so runs take longer. Same price either way.

## `onlyNewSinceLastRun` (type: `boolean`):

Return only jobs not seen in a previous run with the same settings. Schedule it daily or weekly for job alerts.

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

Hard stop: you are never charged for more jobs than this.

## Actor input object example

```json
{
  "discovery": "fast",
  "keywords": [
    "python"
  ],
  "remoteOnly": false,
  "postedWithin": "any",
  "includeDescription": true,
  "onlyNewSinceLastRun": false,
  "maxItems": 50
}
```

# Actor output Schema

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

Job listings (table view, JSON/CSV/Excel export).

## `allFields` (type: `string`):

Every field of every job, including descriptions.

## `companies` (type: `string`):

For each company read: status (ok / not_found / error), jobs, jobs matched.

## `health` (type: `string`):

Companies discovered and read, failures, empty-field ratios.

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

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

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

```

## MCP server setup

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