CareerBuilder Scraper - Jobs, Salaries & Company Profiles
Pricing
from $1.20 / 1,000 job scrapeds
CareerBuilder Scraper - Jobs, Salaries & Company Profiles
Scrape CareerBuilder.com job listings by search or URL. Returns title, company profile, location with coordinates, salary range, employment type, apply link, posting dates, and full job description, with date sorting and optional detail enrichment.
Pricing
from $1.20 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
20
Total users
4
Monthly active users
3 days ago
Last modified
Categories
Share
CareerBuilder Scraper: Job Listings, Salaries & Company Profiles
CareerBuilder Scraper turns CareerBuilder job search into a clean dataset. Search by keyword and location, or paste search-result and job-detail links, and get a flat record per job: title, the hiring company's profile, location with map coordinates, salary range, employment type, the apply link, posting dates, and, on request, the complete job description. Run it once, resume an interrupted crawl, or schedule it and get only new and changed jobs on later runs. Export to JSON, CSV or Excel, read the dataset through the API, or pipe results into the apps you already use.
Why This Scraper?
- Rich, flat records. Over 40 possible fields per job, including the hiring company's profile (logo, website, size, description), map coordinates, salary min/max with currency and unit, remote or onsite, and the direct apply link.
- Two ways to start. Search by keyword and location, optionally ordered newest first, or paste search-result and job-detail URLs and let the actor walk them.
- Full descriptions on demand. Turn on detail enrichment to attach each job's complete description, billed only for jobs actually returned.
- Multi-search. Give several keywords and several locations, and every combination is searched.
- Built for recurring monitoring. Resume continues one interrupted run without re-collecting or re-billing what it already has. Incremental mode tracks a search across scheduled runs and classifies each job as it changes.
- Optional export. Pipe results straight into Notion, Linear, Airtable, or Apify via MCP connectors, right after the dataset is written.
Use Cases
- Job boards and aggregators: compile current CareerBuilder listings by keyword and region for a meta-search product.
- Recruiting and sourcing teams: track new postings for competitive intelligence or candidate pipelines by keyword and location.
- Compensation and salary benchmarking: collect salary ranges across roles and regions where CareerBuilder publishes them.
- Labor market research: schedule incremental runs to track how job counts and postings shift over time for a given search.
- Employer and company research: pull the hiring company's profile fields (size, website, description) attached to each posting.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
jobId | 00000000-0000-0000-0000-000000000000 |
title | "Sample Software Engineer" |
company | "Sample Company" |
companyLogo / companyWebsite | "https://media.example.com/logo.png" / "http://www.example.com" |
companySize | "100 to 499 Employees" |
location | "New York, NY, US" |
city / state / country | "New York" / "NY" / "US" |
latitude / longitude | 40.714 / -74.006 |
isRemote | false |
employmentType | "Full-time" |
industry | "Software" |
salary | "USD 160,000 - 185,000 YEAR" |
salaryMin / salaryMax | 160000 / 185000 |
salaryCurrency / salaryUnit | "USD" / "YEAR" |
snippet | "Short summary of the role." |
skills | list of skill names the site tags on the job; filled only when detail enrichment is on or for pasted job-detail links, otherwise null |
postalCode | "02298", the job's postal code when the listing gives one |
occupationalCategory | "15-1132.00: Software Developers, Applications", the O*NET occupation code and title; detail enrichment only, otherwise null |
validThrough | "2027-10-12T13:31:03.078Z", when the posting expires; detail enrichment only, otherwise null |
identifier | the employer's own posting ID; detail enrichment only, otherwise null |
description | full HTML job description (short in search results, full only with detail enrichment on or for pasted job-detail links) |
datePosted / dateRecency | "2026-01-01" / "9 days ago" |
applyType / applyUrl | "INTEGRATED" / "https://apply.example.com/job/000" |
directApply | true |
url | "https://www.careerbuilder.com/job-details/sample--00000000-0000-0000-0000-000000000000" |
Each record also carries companyDescription, companyFoundingDate and companyLocation (employer profile detail), jobLocationType (the raw on-site, remote or hybrid decision behind isRemote), isSalaryExtracted (whether the salary was stated by the employer rather than estimated), seoJobId (used to build the job's detail-page URL), status, jobType and promoted (posting metadata), provider (the listing's source name), formattedDate, createdDate and modifiedDate (raw posting timestamps), and isEligibleForExpertApply. With Incremental mode on, records also carry changeType, changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a mode:
search(keywords, with optional locations) orurl(paste CareerBuilder search-result or job-detail links). - For search mode, fill in Job keywords and, optionally, Locations, and pick a Sort by order. For URL mode, paste one or more links.
- Turn on Fetch full job details if you want the complete description attached (one extra request, and one billed unit, per job actually returned).
- Set Max jobs to control run size and cost, then click Start. Download the dataset as JSON, CSV or Excel, or read it through the API.
Search by keyword and location, sorted by date:
{"mode": "search","queries": ["registered nurse"],"location": ["Dallas, TX"],"sortBy": "date","fetchDetails": true,"maxItems": 50}
Paste links (a search page and a job detail page):
{"mode": "url","startUrls": ["https://www.careerbuilder.com/jobs-software-engineer-in-new-york,ny","https://www.careerbuilder.com/job-details/sample--00000000-0000-0000-0000-000000000000"],"fetchDetails": true,"maxItems": 20}
Recurring monitoring of one search, only changes returned:
{"mode": "search","queries": ["truck driver"],"location": ["Chicago, IL"],"incrementalMode": true,"stateKey": "chicago-truck-driver-watch","maxItems": 0}
Continue an interrupted run:
{"mode": "search","queries": ["software engineer"],"resumeFromRunId": "<previous run or dataset id>","maxItems": 50}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/careerbuilder-scraper").call(run_input={"mode": "search", "queries": ["software engineer"], "location": ["New York, NY"]})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], job["company"], job["salary"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/careerbuilder-scraper').call({mode: 'search', queries: ['software engineer'], location: ['New York, NY'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
Two different features, both optional:
- Resume (
resumeFromRunId) continues one specific interrupted crawl: paste a previous run or dataset ID and the actor skips every job already collected there, so you don't pay twice. No state is kept beyond that one run. - Incremental mode (
incrementalMode) is for scheduling the same search again and again and getting only what changed. The actor keeps its own baseline for the search, keyed bystateKeyor an automatic key derived from the search or URLs and the detail setting, and classifies every job asNEW,UPDATED(withchangedFields),UNCHANGED,REAPPEAREDorEXPIRED. By default onlyNEW,UPDATEDandREAPPEAREDjobs return;UNCHANGEDjobs are suppressed and not billed unlessemitUnchangedis on. The comparison covers every output field exceptdateRecency,formattedDateandpromoted(they drift or rotate without a real change) anddescription,skills,identifier,occupationalCategoryandvalidThrough(only filled when detail enrichment runs or on pasted job-detail links, so they cannot be compared across runs). Excluded fields stay in the output. You can exclude more by listing field names inignoreFieldsForChanges("Ignore fields when detecting changes (incremental mode only)", in the Resume & recurring updates group); ignored fields never triggerUPDATEDand never appear inchangedFields. EXPIREDis only produced after a run in which every tracked search returned results (the first results page of each search, up to about 50 jobs), with no Max jobs cap hit and no Resume in play, and only whenemitExpiredis on. A job that drops off that first page counts as no longer found. A pasted search URL that starts at?page=2or later is a partial scope and never producesEXPIRED.REAPPEAREDcan only happen to a job that such a complete scan previously found missing; ifemitExpiredhas never been turned on for a search, no job can ever be markedEXPIRED, and soREAPPEAREDnever occurs either. Combining Resume with Incremental mode on a search that already has tracked state is rejected: use one or the other, or pick a differentstateKey.- Change detection ignores
dateRecency(a relative label like "9 days ago" that drifts on its own every day),formattedDate,promoted, and the detail-only fieldsdescription,skills,identifier,occupationalCategoryandvalidThrough(not present on every row, so they can't be compared across runs where the detail setting differs).datePosted, salary, snippet and every other field are real data and do triggerUPDATED.
URL mode
Supported links (all on https://www.careerbuilder.com): keyword plus city search (/jobs-software-engineer-in-new-york,ny), keyword-only (/jobs-software-engineer), state listing (/jobs-in-ny), city listing (/jobs-in-new-york,ny), remote collection (/jobs-remote), industry collection (/jobs-information-technology-and-internet), title directory (/browse/jobs-software-engineer, accepted but a landing page that may return no jobs), paginated search (?page=2 starts at that page and never marks earlier jobs expired in Incremental mode), and job details (/job-details/<slug>--<id> or /job-details/<id>).
Behaviour change: URL mode now has seven sample links as its default, each a different link shape, so switching to URL mode and leaving the field empty runs those samples instead of nothing; clear the field or paste your own links to avoid that.
Links that return no jobs are skipped with a clear warning in the log: other hosts such as careerbuilder.com without www, the old /jobs?keywords= form and /job/<id> links. A link that matches nothing, or a job that was removed or expired, also logs a warning and the run still finishes successfully.
Output views
The dataset has three table views in the Console: Jobs Overview (title, change type, company, location, salary, employment type, remote flag, posting date, apply link, URL), Job details & company (description, skills, occupation, expiry, employer posting ID and the employer profile fields) and Changes (incremental mode) (change type, changed fields, first and last seen).
Send results into your apps (MCP connectors)
Optionally pipe every job straight into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each job, not the full JSON, one entry per job with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify then Settings then Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the mcpConnectors input field. Notion gets a page per job; Linear, Airtable and Apify get a best-effort write of the same summary.
- For Notion, also set
notionParentPageUrlto the page under which item pages should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (keywords and optional locations) or url (paste links). |
queries | array | none (prefill: ["software engineer"]) | Job titles or keywords to search (search mode). |
location | array | none (prefill: ["New York, NY"]) | Optional locations as City, ST or a city name; each keyword is searched in each location. Leave empty for nationwide. |
startUrls | array | seven sample links, one per distinct shape (see URL mode) | CareerBuilder search-result, listing, browse or job-detail URLs (url mode). |
sortBy | string | relevance | relevance (site order) or date (reorders the jobs of each fetched page newest first; CareerBuilder offers no server-side sort and its search links ignore filter and sort parameters, so it does not change which jobs are fetched or their order across pages). |
keywords | string | none | Single-keyword alias, added to queries. |
startUrl | string | none | Single-link alias, added to startUrls. |
fetchDetails | boolean | false | Attach the complete job description to each job. |
maxItems | integer | 20 | Total jobs to return across all searches or URLs (0 = no limit). Each search reads the first results page (up to about 50 jobs) per keyword and location pair. |
resumeFromRunId | string | none | Continue one specific interrupted run, skipping jobs it already collected. |
ignoreFieldsForChanges | array | [] | Incremental mode only: output field names excluded from change detection (in addition to dateRecency, formattedDate, promoted, description, skills, identifier, occupationalCategory, validThrough). |
incrementalMode | boolean | false | Recurring monitoring: classify jobs as NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED against a stored baseline. |
stateKey | string | none (auto-derived) | Name a monitoring campaign, or leave empty for a key derived automatically from the search and detail settings. |
emitUnchanged | boolean | false | Also return (and bill) unchanged jobs, marked UNCHANGED. |
emitExpired | boolean | false | Also return (and bill) jobs no longer found, marked EXPIRED. Only produced after a complete, non-resumed, non-capped scan. |
proxy | object | Residential proxy group, country US | Connection settings. |
mcpConnectors | array | none | Optionally send a summary of each job to apps you authorized under Integrations. |
notionParentPageUrl | string | none | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on jobs written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"mode": "search","jobId": "00000000-0000-0000-0000-000000000000","seoJobId": "sample-software-engineer--00000000-0000-0000-0000-000000000000","title": "Sample Software Engineer","url": "https://www.careerbuilder.com/job-details/sample--00000000-0000-0000-0000-000000000000","status": "ACTIVE","jobType": "FULL_TIME","promoted": false,"provider": "CareerBuilder","industry": "Software","company": "Sample Company","companyLogo": "https://media.example.com/logo.png","companyWebsite": "http://www.example.com","companyDescription": "A sample employer description.","companySize": "100 to 499 Employees","companyFoundingDate": "1998","companyLocation": "1 Main St, NY, US","location": "New York, NY, US","city": "New York","state": "NY","country": "US","latitude": 40.714,"longitude": -74.006,"isRemote": false,"jobLocationType": "ON_SITE","employmentType": "Full-time","salary": "USD 160,000 - 185,000 YEAR","salaryMin": 160000,"salaryMax": 185000,"salaryCurrency": "USD","salaryUnit": "YEAR","isSalaryExtracted": true,"snippet": "Short summary of the role.","description": "Full multi-paragraph job description text.","datePosted": "2026-01-01","dateRecency": "9 days ago","formattedDate": "Jan 1, 2026","createdDate": "2026-01-01T00:00:00Z","modifiedDate": "2026-01-01T00:00:00Z","applyType": "INTEGRATED","applyUrl": "https://apply.example.com/job/000","directApply": true,"isEligibleForExpertApply": false}
Plan Requirement
A residential proxy is required. CareerBuilder is protected by an anti-bot interstitial that refuses datacenter traffic, so a run needs a residential connection. The default is the Apify residential proxy group scoped to the United States, which needs a paid Apify plan; Apify free plans do not include residential proxies. On a free plan you can supply your own residential proxy URLs in the Proxy configuration field instead. If the residential connection is refused, the run logs this warning once and continues on a backup connection, where some pages may still be unavailable:
The selected connection is unavailable to this run.Apify free plans do not include residential proxies.Continuing on a backup connection; some pages may still be unavailable.For residential access, upgrade at https://apify.com/pricing or supply your own proxy URLs.
When the backup connection serves data, the log says "Served over the backup connection (the default connection was unavailable)."
FAQ
How much does it cost?
You are billed for each job returned, plus a separate detail-enrichment charge for each returned job that carries the full description: jobs enriched with Fetch full job details on, and any job-detail links pasted in URL mode (those always arrive complete). It is charged once per job, immediately after that job is delivered to the dataset (not at the end of the run), only for jobs actually returned, never for jobs suppressed by Incremental mode. The Pricing tab shows current rates. Use Max jobs to cap the cost of any run.
Is it legal to scrape CareerBuilder?
This actor collects only publicly available job-listing data. You are responsible for how you use it: follow CareerBuilder's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.
Can I get only new or changed jobs on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Later runs return only NEW, UPDATED and REAPPEARED jobs by default; unchanged jobs are not billed. EXPIRED is opt-in (emitExpired) and only appears after a full, uncapped, non-resumed scan, so don't expect it on a first run or a capped run. REAPPEARED can only follow such an expiry.
What's the difference between Resume and Incremental mode?
Resume continues one specific interrupted run from a run or dataset ID, so it never re-collects (or re-bills) what that run already got. Incremental mode is for running the same search again and again over time and getting only what changed since last time. Combining both on a search that already has tracked Incremental state is rejected; the run stops with a message asking you to remove one or set a different stateKey.
Why did my run fail instead of returning an empty dataset?
A run fails outright, with a clear status message, in these cases. (a) No results or job page could be loaded at all (nothing was scanned and every page request was refused or failed). The message depends on what happened: when the proxy connection is refused for the whole account it reads "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required: https://apify.com/pricing. If you entered your own proxy URLs, check that their credentials are valid."; on a free plan where residential proxies are unavailable and the backup connection also loaded no page it reads "No results: residential proxies are unavailable on this run (Apify free plans do not include them), and the backup connection could not load the requested CareerBuilder pages. Upgrade at https://apify.com/pricing or supply your own proxy URLs, then try again."; for any other case where every page request failed it reads "Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Please try again later." (b) An invalid resumeFromRunId that can't be resolved to a dataset. (c) resumeFromRunId combined with incrementalMode on a search that already has tracked state. A run finishes as a normal successful run, with an empty or small dataset and a status message explaining why, in these cases: (1) a search or link that matches nothing (the site answered with an empty list or "page not found"): "No jobs matched this search. Check the keywords/location or that the link opens a job list in a browser."; (2) a job link whose posting was removed or expired: it is skipped at once with the log warning "This job is no longer available (removed or expired)" and, if it was the only link, the same "No jobs matched this search." message; (3) every pasted link is an unsupported form: "Every link you pasted is an unsupported form; see the log for the supported link shapes."; (4) no keywords or links were entered: "No search keywords or links were provided, so nothing was searched."; (5) a Resume run where every job scanned was already collected: "No new jobs found: every job scanned was already collected."; (6) an incremental run where nothing changed: "Incremental mode: N job(s) scanned, nothing changed since the last run. Nothing to return.". Run it again in a few minutes if a run failed because nothing could be loaded.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push job summaries into Notion, Linear or Airtable.
๐ Want more jobs data?
Pair this actor with these related scrapers from the same team:
| ๐ผ ZipRecruiter Scraper From $1/1K. Scrape ZipRecruiter jobs with titles, companies, salaries, locations... | ๐ผ Totaljobs Scraper Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract... |
| ๐ผ Wellfound Jobs Scraper Scrape startup jobs from Wellfound.com by keyword, location, role, or remote status... | ๐ผ RemoteOK Jobs Scraper Scrape RemoteOK jobs by keyword or job URL. Extract title, company, location, remote... |
| ๐ผ StepStone.de Scrape StepStone.de jobs by keyword, location, filters, or URL. Extract 35+ fields... | ๐ผ Hiring.Cafe Jobs From $1/1K. Unlock powerful Hiring.Cafe job data extraction. Use advanced filters or URLs... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.