# Dice Employers, Grouped on the Id and Not the Name (`gubidonius/dice-employers`) Actor

Who is advertising on dice.com, with advert counts, locations and pay worked out from employer set figures only. Dice's own salary bands are counted separately rather than averaged in, because they are not what anyone pays.

- **URL**: https://apify.com/gubidonius/dice-employers.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 employer 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 employers

Who is advertising on dice.com, with advert counts, locations and pay. Grouped on dice.com's
own employer id, not on the name.

### This is a sample, and the run says how big

On 16 September 2026 the board reported 111,699 adverts. Asked for 900, it served 741 and then
started repeating a page it had already served. There is no empty page and no error at the end.

So an employer list from one search covers roughly 0.7% of what dice.com claims to hold. Those
741 adverts held 47 employers, and one of them, SAIC, had 262 of them.

`advertsSeen` is named for what it is. It is what this run read, not the employer's total on
dice.com, and no total is claimed anywhere, because none is knowable from the board.

The run summary carries `advertsTheBoardClaimedButDidNotServe` so the gap is a number you can
read rather than something to infer.

### Pay comes from employer figures only

Salary on dice.com mixes at least five things in one field. This run uses only yearly figures
the employer set, and counts the rest separately:

- `advertsWhosePayIsADiceBand` are adverts whose salary is one of Dice's five bands, like
  `USD 80,001.00 - 120,000.00`. About one in five. Averaging those with real pay drags the
  answer towards a number nobody was offered.
- `advertsPaidHourly` quote an hourly rate. `USD 30.00 per hour` and `USD 152,749.00 per year`
  sit in the same field on the same board.
- `advertsWithPayAsWords` say things like `Depends on Experience`.
- `advertsWithNoPay` published nothing.

An employer with no usable figure gets null, never zero.

### Grouped on the id

`companyProfileId` is dice.com's own key and survives a rename. `companyName` does not. In the
741 advert sample both gave 47 employers, so nothing was split that day, and the id is still
what the grouping uses.

`employerTypes` is a list because one employer really can advertise both directly and through
an agency. `clientBrandIds` is a list for the same reason.

### What is not here

No employer description, size, industry or logo. Those live on the company profile page, and
that page is a 4 KB shell that renders in the browser and carries no data in the HTML. Its API
answers two questions, neither of them about the company, and the branding endpoint refuses the
keys published in the site's own bundle. Probed on 16 September 2026.

Everything here comes from the adverts instead.

### Careful with the city list

dice.com writes the word `remote` into the city field on remote adverts. So `cities` can hold
workplace words as well as places.

### What it costs

$0.00001 per run and $0.00001 per employer. The employers come from one board walk, one request
per 30 adverts, so 47 employers cost about 25 requests. A run that matches nothing costs
nothing.

### No keyword search

dice.com's robots.txt disallows `/jobs?q*`, so this Actor never sends a keyword. Narrow with
place, contract type, workplace, who is advertising, posted date or visa sponsorship. Use
`Recruiter` to list agencies and `Direct Hire` to list employers.

# 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 returns the whole United States board rather than an error, so this run checks for that and stops. Leave empty for the whole board.

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

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`):

Use Recruiter to list the agencies, or Direct Hire to list the employers themselves.

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

The remote filter that works.

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

Employers who said they will sponsor a visa. 1,163 adverts of 111,682 on 2026-09-16.

## `minAdverts` (type: `integer`):

Drop employers with fewer adverts than this in what was read. 1 keeps every employer.

## `maxAdvertsToRead` (type: `integer`):

The employers are worked out from the adverts the board serves, so this is the size of the sample, not the number of employers. Must be a positive number: 0 is not read as "everything". The board stops serving new adverts at roughly 740 whatever you ask for, which the run summary reports.

## Actor input object example

```json
{
  "location": "",
  "postedDate": "",
  "employmentType": "",
  "employerType": "",
  "workplaceTypes": "",
  "willingToSponsor": "",
  "minAdverts": 1,
  "maxAdvertsToRead": 500
}
```

# 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": "",
    "minAdverts": 1,
    "maxAdvertsToRead": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/dice-employers").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": "",
    "minAdverts": 1,
    "maxAdvertsToRead": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/dice-employers").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": "",
  "minAdverts": 1,
  "maxAdvertsToRead": 500
}' |
apify call gubidonius/dice-employers --silent --output-dataset

```

## MCP server setup

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

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/wqnlywTabekBrwegA/builds/txiKuorymn13Tdoqg/openapi.json
