# Dice Jobs Scraper - Search Tech Jobs by Keyword or URL (`confidential_gnat/dice-jobs-scraper`) Actor

Scrapes tech job listings from Dice (dice.com): title, company, location, employment type, salary, posted date, skills, remote status, full description and job link. Search by keyword, search URL or job URL.

- **URL**: https://apify.com/confidential_gnat/dice-jobs-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Dice Jobs Scraper - Search Tech Jobs by Keyword or URL

**Scrape tech job listings from Dice (dice.com)**: title, company, location, employment type, salary, posted date, skills, remote status, full job description and job link. Export the results as **JSON, CSV or Excel**, or call the actor as an **API**. Type a keyword or paste a Dice search URL, press Start, and get clean job data. Repeat runs skip jobs you already scraped, so you never pay twice for the same job, which makes this one of the **cheapest Dice jobs scrapers** to run on a schedule.

**Target website:** [dice.com](https://www.dice.com)

### ✨ Features of this Dice jobs scraper

- **Job listing extraction** — title, company, location, employment type, salary, posted date, remote and workplace type, easy apply flag and the job summary.
- **Full job details** — skills, full description (HTML and plain text), valid-through date and apply type for every job.
- **Pagination support** — keeps paging through search results until Max items is reached.
- **Keyword, URL and ID input** — search by keyword, paste a Dice search URL with filters, or pass single job URLs and job IDs.
- **Incremental runs, no repeat charges** — with a cache project name, jobs and URLs you already scraped are skipped on every later run, so you never pay for the same job twice and scheduled runs return only new jobs.
- **Proxy support** — optional Apify Proxy, off by default.
- **No browser required** — plain HTTP requests keep runs fast and cheap.

### 🚀 How to scrape Dice jobs in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a keyword, search URL or job URL is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Dice jobs scraper pricing

This actor uses **pay-per-result** billing: you pay for each job saved to the dataset.

- New Apify accounts include **$5 of free monthly credit**.
- The actor uses plain HTTP requests, so it costs significantly less to run than browser-based scrapers.
- The proxy is disabled by default; leaving it off keeps runs cheapest.
- Jobs skipped by the cache are not charged. Reuse the same **Cache project name** across runs and the same URLs are never scraped (or billed) again, so repeated and scheduled runs cost only for genuinely new jobs, which can make this the cheapest way to track Dice jobs.

### 🔧 Dice jobs scraper input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Search keywords (`keywords`) | array | — | `["typescript"]` (prefill) | Job titles or skills to search for. Each keyword is searched separately. |
| Search or job URLs (`startUrls`) | array | — | — | Dice search result URLs with filters applied, or single job URLs. A page number in a search URL is the page the search starts from. |
| Job IDs (`jobIds`) | array | — | — | Dice job IDs to scrape directly. |
| Scrape full job description (`scrapeDetails`) | boolean | — | `true` | Open every job page for the description, skills, validity date and apply type. Turn off for faster runs with the search summary only. |
| Cache project name (`cacheProjectName`) | string | — | — | Use the same name on each run to get only new jobs. Cached jobs are skipped, not charged and not counted towards Max items. Records get `changeType: new`. |
| Max items per search (`maxItems`) | integer | — | `5` | Maximum unique jobs saved for each keyword or search URL. |
| Max concurrency (`maxConcurrency`) | integer | — | `5` | How many requests run in parallel. |
| Proxy configuration (`proxyConfiguration`) | object | — | no proxy | Works without a proxy. Enable Apify Proxy only if you get blocked. |

**Supported URL types:**

- Search: `https://www.dice.com/jobs?q=typescript&radius=30&radiusUnit=mi`
- Search starting at a page: `https://www.dice.com/jobs?q=typescript&page=2`
- Job: `https://www.dice.com/job-detail/f9b02b33-d1be-43cb-84bc-96648ee1b08c`

![Dice jobs scraper input form with the search keywords, search or job URLs, job IDs, full description and cache project name fields marked 1 to 5](https://i.postimg.cc/HL6H3LHs/image.png)

In the screenshot above:

1. **Search keywords** — job titles or skills, such as `python`.
2. **Search or job URLs** — Dice search result URLs or single job URLs.
3. **Job IDs** — Dice job IDs to scrape directly.
4. **Scrape full job description** — tick to open every job page for the full details.
5. **Cache project name** — reuse the same name on each run to get only new jobs.

### 📦 Dice jobs scraper output data

The actor saves one JSON record per job with these fields: `id`, `url`, `title`, `companyName`, `companyLogoUrl`, `companyProfileUrl`, `employerType`, `location`, `city`, `state`, `country`, `isRemote`, `workplaceTypes`, `employmentType`, `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `postedAt`, `modifiedAt`, `validThrough`, `easyApply`, `applyType`, `skills`, `summary`, `descriptionHtml`, `description`, `scrapedAt` and, when caching is on, `changeType`.

There is 1 output view. **Overview** is a compact table with the id, title, company, location, workplace type, employment type, salary, posted date, skills, change type and job link.

**Output at a glance:**

| Job | Company | Location | Type | Salary | Posted |
| --- | ------- | -------- | ---- | ------ | ------ |
| [Backend Software Engineer, TypeScript / Node.](https://www.dice.com/job-detail/381aa969-85b2-4127-bf1a-34f8cbc11d7e) | Jobot | New York, New York, USA | Full-time | USD 185,000.00 - 225,000.00 per year | 2026-10-09 |
| [Senior Full-Stack Software Engineer, TypeScri](https://www.dice.com/job-detail/a7be780f-75dc-460c-a264-46499d8e3b9e) | Jobot | San Francisco, California, USA | Full-time | USD 190,000.00 - 250,000.00 per year | 2026-10-09 |
| [Full-stack Engineer 4 (Manager, IC - Node.js,](https://www.dice.com/job-detail/52660b7f-2798-4909-9a8e-96aeab632017) | Capital One | McLean, Virginia, USA | Full-time | USD 197,300.00 - 225,100.00 per year | 2026-09-26 |
| [Full-stack Engineer 4 (Manager, IC - Python, ](https://www.dice.com/job-detail/56bfa0f0-8d70-4033-8bde-f962d9919761) | Capital One | McLean, Virginia, USA | Full-time | USD 197,300.00 - 225,100.00 per year | 2026-10-02 |
| [Full-stack Engineer 5 (Senior Manager, IC - A](https://www.dice.com/job-detail/c4eef5b1-fff7-4d16-ab26-14a941f151a6) | Capital One | McLean, Virginia, USA | Full-time | USD 229,900.00 - 262,400.00 per year | 2026-10-02 |

**Sample output (raw JSON, long fields shortened for this page):**

```json
{
  "id": "381aa969-85b2-4127-bf1a-34f8cbc11d7e",
  "url": "https://www.dice.com/job-detail/381aa969-85b2-4127-bf1a-34f8cbc11d7e",
  "title": "Backend Software Engineer, TypeScript / Node.js",
  "companyName": "Jobot",
  "companyLogoUrl": "https://d3qscgr6xsioh.cloudfront.net/RVkPsbuFScmLFloqItyr_transformed.png?format=webp",
  "companyProfileUrl": "https://www.dice.com/company-profile/1fe51e5d-d563-4d82-9928-351f47c55576",
  "employerType": "Recruiter",
  "location": "New York, New York, USA",
  "city": "New York",
  "state": "New York",
  "country": "USA",
  "isRemote": false,
  "workplaceTypes": ["On-Site"],
  "employmentType": "Full-time",
  "salaryText": "USD 185,000.00 - 225,000.00 per year",
  "salaryMin": 185000,
  "salaryMax": 225000,
  "salaryCurrency": "USD",
  "postedAt": "2026-10-09T14:17:15Z",
  "modifiedAt": "2026-10-11T14:18:39Z",
  "validThrough": "2026-11-11T15:18:39.000Z",
  "easyApply": false,
  "applyType": "External",
  "skills": ["Startups", "Management", "Finance", "Collaboration", "IT Strategy", "IT Management"],
  "summary": "Build the backend infrastructure powering production AI agents at a growing fintech startup. ...",
  "descriptionHtml": "<strong>Build the backend infrastructure powering production AI agents ...</strong><br /><br />This Jobot Job is hosted by: Sean Pool<b...",
  "description": "Build the backend infrastructure powering production AI agents at a growing fintech startup. ...",
  "scrapedAt": "2026-10-11T15:40:50.153Z"
}
```

### 🐍 How to scrape Dice with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/dice-jobs-scraper").call(run_input={
    "keywords": ["typescript"],
    "maxItems": 5,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/dice-jobs-scraper').call({
    keywords: ['typescript'],
    maxItems: 5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~dice-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["typescript"], "maxItems": 5}'
```

### 💡 What you can use Dice jobs data for

- Tracking demand for programming languages, frameworks and certifications
- Salary benchmarking for contract and full-time tech roles
- Feeding job boards or newsletters with fresh tech openings
- Recruiter and staffing market research by company and employer type
- Monitoring remote, hybrid and on-site hiring trends

Recruiters, staffing agencies, job aggregators, HR analysts and tech career platforms use this data to follow the IT job market.

### ⚠️ Limitations of the Dice jobs scraper

- **Salary** — many jobs show text such as "Depends on Experience"; in that case `salaryMin` and `salaryMax` are `null` and only `salaryText` is filled.
- **Remote jobs** — remote jobs often have no city, state or country, so those fields are `null`.
- **Search depth** — Dice limits how far a single search can page; use more specific keywords or filters to reach other jobs.
- **Expired jobs** — a job URL or ID that no longer exists is skipped with a warning.

### ❓ Frequently asked questions

#### Can I scrape Dice legally?

The actor only collects job data that is publicly visible on dice.com — no login, paywall or private content is accessed. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with Dice's Terms of Service and applicable laws such as GDPR and CCPA if personal data is involved.

#### What data does the Dice scraper return?

Every job has its title, company, location, employment type, salary, posted date, remote and workplace type, summary and job link. With **Scrape full job description** on, you also get skills, the full description in HTML and text, the valid-through date and the apply type.

#### How many jobs can I scrape from one Dice search?

**Max items per search** limits the unique jobs saved for each keyword or search URL, not for the whole run. The actor pages through the results (30 jobs per page) until it reaches that number or the results end.

#### Do I need a proxy to scrape dice.com?

No. The input defaults to no proxy, which is the cheapest option. If you get blocked on a large run, enable Apify Proxy in the proxy configuration.

#### How do I scrape Dice with Python?

Use the Python example above: call the actor with `apify-client` and iterate over the dataset items.

#### Can I run this Dice scraper on a schedule, and is it the cheapest option?

Yes, use Apify Schedules. Set the same **Cache project name** on every scheduled run and the actor skips jobs it already saved, so each run returns only new jobs, marked with `changeType: new`.

It is built to be cheap. With a **Cache project name** set, every later run skips jobs it has already saved, so the same URLs are never scraped again and you are only charged for new jobs. Combined with plain HTTP requests and no proxy by default, repeated runs stay very cheap.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why is the salary empty for some Dice jobs?

Many Dice employers do not publish a number and write "Depends on Experience" instead. The text is kept in `salaryText`, and `salaryMin` and `salaryMax` stay `null`.

### 🔗 Other actors you may find useful

| Actor | Description |
| ----- | ----------- |
| [💼 HiringCafe Jobs Scraper](https://apify.com/confidential_gnat/hiringcafe-jobs-scraper) | Scrapes job listings from HiringCafe by keyword, search URL or job URL. |
| [📧 Decision Maker Email Finder](https://apify.com/confidential_gnat/decision-maker-email-finder) | Finds founders, executives and department heads at any company website. |
| [🏢 BBB Business Info and Emails Scraper](https://apify.com/confidential_gnat/bbb-business-scraper) | Scrapes Better Business Bureau businesses: contacts, rating and reviews. |
| [📰 Google News AI Scraper](https://apify.com/confidential_gnat/google-news-ai-scraper) | Searches Google News by keyword with optional full text and AI summaries. |
| [📊 Sentiment Analysis Using Jev](https://apify.com/confidential_gnat/sentiment-analysis) | Classifies text as positive, negative, neutral or mixed, or into custom labels. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/dice-jobs-scraper/issues/open) or reach out via the [Apify Community Forum](https://community.apify.com/).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills to search for, for example python, data engineer. Each keyword is searched separately.

## `startUrls` (type: `array`):

Dice search result URLs (with filters already applied, for example https://www.dice.com/jobs?q=typescript\&radius=30\&radiusUnit=mi) or single job URLs, for example https://www.dice.com/job-detail/f9b02b33-d1be-43cb-84bc-96648ee1b08c. A page number in a search URL is the page the search starts from.

## `jobIds` (type: `array`):

Dice job IDs to scrape directly, for example f9b02b33-d1be-43cb-84bc-96648ee1b08c.

## `scrapeDetails` (type: `boolean`):

Open every job page to get the full description, skills, validity date and apply type. Turn off for faster runs with the search summary only. Job URLs and IDs always include the details.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new jobs. Jobs already scraped under this name are skipped and not charged, and they do not count towards Max items. Each record gets changeType: new.

## `maxItems` (type: `integer`):

Maximum unique jobs saved for each keyword or search URL.

## `maxConcurrency` (type: `integer`):

How many requests run in parallel.

## `proxyConfiguration` (type: `object`):

This website works without a proxy. Enable Apify Proxy only if you get blocked.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "startUrls": [],
  "jobIds": [],
  "scrapeDetails": true,
  "maxItems": 5,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "python"
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/dice-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["python"],
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/dice-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "python"
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call confidential_gnat/dice-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,confidential_gnat/dice-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Bq3bJSuT2zKf5JVey/builds/7iBVpC3vw5p1hCZwx/openapi.json
