# YC Company Hiring Monitor (`cherubic_snipefish/yc-company-hiring-monitor`) Actor

Monitor Y Combinator companies for hiring, team-size, status, and website changes with stateful scheduled comparisons and webhook-ready output.

- **URL**: https://apify.com/cherubic\_snipefish/yc-company-hiring-monitor.md
- **Developed by:** [Deva](https://apify.com/cherubic_snipefish) (community)
- **Categories:** Lead generation, Jobs, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 Company Hiring Monitor

Monitor public Y Combinator company profiles for hiring and company-profile changes. The Actor is designed for scheduled recruiting, sales, and market-intelligence workflows and uses the public YC directory without a browser or proxy.

### What it detects

- New companies matching your filters
- Companies that start or stop hiring
- Team-size changes
- Company-status changes
- Website changes

Each dataset row includes the current company profile, a primary `changeType`, all detected `changeTypes`, and webhook-friendly `previousValue` / `currentValue` objects.

### Recommended setup

1. Run once with `baselineOnly: true` to save the current state without emitting rows.
2. Create an Apify schedule (daily is a practical default) with `baselineOnly: false` and `emitChangesOnly: true`.
3. Optionally connect the dataset to a webhook or integration.

State is stored in the run's default key-value store under `YC_COMPANY_STATE_V1`. Scheduled runs must reuse the same default storage to compare against the prior baseline.

### Input

| Field | Type | Default | Description |
|---|---|---:|---|
| `maxItems` | integer | `100` | Maximum companies fetched and compared per run (1–2,000). |
| `hiringOnly` | boolean | `true` | Limit results to companies currently marked as hiring. Disable it to detect stopped-hiring transitions. |
| `baselineOnly` | boolean | `false` | Save current state and emit no dataset rows. Use this for the first scheduled run. |
| `emitChangesOnly` | boolean | `true` | After a baseline exists, emit only new or changed companies. |
| `batches` | string\[] | `[]` | Exact YC batch facets, such as `S24` or `W25`. |
| `industries` | string\[] | `[]` | Exact YC directory industry facets. |
| `regions` | string\[] | `[]` | Exact YC directory region facets. |
| `statuses` | string\[] | `[]` | Exact YC company-status facets. |

Empty filter arrays mean “all values.” Multiple values within one facet are ORed; different facet groups are ANDed.

#### First-run baseline

```json
{
  "maxItems": 500,
  "hiringOnly": false,
  "baselineOnly": true,
  "emitChangesOnly": true,
  "batches": ["S24", "W25"]
}
```

#### Daily hiring-change monitor

```json
{
  "maxItems": 500,
  "hiringOnly": false,
  "baselineOnly": false,
  "emitChangesOnly": true,
  "batches": ["S24", "W25"]
}
```

Use `hiringOnly: false` when you need both `newlyHiring` and `stoppedHiring` events. With `hiringOnly: true`, companies that leave the filtered search results cannot be observed as stopped hiring.

### Output

Dataset records contain:

- Identity: `companyId`, `name`, `slug`, `ycProfileUrl`
- Profile: `website`, `batch`, `status`, `stage`, `location`, `industries`, `oneLiner`
- Hiring signals: `isHiring`, `teamSize`
- Change metadata: `changeType`, `changeTypes`, `previousValue`, `currentValue`, `detectedAt`

The `OUTPUT` key-value-store record provides a compact run summary:

```json
{
  "status": "ok",
  "inspected": 100,
  "emitted": 3,
  "baselineOnly": false,
  "hadPreviousBaseline": true,
  "detectedAt": "2026-09-17T09:00:00.000Z"
}
```

### Operational notes

- The Actor discovers YC's public search configuration at runtime rather than embedding credentials.
- Requests retry transient failures and respect `Retry-After` responses.
- `maxItems` bounds request volume and state growth.
- The Actor reports changes only among records returned by the current filters. Keep filters stable between scheduled runs for clean comparisons.
- Data comes from public YC directory profiles and may be incomplete or delayed. Verify signals before contacting a company or making decisions.

# Actor input Schema

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

Maximum records fetched and compared per run.

## `hiringOnly` (type: `boolean`):

Disable this to detect both newly hiring and stopped-hiring transitions across all matching YC companies.

## `baselineOnly` (type: `boolean`):

Save current state but emit no dataset rows. Useful for the first scheduled run.

## `emitChangesOnly` (type: `boolean`):

After state exists, emit only new or changed companies.

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

Optional exact YC batches, for example S24 or W25.

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

Optional exact industry facet values.

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

Optional exact region facet values.

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

Optional exact company status facet values.

## Actor input object example

```json
{
  "maxItems": 100,
  "hiringOnly": true,
  "baselineOnly": false,
  "emitChangesOnly": true,
  "batches": [],
  "industries": [],
  "regions": [],
  "statuses": []
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runSummary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("cherubic_snipefish/yc-company-hiring-monitor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("cherubic_snipefish/yc-company-hiring-monitor").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 '{}' |
apify call cherubic_snipefish/yc-company-hiring-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cherubic_snipefish/yc-company-hiring-monitor"
        }
    }
}
```

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/8A7dPbN2p4XiaOYcn/builds/yykEqHZWitFkHtu0Q/openapi.json
