Built In Jobs Scraper avatar

Built In Jobs Scraper

Pricing

from $0.06 / 1,000 job results

Go to Apify Store
Built In Jobs Scraper

Built In Jobs Scraper

Scrape public Built In job listings by keyword, location, remote preference, category, and recency.

Pricing

from $0.06 / 1,000 job results

Rating

0.0

(0)

Developer

Fetch Cat

Fetch Cat

Maintained by Community

Actor stats

0

Bookmarked

76

Total users

54

Monthly active users

a day ago

Last modified

Share

Export public Built In job listings to a structured dataset for recruiting research, hiring-market analysis and job-board enrichment. Search by keyword or supply Built In search URLs. Get job titles, companies, URLs and available salary, skill and detail-page fields.

Public pages only, with no login or cookies. Optional fields can be missing, and Built In controls search coverage and ordering.

Quick start

Use this bounded input for a generated remote engineering search:

{
"startUrls": [],
"keyword": "python",
"remotePreference": "remote",
"category": "dev-engineering",
"postedWithinDays": 7,
"maxItems": 20,
"includeDetails": true
}

In the input form, clear the prefilled start URL to use category, location and remote-preference settings. Nonempty startUrls take precedence over those settings. Run the Actor, then download the dataset as CSV, Excel or JSON, or retrieve it through the API.

Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.

Ready-to-run examples

Choose a public example to see its settings before starting a run:

What you get

One row per saved public job listing, with title, job URL and available company, location, salary text or listing-card skills. Optional detail visits also reuse public structured job data for numeric salary bounds, explicit currency/period, employment types, postal addresses, expiry and source-provided company logos. These fields reuse the existing detail requests. Detail visits do not guarantee every field or supply skills missing from the listing card. The existing salary text is unchanged; structured salary fields never guess units or annualize hourly pay.

Who is it for?

  • Recruiting teams reviewing publicly advertised engineering or analytics roles.
  • Job-feed builders collecting cited listings for their own import workflow.
  • Hiring-market analysts comparing available job titles, companies and locations across exports.
  • Data teams connecting public listing records to their own reporting tools.

How you can use the data

  • Prepare a Python engineering sample. Clear prefilled startUrls, use keyword python and category dev-engineering, and set a small job cap. Keep title, companyName, jobUrl and available salary or skills fields in a review sheet.
  • Review a location or remote-route sample. Generated searches can use a location slug or the existing remote-preference choices. The default remote-or-hybrid and remote settings both use the remote route. Returned location or remote text does not certify applicant eligibility.
  • Compare your own job snapshots. Keep jobId, jobUrl and scrapedAt together, then compare later exports in your spreadsheet. A missing row is not proof that an employer closed the vacancy.
  • Choose listing or detail coverage deliberately. Leave detail visits off for a listing-card sample, where postedDate stays null. Enable them for available descriptions or date, salary and location updates, without assuming missing listing-card skills or company-profile data will be added.

Input settings

No field is globally required. An empty API input generates the existing remote search with a limit of 20 and details enabled. Form prefills are not API defaults.

Setting / JSON keyBehavior
Start URLs / startUrlsUp to 100 public Built In jobs/search URLs. Omit or use [] to generate a search. Supplied URLs override category, location and remote preference.
Keyword / keywordWebsite search term, up to 200 characters. An existing URL search parameter wins.
Location / locationLocation slug such as chicago. Generated searches only.
Remote preference / remotePreferenceGenerated searches only. remote-or-hybrid (default) and remote both use the remote route. hybrid uses the hybrid route. any adds neither segment.
Category / categorySupported category slug such as dev-engineering or data-analytics. Generated searches only. See field help for all accepted slugs.
Recency / postedWithinDaysOptional website filter: any integer from 1 to 30. Values 1, 3, 7, 14 and 30 are unchanged; other values round up to the next supported window with one warning (for example, 2→3, 5→7, 10→14, 20→30). This widens the window rather than dropping wanted jobs. An existing URL daysSinceUpdated parameter always wins. Non-integers and values outside 1–30 are rejected. No independent date filtering or chronological sorting.
Maximum jobs / maxItemsSaved-row limit across all sources, 1–5000. Default 20.
Detail pages / includeDetailsDefault true. Optional enrichment. false keeps listing-card data and leaves postedDate null.
Resume source / resumeFromStartIndexZero-based source index. Omit for a new run.
Resume page / resumeFromPageOne-based page for the selected source. Omit for page 1.

Detailed setting behavior and limitations are in each input field's help. The Connection setting defaults to Automatic: direct access first, then bounded existing Apify datacenter HTTP recovery if challenged. This may incur platform proxy usage. Select Direct to disable paid proxy fallback; local runs always use Direct. Automatic HTTP recovery uses at most eight detail workers and one prefetched listing page with the same shared request-start pacing, rotates each connection after at most eight requests (earlier on failure), and rejects HTML responses above 1 MiB rather than buffering them without a limit.

Example inputs

Use the Quick start input as a small first run. Adjust the fields described above for your own data.

Output data

One dataset row represents one saved job listing. Optional values can be null and arrays can be empty. Detail visits do not add skills or category absent from the listing card, and do not fetch company profiles. With includeDetails: false, all new scalar detail fields are null and employmentType/locations are empty arrays.

FieldValue
titleJob title.
companyNameCompany name, or null.
jobUrlPublic Built In job URL.
jobIdListing ID, or null.
locationVisible location or applicant-location requirement, or null.
remoteTypeVisible remote/hybrid/on-site text or detail-page value, or null.
descriptionListing summary or available detail description, or null.
postedDateDetail-page posted date, or null.
categoryListing-card category, or null.
skillsArray of visible listing-card skills/tags.
salaryVisible salary text, or null. Not a normalized numeric salary.
companyUrlCompany profile URL from the card, or null. Not a company profile export.
salaryMin, salaryMaxNumeric JobPosting base salary bounds, or null. A single salary is placed in salaryMin; no parsing of abbreviated card text.
salaryCurrency, salaryPeriodExplicit source currency and unit, such as USD / YEAR or HOUR, or null.
employmentTypeArray of source types, such as ["FULL_TIME"]; empty when unavailable.
locationsArray of public postal addresses with nullable streetAddress, addressLocality, addressRegion, postalCode, addressCountry. Country values are source labels/codes, not normalized.
validThroughParseable source expiry date/time, or null; not a guarantee the job remains open.
companyLogoUrlPublic organization logo link, or null. Source placeholders are possible; no image is downloaded.
scrapedAtISO timestamp when the row was prepared.

Public-source example captured 29 Oct 2026: Clear Street's Security Operations Engineer supplied salaryMin: 125000, salaryMax: 145000, salaryCurrency: "USD", salaryPeriod: "YEAR", employmentType: ["FULL_TIME"] and a New York postal address. Optum's Business Operations Specialist supplied hourly bounds 18.6–27.9. Values and availability change with the source.

Application-link limitation: the inspected anonymous public pages expose empty application URLs, not employer application links. This release does not invent an applyUrl, substitute a login/save link or fetch an extra application endpoint. Use jobUrl to review the vacancy on Built In. Company websites and inferred seniority are not added.

Shape-only illustration, not an observed job or a complete dataset row:

{
"title": "<job title>",
"jobUrl": "https://builtin.com/job/<job-slug>/<id>",
"companyName": null,
"postedDate": null,
"salary": null,
"skills": []
}

Download your results

Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.

See Apify's download and export guide for the available formats and field options.

Pricing

The start event is charged once after input validation, and result is charged per paid saved job listing. Errors and status messages are not extra dataset rows. Apify platform usage charges may also apply.

Keep maxItems low for an initial search and disable includeDetails when optional detail visits are unnecessary. See the live Pricing tab for current rates and applicable discounts.

Tips for best results

  • Clear the form's prefilled URLs for a generated search. Nonempty URLs take precedence over category, location and remote preference.
  • Set a small job cap explicitly. Inspect titles, links and nullable fields before increasing volume.
  • Check the effective search settings. Existing URL search or recency parameters can override the separate input values.
  • Choose whether descriptions and posted dates matter. Detail visits are optional and cannot fill every absent field.
  • Review run status and the dataset before importing. Useful rows can remain after an isolated source or detail failure.

Limits and caveats

Built In controls which jobs appear and their order. Results are not guaranteed exhaustive or chronological. Recency is a website filter rather than independent date filtering, and remote-route preferences are not a normalized eligibility test.

Public fields can be missing, and no matches can produce a successful empty dataset. An isolated source failure can leave useful rows from other sources. The run can fail if sources fail or its deadline is reached before any output. The result budget can stop work normally with rows already saved.

Requests are paced, with at most two concurrent detail visits. Challenged pages can switch the run to an anonymous browser using a single reusable page; image, media and font downloads are blocked. After successful navigation, same-origin HTML requests reuse that anonymous browser session without reloading page scripts; challenged responses fall back to navigation. Temporary rate limits trigger a shared wait and bounded retries, respecting the server's retry time and the run deadline. Browser fallback uses the same deadline and does not guarantee challenge resolution. Failed optional detail visits retain listing data. If detail-page rate limiting persists after retries, further detail visits stop while preserving already collected details. When requested detail extraction is incomplete, the run logs a warning and marks that source partial in SOURCE_OUTCOMES, with requested, attempted, fetched, enriched, failed and skipped detail counts. Useful listing rows do not mean every detail was retrieved. Listing-only rows have null postedDate, and detail visits do not add skills, category or company-profile data missing from a card.

No private applicant or account data is accessed. This is not an official Built In API, and Automatic connection recovery uses only Apify's existing DEFAULT datacenter pool, never residential proxies or Unblocker. Direct disables proxy fallback.

Automation and integrations

Save your settings for next time

Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.

Run on a schedule

Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.

Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.

Send results to your other tools

Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.

For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.

API usage

Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.

The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.

For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.

cURL

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~builtin-jobs-scraper/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
--data @- <<'JSON'
{
"startUrls": [],
"keyword": "python",
"remotePreference": "remote",
"category": "dev-engineering",
"postedWithinDays": 7,
"maxItems": 20,
"includeDetails": true
}
JSON

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/builtin-jobs-scraper').call({
"startUrls": [],
"keyword": "python",
"remotePreference": "remote",
"category": "dev-engineering",
"postedWithinDays": 7,
"maxItems": 20,
"includeDetails": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/builtin-jobs-scraper').call(run_input={'startUrls': [], 'keyword': 'python', 'remotePreference': 'remote', 'category': 'dev-engineering', 'postedWithinDays': 7, 'maxItems': 20, 'includeDetails': True})
print(client.dataset(run['defaultDatasetId']).list_items().items)

API usage notes

After the run finishes, use its defaultDatasetId to retrieve items from https://api.apify.com/v2/datasets/DATASET_ID/items.

MCP and AI agents

You can ask your AI assistant to collect data with Built In Jobs Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.

Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.

Easier setup with an Apify plugin

If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.

Use Apify AI in Console

Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Built In Jobs Scraper. You can describe the data you want and ask questions about the results.

Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.

Choose your assistant

Connect just this scraper

To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/builtin-jobs-scraper"
}
}
}

Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.

Use Apify's general server

Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Built In Jobs Scraper by Fetch Cat, or give it the identifier fetch_cat/builtin-jobs-scraper.

Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.

Example requests

  • “Use Fetch Cat’s Built In Jobs Scraper to collect up to 5 Python engineering jobs from a generated search, with any prefilled search URLs cleared. Show companies, titles, job links and available salary text or skills.”
  • “Collect at most 5 data-analytics jobs for Chicago with keyword SQL and no remote-route restriction. Show the actual location text without treating it as applicant eligibility, and keep original job links.”
  • “Retrieve up to 5 jobs from this public Built In search URL without optional detail visits. Keep job IDs and collection time for my comparison sheet, marking missing posted dates and other optional fields.”

Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.

Pay with x402

If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.

Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.

Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.

Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.

Other ways for agents to pay

Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.

FAQ

Why does changing category have no effect?

Nonempty start URLs take precedence. Clear the form's prefilled URL or send startUrls: [] to generate a search using category, location and remote preference.

Does Remote or hybrid search both routes?

No. The existing remote-or-hybrid option uses the same remote route as remote. Use hybrid for the hybrid route. Website results determine actual coverage.

Why are salary or posted date fields empty?

Not every page exposes them. Enable details for available detail fields. Listing-only examples do not return posted dates.

Can I export to CSV or Excel?

Yes. Download the saved dataset from Apify, or retrieve it through the API. A saved example is a starting input, not an automatically recurring job.

  • LinkedIn Jobs Scraper — Collect public LinkedIn job listings with titles, companies, locations and source links, plus optional details when available.
  • Greenhouse Jobs Scraper — Export openings from supplied public Greenhouse company boards, including job titles, departments, locations and application URLs.
  • Lever Jobs Scraper — Export job postings from supplied public global Lever boards, including titles, locations, teams and descriptions.
  • Workday Jobs Scraper — Collect public postings from Workday company career sites, with available requisition IDs, locations and descriptions.
  • SmartRecruiters Jobs Scraper — Export public jobs from supplied SmartRecruiters company boards, with titles, locations and job URLs.

Support and feedback

For custom additions or integrations, email hello@fetchcat.dev.

Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.

Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.

Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.

Made with care for curious people, AI agents and the possibilities in data. ♥