# Built In Jobs, Past the 400-Page Ceiling (`gubidonius/builtin-jobs`) Actor

Job adverts from builtin.com with pay, level, workplace type, every location and the board's skill tags. The board serves no page after the 400th and never says how big a search is. This one reads the size from the paginator and cuts a big search into cells.

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

## Pricing

Pay per event

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

## Built In Jobs, Past the 400-Page Ceiling

Job adverts from builtin.com, the US tech job board that took in Built In Chicago, NYC,
Austin, Boston, Colorado, LA, Seattle and San Francisco. Search by keyword, category,
subcategory, workplace type, experience level, industry, company size, posting window,
skill tag, city or employer. No key and no login.

### What the board hides

The board serves 25 adverts a page and stops at page 400. Page 401 answers with the same
"No job results" block a search matching nothing shows, so a walk that stops on an empty
page reports 10,000 as the whole search. And the board publishes no total anywhere: the
only count is the paginator's last link.

This Actor never asks for the page that lies. It reads the size of a search from the
paginator, 25 times the pages before the last plus the cards on the last page, which is
exact under the ceiling. At the ceiling it publishes what it can prove instead: the
board's own skill facet, which on 11 September 2026 said 39,927 adverts carry Python
while the paginator stopped at 400 pages. Every row carries `searchTotal` when it is
known and `searchAtLeast` always.

A row budget up to 10,000 walks the search in the board's own order, so you get what a
visitor would have seen first. A bigger budget cuts the search into cells on category,
then experience level, workplace type, company size and industry, and deduplicates on
the advert id across cells. `matchedCell` on every row says which cell it came from, and
`RUN_SUMMARY` lists every cell with what it reported, what was fetched and why it
stopped.

### What a row is

One advert, keyed by `jobId`. An advert open in three cities is one row with all three
in `locations`, read from the card's tooltip rather than the "3 Locations" label. Pay is
kept as the board prints it in `salaryLabel` and split into `salaryMin`, `salaryMax` and
`salaryPeriod`, with the period read from the label's own word, because internships are
quoted hourly and everything else per year.

The full advert text, the posting date, the employer's benefits and the apply link are on
the advert page, which is the sibling Actor builtin-job-details.

### Billing

Two events: a start fee charged only once a row is returned, and a per-row fee charged
after each row is written. A search that matches nothing, or a filter value the board
does not have, costs nothing.

# Actor input Schema

## `search` (type: `string`):

Job title, company or keyword, as you would type it into the board. Leave it empty to walk the whole board under the filters below.

## `categories` (type: `array`):

One of the board's 16 categories, by name or URL alias: Engineering, Data & Analytics, AI & Machine Learning, Product Management, Sales, Marketing and so on. The board filters on ONE category at a time, so only the first is applied and the rest are named in RUN\_SUMMARY. A name the board does not have is reported with the nearest real names rather than guessed.

## `subcategories` (type: `array`):

Subcategories under the category above, for example Back End Developer, Data Engineer, Machine Learning Engineer. A subcategory only filters under its own category, so the category is added for you when you name a subcategory alone.

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

Remote, Hybrid, In-Office. Several at once are allowed.

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

Internship, Entry level, Junior, Mid level, Senior, Expert/Leader, Not specified. Several at once are allowed.

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

The employer's industry, from the board's list of 103, for example Fintech, Healthtech, Aerospace. A company carries several, so an industry cut is a cover rather than a partition and the run deduplicates on the advert id.

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

1-10, 11-50, 51-200, 201-500, 501-1000, 1000+ employees.

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

Only adverts posted or reposted in the last 1, 3, 7 or 30 days, which are the only windows the board has. 0 means no date filter.

## `skills` (type: `array`):

Skill tags as the board spells them, for example Python, AWS, Kubernetes. The board applies a skill filter only alongside a search term or a category.

## `city` (type: `string`):

A city as the board writes it, for example Austin. Pair it with state and country.

## `state` (type: `string`):

The state written out, for example Texas.

## `country` (type: `string`):

Three-letter code, USA by default. The board is US-first and answers a national search when no city is given.

## `searchRadiusMiles` (type: `integer`):

Around the city: 5, 10, 25, 50 or 100. 0 leaves the board's own default.

## `allLocations` (type: `boolean`):

Every country the board lists, not only the one above. Rows then carry places like Bengaluru, KA, IND beside Austin, TX, USA.

## `companyId` (type: `integer`):

Only this employer's adverts. The number is the companyId column of builtin-companies or builtin-company-details. 0 means every employer.

## `earlyApplicantOnly` (type: `boolean`):

Only adverts the board marks Be an Early Applicant.

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

Most adverts to return, and the most you will be charged for. Up to 10,000 the board is walked in its own order. Past 10,000 the search is cut into cells on category, experience, workplace, company size and industry, because the board serves no page after the 400th.

## Actor input object example

```json
{
  "search": "data engineer",
  "categories": [],
  "subcategories": [],
  "workplaceTypes": [],
  "experienceLevels": [],
  "industries": [],
  "companySizes": [],
  "postedWithinDays": 0,
  "skills": [],
  "city": "",
  "state": "",
  "country": "USA",
  "searchRadiusMiles": 0,
  "allLocations": false,
  "companyId": 0,
  "earlyApplicantOnly": false,
  "maxResults": 100
}
```

# 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 = {
    "search": "data engineer",
    "categories": [],
    "subcategories": [],
    "workplaceTypes": [],
    "experienceLevels": [],
    "industries": [],
    "companySizes": [],
    "postedWithinDays": 0,
    "skills": [],
    "city": "",
    "state": "",
    "country": "USA",
    "searchRadiusMiles": 0,
    "allLocations": false,
    "companyId": 0,
    "earlyApplicantOnly": false,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/builtin-jobs").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 = {
    "search": "data engineer",
    "categories": [],
    "subcategories": [],
    "workplaceTypes": [],
    "experienceLevels": [],
    "industries": [],
    "companySizes": [],
    "postedWithinDays": 0,
    "skills": [],
    "city": "",
    "state": "",
    "country": "USA",
    "searchRadiusMiles": 0,
    "allLocations": False,
    "companyId": 0,
    "earlyApplicantOnly": False,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/builtin-jobs").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 '{
  "search": "data engineer",
  "categories": [],
  "subcategories": [],
  "workplaceTypes": [],
  "experienceLevels": [],
  "industries": [],
  "companySizes": [],
  "postedWithinDays": 0,
  "skills": [],
  "city": "",
  "state": "",
  "country": "USA",
  "searchRadiusMiles": 0,
  "allLocations": false,
  "companyId": 0,
  "earlyApplicantOnly": false,
  "maxResults": 100
}' |
apify call gubidonius/builtin-jobs --silent --output-dataset

```

## MCP server setup

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

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/DPJPU1YUk0FFcKaas/builds/Hn7YOSyAf4AsIKVGB/openapi.json
