# Startup & Tech Jobs Scraper: 19,000+ Companies, YC Filter (`richiedc95/startup-jobs-search`) Actor

Jobs at 19,000+ startups and tech companies, straight from their career sites (Ashby, Lever, Greenhouse and more). Filter to 950+ Y Combinator companies, by role, remote, salary or date. $3.00 per 1,000 jobs.

- **URL**: https://apify.com/richiedc95/startup-jobs-search.md
- **Developed by:** [Richie Data](https://apify.com/richiedc95) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 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

## Startup & Tech Jobs Scraper: 19,000+ Companies, YC Filter

Search open jobs at **19,000+ startups and tech companies** in one run, straight from their own career sites on Ashby, Lever, Greenhouse, Workable, Rippling, Personio and 6 more applicant tracking systems. Turn on **Y Combinator companies only** to see roles at the 950+ YC startups we track, each tagged with its batch (W24, S23...).

⭐ **Is this Actor useful to you?** A short review on the Reviews tab helps other users find it, and tells us what to build next.

- 🚀 **Startups and scale-ups**: the ATS that startups use, without big-enterprise systems.
- 🟧 **Y Combinator filter and batch tag**: `ycBatch` on every job from a YC company, from YC's public company directory.
- 🏢 **Straight from employers**: no reposts or aggregator duplicates; the apply link goes to the company.
- 💰 **Salary ranges parsed into numbers** when published; remote, hybrid and on-site detected.
- 🔔 **Daily job alerts**: save your search as a task, schedule it daily and turn on **Only new jobs**: each run returns just the jobs posted since the last one, straight to Slack, email, Google Sheets or a webhook.
- 🎯 **Filters**: role keywords, locations, remote only, experience level, employment type, minimum salary, words in the description, posted in the last N days.
- 🔔 **Daily alerts**: turn on **Only new jobs** and schedule it.
- 💵 **$3.00 per 1,000 jobs**.

### Who uses it

- **Job seekers** who want to work at startups or YC companies.
- **Startup job boards and newsletters** publishing fresh roles every day.
- **Recruiters, investors and analysts** tracking which startups are hiring, and for what.

### How to use it

1. Enter one or more **roles** (for example `founding engineer`, `product designer`, `growth`).
2. Optionally turn on **Y Combinator companies only**, add **locations** or **remote only**, **posted within N days**, **experience level** or **minimum salary**.
3. Click **Start**. For a daily feed, turn on **Only new jobs** and add a schedule.

#### Example input

```json
{
    "keywords": ["founding engineer", "software engineer"],
    "ycOnly": true,
    "remoteOnly": true,
    "postedWithinDays": 14,
    "maxJobsPerCompany": 3
}
```

### Output

Each job has the same schema as our other job Actors (company, title, department, location, workplace type, employment type, seniority, salary, posting date, apply URL, description), plus `ycBatch` for Y Combinator companies.

### Pricing

**$3.00 per 1,000 jobs** saved plus about $0.01 per run. Use **Max jobs** to cap a run. In the **Companies** output (lead lists), each hiring company costs $0.01 more, because one record bundles every matching role, the careers page and the salary range.

### FAQ

**Is this an alternative to a LinkedIn or Indeed jobs scraper?** Yes, and a safer one. Most jobs you see on LinkedIn and Indeed are first published on the employer's own career site (Greenhouse, Lever, Workday and the other ATS this Actor reads), so you get the same openings from the original source, usually earlier and with the full description, salary range and direct apply link. No LinkedIn or Indeed account, cookies, proxies or login are needed, nothing is scraped from those sites, and there are no blocked runs or duplicated reposts. This Actor is not affiliated with LinkedIn or Indeed.

**Which companies count as startups?** Companies whose careers site runs on an ATS that startups and tech companies use (Ashby, Lever, Greenhouse, Workable, Recruitee, Rippling, Pinpoint, Breezy HR, Teamtailor, Personio, BambooHR, Jobvite). Large enterprises on Workday, Oracle or SmartRecruiters are left out; use the [Job Search Scraper: All Company Career Sites](https://apify.com/richiedc95/company-jobs-search) to include them.

**How is a company marked as Y Combinator?** By matching it, by exact name, to YC's public company directory (via the open yc-oss dataset). Big-enterprise ATS are never matched, so common names are not mistaken for YC startups.

**How fresh are the results?** Titles are indexed daily and every matching job is fetched live from the company's career site at run time.

**Is it legal?** It reads public job postings that companies publish for anyone to see, through each ATS's public job board endpoints. No login and no personal data.

### Use it from your code, AI agents and automations

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("richiedc95/startup-jobs-search").call(run_input={
    "keywords": [
        "founding engineer"
    ],
    "ycOnly": True,
    "postedWithinDays": 7,
    "onlyNewJobs": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('richiedc95/startup-jobs-search').call({
    "keywords": [
        "founding engineer"
    ],
    "ycOnly": true,
    "postedWithinDays": 7,
    "onlyNewJobs": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

- 🤖 **AI agents (MCP)**: add the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client and this Actor becomes a tool your agent can call.
- 🔗 **No-code (n8n, Make, Zapier)**: one HTTP request runs the Actor and returns the results, so any automation tool can use it. In n8n, add an *HTTP Request* node with method `POST`, URL `https://api.apify.com/v2/acts/richiedc95~startup-jobs-search/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>` and the JSON input above as the body, then send the items to Slack, Google Sheets, email or a CRM. Put a *Schedule* node in front for daily alerts. Make and Zapier have official Apify apps (*Run an Actor* → *Get dataset items*). Ready-made n8n workflows (import from URL) and a step-by-step guide: [n8n / Make / Zapier examples](https://github.com/richiedc95/job-search-mcp/blob/main/examples/README.md).
- 📥 **Exports**: download every run as JSON, CSV, Excel, XML or RSS, or read it through the [Apify API](https://docs.apify.com/api/v2).

### Get a fresh feed automatically (job boards, dashboards, alerts)

1. Click **Save as a new task** with your input (turn on the monitoring option if the Actor has one, so each run returns only new jobs).
2. Add a **schedule** to the task (hourly, daily or weekly) under **Schedules**.
3. Read the latest results from one stable URL, in the format your tool expects:

```text
https://api.apify.com/v2/actor-tasks/<TASK_ID>/runs/last/dataset/items?token=<YOUR_APIFY_TOKEN>&status=SUCCEEDED&format=csv
```

Use `format=json`, `csv`, `xlsx`, `xml` or `rss`. Job-board plugins and spreadsheets can import that URL directly.

### Related Actors

- [Remote Jobs Scraper](https://apify.com/richiedc95/remote-jobs-search): remote and work-from-home jobs from the same career sites.
- [Career Site Jobs Scraper & API](https://apify.com/richiedc95/career-site-jobs-scraper): all jobs from the companies you choose.

Found a bug or need a feature? Open an issue on the Issues tab and we will usually answer within a day.

# Actor input Schema

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

Jobs whose title contains at least one of these words or phrases (case-insensitive), e.g. "data engineer", "product designer".

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

Skip jobs whose title contains any of these words, e.g. "senior", "intern".

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

Keep only jobs whose location contains one of these texts, e.g. "Remote", "London", "Berlin".

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

Keep only jobs detected as fully remote.

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

Keep only jobs posted in the last N days. 0 = no limit.

## `excludeLocations` (type: `array`):

Skip jobs whose location contains any of these texts, e.g. "India", "Remote".

## `seniorityLevels` (type: `array`):

Keep only these levels, detected from the job title (e.g. "Junior", "Graduate", "Senior", "Head of"). "Mid" is any title without a level word. Leave empty for all.

## `employmentTypes` (type: `array`):

Keep only these employment types. Jobs that do not state a type are skipped when this is set.

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

Keep only jobs that publish a pay range whose top reaches at least this yearly amount, in the job's own currency (hourly and monthly pay are converted to yearly). Jobs without a published salary are skipped when this is set. 0 = no filter.

## `descriptionKeywords` (type: `array`):

Keep only jobs whose title or description contains at least one of these words, e.g. "Python", "visa sponsorship", "Spanish".

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

Keep only jobs whose description says visa sponsorship is offered (e.g. "we sponsor H-1B visas"). Every job also gets a visaSponsorship field: true, false (says it does not sponsor) or null (does not say).

## `ycOnly` (type: `boolean`):

Only jobs at the 950+ Y Combinator companies we track. Every job from a YC company carries its batch in ycBatch (e.g. W24).

## `companyNames` (type: `array`):

Search only companies whose name contains one of these texts, e.g. "Stripe", "Bank". Leave empty to search the whole directory.

## `excludeCompanyNames` (type: `array`):

Skip companies whose name contains any of these texts (e.g. staffing agencies or your own company).

## `onlyNewJobs` (type: `boolean`):

Return only jobs not returned in previous runs. Schedule it daily for a job alert feed.

## `descriptionFormat` (type: `string`):

Format of the job description field.

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

Stop after saving this many jobs. 0 = no limit.

## `outputMode` (type: `string`):

Companies gives one record per company with matching jobs: careers page, how many matching and remote jobs, titles, locations, salary range and newest posting date. Max jobs then counts companies.

## `mergeDuplicates` (type: `boolean`):

Companies often post the same opening once per city. Keep one job per company and title, with every location in locations and the merged postings in duplicates.

## `maxJobsPerCompany` (type: `integer`):

Keep at most this many jobs from each company, for a more varied list. 0 = no limit.

## `maxCompanies` (type: `integer`):

For testing: scan only the first N companies of the directory. 0 = all.

## Actor input object example

```json
{
  "keywords": [
    "software engineer",
    "product manager"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "minSalary": 0,
  "visaSponsorship": false,
  "ycOnly": false,
  "onlyNewJobs": false,
  "descriptionFormat": "text",
  "maxItems": 100,
  "outputMode": "jobs",
  "mergeDuplicates": false,
  "maxJobsPerCompany": 5,
  "maxCompanies": 0
}
```

# Actor output Schema

## `jobs` (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 = {
    "keywords": [
        "software engineer",
        "product manager"
    ],
    "maxItems": 100,
    "maxJobsPerCompany": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("richiedc95/startup-jobs-search").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": [
        "software engineer",
        "product manager",
    ],
    "maxItems": 100,
    "maxJobsPerCompany": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("richiedc95/startup-jobs-search").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": [
    "software engineer",
    "product manager"
  ],
  "maxItems": 100,
  "maxJobsPerCompany": 5
}' |
apify call richiedc95/startup-jobs-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,richiedc95/startup-jobs-search"
        }
    }
}
```

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/538l3lqDbmJ3vVU7b/builds/RPf7V9iy4yZEja41E/openapi.json
