# Built In Jobs Scraper - Tech & Startup Jobs with Salary (`scrapewise/builtin-jobs-scraper`) Actor

Scrape Built In (builtin.com) tech and startup jobs by keyword, location, remote, category, seniority, industry and company size: title, company, salary range, skills, posted date, benefits and full description. Schedule it with onlyNew for daily alerts. Error rows are free.

- **URL**: https://apify.com/scrapewise/builtin-jobs-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Jobs, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 job delivereds

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

## Built In Jobs Scraper: tech and startup jobs with salary, skills and full description

Built In Jobs Scraper collects **jobs from Built In (builtin.com)**, the job board for tech companies and startups in
the US and beyond. You search by keyword, location and the site's own filters, and each job comes back as one clean
row: title, company with its Built In profile and logo, location (every office of the job), remote, hybrid or on
site, experience level, salary range, industries, top skills, a short summary, when it was posted, and, by default,
the **full description, exact salary with currency, employment type, posting and expiry dates, geo coordinates of
each location and the company's benefits** from the job page.

No account or cookies needed. It is used to:

- build job boards, newsletters and job alert bots for tech roles (remote data jobs, senior React in New York...);
- research salaries and skills in demand by role, city, industry or company size;
- find startups and tech companies that are hiring right now, with their size and industry, for sales and recruiting.

### At a glance

| What | Price |
|---|---|
| Job delivered | **US$ 1.00 per 1,000 jobs** (US$ 0.001 each) on the Free plan, lower on paid plans |
| Run start | US$ 0.005 per run |

- 500 jobs with full descriptions = **about US$ 0.51** on the Free plan.
- Paid Apify plans get a lower price per job automatically (Bronze US$ 0.95, Silver US$ 0.90, Gold and above
  US$ 0.85 per 1,000).
- The job page details are included in the job price; there is no extra event for them.
- Error rows, duplicates and jobs already delivered in earlier runs (`onlyNew`) are never charged. `maxItems` is a
  hard cap, and a spending limit set on the run stops it cleanly with everything delivered so far.

### Quick start

```json
{
  "searchQueries": ["data engineer"],
  "location": "United States",
  "maxItems": 50
}
```

Fully remote senior Python jobs posted in the last week, in two cities:

```json
{
  "searchQueries": ["python"],
  "location": "Austin, TX; New York, NY",
  "workplaceTypes": ["remote"],
  "experienceLevels": ["senior"],
  "postedWithinDays": 7,
  "maxItems": 200
}
```

A whole category in fintech startups of 51 to 200 people, card fields only (faster):

```json
{
  "category": "data-analytics",
  "industries": ["Fintech"],
  "companySizes": ["51-200"],
  "includeDescription": false,
  "maxItems": 300
}
```

Any search of the site: set the filters on builtin.com/jobs in your browser, copy the link from the address bar and
paste it in `startUrls`.

Daily alert: schedule the run once a day with `"onlyNew": true` and only jobs you have not received before come back.

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Job titles, skills or keywords, one per line. Each keyword is one search. |
| `location` | Country, state or city in English (`United States`, `California`, `Austin, TX`, `London`). Several: separate with a semicolon. Empty = United States. |
| `workplaceTypes` | `remote`, `hybrid`, `office`. Empty = all. |
| `category` | One Built In category: `engineering`, `data-analytics`, `ai-machine-learning`, `product-management`, `designer`, `marketing`, `sales`, `cyber-security`, `finance`, `hr-recruiting`, `legal`, `operations-support`, `consultant`, `customer-success-experience`, `program-project-management`, `supply-chain-procurement`. |
| `experienceLevels` | `internship`, `entry-level`, `junior`, `mid-level`, `senior`, `expert-leader`, `not-specified`. |
| `industries` | Built In industry names, for example `Fintech`, `Artificial Intelligence`, `Healthtech`. |
| `companySizes` | `1-10`, `11-50`, `51-200`, `201-500`, `501-1000`, `1000` (1000+ employees). |
| `postedWithinDays` | 1, 3, 7 or 30 (other numbers round up). Empty = any date. |
| `startUrls` | Built In search links copied from the browser. |
| `includeDescription` | Job page details (default on). Off = faster, card fields only. |
| `maxItems` | Cap for the whole run, across all searches (default 50; 0 = no cap). |
| `onlyNew` | Deliver only jobs not delivered in earlier runs of the same search (for schedules). |
| `proxyConfiguration` | Apify Proxy by default. |

Inputs written for other job tools keep working: `searchQuery`, `query`, `keyword`, `keywords`, `maxResults`,
`limit`, `remote: true`, `remoteOnly`, `seniority`, `experienceLevel`, `companySize`, `industry`, `datePosted`,
`daysSinceUpdated`, `onlyNewJobs` and `urls` are read too.

### Output

Each job is one row with `type: "job"`:

| Field | What it is |
|---|---|
| `jobId`, `url` | Built In job id and the job page |
| `title` | Job title |
| `companyName`, `companyUrl`, `companyLogo` | Employer, its Built In profile and logo |
| `location`, `locations` | Location line and every location of the job (multi-location jobs list all of them) |
| `workplaceType`, `isRemote` | Remote, Hybrid, In-Office, or combinations such as "Remote or Hybrid" |
| `seniorityLevel` | Experience level shown by Built In (Entry level, Junior, Mid level, Senior level...) |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryText` | Pay range as numbers, its currency and period, and the original text |
| `industries`, `skills`, `summary` | Company industries, top skills of the job, short summary |
| `isEasyApply` | Built In Easy Apply job |
| `postedLabel`, `postedAt`, `datePosted`, `validThrough` | "2 Days Ago" as shown, posting date (exact from the job page), expiry date |
| `employmentType`, `jobLocationType` | FULL_TIME, PART_TIME, CONTRACTOR...; TELECOMMUTE for remote jobs |
| `jobLocations` | City, region, country and latitude/longitude of each location |
| `applicantLocationRequirements` | Countries a remote job accepts candidates from |
| `companyBenefits` | Benefits and perks the company lists on Built In |
| `description`, `descriptionHtml` | Full description as plain text and as HTML |
| `sourceQuery`, `scrapedAt` | The search that found the job, and when it was collected |

With `includeDescription` off, the job page fields (`description`, `datePosted`, `validThrough`, `employmentType`,
`jobLocations`, `companyBenefits`...) are empty and the run is about five times faster.

One real row from 16 Oct 2026 (lists and description shortened):

```json
{
  "type": "job",
  "jobId": "11704721",
  "title": "Data Engineer 5",
  "companyName": "Capital One",
  "companyUrl": "https://builtin.com/company/capital-one",
  "location": "Chicago, IL, USA",
  "workplaceType": "Hybrid",
  "seniorityLevel": "Senior level",
  "salaryMin": 209000,
  "salaryMax": 238500,
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly",
  "industries": ["Fintech", "Machine Learning", "Payments"],
  "skills": ["Airflow", "AWS", "Databricks", "Python", "Snowflake", "Spark", "SQL"],
  "postedAt": "2026-10-15",
  "validThrough": "2026-11-14T18:24:05+00:00",
  "employmentType": ["FULL_TIME"],
  "jobLocations": [{"city": "Chicago", "region": "Illinois", "country": "USA", "latitude": 41.883229, "longitude": -87.632398}],
  "applicantLocationRequirements": ["USA"],
  "url": "https://builtin.com/job/data-engineer-5/11704721"
}
```

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_INPUT` | A field has a wrong value (for example an experience level the site does not have) |
| `INVALID_URL` | A link in `startUrls` is not a builtin.com/jobs search link |
| `LOCATION_NOT_FOUND` | Built In does not know that location; try `City, ST` or the country name in English |
| `NO_RESULTS` | The search and filters match no job |
| `BLOCKED` | Built In refused every attempt for this search; run it again in a few minutes |
| `UNEXPECTED` | Something else stopped the run; the message says what |

### Integrations, scheduling and AI agents

- **Schedule** a daily run with `onlyNew` in [Apify schedules](https://docs.apify.com/platform/schedules) to get
  only fresh jobs every morning.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier, Slack or Google Sheets through
  [Apify integrations](https://docs.apify.com/platform/integrations) to post new jobs to a channel or a sheet.
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "list remote senior data jobs at fintech startups posted
  this week, with the salary range".

### FAQ

**Do I need a Built In account?** No. Everything comes from public search and job pages, without login.

**Why is there no external apply link?** Built In shows the employer's apply link only after a visitor signs up with
name and email, so the Actor gives the Built In job page (`url`), where the Apply button is.

**Why is the salary empty on some jobs?** The employer did not publish it. Most US jobs on Built In have a range.

**How many jobs can one search return?** Built In shows up to about 125 pages per search; the Actor reads them until
the end or your `maxItems`. For more, split the search by location, category or experience level.

**How does `onlyNew` work?** The Actor keeps the ids of the jobs it delivered for each search (same keyword and
filters) in a key-value store in your account. Jobs seen before are skipped and not charged.

**Is it legal?** The Actor reads public job postings only. Emails and phone numbers inside descriptions are replaced
by `[contact removed]`. You are responsible for how you use the data under the laws that apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- One category per search (as on the site); run one search per category for several.
- `postedAt` from the card is approximate ("2 Days Ago"); with `includeDescription` on it is the exact date.
- Built In's regional sites show the same jobs as builtin.com; use `location` to narrow by city.

### Changelog

- **16 Oct 2026:** first version: keyword, location and filter search, search links, salary as numbers, skills,
  industries, full description and job page details, `onlyNew` for schedules.

# Actor input Schema

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

Job titles, skills or keywords, one per line, for example data engineer or product manager. Each keyword is one search.

## `location` (type: `string`):

Country, state or city in English, for example United States, California, Austin, TX or London. Several: separate with a semicolon (New York, NY; Chicago, IL). Empty = United States.

## `workplaceTypes` (type: `array`):

Keep only these workplace types. Empty = all.

## `category` (type: `string`):

One Built In job category. Works with or without a keyword. Empty = all categories.

## `experienceLevels` (type: `array`):

Keep only these experience levels. Empty = all.

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

Built In industry names, for example Fintech, Artificial Intelligence or Healthtech. Empty = all industries.

## `companySizes` (type: `array`):

Keep only companies of these sizes (employees). Empty = all.

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

Only jobs posted or updated in the last 1, 3, 7 or 30 days (other numbers round up). Empty = any date.

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

Optional: Built In search links copied from the address bar after setting filters on the site, for example https://builtin.com/jobs/remote/data-analytics?search=python. Each link is one search.

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

On: opens each job page for the full description, exact salary, employment type, posted and expiry dates, locations and benefits. Off: faster, card fields only.

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

Hard cap for the whole run, across all searches. 0 = no cap.

## `onlyNew` (type: `boolean`):

On: remembers the jobs delivered in earlier runs of the same search (in your account) and delivers only jobs not seen before. Skipped jobs are free.

## `proxyConfiguration` (type: `object`):

Apify Proxy by default. Change it only if you know you need to.

## Actor input object example

```json
{
  "searchQueries": [
    "data engineer"
  ],
  "location": "United States",
  "includeDescription": true,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (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 = {
    "searchQueries": [
        "data engineer"
    ],
    "location": "United States",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/builtin-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 = {
    "searchQueries": ["data engineer"],
    "location": "United States",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/builtin-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 '{
  "searchQueries": [
    "data engineer"
  ],
  "location": "United States",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/builtin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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