Dice Jobs Scraper | Tech Hiring Change Feed avatar

Dice Jobs Scraper | Tech Hiring Change Feed

Pricing

from $0.06 / 1,000 saved dice job or change rows

Go to Apify Store
Dice Jobs Scraper | Tech Hiring Change Feed

Dice Jobs Scraper | Tech Hiring Change Feed

Search Dice tech jobs or supply job URLs. Export available descriptions, salary and skills, then track changes across runs. Fields and coverage depend on Dice.

Pricing

from $0.06 / 1,000 saved dice job or change rows

Rating

0.0

(0)

Developer

Eli J

Eli J

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Categories

Share

What you can export

Use this Dice jobs scraper for technology recruiting and hiring research. Search by keywords and location, or supply job URLs, to export job identities, available descriptions, salary information, skills and employer context.

Optional incremental mode reports changes across runs. Source fields vary by listing, and observed disappearance is subject to the completion safeguards described below.

Try the example input

{
"queries": [
"python developer"
],
"maxResults": 30
}

The form prefills that example. API input {}, omitted queries, null queries or empty input lists produce no rows and exit successfully with guidance. A startUrls array replaces generated queries; an explicit empty array means no work. Invalid inputs and unreadable jobs are stored in the run's ERRORS record and never sold as dataset rows.

Input

FieldTypeDefaultWhat it does
queriesarrayForm prefill ["python developer"]One or more keywords. Omitted, null or [] produces no generated searches.
locationstring""Single city, state or country. Used when locations is omitted.
locationsarray—Multiple locations combined with every query. [] generates no searches.
startUrlsarray—Dice search, keyword SEO or job-detail HTTPS URLs. When supplied, replaces queries; [] means no work.
maxResultsintegerForm prefill 30; API 100Total emitted row limit, 0–10000. 0 is unlimited, including change rows.
maxResultsPerSourceinteger0Emitted jobs per input source. 0 is unlimited.
maxPagesinteger0Pages per search source. 0 continues until the source ends or repeats.
pageSizeinteger30Requested page size, 1–100. Dice may use its own page size.
radiusinteger30Location radius in the selected distance unit; 0 is passed through.
unitstring"mi"Distance unit: mi or km.
postedDatestring"ANY"ANY, ONE, THREE, SEVEN, FOURTEEN or THIRTY. 14/30 days are filtered locally by source posting time.
employmentTypearray[]Employment filters: FULLTIME, PARTTIME, CONTRACTS, THIRD_PARTY.
employerTypearray[]Employer filters: Direct Hire, Recruiter, Other.
workplaceTypesarray[]Workplace filters: Remote, Hybrid, On-Site.
includeRemotebooleantrueInclude remote jobs; false excludes them in generated searches unless workplaceTypes is selected, which takes precedence.
easyApplybooleanfalseOnly Easy Apply jobs in generated searches when true.
willingToSponsorbooleanfalseOnly sponsorship jobs in generated searches when true.
includeDetailsbooleantrueRead full detail pages. false uses search summaries; direct job URLs still read the detail.
includeCompanyProfilebooleanfalseRead public employer overview and company metadata when an ID is available; missing values stay null.
compactbooleanfalseEmit core identity, title, employer, location, salary, dates and URLs only.
descriptionMaxLengthinteger0Maximum characters per description representation; 0 keeps full descriptions.
descriptionFormatstring"all"all, text, html or markdown. Markdown uses plain text, which is valid Markdown.
excludeEmptyFieldsbooleanfalseRemove top-level nulls, empty strings and empty arrays.
incrementalModebooleanfalsePersist a scoped baseline and emit NEW, UPDATED and REAPPEARED jobs.
stateKeystring""Stable tracker key; omitted derives one from sources, detail/profile mode and local date filter. Serialize runs using a shared key.
emitUnchangedbooleanfalseAlso emit UNCHANGED jobs in incremental mode.
emitExpiredbooleanfalseEmit EXPIRED jobs only after a fully traversed successful scan; caps, failures and clamps suppress expiration.
skipRepostsbooleanfalseSuppress a new identity with content matching a tracked inactive job.
maxConcurrencyinteger30Concurrent detail reads, 1–40. Higher values need measured target and memory headroom.
maxRetriesPerRequestinteger3Retries after the first request, 0–8. Classified failures rotate to a fresh session.
rotateAfterRequestsinteger48Proactive session retirement request count; 0 disables proactive retirement.
maxRunSecondsinteger240HTTP work budget in seconds, 1–86400. Partial traversal is recorded in RUN_STATS.
proxyConfigurationobject—Omitted starts direct and uses Apify StaticUS3 datacenter fallback after HTTP 403/429 or a recognized challenge. Explicit settings are passed to the SDK and disable automatic fallback.

Filters apply to generated searches. Pasted search URLs retain their filters and page number. When workplaceTypes is selected, Dice gives that selection precedence over includeRemote: its effective includeRemote setting is true for selections containing Remote and false for Hybrid or On-Site alone. A job can list several workplace types. The Actor verifies the echoed workplace filter and the effective source setting. A pasted job URL reads that job even when includeDetails is false. Radius and units are sent to Dice's public search page; location resolution is performed by Dice. Unknown or missing sponsorship and location values remain null.

Examples

Search batches across the United States and Canada:

{"queries":["python developer","data engineer"],"locations":["Austin, TX, USA","Toronto, ON, Canada"],"maxResults":100,"maxPages":3}

Remote jobs posted recently:

{"queries":["java developer"],"postedDate":"SEVEN","workplaceTypes":["Remote"],"employmentType":["FULLTIME"],"maxResults":50}

Paste a search URL or a current job URL:

{"startUrls":["https://www.dice.com/jobs?q=data+engineer&location=Toronto%2C+ON%2C+Canada"],"maxResults":20}

Track a query on repeat runs:

{"queries":["python developer"],"maxResults":100,"incrementalMode":true,"stateKey":"python-hiring"}

Search summaries and compact output:

{"queries":["python developer"],"includeDetails":false,"compact":true,"maxResults":20}

Output

Every normal row describes one identified job, with recordType and type equal to job. The GUID in id is the stable deduplication key; jobId is Dice's separate legacy identifier. All listed normal fields are emitted, including nulls for unavailable data. Change-feed fields appear only in incremental mode. Compact mode and description selection deliberately reduce the fields. Results are in the default dataset and can be exported through Apify as JSON, CSV or Excel.

GroupFields
Stable identityrecordType, type, id, jobKey, guid, dice_id, jobId, positionId, position_id, identity
Job and companytitle, company, companyName, companyProfileId, clientBrandId, companyPageUrl, companyUrl, companyLogoUrl, companyProfile, entities, media
Location and workplacelocation, jobLocation, postalCode, applicantLocationRequirements, sourceCountry, employmentType, employmentTypeStructured, employerType, workplaceTypes, workSetting, isRemote, workFromHomeAvailability
Salarysalary, salaryText, salaryMin, salaryMax, salaryCurrency, salaryUnit, pricing
Application and contactseasyApply, willingToSponsor, applyType, applyUrl, contactName, skills, extractedEmails, extractedPhones, extractedUrls, socialProfiles, attributes, availability
Descriptionssummary, description, descriptionHtml, description_text, description_html, descriptionMarkdown, descriptionLength, content
Source timespostedDate, posted, postDate, modifiedDate, updated, validThrough, timestamps
Source and search contexturl, canonicalUrl, detailsPageUrl, portalUrl, source, sourceDomain, sourceUrl, searchUrl, searchQuery, searchId, searchPage, searchPageSize, searchSortBy, searchIncludeRemote, score, isSponsored, isFeatured, detailFetched, contentQuality, fetchedAt, scrapedAt, source_context
Change feedchangeType, isRepost, repostOfId, repostDetectedAt

salaryMin and salaryMax preserve source values, including nonnumeric placeholders such as "Depends on Experience". Only numeric values are usable as amounts; check salaryCurrency and salaryUnit (such as HOUR or YEAR) separately. A null unit means Dice did not supply one; the Actor does not guess it from an unlabelled amount. descriptionLength is the full plain-text character count before optional truncation. score is Dice's source relevance score, with no normalization. Search page numbers and page sizes count source pages and source records. Times preserve source ISO values; scrapedAt and fetchedAt are UTC extraction timestamps. Unknown booleans remain null.

The grouped identity, source_context, content, entities, media, pricing, timestamps, attributes and availability objects carry the corresponding identity, discovery, job, company, salary, time and application data. Structured location is in jobLocation; location stays a readable string. Contacts and URL arrays contain only matches found in the public description. Company profile links are passed through. With includeCompanyProfile, companyProfile contains the public employer ID, legacy_company_id, company_info (name, website, founded, employees, categories, office policy, account type, logo, locations and social media), general_information (overview HTML and header), technologies, company_technologies and overviewText. These fields can be null. An unavailable profile adds an ERRORS record while retaining the independently identified job.

Legacy field mapping

Snake-case names map to canonical fields: company_page_url → companyPageUrl, company_name → companyName, company_logo_url → companyLogoUrl, job_id → jobId, posted_date → postedDate, modified_date → modifiedDate, salary_min/salary_max → salaryMin/salaryMax, and description_text/description_html retain their spellings. Grouped location.formatted_location → location; location.locality, region, country and postal code → jobLocation.addressLocality, addressRegion, addressCountry and postalCode when the detail source supplies them. Summary location parts use Dice’s original keys in jobLocation. The grouped identity, content, entities, media, pricing, timestamps, attributes and availability fields are retained as documented above.

Change tracking

The first run emits NEW jobs and stores a baseline in a named key-value store. Repeat runs compare stable job identities and observable content, ignoring retrieval times, search IDs and optional employer-profile enrichment. Stable source job fields drive updates, including remote status, employer type, applicant location and contact name. Employer-profile-only changes do not create job change events. Default output includes NEW, UPDATED and REAPPEARED records. emitUnchanged includes UNCHANGED records. A new identity matching an inactive job’s role content can identify a repost; a previously tracked identity returning is REAPPEARED. skipReposts suppresses its output.

EXPIRED means an earlier job was absent from a fully traversed, successful scan of the same searches after local date filtering. It is a search-scope observation, not proof that a vacancy closed. Failures, page clamps, row/page limits and time limits suppress expiration. State changes for emitted rows follow successful delivery; a row rejected at the customer's charge limit is not acknowledged. Run one tracker at a time per state key. Changing its source universe, detail/profile mode or local date filter requires another key.

Coverage and limits

Dice can widen the search radius when no jobs match. A response reporting zero jobs, zero total results and zero pages is accepted as an empty answer with guidance. A populated response whose reported radius differs from the requested radius is rejected; widened jobs are not presented as matching that radius.

The Actor reads public Dice search and job-detail pages without a Dice account. US and Canada locations are supported by the page route; exact results depend on Dice. Some search windows clamp or repeat deep pages. The Actor detects this, records the incomplete scan in ERRORS/RUN_STATS, and stops that source. Partition large collections by keyword, location or posted date; it makes no claim to a complete global Dice census or a guaranteed row count.

When proxyConfiguration is omitted, requests start direct and use concurrent requests with fresh-session retries for source errors, blocks and rate limits. HTTP 403/429, or a 200 response whose parsing fails with the recognized Just a moment challenge title, activates datacenter fallback within the remaining HTTP work budget; explicit proxy settings, including useApifyProxy false, disable automatic fallback. The log records fallback activation once per run. Concurrent failures on the same retired session share a fresh retry session. A 404/410 job is an unresolved input rather than a paid result. Completed jobs are saved in batches; only the delivered prefix advances feed state when a charge limit truncates a batch. Work already in flight is cancelled when the charge limit binds. The log reports aggregate concurrent HTTP seconds by warm-up, search, detail, company, session wait and retry wait, plus classified retry counts. RUN_STATS records delivered rows, request count, decoded response-body bytes and whether source traversal completed; these bytes are not a proxy billing meter. Zero-result searches finish successfully. Only a run where all attempted work failed is marked failed.

Dice's robots file disallows query searches. Its terms restrict automated retrieval. Review the current source terms for your use. This Actor is independent of Dice. Salary, description, sponsorship, company and contact completeness varies by listing; missing data is never fabricated.

The transport reuses HTTP/1.1 sessions and reads only requested pages, with an eight-second request wait before classified retry within the overall work budget. The warm-up timing category is zero because no extra homepage request is made.

Runs support 256–4096 MB in Apify's run settings. Memory also determines CPU allocation: 1024 MB supplies one quarter of a CPU core and 4096 MB supplies one full core.

Billing and support

Apify's synthetic apify-actor-start event is charged once up to 1024 MB and once per additional gigabyte (2048 MB: two units; 4096 MB: four). The custom processing event remains once per run at every memory allocation.

The listing's pay-per-event prices apply to the platform's start event, saved result rows and one dice-run-processing event per run, including empty or invalid-input runs. This processing event covers run initialization; its price is set by the listing. The Actor stops before fetching if the processing fee cannot be charged or no result row remains affordable, and also stops when result delivery reaches the limit. If processing initialization raises an error, the run fails with a reason in ERRORS before collecting jobs. Error records are kept out of the dataset. No notification delivery or account access is included. Use Apify's Issues tab for support and include your input, run URL and an example of the expected record.