# Dice Tech Jobs Scraper (`devilscrapes/dice-tech-jobs-scraper`) Actor

Scrape tech job postings from Dice.com — filter by keyword, location and radius, skill, or employment type. Get one normalized row per job with title, company, location, employment type, and optional skill tags, ready for CSV, JSON, or API export.

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

## Pricing

from $0.80 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Dice Tech Jobs Scraper

**💰 $2.01 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Scrape tech job postings from Dice.com — filter by keyword, location and radius, skill, or employment type. Get one normalized row per job with title, company, location, employment type, and optional skill tags, ready for CSV, JSON, or API export.

Built for tech recruiters, sourcers, and DevOps hiring pipelines that need fresh Dice listings without babysitting a browser.

</div>

***

### 🎯 What this scrapes

Dice is a dedicated tech-job board listing developer, DevOps, data, and IT-contract roles that general job boards often miss. This Actor searches Dice's own listings and writes one structured row per posting: title, company, location, employment type, a remote flag, and (optionally) the skill tags Dice attaches to each role. Filter by keyword, location + radius, skill, or employment type — or leave everything blank to pull the newest postings site-wide.

### 🔥 What we handle for you

- 🛡️ **We rotate browser fingerprints** — `curl-cffi` impersonation (Chrome / Firefox / Safari) so the target sees real-browser TLS, not Python.
- 🌐 **We rotate residential proxies** through Apify Proxy on every block — fresh session ID, fresh exit IP.
- 🔁 **We retry with exponential backoff** on `408 / 429 / 5xx` and honour `Retry-After` — up to 5 attempts per page.
- 🧱 **Rate-limit-aware pacing** — when the target pushes back, we slow down instead of getting banned.
- 🧊 **We keep the dataset clean** — Pydantic-validated rows, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 **Pay-Per-Event pricing** — you only pay for results that hit your dataset. No data, no charge.

### 💡 Use cases

- **Tech recruiting pipelines** — pull fresh Dice postings that match a role profile into your ATS or sourcing sheet.
- **Market-rate research** — aggregate published salary/rate text by skill and location to benchmark comp bands.
- **Contract/DevOps sourcing** — filter by Employment type to isolate Contract and Third Party roles Dice specializes in.
- **Remote-role monitoring** — track newly posted remote tech jobs across a keyword or skill on a schedule.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Fill in the input form — most fields have sensible defaults.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 🔌 Integrate it

Pull results straight into a script with the Apify Python client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("DevilScrapes/dice-tech-jobs-scraper").call(
    run_input={"keyword": "python developer", "location": "Austin, TX"}
)
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["company"], job["apply_url"])
```

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `keyword` | `string` | no | 'Python Developer' | Free-text search term matched against job titles and descriptions. Leave empty to browse all postings. |
| `location` | `string` | no | 'Austin, TX' | City, state, or ZIP to center the search on, e.g. 'Austin, TX'. Leave empty to search nationwide. |
| `skill` | `string` | no | '—' | Single skill or technology to filter by, e.g. 'Kubernetes'. Leave empty to skip skill filtering. |
| `radius` | `integer` | no | 30 | Search radius in miles around Location. Ignored when Location is empty. |
| `includeRemote` | `boolean` | no | True | Include postings Dice tags as remote-eligible in addition to the Location + Radius match. |
| `employmentType` | `string` | no | '—' | Filter by employment type. Leave empty to include all types. |
| `fetchSkills` | `boolean` | no | False | When enabled, fetch each job's full skill-tag list from its detail page. Adds one extra request per job. |
| `maxResults` | `integer` | no | 100 | Hard cap on dataset rows for this run. |
| `proxyConfiguration` | `object` | no | {'useApifyProxy': True} | Apify Proxy configuration. Standard (non-residential) group by default — override here if you need a different group. |

#### Example input

```json
{
  "keyword": "python developer",
  "location": "Austin, TX",
  "radius": 30,
  "includeRemote": true,
  "maxResults": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

### 📤 Output

Every row is one dataset item.

| Field | Type | Notes |
|---|---|---|
| `job_id` | `string` | Dice internal job ID — stable across runs. |
| `title` | `string` | Job title. |
| `company` | `string` | Hiring company name. |
| `location_display` | `string` | Raw location string as shown on the listing. |
| `is_remote` | `boolean` | True when Dice tags the posting as remote-eligible. |
| `workplace_types` | `array` | e.g. `["On-Site"]`, `["Remote"]`, `["Hybrid"]`. |
| `employment_type` | `['string', 'null']` | 'Full-time' / 'Contract' / 'Third Party' as tagged by Dice; null if not shown. |
| `employer_type` | `['string', 'null']` | e.g. 'Direct Hire' / 'Recruiter'; null if not shown. |
| `easy_apply` | `boolean` | True when Dice's one-click Easy Apply is available. |
| `skills` | `array` | Skill tags; populated only when Fetch skill tags is enabled, else \[]. |
| `posted_date` | `string` | ISO-8601 posting timestamp as tagged by Dice. |
| `modified_date` | `['string', 'null']` | ISO-8601 last-modified timestamp; null if not shown. |
| `summary` | `['string', 'null']` | Truncated job summary snippet. |
| `description_full` | `['string', 'null']` | Full description; populated only when Fetch skill tags is enabled. |
| `apply_type` | `['string', 'null']` | e.g. 'External'; populated only when Fetch skill tags is enabled. |
| `salary_text` | `['string', 'null']` | Raw salary/rate string as published; null when Dice doesn't show one. |
| `apply_url` | `string` | Canonical Dice job-detail URL. |
| `scraped_at` | `string` | ISO-8601 UTC row-construction timestamp. |

#### Example output

```json
{
  "job_id": "b4b1e2f7c9",
  "title": "Senior Python Developer",
  "company": "Example Tech Inc.",
  "location_display": "Austin, TX",
  "is_remote": true,
  "workplace_types": ["On-Site"],
  "employment_type": "Full-time",
  "employer_type": "Direct Hire",
  "easy_apply": true,
  "skills": [
    "Python",
    "Django",
    "AWS"
  ],
  "posted_date": "2026-07-30T00:00:00+00:00",
  "salary_text": "$120,000 - $150,000",
  "apply_url": "https://www.dice.com/job-detail/b4b1e2f7c9",
  "scraped_at": "2026-08-01T14:00:00+00:00"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.01 | One-off warm-up charge per run |
| `result` | $0.002 | Per dataset item |

Example: 1 000 results at the rates above ≈ **$2.01**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

v1 covers Dice.com's US tech-job listings surface only — the DHI-owned ClearanceJobs/eFinancialCareers properties are separate sites and out of scope. Skill tags, full descriptions, and apply\_type require Fetch skill tags (one extra request per job). posted\_date and modified\_date are the raw ISO-8601 values Dice itself publishes at list level — we don't infer or estimate a date when Dice doesn't supply one.

### ❓ FAQ

**Do I need a Dice account or API key?**

No. This Actor scrapes Dice's own publicly listed job postings — no login, no API key.

**What happens if I leave every filter blank?**

The Actor pulls the newest postings site-wide, up to Max results.

**Does skills always populate?**

Only when Fetch skill tags is enabled; each job then costs one extra detail-page request. Otherwise skills is an empty list.

**Why is salary\_text sometimes null?**

Dice doesn't require employers to publish a salary or rate — we surface the raw text only when the listing shows one, never an estimate.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

## `keyword` (type: `string`):

Free-text search term matched against job titles and descriptions. Leave empty to browse all postings.

## `location` (type: `string`):

City, state, or ZIP to center the search on, e.g. 'Austin, TX'. Leave empty to search nationwide.

## `skill` (type: `string`):

Single skill or technology to filter by, e.g. 'Kubernetes'. Leave empty to skip skill filtering.

## `radius` (type: `integer`):

Search radius in miles around Location. Ignored when Location is empty.

## `includeRemote` (type: `boolean`):

Include postings Dice tags as remote-eligible in addition to the Location + Radius match.

## `employmentType` (type: `string`):

Filter by employment type. Leave empty to include all types.

## `fetchSkills` (type: `boolean`):

When enabled, fetch each job's full skill-tag list from its detail page. Adds one extra request per job.

## `maxResults` (type: `integer`):

Hard cap on dataset rows for this run.

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

Apify Proxy configuration. Standard (non-residential) group by default — override here if you need a different group.

## Actor input object example

```json
{
  "keyword": "Python Developer",
  "location": "Austin, TX",
  "radius": 30,
  "includeRemote": true,
  "fetchSkills": false,
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "keyword": "Python Developer",
    "location": "Austin, TX",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/dice-tech-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 = {
    "keyword": "Python Developer",
    "location": "Austin, TX",
    "maxResults": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "keyword": "Python Developer",
  "location": "Austin, TX",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call devilscrapes/dice-tech-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devilscrapes/dice-tech-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/6mjT5nbyP6922fhnJ/builds/UPj1igKOIwn2cnQnU/openapi.json
