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

Search dice.com tech jobs and get structured rows, not raw text: a parsed salary band (min, max, currency, period) plus an annualised figure so hourly contract rates compare against salaries, the employer type so agency reposts can be dropped, a real remote boolean and the visa-sponsorship flag.

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

## Pricing

$0.70 / 1,000 job returneds

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/actors/running/actors-in-store.md#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

## Dice Tech Jobs Scraper

**Scrape Dice.com tech jobs** as structured rows rather than raw text. This **Dice jobs scraper** returns a parsed salary band — minimum, maximum, currency, and period — plus an **annualised figure so hourly contract rates compare directly against salaries**, the employer type so agency reposts can be dropped, and sponsorship and easy-apply flags.

No Dice API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Dice Tech Jobs Scraper?

Dice Tech Jobs Scraper is an [Apify Actor](https://apify.com/actors) that extracts tech job listings with parsed salary bands from [Dice](https://www.dice.com) and returns them as clean, structured records. Dice is dominated by contract roles quoted hourly. Without annualisation you cannot compare a $85/hour contract against a $150,000 salary, which makes most Dice datasets useless for compensation work.

### What data can this Dice jobs scraper extract?

Every run writes one row per job posting. The full schema carries **41 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `jobId` | string | Dice's identifier for the listing. Stable across runs and usable as a deduplication key. Null only on the... |
| `guid` | string | The identifier that appears inside the job URL (dice.com/job-detail/<guid>), so it is the key to join this row... |
| `title` | string | Job title exactly as the employer published it. |
| `companyName` | string | Hiring company or staffing agency name. |
| `companyId` | string | Dice's brand identifier for the employer. Groups every posting from the same company, even when the displayed name... |
| `companyUrl` | string | The employer's Dice company page. |
| `companyLogoUrl` | string | Employer logo image. Present on about 99.8% of listings. |
| `locationDisplay` | string | Location as Dice displays it, for example "Charlotte, North Carolina, USA". |
| `city` | string | City for the role. Dice omits it on statewide postings, in which case this is null rather than repeating the state. |
| `state` | string | Full state or province name, for example "North Carolina". |
| `stateCode` | string | Dice's short region code for the state, for example "NC". |
| `country` | string | Country exactly as Dice reports it. Dice is inconsistent here and mixes "USA", "US", "Canada" and "CA" in one... |
| `countryCode` | string | Two-letter ISO country code normalised from the field above. Null when Dice reported a country this Actor does not... |
| `salaryText` | string | The pay band exactly as the employer typed it, kept verbatim so nothing is lost to parsing. Present on about 83.5%... |
| `salaryMin` | number | Bottom of the published band, in the units of salaryPeriod. Null when the employer published no number, including... |
| `salaryMax` | number | Top of the published band, in the units of salaryPeriod. Equals salaryMin when a single figure was published. |
| `salaryCurrency` | string | Three-letter currency code detected from the published band. Null when the employer gave a bare number with no... |
| `salaryPeriod` | string | One of hourly, daily, weekly, monthly or yearly - the unit salaryMin and salaryMax are quoted in. |
| `salaryPeriodIsInferred` | boolean | True when the employer gave no explicit period and it was inferred from magnitude (a band topping out under 1000... |
| `salaryAnnualMin` | number | salaryMin converted to a yearly figure so hourly contract rates and annual salaries can be compared in one column.... |
| `salaryAnnualMax` | number | salaryMax converted to a yearly figure on the same basis as the field above. |
| `employmentType` | string | Employment type as Dice publishes it. Often several joined by commas, for example "Full-time, Third Party". |

See the **Output** tab in Apify Console for all 41 fields.

### How to scrape Dice tech job listings

1. Open [Dice Tech Jobs Scraper](https://apify.com/cirkit/dice-tech-jobs-scraper) and click **Try for free**.
2. Add `searchQueries` and `locations`, with `radiusMiles` to widen the geography.
3. Filter with `postedWithinDays`, `employmentTypes`, and `workplaceTypes`.
4. Set `willingToSponsorOnly` or `easyApplyOnly` to narrow further.
5. Bound the run with `maxItems`.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Dice Tech Jobs Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `searchQueries` | array | Job titles, skills or keywords to search, one per line. Each keyword is combined with each location, so 3 keywords... | `["software engineer"]` |
| `locations` | array | Where to search, one per line, for example "New York, NY", "Austin, TX" or "Remote". Optional: a keyword with no... | `["New York, NY"]` |
| `radiusMiles` | integer | How far around each location to search. Only applies when a location is given. Dice's own default is 30 miles. | `30` |
| `postedWithinDays` | string | Only return jobs posted this recently. Dice offers exactly these buckets. Note that its 30-day bucket covers almost... | `"any"` |
| `employmentTypes` | array | Only return these employment types. Leave empty for all. Selecting several ORs them together rather than narrowing... |  |
| `workplaceTypes` | array | Only return these workplace arrangements. Leave empty for all. Selecting several ORs them together. |  |
| `willingToSponsorOnly` | boolean | Only return employers who marked the posting as willing to sponsor a work visa. This is a narrow slice, roughly 500... | `false` |
| `easyApplyOnly` | boolean | Only return jobs a candidate can apply to through Dice itself, rather than being redirected to the employer's own... | `false` |
| `startUrls` | array | Paste dice.com search URLs to scrape them directly, for example... |  |
| `maxItems` | integer | Hard cap on jobs returned across all searches, and the cap on what you are charged. Dice serves at most 10,000... | `100` |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "searchQueries": ["python developer", "data engineer"],
  "locations": ["Austin, TX"],
  "radiusMiles": 30,
  "postedWithinDays": "7",
  "employmentTypes": ["full-time"],
  "workplaceTypes": ["remote", "hybrid"],
  "willingToSponsorOnly": false,
  "maxItems": 500
}
```

### How much does it cost to scrape Dice?

This Actor runs on **pay per result** pricing: **$0.0007 per job** ($0.7 per 1,000).

| Results | Approximate cost |
| --- | --- |
| 1,000 | $0.70 |
| 10,000 | $7.00 |
| 100,000 | $70.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Dice Tech Jobs Scraper at no cost.

### What can you build with Dice data?

#### Benchmark contract versus permanent tech pay

Annualised salary figures make hourly and salaried roles directly comparable, which is the whole point of compensation analysis in a contract-heavy market.

#### Filter out staffing-agency noise

`employerType` distinguishes direct employers from agencies, letting you drop the duplicate reposts that make Dice data look larger than it is.

#### Find visa-sponsoring employers

`willingToSponsor` identifies employers open to sponsorship, which is decisive for international candidates.

#### Track tech skill demand over time

Posting volume by keyword and location is a genuine leading indicator of which technologies are being hired for.

#### Build a recruiting lead list

Direct employers posting repeatedly for the same skill are the clearest prospects for a technical recruiting desk.

### Dice scraping tips and limits

- `salaryPeriodIsInferred` flags rows where the period was deduced rather than stated. Exclude them from precise compensation analysis.
- Filtering to direct employers via `employerType` typically removes a large share of duplicate listings.
- `postedWithinDays` keeps scheduled runs cheap by pulling only new postings.
- Dice is US-centric and skewed toward contract work. For permanent roles, pair it with Indeed or ATS boards.

### Integrations and automation

Run Dice Tech Jobs Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Dice dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [Indeed Jobs Scraper](https://apify.com/cirkit/indeed-jobs-scraper) | Broader job coverage with parsed salaries. |
| [ATS Job Boards Scraper - Greenhouse, Ashby, Lever](https://apify.com/cirkit/ats-job-boards-scraper) | Greenhouse, Ashby, and Lever company boards. |
| [Workday Jobs Scraper - Search Any Workday Career Site](https://apify.com/cirkit/workday-jobs-scraper) | Enterprise Workday career sites. |
| [Glassdoor Company Scraper](https://apify.com/cirkit/glassdoor-company-scraper) | Employee reviews and salary reports. |

### Frequently asked questions

#### How does the annualised salary work?

Where Dice quotes an hourly or daily rate, the Actor computes `salaryAnnualMin` and `salaryAnnualMax` so contract and permanent roles sit on the same scale. The original text stays in `salaryText`.

#### Can I exclude staffing agencies?

Yes. Filter on `employerType` to keep only direct employers, which removes most of the duplicate agency reposts Dice is known for.

#### Do I need a Dice API key?

No. Dice Tech Jobs Scraper reads publicly available Dice pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Dice data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Dice Tech Jobs Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Dice?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public job posting information Dice publishes publicly. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Dice page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles, skills or keywords to search, one per line. Each keyword is combined with each location, so 3 keywords and 2 locations run 6 searches. Leave empty to search every job matching the locations and filters below.

## `locations` (type: `array`):

Where to search, one per line, for example "New York, NY", "Austin, TX" or "Remote". Optional: a keyword with no location searches the whole United States index. Each location is searched within the radius set below.

## `radiusMiles` (type: `integer`):

How far around each location to search. Only applies when a location is given. Dice's own default is 30 miles.

## `postedWithinDays` (type: `string`):

Only return jobs posted this recently. Dice offers exactly these buckets. Note that its 30-day bucket covers almost its entire index, so it barely narrows a search.

## `employmentTypes` (type: `array`):

Only return these employment types. Leave empty for all. Selecting several ORs them together rather than narrowing further.

## `workplaceTypes` (type: `array`):

Only return these workplace arrangements. Leave empty for all. Selecting several ORs them together.

## `willingToSponsorOnly` (type: `boolean`):

Only return employers who marked the posting as willing to sponsor a work visa. This is a narrow slice, roughly 500 of 71,000 developer jobs, so pair it with a broad keyword rather than a specific one.

## `easyApplyOnly` (type: `boolean`):

Only return jobs a candidate can apply to through Dice itself, rather than being redirected to the employer's own system.

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

Paste dice.com search URLs to scrape them directly, for example https://www.dice.com/jobs?q=python\&location=Austin,%20TX. Use this instead of the fields above when you already have the searches you want. Keywords and locations are ignored for these URLs, but the filters above still apply.

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

Hard cap on jobs returned across all searches, and the cap on what you are charged. Dice serves at most 10,000 results per individual search, so going beyond that needs several keywords, locations or filter combinations rather than one broad search.

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

Dice does not block datacenter IPs, so the default shared Apify proxy is enough. Residential proxies work but cost far more and buy nothing here.

## Actor input object example

```json
{
  "searchQueries": [
    "software engineer"
  ],
  "locations": [
    "New York, NY"
  ],
  "radiusMiles": 30,
  "postedWithinDays": "any",
  "employmentTypes": [],
  "workplaceTypes": [],
  "willingToSponsorOnly": false,
  "easyApplyOnly": false,
  "startUrls": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

Every job listing collected in this run, as JSON.

## `jobsCsv` (type: `string`):

The same job listings as a CSV download.

## `jobsExcel` (type: `string`):

The same job listings as an Excel workbook.

# 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 = {
    "searchQueries": [
        "software engineer"
    ],
    "locations": [
        "New York, NY"
    ],
    "radiusMiles": 30,
    "postedWithinDays": "any",
    "willingToSponsorOnly": false,
    "easyApplyOnly": false,
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/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 = {
    "searchQueries": ["software engineer"],
    "locations": ["New York, NY"],
    "radiusMiles": 30,
    "postedWithinDays": "any",
    "willingToSponsorOnly": False,
    "easyApplyOnly": False,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/dice-tech-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 '{
  "searchQueries": [
    "software engineer"
  ],
  "locations": [
    "New York, NY"
  ],
  "radiusMiles": 30,
  "postedWithinDays": "any",
  "willingToSponsorOnly": false,
  "easyApplyOnly": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/dice-tech-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/dice-tech-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/hbJI4fqM535rWbPer/builds/DFzxT1zPKFtDeDlLN/openapi.json
