# Work at a Startup (YC) Jobs Scraper (`santamaria-automations/workatastartup-scraper`) Actor

Scrape jobs from Y Combinator's Work at a Startup. Returns title, YC batch (W25/S24), company URL/team size, salary range, equity, visa sponsorship, min experience, remote type, tech stack, founder replies flag, and full hiring description. Pay-per-result.

- **URL**: https://apify.com/santamaria-automations/workatastartup-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 serp 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Work at a Startup (YC) Jobs Scraper: Batch, Equity, Founders

Pull live job listings from Y Combinator's official Work at a Startup board (workatastartup.com). Only YC-funded companies post here: the ~1,000 vetted startups YC has invested in. Each record includes the YC batch (W25, S24, F26 and so on), the company's website URL, industry, team size, salary range, equity window, visa sponsorship signal, minimum experience, remote type, tech stack, founder profiles, and the full hiring description. No API key, no registration.

### Sample output

```json
[
  {
    "_type": "job",
    "id": "103933",
    "title": "Senior Software Engineer, Machine Learning",
    "company_name": "Hive",
    "company_slug": "hive",
    "company_url": "http://www.hive.co",
    "company_one_liner": "Marketing automation for event promoters (email, sms, ads, CRM)",
    "yc_batch": "S14",
    "yc_top_company": false,
    "industry": "B2B -> Marketing",
    "team_size": 65,
    "location": "CA / Remote (CA)",
    "company_location": "Kitchener, Canada",
    "remote_type": "hybrid",
    "employment_type": "full-time",
    "role_type": "Machine learning",
    "salary_range": {
      "min": 124000,
      "max": 188000,
      "currency": "CAD"
    },
    "salary_text": "$124K - $188K CAD",
    "equity_range": null,
    "experience_years_min": 5,
    "experience_years_max": 5,
    "sponsors_visa": true,
    "sponsors_visa_text": "US citizenship/visa not required",
    "founder_replies_directly": false,
    "tech_stack": ["JavaScript", "Docker", "Kubernetes"],
    "founders": [
      {
        "name": "Patrick Hannigan",
        "bio": "Founder @ www.hive.co",
        "past_companies": "Product Designer at Desire2Learn, Growth Engineer and Designer at Bunch",
        "linkedin": "https://www.linkedin.com/in/patrickhannigan/",
        "avatar_url": "https://bookface-images.s3.amazonaws.com/avatars/9868df01b4cec4ac4a81c77a78af56f9ad44604e.jpg"
      }
    ],
    "hiring_description_text": "Hive is the industry-best marketing platform for event marketers. Our platform powers marketing for 1500+ of the most iconic event, festivals, venues, promoters, and event-centric brands across North America...",
    "apply_url": "https://account.ycombinator.com/authenticate?continue=https%3A%2F%2Fwww.workatastartup.com%2Fapplication%3Fsignup_job_id%3D103933",
    "source_url": "https://www.workatastartup.com/companies/hive",
    "job_url": "https://www.workatastartup.com/jobs/103933",
    "company_profile_url": "https://www.workatastartup.com/companies/hive",
    "source_platform": "workatastartup",
    "search_query": "software engineer",
    "scraped_at": "2026-08-19T11:26:41Z",
    "company_about": "Hive is the industry-best marketing platform for event marketers...",
    "company_phone": null,
    "company_email": null,
    "company_website": "https://hive.co",
    "company_address_street": null,
    "company_address_city": null,
    "company_address_postcode": null,
    "company_address_country": null,
    "company_active_jobs_count": 4,
    "company_active_jobs": [
      {"title": "Senior Backend Engineer", "job_url": "https://www.workatastartup.com/jobs/104112", "location": "Remote", "salary_text": "$150K - $200K", "description_snippet": null}
    ]
  }
]
```

### Pricing

| Event | Price |
|-------|-------|
| Actor start | $0.001 |
| SERP result (per job) | $0.003 |
| Detail result (per job with company enrichment) | $0.005 |
| Company profile (unique employer, when `includeCompanyDetails=true`) | $0.005 |

Around $8 per 1,000 fully-enriched jobs (SERP + detail), or $3 per 1,000 SERP-only if you turn `includeJobDetails: false`. Failed detail fetches are not charged.

New to Apify? Every account gets a $5 free monthly platform credit, enough for around 500-600 fully-enriched Work at a Startup jobs before you commit to paying anything.

### Input

No API key required. Choose one or more role keywords; the actor maps each to a Work at a Startup role bucket.

| Field | Type | Required | Description | Example |
|-------|------|----------|-------------|---------|
| `searchQueries` | array | No | Role keywords (engineer, designer, pm, growth, ops, finance, legal, recruiter, ml, sales, ...). Unknown keywords default to software-engineer. | `["software engineer", "designer", "product manager"]` |
| `maxResults` | integer | No | Total cap across all queries. Default 5. | `500` |
| `maxResultsPerQuery` | integer | No | Per-bucket cap (public pages surface ~20-30 jobs per role). Default 5 so multi-query runs distribute across all buckets. | `30` |
| `includeJobDetails` | boolean | No | Fetch each unique company page for hiring description, tech stack, founders, salary/equity/visa/experience. Default false. | `true` |
| `includeCompanyDetails` | boolean | No | Also emit `company_about`, `company_website`, `company_active_jobs[]` snapshots per unique YC company. Deduplicated per company. Implies `includeJobDetails=true`. | `true` |
| `maxConcurrency` | integer | No | Concurrent company detail requests (1-10). Default 5. | `5` |

### Output fields

**Job core**

- `id`: Work at a Startup internal job ID.
- `title`: Role title.
- `role_type`: Role category from the listing (e.g. "Machine learning", "Frontend").
- `employment_type`: `full-time`, `part-time`, `contract`, `intern`, or raw string.
- `location`: Job location string as published.
- `remote_type`: `100%-remote`, `hybrid`, or `onsite`.

**YC / company**

- `company_name`, `company_slug`, `company_url`, `company_one_liner`, `company_logo_url`.
- `yc_batch`: Y Combinator batch (e.g. W25, S24, F26).
- `yc_top_company`: Whether the company holds YC's Top Companies designation.
- `industry`, `team_size`, `company_location`.

**Compensation**

- `salary_range`: `{min, max, currency}`, parsed from strings like `$124K - $188K CAD`.
- `salary_text`: Raw salary string.
- `equity_range`: `{min_pct, max_pct}`, percentage-based equity window.
- `equity_text`: Raw equity string.

**Requirements**

- `experience_years_min`, `experience_years_max`: Numeric years of experience parsed from strings like "5+ years" or "3-5 years".
- `sponsors_visa`: Boolean. True when the listing explicitly does not require existing US work status, false when it does, null when unknown.
- `sponsors_visa_text`: Raw sponsorship string.

**Signal / differentiation**

- `founder_replies_directly`: Work at a Startup surfaces a badge when a company's founders personally reply to applicants. Very useful signal for candidates.
- `tech_stack`: Tech tokens detected in the company's engineering description (React, TypeScript, Postgres, Kafka, PyTorch, Rust, LangChain, ...).
- `founders`: Array of `{name, bio, past_companies, linkedin, avatar_url}` for each founder.

**Descriptions**

- `hiring_description_html`, `hiring_description_text`: Company-level hiring pitch.
- `tech_description_html`, `tech_description_text`: Engineering description (roles that expose it).

**Links / metadata**

- `apply_url`: Direct apply link (routes through YC's account signup).
- `job_url`: Canonical job posting URL (`https://www.workatastartup.com/jobs/{id}`).
- `company_profile_url`: Company profile page (`https://www.workatastartup.com/companies/{slug}`).
- `source_url`: Legacy alias of `company_profile_url`, kept for back-compat.
- `source_platform`: Always `workatastartup`.
- `search_query`: Query that produced this hit.
- `scraped_at`: ISO timestamp of when this record was fetched.
- `posted_at`: Always `null`. Work at a Startup does not expose listing/posting dates in any public endpoint (SERP, company page, or job detail). Use `scraped_at` as a recency proxy.

**Employer profile (populated when `includeCompanyDetails=true`)**

- `company_about`: Company description text from the YC company page (aliases company\_one\_liner + hiring copy)
- `company_website`: Alias of `company_url`
- `company_phone`, `company_email`, `company_address_*`: Usually null. WAAS does not publish postal addresses or contact details.
- `company_active_jobs_count`: Number of other currently-open roles at the same YC company
- `company_active_jobs`: Snapshot of other open roles at this company (title, location, salary text)

Note: `founders[]` and `tech_stack[]` are already emitted at the top level for every row. We do not duplicate them under a `company_founders`/`company_tech_stack` prefix.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

`https://mcp.apify.com?tools=santamaria-automations/workatastartup-scraper`

**Example prompt once connected:**

> "Use `workatastartup-scraper` to find every YC W25 or S25 engineering role where the company sponsors visas and the founders reply directly. Return a table with title, company, batch, salary range."

Clients that support dynamic tool discovery (Claude.ai, VS Code) receive the full input schema automatically via `add-actor`.

### Why this actor

- YC-only signal. Every result is a company Y Combinator has funded, a much narrower and higher-quality slice than a generic job board.
- YC batch as a first-class field. Filter or segment by cohort (W25 vs S24) without regex.
- Rare fields other job scrapers miss: equity range, founder profiles (name, LinkedIn, past companies), founder-replies flag, YC top-company badge.
- Two-stage architecture: SERP scan finds jobs, company page enriches with rich detail. One request per unique company, not per job, so it stays cost-efficient.
- Failed detail fetches are not charged.

### Common use cases

- Recruiter agencies: Track newly-posted senior engineering roles at every W25/S25 company sponsoring visas for outbound candidates.
- Investors / analysts: Monitor hiring velocity per YC batch as a leading indicator of company growth.
- Job seekers: Build alerts filtered by `founder_replies_directly=true` and specific tech stack tokens.
- CRM enrichment: Enrich a list of YC portfolio companies with current job openings + founder LinkedIn profiles.
- Competitive intelligence: Track a competitor's YC-portfolio hiring signals week over week.

### Notes and limits

- Public Work at a Startup surfaces roughly 20-30 jobs per role bucket for unauthenticated visitors. Deeper filters (location, batch, remote type) require a logged-in YC account and are not accessible via this actor.
- Ten role buckets are supported: software-engineer, designer, product-manager, sales, marketing, operations, finance, legal, recruiting, science. Query keywords are mapped to buckets automatically.
- Salary parsing handles USD, CAD, GBP, EUR and common suffixes (K, M). If the salary string is missing, `salary_range` is null.
- The `founder_replies_directly` badge is only set when Work at a Startup emits the flag in their company payload. It is a signal-of-signal, not a guarantee.
- Tech stack detection scans the engineering description prose. Roles at non-engineering companies typically have empty `tech_stack`.

### Troubleshooting

**"No jobs found"**
The query keyword did not map to a known role bucket AND the default software-engineer bucket returned zero. Remove the `searchQueries` input entirely to fall through to the default bucket, or try one of: `engineer`, `designer`, `pm`, `growth`, `ops`, `finance`, `legal`, `recruiter`, `ml`, `sales`.

**"Company enrich failed"**
Occasionally Work at a Startup unpublishes a company or their /companies/{slug} endpoint returns 404 mid-run. The affected job is still emitted with SERP-level fields; only company-level enrichment is skipped for that record. You are not charged for the detail event when this happens.

**Equity or salary null on some jobs**
Not every YC company publishes compensation. When the source string is empty, the parsed range is null. `salary_text` will also be null in that case.

### Related Actors

- [Job Feed](https://apify.com/santamaria-automations/job-feed): one normalized, deduplicated job feed across 50+ international job boards. Orchestrates the NanoScrape fleet.
- [Career Site Jobs Scraper](https://apify.com/santamaria-automations/career-site-jobs-scraper): scrape jobs directly from company career pages (Greenhouse, Lever, Workday, etc.).
- [Website Job Extractor](https://apify.com/santamaria-automations/website-job-extractor): extract job listings from any website via HTML pattern detection.

### Support

Something broken, or a field you wish this actor returned? Email contact@nanoscrape.com or open a ticket on the actor's Issues tab. We usually respond within one working day.

# Actor input Schema

## `searchQueries` (type: `array`):

One or more role keywords. Each is mapped to a Work at a Startup role bucket ('engineer' -> software-engineer, 'designer' -> designer, 'pm' -> product-manager, 'growth' -> marketing, 'ml' -> science, etc). Unknown keywords default to software-engineer. Results are deduplicated by job ID across all queries.

## `startUrls` (type: `array`):

Direct Work at a Startup role URLs to crawl instead of building from keywords. Mutually exclusive with searchQueries — provide one or the other.

## `includeJobDetails` (type: `boolean`):

When enabled, each job's company page is fetched to add hiring description, tech stack, founder profiles, team size, industry, company website, salary range, equity range, visa sponsorship, and min experience. Adds one extra request per unique company.

## `includeCompanyDetails` (type: `boolean`):

Also fetch each unique employer's company profile page for the About-us text, phone, address, website, and a list of the employer's other currently-open roles. Deduplicated per employer within a run. Adds $0.005 per unique employer. Implies includeJobDetails=true (employer link only lives on the PDP).

## `maxResults` (type: `integer`):

Total cap on jobs emitted across all queries.

## `maxResultsPerQuery` (type: `integer`):

Cap per role bucket. Public Work at a Startup pages surface roughly 20-30 jobs per role. Default kept low so all queries get a chance to run within maxResults.

## `maxConcurrency` (type: `integer`):

Concurrent company detail-page requests (1 to 10). Work at a Startup is a small YC-controlled site — keep this polite.

## Actor input object example

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset of scraped Work at a Startup job listings.

# 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 = {
    "searchQueries": [
        "software engineer"
    ],
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/workatastartup-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 = {
    "searchQueries": ["software engineer"],
    "maxResults": 5,
    "maxResultsPerQuery": 5,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/workatastartup-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 '{
  "searchQueries": [
    "software engineer"
  ],
  "maxResults": 5,
  "maxResultsPerQuery": 5,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/workatastartup-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/workatastartup-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/IMU8rqFvGFM8J8018/builds/71oaHj15iflt4YdDJ/openapi.json
