Built In Jobs Scraper
Pricing
from $0.84 / 1,000 results
Go to Apify Store
Built In Jobs Scraper
Tech jobs from Built In: title, company, location, salary range, employment type, industries, benefits and the full description. Browse by category, city or remote, or search by keyword. A category Built In does not recognise is reported, not quietly replaced.
Pricing
from $0.84 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Tech jobs from Built In — title, company, location, salary range, employment type, industries, benefits and the full description.
Why use this actor
- Complete rows, not just links. Built In's listing pages publish only four things per job: title, link, position and a one-line summary. No company, no location, no salary, no date. This actor reads each job's own page to fill all of that in, and does it by default.
- Salary ranges as numbers, with currency and period — not a string you have to parse.
- Per-job benefits lists. 401(k) matching, parental leave, fertility benefits, mental-health cover and the rest, as a structured list. Very few job boards publish this.
- A typo can't hand you the wrong jobs. Ask Built In for a category it does
not recognise and it returns ten perfectly real, completely unrelated jobs
with a
200 OK— no error, no redirect. This actor spots that and returns an error row instead of the wrong data. - Nothing depends on page markup. Every field comes from the structured data Built In publishes for search engines, so a site redesign does not silently empty your dataset.
- No account, no login, no API key.
How it works
- You pick categories (
dev-engineering,remote,san-francisco), keywords, or nothing at all for the full listing. - The actor reads the listing pages, collecting job links and deduplicating.
- It then reads each job's own page for the employer, salary, location, date, benefits and full description.
- Results land in your dataset as JSON, CSV or Excel, with one summary row per query.
Input
{"categories": ["dev-engineering"],"searchTerms": [],"includeJobDetails": true,"maxItemsPerQuery": 100,"maxPagesPerQuery": 5,"maxConcurrency": 5,"minRequestInterval": 0.5,"proxyConfiguration": { "useApifyProxy": true }}
| Field | Type | Description |
|---|---|---|
categories | array | The path segment from Built In's own URL — dev-engineering, remote, san-francisco. An unrecognised one is reported as an error rather than quietly replaced with generic jobs. |
searchTerms | array | Keyword search. Combine with categories and every category is searched with every term. |
includeJobDetails | boolean | On by default — without it you get titles and links and nothing else, because that is all the listing publishes. Costs one request per job. |
maxItemsPerQuery | integer | Stop after this many unique jobs per query. 0 = no cap. Default 100. |
maxPagesPerQuery | integer | Listing-page ceiling. Page size varies between about 10 and 27 jobs, so use the item cap for a precise budget. Default 5. |
maxConcurrency | integer | Requests in flight, which matters most during the detail pass. Default 5. |
minRequestInterval | number | Seconds between request starts. Default 0.5. |
proxyConfiguration | object | Apify Proxy. Datacenter is the default and is sufficient. |
Output
Three record types share one dataset, told apart by recordType.
JOB
{"_input": "category=dev-engineering","_source": "S1-jsonld-list+S2-jsonld-detail","_scrapedAt": "2026-09-16T04:13:58Z","recordType": "JOB","jobId": "11198462","title": "Software Engineer, Behavior Validation","jobUrl": "https://builtin.com/job/software-engineer-behavior-validation/11198462","summary": "Develop behavior validation products for autonomous vehicle software…","detailCompanyName": "General Motors","detailCompanyUrl": "https://builtin.com/company/general-motors","detailCompanyLogo": "https://builtin.com/sites/www.builtin.com/files/2025-06/gm_avatar_white_blue%201.png","detailSalaryMin": 123200,"detailSalaryMax": 189100,"detailSalaryCurrency": "USD","detailSalaryPeriod": "YEAR","employmentType": "FULL_TIME","datePosted": "2026-09-16","validThrough": "2026-10-16T03:22:34+00:00","directApply": false,"industry": ["Automotive", "Big Data", "Information Technology", "Robotics", "… 3 more"],"jobBenefits": ["Offers 401(K)", "Provides 401(K) matching", "Offers generous parental leave", "… 17 more"],"applicantLocationRequirements": { "@type": "Country", "name": "USA" },"hiringOrganization": { "@type": "Organization", "name": "General Motors", "sameAs": "https://builtin.com/company/general-motors" },"baseSalary": { "@type": "MonetaryAmount", "currency": "USD", "value": { "minValue": 123200, "maxValue": 189100, "unitText": "YEAR" } },"description": "<b>Description</b><br><strong>Role</strong>… (full HTML)","listPosition": 1,"pageNumber": 1}
| Field | Description |
|---|---|
jobId / jobUrl | Built In's job id and a direct link. |
title | Job title. |
summary | The one-line summary from the listing page. |
description | The full job description (HTML) from the job's own page. |
detailCompanyName / detailCompanyUrl / detailCompanyLogo | The employer. |
detailSalaryMin / detailSalaryMax / detailSalaryCurrency / detailSalaryPeriod | Salary range, already split into numbers. |
detailCity / detailRegion / detailCountry / detailPostalCode | Location, flattened from the posting's address. |
employmentType | FULL_TIME, PART_TIME, CONTRACTOR, … |
datePosted / validThrough | When it was posted and when it expires. |
industry | The employer's industry tags. |
jobBenefits | Structured benefits list — often 20+ entries. |
applicantLocationRequirements | Where applicants must be based. |
directApply | Whether Built In accepts the application directly. |
baseSalary / hiringOrganization / jobLocation / identifier | The original structured objects, kept whole. |
_detailError | Present only when a job's own page could not be read. |
SEARCH_SUMMARY
| Field | Description |
|---|---|
category / searchTerm | What was queried. |
pagesFetched / jobsReturned / duplicatesDropped | What the run did. |
collectionPageTitle | The page title Built In returned — this is what proves the category applied. |
unfilteredPageTitle | The generic title, for comparison. |
jobDetailsRequested / jobDetailFailures | Whether the detail pass ran, and how many pages failed. |
stoppedBecause | max_items_reached, max_pages_reached, no_new_jobs, no_more_results. |
upstreamTotalNotPublished | Always true — Built In publishes no result total anywhere, so none is invented. |
pageSizeVaries | Always true — pages hold roughly 10–27 jobs. |
ERROR
_error | Meaning |
|---|---|
category_not_applied | Built In ignored the category and served generic jobs. The rows were discarded. |
invalid_input | A malformed category slug, refused before any request. |
blocked | Every attempt was refused; try the residential proxy group. |
unexpected_shape | A 200 without the structured data this actor depends on. |
fetch_failed | Network or server trouble after retries. |
Known limits
- No result total. Built In does not publish one, so runs are bounded by your page and item caps rather than by a known total.
- Page size is not fixed (roughly 10–27 jobs), so a page count is not a precise job budget.
- The detail pass is one request per job. A 500-job run is ~500 requests.
- Company profiles are not scraped — each job carries its employer's name, Built In page and logo, but not the full company profile.