BuiltIn Jobs Scraper API
Pricing
from $0.81 / 1,000 job returneds
BuiltIn Jobs Scraper API
Scrape Built In tech jobs by board or by company. Each job has the title, company, every location, remote or hybrid. You also get seniority, skills and the exact posted date. About half the listings have a salary. The rest come back empty, not guessed. No login. $0.81 per 1,000 jobs.
Pricing
from $0.81 / 1,000 job returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Built In Jobs Scraper: tech jobs by search, filter or URL, no login
Give it a search term, a city, a set of Built In filters or just a URL, and you get one row per job. Title, company, every location the role is open in, remote or hybrid or on site, seniority, the skills listed on the card, industries and the exact posted timestamp.
Built In publishes a pay range on about half its listings, because that is how many employers filled
one in. Rows without one come back as null rather than a guess, and no scraper can produce the
missing ones.
| Input | Search terms, a location, Built In filters, or Built In URLs |
| Output | One row per job listing |
| Ceiling | 10,000 jobs per run |
| Account needed | None, and no API key |
| Price | $0.81 per 1,000 jobs, flat on every plan |
🔍 What Built In Jobs Scraper does
It reads the Built In job board the same way the site's own front end reads it, so there is nothing to log into and no key to apply for. You can search by keyword, narrow by city, category, seniority, working style and how recently a job was posted, or skip the fields entirely and paste URLs.
The URL route takes a single job page, a filtered board view, a city site like builtinnyc.com, or a company's board. Built In's own company page stops at 20 jobs and will not page past that; this actor resolves the employer behind it and reads the main board filtered to them instead, which does page.
📥 What you give it
{"searchQueries": ["data engineer", "product manager"],"location": "Austin, TX","remotePreference": "remote","maxItems": 200}
| Field | Default | What it is |
|---|---|---|
searchQueries | none, the box starts with data engineer | Job titles or keywords, one per line. Leave it empty if you only want the filters, or only the URLs. |
location | none | Plain text: Austin, TX, New York, Chicago. Resolved through Built In's own location lookup. Empty searches every location. |
searchRadius | Built In's own | 5mi, 10mi, 25mi, 50mi or 100mi around that location. Ignored when no location is set. |
remotePreference | any | remote, hybrid or office. Any still tells you which each job is. |
category | any | Built In's own categories: engineering, data-analytics, product, designer, sales, marketing and the rest. |
experienceLevel | any | internship, entry-level, junior, mid-level, senior, expert-leader. |
postedWithinDays | any time | 1, 3, 7 or 30. |
maxItems | 50 | Hard cap on rows across every search and URL, 1 to 10,000. |
startUrls | none | Built In pages pasted directly. See the table below. |
includeJobDescription | off | Opens each job's own page for the full text, employment type, benefits and closing date. |
proxyConfiguration | none | Optional. Only touch it if the run has to leave through your own servers. |
URLs you can paste into startUrls:
| URL | What comes back |
|---|---|
https://builtin.com/job/lead-data-engineer/10586279 | That one job, with the full description |
https://builtin.com/jobs?search=product+manager | Everything that search returns |
https://builtin.com/jobs/remote/engineering | Every remote engineering role |
https://builtin.com/company/crowdstrike/jobs | One company's whole board |
https://builtinnyc.com/jobs | A city site's board |
If location does not resolve, the run stops there. It writes one row saying so and does no
further work, even when you also gave startUrls. Use a plain City, ST or City, Country
spelling, or leave the field empty.
includeJobDescription holds the run's rows until the last description arrives. One extra
request per job, so a very large maxItems on that path asks a lot of the container. Keep it to a
few hundred at a time. The price per job does not change.
📤 What you get back
A real row from a recent run, with the logo URL trimmed:
{"jobId": "11269166","title": "Data Engineer 4","companyName": "Comcast","companySlug": "comcast-3","companyUrl": "https://builtin.com/company/comcast-3","companyLogo": "https://static.builtin.com/cdn-cgi/image/f=auto,fit=scale-down,w=128,h=128/...","jobUrl": "https://builtin.com/job/data-engineer-4/11269166","location": "Chennai, Tamil Nadu, IND","locations": ["Chennai, Tamil Nadu, IND"],"locationCount": 1,"workplaceType": "Hybrid","isRemote": false,"isHybrid": true,"isOnsite": false,"salaryText": null,"salaryMin": null,"salaryMax": null,"salaryPeriod": null,"experienceLevel": "Senior level","postedAt": "2026-09-20T03:29:01.000Z","postedLabel": "3 Hours Ago","isFeatured": false,"industries": ["Digital Media", "Information Technology", "News + Entertainment"],"skills": ["APIs", "Databricks", "Kubernetes", "Teradata"],"summary": "Develop and maintain advanced data structures, ingestion frameworks, pipelines, and quality controls across structured and unstructured data environments...","employmentType": null,"validThrough": null,"benefits": [],"descriptionHtml": null,"descriptionText": null,"searchQuery": "data engineer","searchUrl": "https://builtin.com/jobs?search=data+engineer&allLocations=true","page": 1,"position": 1,"scrapedAt": "2026-09-20T07:02:01.834Z"}
| Field | What it is |
|---|---|
jobId | Stable. Use it as your dedupe key across runs. |
salaryText | Built In's own wording, like 195K-320K Annually, with salaryMin, salaryMax and salaryPeriod parsed out of it. All four are null when the employer published no range. |
locations, locationCount | Every location the role is open in. location holds the first. |
workplaceType | Built In's label: Remote, Hybrid, In-Office, Remote or Hybrid, In-Office or Remote. The three booleans next to it say the same thing in a form you can filter on. |
postedAt | The exact publish timestamp. Falls back to the relative label on the rare page that omits it. |
skills, summary | Come from the board card. Paste a single job URL instead and these two are empty, because that page has no card. |
descriptionHtml, descriptionText, employmentType, validThrough, benefits | null or empty unless you switch on includeJobDescription or paste a job URL. |
searchQuery, searchUrl, page, position | Where the row came from, so you can trace it back. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A job | It has a jobId and neither flag below | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
A real job row carries no charged field at all, so filter on _sample and _diagnostic being
absent. Run it with nothing filled in and you get the sample row on its own.
The errorCode on a diagnostic row names what went wrong:
| Code | What it means |
|---|---|
BAD_URL | That URL is not a Built In job, board or company page. |
COMPANY_NOT_FOUND | The company slug in the URL did not resolve. Check it on builtin.com. |
LOCATION_NOT_FOUND | Built In's lookup has no match for that place name. |
LOCATION_LOOKUP_FAILED | The lookup itself did not answer. Re-run it. |
JOB_NOT_FOUND | Built In removes a job page once the listing closes. |
NO_RESULTS | The search ran and matched nothing. Try a broader term or widen the date window. |
HTTP_ERROR | Built In was unreachable or answered badly on that request. |
One bad URL never stops the others, and a diagnostic row never fails the run. The one exception is a location that will not resolve, which ends the run as described above.
▶️ How to run it
- Open Built In Jobs Scraper and click Try for free.
- Type one or more terms into Search terms, or paste Built In pages into Built In URLs.
- Set Location, Job category, Experience level and Posted within if you want them.
- Set Maximum jobs. Start around 50 to see the output shape, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.81 per 1,000 jobs. Flat on every Apify plan, no volume tiers.
You pay per job row delivered. The sample row and diagnostic rows carry no job charge, and neither does a search that matches nothing. Turning on the full job description costs nothing extra per job.
💡 What people use it for
- Watching one city and one category daily with
postedWithinDaysset to1, so each run only picks up what is new. - Pulling a competitor's whole open board by pasting their Built In company URL, which goes far past the 20 that page shows a visitor.
- Building a pay benchmark for a role from the listings that do publish a range, and counting how many do not.
- Tracking which tools keep appearing in
skillsacross a few hundred listings in one category.
🚧 What it does not do
- It does not invent a salary. About half of Built In's listings have no published range, and
those rows stay
null. - There is no salary currency. Built In prints
118K-152K Annuallyfor a Toronto job exactly as for a Boston one, so no currency field is emitted rather than assume dollars. - Mostly US and Canada. That is Built In's own coverage. Company boards carry the occasional Dublin or Singapore role, but Europe and Asia are not the source's strength.
- No recruiter or applicant contact details. Built In does not publish them.
- It does not follow the Apply link.
jobUrlis the Built In page, not the employer's own system. - It does not log in, so saved jobs, alerts and anything behind an account are out of reach.
- Paging has a floor. Built In stops issuing pages on a single board around page 1,000, so one very broad board runs out well before 10,000 rows on some searches. Split by city, category or keyword to go wider.
skillsandsummaryare card fields. A single job URL has no card, so those two come back empty on that route.
🧭 Which job scraper do you need?
| If you want | Use |
|---|---|
| US and Canada tech jobs, with skills and seniority | This one |
| Startup jobs with equity ranges | Wellfound Jobs Scraper |
| Germany, Austria and Switzerland | XING Jobs Scraper |
| A specific company's own careers page | Career Site Jobs Scraper |
| Jobs gathered from across the web | Google Jobs Scraper |
❓ Questions people ask
Is there an official Built In API? No public one. This reads the same results the site's own front end reads, which is why there is nothing to apply for.
Do I get the salary? When Built In shows one. That was 723 of 1,455 jobs in a measured sample, and coverage swings hard by search: high on Chicago data roles, low on a nationwide sweep.
Can I get the full job description? Yes. Set includeJobDescription to on, or paste the job's own
URL. Both give you descriptionText and descriptionHtml at no extra charge per job.
Can I scrape one company's jobs? Paste https://builtin.com/company/<slug>/jobs. The actor reads
the employer's full board rather than the 20 that page shows.
Do the city sites work? Yes, any of them. builtinnyc.com, builtinchicago.org, builtinaustin.com
and the rest. Setting location on builtin.com covers the same ground.
Is scraping job listings legal? These are public listings on public pages. They still describe real roles at real companies, so have a reason for collecting them and check your own obligations. Apify's write-up on scraping and the law is a sensible starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the search or URL you used and the run ID. The
errorCode on the diagnostic row usually names the problem on its own.