# Dice Market Snapshot, Counts You Can Actually Add Up (`gubidonius/dice-market-snapshot`) Actor

The United States tech job market as dice.com counts it, taken in one request. Every count says whether it splits the board cleanly, double counts adverts, or leaves some out, because on dice.com all three happen and none of them is marked.

- **URL**: https://apify.com/gubidonius/dice-market-snapshot.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (community)
- **Categories:** Jobs, Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 facet count 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 market snapshot

The United States tech job market as dice.com counts it. One request, about 21 rows, and every
count says what you are allowed to do with it.

### dice.com's counts do four different things

On 16 September 2026 the board held 111,699 adverts. Its own facet counts added up like this:

- `employerType` summed to 111,700. It splits the board cleanly.
- `employmentType` summed to 119,226, over by 7,527, because an advert can be tagged
  full time and contract at once.
- `workplaceTypes` summed to 110,891, short by 808, because some adverts carry no workplace
  type at all.
- `postedDate` summed to 33,215, and that number means nothing. Today sits inside Last 3 Days,
  which sits inside Last 7 Days.

Nothing on the page marks any of this. Four groups of counts that look identical, and only one
of them can be charted as a breakdown of the board.

Every row carries `sumsToTheSearchTotal`, `anAdvertCanHaveMoreThanOne`, `doesNotCoverEveryAdvert`
and `valuesAreNestedNotSeparate`, so you can tell which you have before you add anything up.

### Two counts you cannot filter on

dice.com publishes `isRemote` with 10,706 adverts and `workFromHomeAvailability` with 450. Both
come with counts. Send either one as a filter and the board comes back unfiltered, all 111,699
adverts, with no error.

`workplaceTypes` is the one that works. `cannotBeFilteredOn` marks the other two.

The 450 and the 10,706 are not a mistake in one of them either. They count different things,
on the same board, on the same day.

### Two totals

The board reports `totalResults` of 111,699 and `totalJobCount` of 122,744 on the same
response. Both are in the run summary. The facet counts are drawn against the first one, which
was checked by adding them up rather than assumed.

### For a time series

Every row is stamped with `takenAt`, `searchUrl` and the filters in force, so snapshots of the
whole country and of one city sit in the same table without merging.

A facet that falls to zero keeps its row with a count of 0. A facet dice.com stops publishing
has no row. A failed run writes nothing rather than rows of zero, so a gap in the series looks
like a gap.

### What it costs

$0.00001 per run and $0.00001 per row. A snapshot of the whole board is one request and about
21 rows, and that does not grow as the board grows, because the counts are published rather
than counted.

Asking for a place costs one extra request. dice.com answers a place it cannot resolve with
the whole country, so this run checks the total against the unfiltered board and stops rather
than describing the United States under a label that says Austin.

### No keyword search

dice.com's robots.txt disallows `/jobs?q*`, so this Actor never sends a keyword. Narrow the
snapshot with place, contract type, workplace, who is advertising, posted date or visa
sponsorship.

# Actor input Schema

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

Leave empty for the whole United States board. A place in dice.com's own form, for example "Austin, TX, USA". A place dice.com cannot resolve returns the whole board rather than an error, so this run checks for that and stops rather than labelling the country as one city.

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

Narrows the snapshot to recent adverts. dice.com offers these three windows and nothing else.

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

dice.com takes the value, not the label. A label returns zero adverts rather than an error.

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

Narrows the snapshot to adverts from the employer or from agencies.

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

The remote filter that works. dice.com also publishes a work from home count that cannot be filtered on.

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

Narrows the snapshot to employers who said they will sponsor a visa.

## Actor input object example

```json
{
  "location": "",
  "postedDate": "",
  "employmentType": "",
  "employerType": "",
  "workplaceTypes": "",
  "willingToSponsor": ""
}
```

# 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": "",
    "postedDate": "",
    "employmentType": "",
    "employerType": "",
    "workplaceTypes": "",
    "willingToSponsor": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/dice-market-snapshot").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": "",
    "postedDate": "",
    "employmentType": "",
    "employerType": "",
    "workplaceTypes": "",
    "willingToSponsor": "",
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/dice-market-snapshot").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": "",
  "postedDate": "",
  "employmentType": "",
  "employerType": "",
  "workplaceTypes": "",
  "willingToSponsor": ""
}' |
apify call gubidonius/dice-market-snapshot --silent --output-dataset

```

## MCP server setup

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

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/C2rqjehwURIHDTH4H/builds/dOlgdk3sDzTcYypYX/openapi.json
