# Built In Jobs Scraper - Tech Jobs, Salaries & Skills (`tgsneaks/builtin-jobs-scraper`) Actor

Scrape tech jobs from Built In (builtin.com) by category and remote policy: title, company, salary range, seniority, work type, locations, industries, top skills, summary and posting time. Optional full description, benefits and dates.

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

## Pricing

from $1.00 / 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.

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 Jobs, Salaries & Skills

Scrape **tech jobs from Built In** (builtin.com) by category and remote policy - with the details that make job data useful:

- 💰 **Salary range as numbers** (`salaryMin`, `salaryMax`, yearly or hourly)
- 🎯 **Seniority** (Entry, Junior, Mid, Senior, Expert/Leader, Internship)
- 🏠 **Work type** - Remote, Hybrid, In-Office (+ handy `isRemote` / `isHybrid` / `isOnsite` flags) and all locations
- 🛠️ **Top skills** per job (Python, SQL, AWS, React...)
- 🏭 Company **industries** (Fintech, Healthtech, AI...)
- 📝 Short summary, posting time, company name, logo and Built In page
- ➕ Optional: **full description, benefits, exact posting and expiry dates**, employment type

Fast: ~25 jobs per page in about a second.

### What you can use it for

- **Recruiting & sourcing** - companies hiring for a skill set, with pay up front
- **Salary benchmarking** - pay ranges by role, seniority and work type
- **Skills demand research** - which technologies employers ask for right now
- **B2B lead generation** - companies that are actively hiring are actively spending
- **Job boards, newsletters and Slack bots** - fresh tech jobs every day

### How to use it

Add one or more **Job listing pages**, one per line - a full URL or just the part after `/jobs/`:

| You type | What it scrapes |
|---|---|
| `remote/dev-engineering` | Remote software engineering jobs |
| `data-analytics` | Data & analytics jobs |
| `remote` | All remote jobs |
| `jobs` | All jobs |
| `https://builtin.com/jobs/hybrid/national/dev-engineering` | Any Built In listing page URL |

Then set **Pages per listing URL** (~25 jobs each), optionally **Max jobs** and **Posted within (days)**, and click **Start**.

> Built In's search (`?search=`) and some city / industry filter pages are disallowed by its robots.txt, so the Actor skips them and tells you in the log. Category and remote pages work, and you can filter the results by `skills`, `industries` or `locations` afterwards.

#### Input example

```json
{
    "startUrls": ["remote/dev-engineering", "data-analytics"],
    "maxPagesPerUrl": 5,
    "maxItems": 500,
    "postedWithinDays": 7,
    "includeJobDetails": false
}
```

### Output example

```json
{
    "jobId": "10921515",
    "title": "Software Engineer, Data Platform",
    "url": "https://builtin.com/job/senior-software-engineer-data-platform/10921515",
    "companyName": "Block",
    "companyUrl": "https://builtin.com/company/block-inc",
    "companyLogo": "https://cdn.builtin.com/.../4xlogo.png",
    "workType": "In-Office or Remote",
    "isRemote": true,
    "isHybrid": false,
    "isOnsite": true,
    "locations": ["Fremont, CA, USA", "Oakland, CA, USA", "San Francisco, CA, USA"],
    "salaryText": "153K-270K Annually",
    "salaryMin": 153000,
    "salaryMax": 270000,
    "salaryPeriod": "year",
    "salaryCurrency": null,
    "seniority": "Senior level",
    "industries": ["Fintech", "Payments", "Software", "Financial Services"],
    "skills": ["Apache Airflow", "AWS", "Databricks", "Python", "Snowflake", "Terraform"],
    "summary": "Build and operate Block's data platform, including warehousing, orchestration...",
    "postedText": "Reposted 5 Hours Ago",
    "postedAt": "2026-10-24",
    "validThrough": "2026-11-23T00:40:02+00:00",
    "employmentType": "FULL_TIME",
    "benefits": ["Offers 401(K)", "Provides 401(K) matching", "Offers disability insurance"],
    "description": "Block builds simple, powerful tools that make progress towards an economy that's truly open to all...",
    "searchUrl": "https://builtin.com/jobs/remote/dev-engineering",
    "scrapedAt": "2026-10-24T12:00:00+00:00"
}
```

`validThrough`, `employmentType`, `benefits` and `description` are filled when **Add full description, benefits and dates** is on (one extra request per job); `salaryCurrency` too, when the employer published a structured salary. Without it, `postedAt` is calculated from "Posted 5 hours ago".

### Cost

You pay per job returned (see the **Pricing** tab). Use **Max jobs** or a run spending limit to stay in control - the Actor stops cleanly when either is reached.

### Good to know

- The Actor reads Built In's robots.txt first and never requests a page it disallows.
- It identifies itself, waits between requests (2 s by default) and stops if Built In ever refuses access.
- Only public job listing information is collected - no login, no candidate or personal data.
- Jobs at companies whose industries or description indicate gambling, alcohol, adult content, dating or interest-based lending are not included.

### FAQ

**How fresh is the data?** Every run reads Built In live. Schedule it daily with *Posted within (days)* = 1 for a feed of new jobs.

**Why do some jobs have no salary?** The employer didn't publish one.

**Can I search by keyword?** Built In's search isn't allowed for bots by its robots.txt - use a category page and filter `title` or `skills` in the results.

**Something broke?** Open an issue on the Actor page - fixes are usually quick.

# Actor input Schema

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

One per line: a Built In job listing page URL (e.g. https://builtin.com/jobs/remote/dev-engineering) or just its path after /jobs/ (e.g. remote/dev-engineering, data-analytics, remote). 'jobs' means all jobs. Search URLs (?search=...) and pages that Built In's robots.txt disallows are skipped.

## `maxPagesPerUrl` (type: `integer`):

Each page has about 25 jobs.

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

Stop after this many jobs in total. Leave empty for no limit.

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

Keep only jobs posted or reposted in the last N days. Leave empty for all.

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

Opens each job's page to add the full description, benefits, exact posting / expiry dates, employment type and salary currency. Slower: one extra request per job.

## `requestDelayMs` (type: `integer`):

Pause between two requests to Built In. Higher is gentler on the site; the minimum is 1000 ms.

## Actor input object example

```json
{
  "startUrls": [
    "remote/dev-engineering"
  ],
  "maxPagesPerUrl": 3,
  "maxItems": 100,
  "includeJobDetails": false,
  "requestDelayMs": 2000
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [
        "remote/dev-engineering"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("tgsneaks/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 = {
    "startUrls": ["remote/dev-engineering"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("tgsneaks/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 '{
  "startUrls": [
    "remote/dev-engineering"
  ],
  "maxItems": 100
}' |
apify call tgsneaks/builtin-jobs-scraper --silent --output-dataset

```

## MCP server setup

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