# Built In Jobs Scraper (`automation-lab/builtin-jobs-scraper`) Actor

Extract tech job listings from builtin.com including salary ranges, company details, GPS location, benefits packages, and full job descriptions.

- **URL**: https://apify.com/automation-lab/builtin-jobs-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, NaN 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Scraper

Extract thousands of tech job listings from [Built In](https://builtin.com/jobs) — including salary ranges, company details, location data, required experience, benefits packages, and full job descriptions — without writing a single line of code.

### What Does Built In Jobs Scraper Do?

Built In Jobs Scraper crawls [builtin.com/jobs](https://builtin.com/jobs) and extracts structured data from every job listing. For each position it retrieves:

- 🏢 **Company information** — name, profile URL, logo URL
- 💼 **Job basics** — title, employment type, direct-apply flag
- 📍 **Location** — city, state, country, GPS coordinates (lat/lng)
- 💰 **Salary** — min/max range, currency, period (hourly/annual/monthly)
- 🗓️ **Dates** — date posted, valid-through expiry
- 🏭 **Industries** — all tags assigned by Built In (e.g. Software, SaaS, FinTech)
- 🎁 **Benefits** — full list (401K, equity, dental, parental leave, etc.)
- 🎓 **Requirements** — months of experience, education level required
- 📝 **Description** — full plain-text job description (optional)

The scraper uses structured data (Schema.org `JobPosting` JSON-LD) embedded in each listing page, so the output is consistently typed and requires no brittle HTML parsing.

### Who Is It For?

#### 👩‍💼 Recruiters & Talent Sourcers
Monitor which companies are actively hiring for specific roles. Identify salary benchmarks by role and location. Build candidate outreach lists based on company size and industry.

#### 📊 HR & Compensation Analysts
Pull salary data across hundreds of tech roles in minutes. Compare compensation by employment type, experience level, or geography. Track salary inflation trends over time with scheduled runs.

#### 🚀 Job Seekers & Career Coaches
Aggregate listings from multiple search queries into a single spreadsheet. Filter by direct-apply, salary range, or required experience. Export to Airtable or Google Sheets for organised job hunting.

#### 🤖 Data Scientists & Researchers
Build training datasets for NLP models (job description classification, salary prediction). Research tech hiring trends by industry, city, or technology stack.

#### 🏢 Sales & GTM Teams
Identify companies that are scaling their engineering teams as a signal for SaaS outreach. Enrich prospect lists with real-time headcount-growth signals.

### Why Use This Scraper?

- **Schema.org data** — uses structured `JobPosting` JSON-LD for typed, reliable fields
- **No browser required** — fast HTTP-only extraction (no Playwright overhead)
- **Salary coverage** — extracts min/max salary ranges where available
- **Benefit lists** — 20-50 benefits per listing, individually parsed
- **GPS coordinates** — latitude/longitude for mapping or geocoding workflows
- **Paginated search** — automatically crawls all pages for a search query

### What Data Can You Extract?

| Field | Type | Example |
|---|---|---|
| `id` | string | `"4457551"` |
| `url` | string | `"https://builtin.com/job/software-engineer/4457551"` |
| `title` | string | `"Software Engineer"` |
| `companyName` | string | `"Oso"` |
| `companyUrl` | string | `"https://builtin.com/company/oso"` |
| `companyLogoUrl` | string | `"https://builtin.com/sites/..."` |
| `location` | string | `"New York, New York"` |
| `city` | string | `"New York"` |
| `state` | string | `"New York"` |
| `country` | string | `"USA"` |
| `latitude` | number | `40.7130466` |
| `longitude` | number | `-74.0072301` |
| `datePosted` | string | `"2026-05-05"` |
| `validThrough` | string | `"2026-06-04T00:04:37+00:00"` |
| `employmentType` | string | `"FULL_TIME"` |
| `salaryMin` | number | `100000` |
| `salaryMax` | number | `275000` |
| `salaryCurrency` | string | `"USD"` |
| `salaryPeriod` | string | `"YEAR"` |
| `industries` | array | `["Security","Software","IaaS"]` |
| `benefits` | array | `["401(K)","Company equity","Dental insurance",...]` |
| `directApply` | boolean | `false` |
| `experienceMonths` | number | `108` (= 9 years) |
| `educationLevel` | string | `"Bachelor Degree"` |
| `description` | string | Full plain-text job description |

### How Much Does It Cost to Scrape Built In Jobs?

Built In Jobs Scraper uses **pay-per-result** pricing — you only pay for jobs actually extracted. There is no charge for empty runs or failed requests.

#### Pricing tiers

| Tier | Cost per job |
|---|---|
| Free (first 20 results/month) | $0.0023 |
| Bronze (pay-as-you-go) | $0.002 |
| Silver | $0.00156 |
| Gold | $0.0012 |
| Platinum | $0.0008 |
| Diamond | $0.00056 |

#### Example costs

| Scenario | Jobs | Estimated cost |
|---|---|---|
| Quick market research | 50 | ~$0.10 |
| Weekly job feed | 500 | ~$1.00 |
| Bulk salary analysis | 2,000 | ~$4.00 |
| Full index snapshot | 10,000 | ~$20.00 |

> **Free plan estimate:** Apify's $49/mo plan includes ~$5 in compute credits, enough for approximately 2,500 job listings per month at the Bronze rate.

### How to Scrape Built In Jobs — Step by Step

1. **Open the actor** on the Apify platform and click **Try for free**.
2. **Set a Start URL** — paste any Built In jobs page URL (e.g. `https://builtin.com/jobs?search=machine+learning`). Leave it as the default `https://builtin.com/jobs` to scrape all recent postings.
3. *(Optional)* **Enter Keywords** — type a job title or skill keyword if you prefer not to construct the URL manually.
4. **Set Max Jobs** — enter how many listings you want (e.g. `200`).
5. **Toggle Include Description** — enable to get the full job description text.
6. **Click Start** — the scraper runs and populates your dataset in real time.
7. **Export** — download results as JSON, CSV, Excel, or connect to Zapier / Make.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `[{"url":"https://builtin.com/jobs"}]` | Built In jobs page URLs to crawl with automatic pagination |
| `keywords` | string | — | Job title keyword search (used when Start URLs is empty) |
| `maxJobs` | integer | `100` | Maximum number of job listings to extract |
| `includeDescription` | boolean | `true` | Include full plain-text job description in output |
| `maxRequestRetries` | integer | `3` | Retry limit for failed HTTP requests |

#### Supported start URL formats

````

https://builtin.com/jobs                          All jobs
https://builtin.com/jobs?search=data+scientist    Keyword search
https://builtin.com/remote-jobs                   Remote only
https://builtin.com/jobs/chicago                  City filter
https://builtin.com/jobs/san-francisco            City filter

````

### Output Example

```json
{
  "id": "4457551",
  "url": "https://builtin.com/job/software-engineer/4457551",
  "title": "Software Engineer",
  "companyName": "Oso",
  "companyUrl": "https://builtin.com/company/oso",
  "companyLogoUrl": "https://builtin.com/sites/www.builtin.com/files/2024-12/Oso.jpeg",
  "location": "New York, New York",
  "city": "New York",
  "state": "New York",
  "country": "USA",
  "latitude": 40.7130466,
  "longitude": -74.0072301,
  "datePosted": "2026-05-05",
  "validThrough": "2026-06-04T00:04:37+00:00",
  "employmentType": "FULL_TIME",
  "salaryMin": 100000,
  "salaryMax": 275000,
  "salaryCurrency": "USD",
  "salaryPeriod": "YEAR",
  "industries": ["Security", "Software", "Infrastructure as a Service (IaaS)"],
  "benefits": ["401(K)", "Company equity", "Dental insurance", "Health insurance", "Unlimited vacation policy"],
  "directApply": false,
  "experienceMonths": 108,
  "educationLevel": "Bachelor Degree",
  "description": "Old problem, new $25B+ market\n\nCompanies like AWS, Stripe, and Twilio..."
}
````

### Tips & Best Practices

- 🔍 **Use specific search URLs** for targeted scraping — `builtin.com/jobs?search=react+developer` returns more relevant results than scraping all jobs and filtering afterward.
- 📅 **Schedule weekly runs** to maintain a fresh jobs feed — Built In listings expire after ~30 days so weekly is sufficient for most use cases.
- 💡 **Disable descriptions** when you only need job metadata — set `includeDescription: false` to halve response sizes and speed up large runs.
- 🗺️ **Use GPS coordinates** for geospatial analysis — the lat/lng fields are directly usable in mapping tools like Mapbox, Google Maps, or Tableau.
- 📊 **Filter by `salaryMin`** in downstream tools — not all jobs list salary, but those that do are the most useful for compensation benchmarking.
- 🔄 **Combine multiple start URLs** — add `builtin.com/jobs?search=backend` and `builtin.com/jobs?search=frontend` as separate start URLs in one run to collect both in parallel.
- ⚡ **Use `maxJobs`** to cap spend on exploratory runs — start with 20-50 jobs to validate your search URL before scaling to thousands.

### Integrations

#### 📊 Export to Google Sheets for salary tracking

Use Apify's [Google Sheets integration](https://apify.com/apify/google-sheets) to push job data directly into a spreadsheet. Set up a scheduled run every Monday and your salary tracker auto-updates with the latest listings.

#### 🔔 Slack alerts for new jobs at target companies

Combine with Apify's [webhook notifications](https://docs.apify.com/platform/integrations/webhooks) to receive a Slack message whenever a new job appears from a company on your watchlist.

#### 🔗 Enrich LinkedIn Sales Navigator leads

Export companies from job listings → import into LinkedIn Sales Navigator → reach hiring managers the week they posted a role.

#### 🗂️ Airtable recruiting database

Connect via Zapier: new job → filter by salary ≥ $X and required skills → create Airtable record. Build your own ATS with zero coding.

#### 📧 Email digest with Make (formerly Integromat)

Trigger a Make scenario on run completion → filter jobs by your criteria → send a formatted daily email with the best matches.

### API Usage

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('automation-lab/builtin-jobs-scraper').call({
    startUrls: [{ url: 'https://builtin.com/jobs?search=software+engineer' }],
    maxJobs: 100,
    includeDescription: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} jobs`);
items.forEach(job => {
    console.log(`${job.title} @ ${job.companyName} — ${job.location}`);
    if (job.salaryMin) console.log(`  Salary: $${job.salaryMin}–$${job.salaryMax} ${job.salaryPeriod}`);
});
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("automation-lab/builtin-jobs-scraper").call(
    run_input={
        "startUrls": [{"url": "https://builtin.com/jobs?search=data+scientist"}],
        "maxJobs": 200,
        "includeDescription": False,
    }
)

dataset_items = client.dataset(run["defaultDatasetId"]).list_items().items
for job in dataset_items:
    salary = f"${job.get('salaryMin')}–${job.get('salaryMax')} {job.get('salaryPeriod')}" \
             if job.get('salaryMin') else "Not listed"
    print(f"{job['title']} @ {job['companyName']} | {job['location']} | {salary}")
```

#### cURL

```bash
## Start the scraper
curl -X POST "https://api.apify.com/v2/acts/automation-lab~builtin-jobs-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://builtin.com/jobs?search=backend+engineer"}],
    "maxJobs": 50,
    "includeDescription": true
  }'

## Get results (replace RUN_ID with the ID from the response above)
curl "https://api.apify.com/v2/datasets/RUN_ID/items?token=YOUR_API_TOKEN&format=json"
```

### Use With Claude and Other AI Assistants (MCP)

Built In Jobs Scraper is available as an **MCP (Model Context Protocol) tool**, letting AI assistants like Claude run the scraper and analyse results in one conversation.

#### Claude Code (terminal)

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/builtin-jobs-scraper"
```

#### Claude Desktop / Cursor / VS Code

Add to your MCP config (`claude_desktop_config.json` or `.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=automation-lab/builtin-jobs-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

#### Example Claude prompts

> "Scrape 200 software engineer jobs from Built In and find the top 10 companies hiring the most. Show their average salary ranges."

> "Pull 100 remote Python jobs from builtin.com, then list all unique benefits offered and rank them by frequency."

> "Get all product manager roles posted in the last week on Built In and create a comparison table sorted by salary."

### Legality — Is Scraping Built In Legal?

Built In's publicly accessible job listings contain data that companies have intentionally published for public viewing. Scraping publicly available job data for personal research, market analysis, and non-commercial purposes is generally considered lawful in most jurisdictions.

The built-in.com robots.txt permits crawling of job listing pages. This scraper:

- Does not require login or bypass any access controls
- Respects rate limits with automatic delays between requests
- Only collects data that is publicly visible to any visitor

**You are responsible for ensuring your use of the extracted data complies with applicable laws, Built In's Terms of Service, and data privacy regulations (GDPR, CCPA) in your jurisdiction.** Do not use extracted personal data (such as contact information) for unsolicited outreach.

### FAQ — Frequently Asked Questions

**How many jobs can I scrape in one run?**
There is no hard limit. The scraper handles pagination automatically. Practically, builtin.com has ~10,000–50,000 active listings at any time. For very large runs (>5,000 jobs), consider splitting by search query to manage memory and cost.

**Does it scrape all cities or just one?**
The default `builtin.com/jobs` URL covers all cities. Use city-specific URLs like `builtin.com/jobs/chicago` or `builtin.com/jobs/new-york` to restrict to a single metro area.

**Why are some salary fields null?**
Not all companies list salary ranges. Built In encourages it but doesn't require it. Roughly 40–60% of listings include salary data.

**Can I filter by remote, hybrid, or on-site?**
Yes — construct a filtered URL on Built In's website (use the "Remote" dropdown), then copy that URL as your start URL. The scraper will respect the filter.

**The scraper returned fewer jobs than expected — why?**
Built In paginates results at 24–25 per page. If your `maxJobs` is less than the total matching results, the scraper stops early (by design). Also, some listing pages may lack JSON-LD data and are skipped with a warning in the log.

**I'm getting 403 errors on some pages. How do I fix it?**
Built In occasionally rate-limits high-frequency requests. Reduce the run frequency or lower `maxJobs`. The scraper uses automatic retries (`maxRequestRetries`), which resolves transient blocks automatically.

### Related Scrapers

Looking for job data from other platforms?

- [Glassdoor Jobs Scraper](https://apify.com/automation-lab/glassdoor-jobs-scraper) — salary reviews + job listings from Glassdoor
- [LinkedIn Jobs Scraper](https://apify.com/automation-lab/linkedin-jobs-scraper) — LinkedIn job postings with company details
- [Indeed Jobs Scraper](https://apify.com/automation-lab/indeed-jobs-scraper) — Indeed listings with apply links
- [Wellfound Scraper](https://apify.com/automation-lab/wellfound-scraper) — AngelList/Wellfound startup jobs

***

Built by [Automation Lab](https://apify.com/automation-lab) — your source for reliable, well-maintained data extraction tools.

# Actor input Schema

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

Built In jobs page URLs to scrape (e.g. <code>https://builtin.com/jobs</code>, <code>https://builtin.com/jobs?search=engineer</code>). Leave empty to use the Keywords field instead.

## `keywords` (type: `string`):

Job title keyword to search for (e.g. <code>software engineer</code>, <code>product manager</code>). Used only when Start URLs is empty.

## `maxJobs` (type: `integer`):

Maximum number of job listings to extract.

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

Whether to include the full plain-text job description in output. Adds detail but increases run time.

## `maxRequestRetries` (type: `integer`):

Number of retry attempts for failed requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://builtin.com/jobs"
    }
  ],
  "maxJobs": 20,
  "includeDescription": true,
  "maxRequestRetries": 3
}
```

# Actor output Schema

## `overview` (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": [
        {
            "url": "https://builtin.com/jobs"
        }
    ],
    "keywords": "",
    "maxJobs": 20,
    "maxRequestRetries": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/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": [{ "url": "https://builtin.com/jobs" }],
    "keywords": "",
    "maxJobs": 20,
    "maxRequestRetries": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/builtin-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    {
      "url": "https://builtin.com/jobs"
    }
  ],
  "keywords": "",
  "maxJobs": 20,
  "maxRequestRetries": 3
}' |
apify call automation-lab/builtin-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/builtin-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Built In Jobs Scraper",
        "description": "Extract tech job listings from builtin.com including salary ranges, company details, GPS location, benefits packages, and full job descriptions.",
        "version": "0.1",
        "x-build-id": "OP55pJj3dxhFxwQpv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~builtin-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-builtin-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~builtin-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-builtin-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~builtin-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-builtin-jobs-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "🔗 Start URLs",
                        "type": "array",
                        "description": "Built In jobs page URLs to scrape (e.g. <code>https://builtin.com/jobs</code>, <code>https://builtin.com/jobs?search=engineer</code>). Leave empty to use the Keywords field instead.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "keywords": {
                        "title": "🔑 Keywords",
                        "type": "string",
                        "description": "Job title keyword to search for (e.g. <code>software engineer</code>, <code>product manager</code>). Used only when Start URLs is empty."
                    },
                    "maxJobs": {
                        "title": "📊 Max jobs",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of job listings to extract.",
                        "default": 100
                    },
                    "includeDescription": {
                        "title": "📝 Include job description",
                        "type": "boolean",
                        "description": "Whether to include the full plain-text job description in output. Adds detail but increases run time.",
                        "default": true
                    },
                    "maxRequestRetries": {
                        "title": "🔄 Max retries",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of retry attempts for failed requests.",
                        "default": 3
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
