Dice Jobs Scraper - Tech Jobs by Keyword, No Login
Pricing
from $0.90 / 1,000 dice jobs
Dice Jobs Scraper - Tech Jobs by Keyword, No Login
Scrape Dice jobs, no login needed. Dice's filters need its own internal codes, not the labels on the cards. Ask for "Full-time" and you get zero jobs, so this translates. Per job: title, company, location, employment type. Also workplace type, posting age and apply URL. $0.90 per 1,000 jobs.
Pricing
from $0.90 / 1,000 dice jobs
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 hours ago
Last modified
Categories
Share
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, how old the posting is 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.
| Input | Keywords and locations, or Dice job URLs and ids |
| Output | One row per job |
| Ceiling | 1,000 jobs per run |
| Account needed | None, 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. Posting age, workplace type, employment type and Easy Apply all work that way.
employerTypes does too: pick Direct Hire to skip agencies, or Recruiter for agency roles only.
With it set you also get only the search results, not the similar jobs Dice shows beside them, since
those ignore it.
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}
| Field | Default | What it is |
|---|---|---|
searchQueries | box starts at python developer | Keywords or job titles. |
locations | box starts at New York, NY | Cities, states, countries or Remote. Every query runs against every location. |
jobUrls | empty | Dice job-detail URLs, fetched directly instead of searched for. |
jobIds | empty | Dice job ids, same idea. |
postedDate | any | any, today, 3d, 7d or 30d. |
workplaceType | any | any, remote, hybrid or onsite. |
employmentTypes | all types | FULLTIME, PARTTIME, CONTRACTS, THIRD_PARTY. Ordinary wording is translated. |
employerTypes | all | Direct Hire, Recruiter or Other: who posted the job, as Dice records it. Needs a search query. |
easyApply | off | Keep only jobs marked for easy application. |
includeDetails | off | Open each job page for its full description. |
maxItems | 100 | Unique jobs to return, up to 1,000. |
maxPagesPerSearch | 5 | Pages per query and location pair, up to 25. |
maxProxyRetries | 2 | How many times a refused request is retried on a different connection, up to 5. |
requestTimeoutSecs | 20 | Limit on each request, 5 to 60 seconds. |
countryCode | empty | Optional two-letter country code for the fallback connection. |
proxyConfiguration | none | Optional. 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": "5a9d2f08-7211-4a85-989c-4ad2d54ca7b9","title": "Urgent Opening - Senior Python Developer - NYC -NY - Hybrid","company": "SunRay Enterprise Inc","location": "New York, New York","workplaceType": "hybrid","employmentType": "Contract","postedAt": "Yesterday","description": null,"url": "https://www.dice.com/job-detail/5a9d2f08-7211-4a85-989c-4ad2d54ca7b9","searchQuery": "python developer","searchLocation": "New York, NY"}
| Field | What it is |
|---|---|
jobId | Dice's id for the posting. Use it to dedupe across runs. |
postedAt | Dice's own wording, such as Yesterday or 3 days ago. It is a phrase, not a date, and it is relative to when the run happened. |
description | null on the row above because full details were off. With them on it holds the job page text, up to 50,000 characters. |
workplaceType | remote, hybrid, on-site or null. Read from the card unless full details are on. |
employmentType | Dice'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, searchLocation | Exactly 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.
| Row | How to spot it | Charged |
|---|---|---|
| A job | _sample: false and _diagnostic: false | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on _sample and _diagnostic, not on ok. The sample row carries ok: true as well.
| Code | What it means |
|---|---|
BAD_INPUT | Every 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_RESULTS | The first page of that search was empty. The row names the query and location, so the other searches in the run carry on. |
BLOCKED | Dice refused the request. Re-run it, or slow it down with fewer pages. |
RATE_LIMITED | Too many requests too quickly. Lower maxPagesPerSearch. |
SERVER_ERROR | Dice answered 5xx. Usually passes. |
TIMEOUT | A request ran past requestTimeoutSecs. |
PARSE_ERROR | The page came back in a shape the parser did not recognise. Worth reporting. |
NETWORK | Dice was unreachable. Re-run it. |
PROXY_GROUP_IGNORED | A 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
- Open Dice Jobs Scraper and click Try for free.
- Put your keywords into Search queries and your cities into Locations. Use
Remoteas a location for remote roles. - Set Maximum jobs. Start around 50 to see the row shape.
- Narrow it with Posted date, Workplace and Employment types if you want, then click Start.
- 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 and jobs dropped by your filters 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
postedDateontodayso 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.
postedAtis a phrase, not a date. Convert it yourself if you need a timestamp, and remember it was relative to the run.- 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.
- Posting age is Dice's filter, not ours. The run only rejects results that are obviously older
than your window, so a
3dsearch can include something a few days past it. - 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 want | Use |
|---|---|
| US tech jobs from Dice | This one |
| Jobs across 11 countries with salary and apply URL | Indeed Jobs Scraper |
| Jobs posted on LinkedIn | LinkedIn Jobs Scraper |
| Startup roles with equity ranges | Wellfound Jobs Scraper |
| Jobs straight off companies' own career sites | Career 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.