# Dice Jobs, With the Salary Bands Marked (`gubidonius/dice-jobs`) Actor

Tech job adverts from dice.com with every salary labelled as either the employer's own figure or one of Dice's five salary bands. About one advert in five publishes a band edge in the salary field, and it reads exactly like a real wage.

- **URL**: https://apify.com/gubidonius/dice-jobs.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (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

from $0.01 / 1,000 job advert 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?

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

Tech job adverts from dice.com, with every salary labelled as either the employer's own
figure or one of Dice's five salary bands.

### One advert in five publishes a band, not a wage

On 16 September 2026 a run of 120 adverts came back with these salaries:

- 46 were the employer's own range, like `USD 119,543.00 - 152,749.00 per year`
- 26 were `USD 80,001.00 - 120,000.00` or `USD 40,001.00 - 80,000.00` or one of three more
- 37 published nothing
- 11 said words, like `Depends on Experience`

The 26 are not wages. They are the edges of Dice's own salary bands, and they sit in the same
field, in the same format, as the real ones. Nothing on the page marks them.

It is worse in the structured data. The advert whose salary reads
`USD 80,001.00 - 120,000.00 per year` publishes this for search engines:

```json
"baseSalary": { "@type": "MonetaryAmount", "currency": "USD", "value": 80001 }
```

One number. It is the band's lower edge plus one, in the field every structured data reader
takes as the salary.

Every row here carries `salaryIsDiceBand`. Filter on it before you average anything.

### Read salaryPeriod before you compare two rows

Hourly and yearly pay sit in the same column on dice.com. `USD 30.00 per hour` and
`USD 152,749.00 per year` are both in it. Every row says which one it is.

Sometimes dice.com says neither. On the visa sponsorship search, every advert with numbers
wrote them like `$$70 - $80` or `$$100,000 - $140,000`, with no period anywhere. That is an
hourly rate and a yearly range in one column, and only the size of the number tells you which.

`salaryPeriod` is null on those rows. This Actor does not guess the unit from the magnitude.

`salaryRaw` keeps the string exactly as dice.com published it, including the double dollar
sign the site writes on those adverts.

### The board will not give you what it says it has

Asked for adverts offering visa sponsorship, dice.com reported 1,163 adverts across 39 pages.
It served 730 across 25 pages, then served page 25 again, and again, for ever. There is no
empty page and no error. A scraper that pages until it runs out never runs out, and it bills
you for the same 30 adverts every time.

This run stops when a page repeats everything it has already seen. The run summary says what
the board claimed, what it served, and the gap between them.

### Two fields both mean remote and they disagree

dice.com publishes `workplaceTypes` with 10,706 adverts tagged Remote. It also publishes
`work from home available`, which is true on 450. Same board, same day. Both are in the
output under their own names. Use `workplaceTypes`. The other one cannot be filtered on at
all, and neither can `isRemote`, which the site lists with counts and then ignores.

### Filters take the value, not the label

Contract type is `FULLTIME`, `PARTTIME`, `CONTRACTS` or `THIRD_PARTY`. Sending `Full-time`
returns zero adverts rather than an error. The input is a list, so you cannot send the wrong
one.

A place dice.com cannot resolve is the same trap. `Zzzqqq, XX, ZZ` returns 111,682 adverts,
the whole United States board, under a search that says it is for that place. This run checks
the total against the unfiltered board and stops rather than writing them.

### What it costs

$0.00001 per run and $0.00001 per advert. A run that matches nothing costs nothing, because
both charges happen after the rows are saved. A run stopped by a bad filter value or an
unresolved place costs nothing either.

### No keyword search

dice.com's robots.txt disallows `/jobs?q*`, so this Actor never sends a keyword. Narrow the
board with place, contract type, workplace, who is advertising, posted date, easy apply or
visa sponsorship instead. Asking for a keyword stops the run with that explanation.

### Fields

`jobId` is dice.com's own uuid and joins to the Dice job details Actor. `companyProfileId` is
the employer key, not `companyName`, which is neither unique nor stable. `employerType` says
whether you are looking at the employer or an agency, and its three values add up to the whole
board exactly, so it is the one filter that cuts the board into parts that do not overlap.

# Actor input Schema

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

A place in dice.com's own form, for example "Austin, TX, USA". A place dice.com cannot resolve is NOT refused and does NOT return zero: it returns the entire unfiltered board, about 111,000 adverts from everywhere, labelled as a search for that place. This Actor checks the returned total against the unfiltered board and stops the run rather than writing them. Leave empty for the whole board.

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

Distance around the place. Measured as real: Austin returned 12,913 adverts at 5 and 13,968 at 100. Ignored when no place is given.

## `radiusUnit` (type: `string`):

Unit for the radius above.

## `postedDate` (type: `string`):

How recent the advert is. dice.com offers these three windows and nothing else, so there is no "last 30 days".

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

dice.com takes the value, not the label. Sending "Full-time" instead of FULLTIME returns 0 adverts rather than an error, which is why this is a list and not a text box. An advert can carry more than one contract type, so these counts add up to more than the board.

## `employerType` (type: `string`):

Whether the advert comes from the employer or an agency. On 2026-09-16 the board held 84,696 direct, 19,668 recruiter and 7,318 other, which adds up to the board exactly, so this is the one filter you can use to cut the board into parts that do not overlap.

## `workplaceTypes` (type: `string`):

Use this for remote work. dice.com also publishes a field called "work from home available", which counts 450 adverts against 10,706 remote and cannot be filtered on at all.

## `easyApply` (type: `string`):

Adverts you can apply to without leaving dice.com. 21,109 of 111,682 on 2026-09-16.

## `willingToSponsor` (type: `string`):

Employers who said they will sponsor a visa. A small and specific part of the board: 1,163 adverts of 111,682 on 2026-09-16.

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

The most adverts to write. This must be a positive number: 0 is not read as "everything", because the whole board is about 111,000 adverts and a run that walked all of it by accident would bill for all of it.

## Actor input object example

```json
{
  "location": "Austin, TX, USA",
  "radius": 30,
  "radiusUnit": "mi",
  "postedDate": "",
  "employmentType": "",
  "employerType": "",
  "workplaceTypes": "",
  "easyApply": "",
  "willingToSponsor": "",
  "maxResults": 100
}
```

# Actor output Schema

## `results` (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 = {
    "location": "Austin, TX, USA",
    "radius": 30,
    "radiusUnit": "mi",
    "postedDate": "",
    "employmentType": "",
    "employerType": "",
    "workplaceTypes": "",
    "easyApply": "",
    "willingToSponsor": "",
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/dice-jobs").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 = {
    "location": "Austin, TX, USA",
    "radius": 30,
    "radiusUnit": "mi",
    "postedDate": "",
    "employmentType": "",
    "employerType": "",
    "workplaceTypes": "",
    "easyApply": "",
    "willingToSponsor": "",
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/dice-jobs").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 '{
  "location": "Austin, TX, USA",
  "radius": 30,
  "radiusUnit": "mi",
  "postedDate": "",
  "employmentType": "",
  "employerType": "",
  "workplaceTypes": "",
  "easyApply": "",
  "willingToSponsor": "",
  "maxResults": 100
}' |
apify call gubidonius/dice-jobs --silent --output-dataset

```

## MCP server setup

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

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/zSgjXlKulAnyDyTZE/builds/fF7h3bTdeTX5O25t9/openapi.json
