Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Dice Jobs Scraper icon

Dice Jobs Scraper

Scrape Dice jobs: title, company, location, type, posting age and apply URL. Descriptions optional. No login. $0.90 per 1,000 jobs.

188 runs on Apify $0.0009 per Dice job ($0.9 / 1,000)
Run this in the cloudRun on Apify →

Job Market Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchQueries, locations, jobUrls (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0009 per Dice job = $0.9 per 1,000

You are charged forWhenPrice
Dice jobOne real, deduplicated Dice job result.$0.0009

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-04, and they are what you are actually charged.

Inputs

FieldWhat it doesType
searchQueriesDice keywords or job titles.array
locationsCities, states, countries, or Remote.array
jobUrlsPublic Dice job-detail URLs to collect directly.array
jobIdsDice job identifiers to collect directly.array
postedDateLimit search results by when each job was first posted. Today, 3 and 7 days are Dice's own filters. For 30 days each job's posting date is checked by the run, and older jobs are left out and not charged. Applies to searches, not to job URLs or IDs.string
workplaceTypeLimit results to remote, hybrid, or on-site roles.string
employmentTypesOptional. Restrict the search to these Dice employment types: FULLTIME, PARTTIME, CONTRACTS, THIRD_PARTY. Everyday labels such as "Full-time", "contract" or "corp-to-corp" are accepted and translated. Leave empty for all types.array
employerTypesOptional. Who posted the job, as Dice records it: Direct Hire (the company itself), Recruiter, or Other. Leave empty for all. It narrows searches, so it needs a search query.array
easyApplyKeep only jobs visibly marked for easy application.boolean
includeDetailsOpen each job page to collect its full public description.boolean
maxItemsMaximum number of unique jobs to return.integer
maxPagesPerSearchMaximum result pages requested for each search.integer
maxProxyRetriesHow many times to retry after a direct request is refused.integer
requestTimeoutSecsMaximum duration of each network request.integer
countryCodeOptional two-letter country code used for the fallback.string

What you get

A structured dataset — each result includes fields like:

titlecompanylocationworkplaceTypeemploymentTypepostedAtpostedDateurl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Job Market Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

SEEK Jobs Scraper iconJob Market Scrapers

SEEK Jobs Scraper

Scrape SEEK jobs in Australia and New Zealand: salary ranges, workplace type and full descriptions. No login. $0.81 per 1,000, flat at every volume.

Ready to run — no setup

Career Site Jobs Scraper iconJob Market Scrapers

Career Site Jobs Scraper

Scrape open jobs from a career page, a domain or a company name. Works with 10 ATS platforms. Get title, location, department and apply URL.

Ready to run — no setup

Internshala Scraper iconJob Market Scrapers

Internshala Scraper

Scrape Internshala internships and fresher jobs by keyword, city, category, stipend or work from home. Duration, apply-by date, openings. $0.34/1,000.

Ready to run — no setup

XING Jobs Scraper iconJob Market Scrapers

XING Jobs Scraper

Scrape XING jobs in Germany, Austria and Switzerland. Company, employment type, career level, posted date, apply URL and salary. $0.51 per 1,000 jobs.

1 use cases

ZipRecruiter Scraper iconJob Market Scrapers

ZipRecruiter Scraper

Scrape ZipRecruiter jobs by keyword, city, remote or salary. Exact posted dates, apply URLs, pay marked published or estimated. $0.80 per 1,000.

Ready to run — no setup

LinkedIn Company Employees Scraper iconJob Market Scrapers

LinkedIn Company Employees Scraper

Find a company's employees on LinkedIn, no login. Give a company URL or name. Get name, headline, job title, location and profile URL. $1.80 per 1,000.

1 use cases

See all Job Market Scrapers →

Dice Jobs Scraper: US tech job listings with the apply link, no login

Give it keywords and a location and it walks Dice's search results, returning one row per job: the title, the company, where it is, whether it is remote or hybrid, the employment type, the date it was first posted and the URL you apply on. You can also hand it job URLs or job ids directly.

Dice's own filters run on internal codes rather than the words printed on the cards. Ask its search for "Full-time" and you get nothing back. This translates the everyday wording for you, so Full-time, contract and corp-to-corp all work.

InputKeywords and locations, or Dice job URLs and ids
OutputOne row per job
Ceiling1,000 jobs per run
Account neededNone, and no Dice login
Price$0.90 per 1,000 jobs, flat on every plan

🔍 What Dice Jobs Scraper does

Every query is run against every location, so three keywords and two cities is six searches. Each one pages through Dice's results up to the page limit you set, and stops early when a page brings nothing new.

Filters go into the Dice URL, so the narrowing happens on their side rather than by throwing rows away afterwards. Workplace type, employment type, Easy Apply and the today, 3d and 7d windows all work that way. Dice stopped applying its 30-day window, so 30d is checked here against each job's own posting date, and older jobs are left out and not charged.

employerTypes goes to Dice too: pick Direct Hire to skip agencies, or Recruiter for agency roles only.

Every results page also lists a few similar jobs beside the results. They ignore your search and its filters, so they are always left out.

By default you get what the search card carries, which is fast. Switch on Fetch full details and each job's own page is opened for the complete description. That takes a request per job, so it is noticeably slower on a big run.

When details are on, the filters are checked a second time against the detail page. Dice cards sometimes label a job one way and the job page another, and a job that turns out not to match what you asked for is dropped rather than delivered.

📥 What you give it

{
  "searchQueries": ["python developer", "data engineer"],
  "locations": ["New York, NY", "Remote"],
  "employmentTypes": ["Full-time"],
  "postedDate": "7d",
  "maxItems": 300,
  "includeDetails": true
}
FieldDefaultWhat it is
searchQueriesbox starts at python developerKeywords or job titles.
locationsbox starts at New York, NYCities, states, countries or Remote. Every query runs against every location.
jobUrlsemptyDice job-detail URLs, fetched directly instead of searched for.
jobIdsemptyDice job ids, same idea.
postedDateanyany, today, 3d, 7d or 30d, counted from when the job was first posted. Searches only, not job URLs or ids.
workplaceTypeanyany, remote, hybrid or onsite.
employmentTypesall typesFULLTIME, PARTTIME, CONTRACTS, THIRD_PARTY. Ordinary wording is translated.
employerTypesallDirect Hire, Recruiter or Other: who posted the job, as Dice records it. Needs a search query.
easyApplyoffKeep only jobs marked for easy application.
includeDetailsoffOpen each job page for its full description.
maxItems100Unique jobs to return, up to 1,000.
maxPagesPerSearch5Pages per query and location pair, up to 25.
maxProxyRetries2How many times a refused request is retried on a different connection, up to 5.
requestTimeoutSecs20Limit on each request, 5 to 60 seconds.
countryCodeemptyOptional two-letter country code for the fallback connection.
proxyConfigurationnoneOptional. Your own servers, used exactly as given.

Run it with nothing filled in and you get one free sample row instead of an error. It is there so you can see the shape before committing to a real run.

📤 What you get back

A real row from a recent run:

{
  "ok": true,
  "_sample": false,
  "_diagnostic": false,
  "source": "dice",
  "jobId": "7015377a-0d8c-4367-86c2-c8de29fa55b8",
  "title": "Senior Python Developer",
  "company": "Randstad Digital",
  "location": "Jersey City, New Jersey",
  "workplaceType": null,
  "employmentType": "Contract",
  "postedAt": "Today",
  "postedDate": "2026-09-28T21:04:03Z",
  "description": null,
  "url": "https://www.dice.com/job-detail/7015377a-0d8c-4367-86c2-c8de29fa55b8",
  "searchQuery": "python developer",
  "searchLocation": "New York, NY"
}
FieldWhat it is
jobIdDice's id for the posting. Use it to dedupe across runs.
postedDateWhen the job was first posted, as Dice records it: an ISO 8601 date and time in UTC, such as 2026-09-28T21:04:03Z. The 30d window checks this same date. Jobs you give by URL or id take it from the job's own page. null when Dice gives no posting date for the job.
postedAtDice's own wording, such as Today or 6d ago, counted from when Dice last updated the posting, so it can say Today on a job first posted weeks ago. A phrase, not a date. Search rows only; jobs given by URL or id do not have it.
descriptionnull on the row above because full details were off. With them on it holds the job page text, up to 50,000 characters.
workplaceTyperemote, hybrid, on-site or null. Read from the card unless full details are on.
employmentTypeDice's display label, such as Contract or Full-time. With full details on it comes from the job page, which is the more reliable of the two.
searchQuery, searchLocationExactly what you typed for the search that found this job, so you can join rows back to your own list.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itCharged
A job_sample: false and _diagnostic: falseyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

Filter on _sample and _diagnostic, not on ok. The sample row carries ok: true as well.

To sort or filter by age, use postedDate, not postedAt.

CodeWhat it means
BAD_INPUTEvery URL or id you gave was unusable, and there was no search query to fall back on. Or employerTypes held a value Dice does not use, or was set without a search query.
NO_RESULTSThe first page of that search was empty, or with 30d none of its jobs was posted in the last 30 days. The row names the query and location, so the other searches in the run carry on.
BLOCKEDDice refused the request. Re-run it, or slow it down with fewer pages.
RATE_LIMITEDToo many requests too quickly. Lower maxPagesPerSearch.
SERVER_ERRORDice answered 5xx. Usually passes.
TIMEOUTA request ran past requestTimeoutSecs.
PARSE_ERRORThe page came back in a shape the parser did not recognise. Worth reporting.
NETWORKDice was unreachable. Re-run it.
PROXY_GROUP_IGNOREDA metered network group was requested in the input. This actor does not offer those, so it was ignored and the run carried on.

One failed search never stops the others, and a diagnostic row never fails the run.

▶️ How to run it

1. Open Dice Jobs Scraper and click Try for free. 2. Put your keywords into Search queries and your cities into Locations. Use Remote as a location for remote roles. 3. Set Maximum jobs. Start around 50 to see the row shape. 4. Narrow it with Posted date, Workplace and Employment types if you want, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Switch on Fetch full details when you need the description text. Leave it off when you only need titles, companies and apply links.

💰 How much does it cost?

$0.90 per 1,000 jobs. Flat on every Apify plan, no volume tiers.

You pay per job row delivered. The sample row, diagnostic rows, jobs already seen in the same run, jobs dropped by your filters and the similar jobs beside the results are all free, and turning on full details does not change the price.

💡 What people use it for

  • Watching a role and a city on a schedule, with postedDate on today so each run is only new

postings.

  • Pulling contract and corp-to-corp roles separately from permanent ones, which is the filter Dice

makes awkward.

  • Building a list of companies hiring for a skill, then working the list rather than the jobs.
  • Feeding descriptions into a model that has to match candidates to postings, with full details on.
  • Checking what a competitor is hiring for, by searching their name as a keyword.

🚧 What it does not do

  • US tech roles. That is what Dice is. It is not a general job board.
  • No salary field. Dice does not publish one consistently, so there is nothing reliable to give

you.

  • No guessed dates. If Dice gives no posting date for a job, postedDate is null.
  • Reposts are not merged. A job relisted under a new id looks like a new job, because to Dice it

is one.

  • Workplace type from a card is inferred from the card's wording, so a title with "Remote" in it

can be read as a remote job. Turn on full details when that distinction matters.

  • The 30-day window is ours, not Dice's. Each job's postedDate decides, whatever its card says.
  • 1,000 jobs per run.
  • Nothing is delivered until the searches finish. A run stopped partway through writes no job

rows.

  • No applying, no contact details, no recruiter emails.

🧭 Which jobs scraper do you need?

If you wantUse
US tech jobs from DiceThis one
Jobs across 11 countries with salary and apply URLIndeed Jobs Scraper
Jobs posted on LinkedInLinkedIn Jobs Scraper
Startup roles with equity rangesWellfound Jobs Scraper
Jobs straight off companies' own career sitesCareer Site Jobs Scraper

❓ Questions people ask

Do I need a Dice account? No. It reads the public search and the public job pages.

Why did asking for full-time jobs used to return nothing? Because Dice's search wants its own internal code, not the label on the card. Type the label here and it is converted before the request goes out.

Should I turn on full details? Only if you need the description. It adds a page fetch per job and makes a large run much slower, though it does not change what you pay.

Can I get just one job? Yes. Paste its URL into Direct job URLs, or its id into Direct job IDs.

Why is description empty? Full details were off. Card previews frequently carry no usable text.

Is scraping job listings legal? These are public postings on public pages. Job ads can contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the run ID and the query and location you used. The errorCode on the diagnostic row usually names the problem on its own.