# Dice Job Scraper: US Tech Jobs, Salaries & Visa Sponsorship (`precious_bathmat/dice-job-scraper`) Actor

Scrape US tech jobs from Dice: title, company, location, salary, contract or full-time, remote, visa sponsorship, recruiter or direct employer, posted date. Plus a salary and hiring report per search. No login, no API key needed.

- **URL**: https://apify.com/precious_bathmat/dice-job-scraper.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (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 $1.00 / 1,000 jobs

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 Job Scraper: US Tech Jobs, Salaries & Visa Sponsorship

Scrape **US tech jobs from Dice.com**, with no login and no account, and get a **salary and hiring report for every search**:

- **Every job**: title, company, location, salary, employment type (full-time, contract, third party/C2C), posted date, summary and link
- **Salary parsed** into minimum, maximum and period (yearly or hourly); most tech ads on Dice show pay
- **Visa sponsorship**: whether the employer says it will sponsor a work visa, with a filter for sponsoring jobs only
- **Recruiter or direct employer** on every job, with a filter for either
- **Filters**: location and radius, posted within, employment type, remote / hybrid / on-site, direct employer or recruiter, visa sponsorship
- **Up to 10,000 jobs per search**
- **Report per search**: yearly salary and hourly contract rate (median and range), visa-sponsorship share, recruiter share, remote and hybrid share, top direct employers, top recruiters, top states, the employers that sponsor visas

### What does this Dice scraper do?

```
Dice · "machine learning engineer" · United States · 2,445 jobs
 Salary shown in 82% of ads · median $202,500 a year ($162,000 to $239,563)
 Contract rate: median $72.50 an hour
 8% remote, 3% hybrid · 21% posted by recruiters · 1.4% sponsor a visa
 Top direct employer: TikTok
```

1. Enter **keywords** and, optionally, **locations** ("Austin, TX", "California").
2. Pick filters: **posted within**, **employment type**, **workplace**, **direct employer or recruiter**, **visa sponsorship only**.
3. You get **one row per job** and **one report per keyword and location**.

```mermaid
flowchart LR
    A[Keywords,<br/>locations] --> C[Dice job search]
    B[Filters<br/>posted, type, remote,<br/>employer, visa] --> C
    C --> D[Jobs<br/>salary parsed,<br/>visa, recruiter]
    D --> E[Report<br/>salary & rate,<br/>visa, recruiters,<br/>remote share]
```

### Who is it for?

- **Tech job seekers and contractors**: real pay and contract rates by role and city, and which jobs sponsor a visa
- **International candidates on H-1B, OPT or other visas**: every job whose employer says it will sponsor, and the companies that do
- **Recruiters and staffing firms**: who is hiring directly, which recruiters dominate a role, current C2C rates
- **HR and compensation teams**: salary benchmarks for tech roles from live ads
- **Analysts**: demand for skills across US states, contract versus full-time mix, remote share

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `id`, `title`, `url`, `summary` | The job (summary of the ad; the full ad opens from `url`) |
| `company`, `companyUrl`, `logoUrl` | Who posted it |
| `employerType`, `isRecruiter` | Direct hire or recruiter |
| `location`, `city`, `state` | Where |
| `employmentTypes` | Full-time, contract, part-time, third party |
| `salary`, `salaryMin`, `salaryMax`, `salaryPeriod`, `salaryPeriodGuessed` | Pay as advertised, parsed |
| `visaSponsorship` | The employer says it will sponsor a visa |
| `workplace`, `workFromHome` | Remote, hybrid or on-site (when you filter by one), and the ad's work-from-home flag |
| `easyApply`, `postedAt`, `updatedAt` | How to apply and how fresh it is |

**Report** (`REPORTS`, one per keyword and location)

| Field | What it tells you |
|---|---|
| `totalOnDice`, `jobsRead` | How many jobs Dice has, and how many were read |
| `salaryShownPercent`, `yearlySalary`, `hourlyRate` | Pay: median and middle half, full-time yearly and contract hourly |
| `visaSponsorshipPercent`, `sponsoringEmployers` | How many jobs sponsor visas, and who |
| `recruiterPercent`, `topDirectEmployers`, `topRecruiters` | Who hires directly, and which recruiters are most active |
| `workplaceOnDice` | Remote and hybrid share, from Dice's own counts for the search |
| `employmentTypes`, `topLocations`, `topStates`, `freshness` | Contract mix, where, how new |
| `highestPaid` | The best-paid ads |

### Example: 3 October 2026

Six roles across the United States, 500 jobs each: **3,000 jobs and 6 reports in 30 seconds**.

| Role | Jobs on Dice | Salary shown | Median yearly pay (middle half) | Contract median | Remote | Sponsor visas |
|---|---|---|---|---|---|---|
| Machine learning engineer | 2,445 | 82% | $202,500 ($162,000 – $239,563) | $72.50/h | 8.0% | 1.4% |
| DevOps engineer | 1,440 | 69% | $150,000 ($125,000 – $182,038) | $65.01/h | 5.9% | 1.4% |
| Salesforce developer | 720 | 47% | $137,631 ($114,450 – $156,250) | $63.25/h | 11.3% | 5.2% |
| Data engineer | 2,549 | 64% | $136,979 ($116,875 – $167,500) | $62.50/h | 5.9% | 1.8% |
| Cybersecurity analyst | 1,274 | 64% | $130,000 ($101,875 – $154,300) | $55.00/h | 5.7% | 1.0% |
| Java developer | 1,715 | 56% | $122,000 ($108,500 – $148,150) | $60.50/h | 3.4% | 8.4% |

- **Java developer jobs sponsor visas most often** (8.4%), led by consultancies such as Photon and Synechron.
- **Recruiters post a third** of data-engineer and Java jobs, but only about a fifth of DevOps, cybersecurity and machine-learning jobs.
- A single search for **"software engineer" read 9,744 jobs in 71 seconds** (median $170,000 a year, 70% showing pay).

### Pricing

**$0.001 per job** and **$0.02 per search report**.

- 500 jobs with a report: **$0.52**
- The run above (3,000 jobs, 6 reports): **$3.12**

Turn off reports to pay for jobs only.

### Good to know

- **Salaries** are what the ad shows. Ranges are parsed into `salaryMin`, `salaryMax` and `salaryPeriod`. When an ad gives no period ("USD70 - USD79"), pay of 1,000 or more is read as yearly and below 300 as hourly, flagged with `salaryPeriodGuessed`. "Depends on Experience" is left empty.
- **Remote and hybrid**: Dice's results carry no per-job workplace flag. Filter by one workplace type and every row is marked with it; the report gives the remote and hybrid share from Dice's own counts for the same search.
- **Locations** must be places Dice knows (a US city and state, or a state). Unknown places are skipped and listed in `RUN_SUMMARY`; for remote jobs use the Workplace filter, not "Remote" as a location.
- **Up to 10,000 jobs per search** (Dice shows 100 pages of 100). Narrow bigger searches by location, date or type.
- **Search results carry a summary**, not the full description.
- **No contact details**: emails and phone numbers in summaries are hidden.
- Data comes from **Dice's public job search**, the same one dice.com's search page uses. **Not affiliated with Dice.**

### Input

| Field | Meaning |
|---|---|
| **Keywords** | One search each |
| **Locations** | US cities or states; empty = all of the US |
| **Radius** | Miles around each location (default 30) |
| **Posted within** | 24 hours, 3 or 7 days |
| **Employment type** | Full-time, contract, part-time, third party |
| **Workplace** | Remote, hybrid, on-site |
| **Employer** | Direct employers only, or recruiters only |
| **Visa sponsorship only** | Off by default |
| **Jobs per search** | 1 to 10,000 (default 200) |
| **Reports** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** with "Last 24 hours" for a feed of new tech jobs, or with "Visa sponsorship only" for new sponsoring jobs.

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills, one search each, e.g. "data engineer", "java developer", "kubernetes".

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

Optional US cities or states, e.g. "Austin, TX", "New York, NY", "California". Each keyword is searched in each. Empty = all of the US.

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

Distance around each location.

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

Only jobs posted in this period.

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

Optional: only these employment types.

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

Optional: only these workplace types.

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

Jobs posted by the hiring company itself, or by recruiters and staffing firms.

## `visaSponsorshipOnly` (type: `boolean`):

Only jobs whose employer says it will sponsor a work visa.

## `maxJobsPerSearch` (type: `integer`):

Most jobs to read per keyword and location (1 to 10,000; Dice shows up to 10,000 per search).

## `includeReports` (type: `boolean`):

One report per keyword and location: yearly salary and hourly rate, visa sponsorship, recruiter share, remote and hybrid share, top employers, recruiters, locations and sponsoring employers.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "radiusMiles": 30,
  "postedWithinDays": "any",
  "employerType": "any",
  "visaSponsorshipOnly": false,
  "maxJobsPerSearch": 200,
  "includeReports": true
}
```

# Actor output Schema

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

One row per job: title, company, location, salary (parsed), employment type, remote, visa sponsorship, recruiter or direct, posted date, summary, link.

## `reports` (type: `string`):

Per search: yearly salary and hourly rate, visa sponsorship, recruiter and remote share, top employers, recruiters, locations, sponsoring employers.

## `reportsCsv` (type: `string`):

One flat row per search.

## `summary` (type: `string`):

Requests, problems and the limits of the data.

# 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 = {
    "keywords": [
        "data engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/dice-job-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 = { "keywords": ["data engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/dice-job-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 '{
  "keywords": [
    "data engineer"
  ]
}' |
apify call precious_bathmat/dice-job-scraper --silent --output-dataset

```

## MCP server setup

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