# Dice Jobs Scraper - Salaries, Visa Sponsorship & Alerts (`mftira/dice-jobs-scraper`) Actor

Scrape Dice.com tech job ads: title, company, location, remote/hybrid, employment type, recruiter vs direct hire, parsed salary and full description. Filter by visa sponsorship, easy apply and posting date. Monitoring mode returns only jobs you haven't seen before.

- **URL**: https://apify.com/mftira/dice-jobs-scraper.md
- **Developed by:** [Taha Mtira](https://apify.com/mftira) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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 Jobs Scraper: US tech jobs, salaries, visa sponsorship and new-job alerts

Get tech job ads from **Dice.com**, the largest US job board dedicated to technology roles, as clean structured data: title, company, location, **remote / hybrid / on-site**, employment type (full-time, contract, third party), **recruiter vs direct hire**, salary parsed into numbers, Easy Apply flag and, optionally, the full job description.

Filters that most scrapers don't offer:

- **Visa sponsorship:** only jobs whose employer is willing to sponsor.
- **Employer type:** direct employers only, or recruiters only.
- **Easy Apply only**, posting date, workplace type, employment type, location and radius.

Turn on **monitoring mode** and schedule it daily: each run returns **only jobs you haven't received before**, so you get a fresh-jobs feed and never pay twice for the same job.

### What you can use it for

- **Tech recruiting and staffing.** Find companies hiring for the stacks you place, and see which ads come from direct employers vs competing agencies.
- **Job alerts and job boards.** Push new Dice ads for a skill or region into Slack, email, Sheets or your site every morning.
- **Visa-sponsorship job lists** for international candidates.
- **Salary and demand research.** Track pay ranges and hiring volume per skill, city and contract type.

### How to use it

1. Enter one or more **job titles, skills or keywords** (`python developer`, `data engineer`, `salesforce`).
2. Optionally set a **location** and **radius**, a **posted within** window, and the filters above.
3. Set **Maximum jobs** and click **Start**.

Already have a filtered search on dice.com? Paste its URL into **Dice search URLs**.

#### Daily new-job feed

1. Turn on **Only new jobs (monitoring mode)** and pick a **monitoring key** (e.g. `remote-python`).
2. Add a **schedule** (e.g. daily at 07:00).
3. Connect an integration (Slack, email, webhook, Google Sheets) to receive each day's new jobs automatically.

### Output example

```json
{
  "id": "4fc33ce6-6bf5-4cba-961c-0ef3cbc7f502",
  "title": "Developer",
  "companyName": "Mitchell Martin, Inc.",
  "employerType": "Recruiter",
  "employmentType": "Contract, Third Party",
  "workplaceTypes": ["On-Site"],
  "isRemote": false,
  "easyApply": true,
  "location": "New York, New York, USA",
  "city": "New York",
  "stateCode": "NY",
  "country": "USA",
  "postedDate": "2026-10-20T09:17:45Z",
  "salaryText": "$$71 - $81",
  "salaryMin": 71,
  "salaryMax": 81,
  "salaryCurrency": "USD",
  "salaryPeriod": "hour",
  "summary": "Developer - New York, NY - Contract- $71-81 Per HR ...",
  "url": "https://www.dice.com/job-detail/4fc33ce6-6bf5-4cba-961c-0ef3cbc7f502",
  "searchQuery": "developer",
  "scrapedAt": "2026-10-28T10:00:00.000Z"
}
```

With **Include full job descriptions** on, each job also gets `description`, `descriptionHtml`, `validThrough`, `applicantLocationRequirements`, and the employer's structured salary when they provided one.

#### About salaries

Dice salaries are free text typed by the employer. This Actor turns them into `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryPeriod` (hour / year / ...), and always keeps the original in `salaryText`. Many ads simply say "Depends on Experience". Those get `null` numbers.

### Pricing

You pay per job saved, plus a small extra per job when full descriptions are enabled. There's no subscription. Set a **maximum cost per run** in the run options and the Actor stops cleanly when it's reached.

### Tips

- Dice shows at most **750 jobs per search** (25 pages of 30). To collect more, split by location, workplace type or posting date.
- Out-of-range page numbers are handled automatically: the Actor stops when Dice runs out of new results.

### FAQ

**Is this legal?** The Actor only collects publicly visible job ads and no candidate data. You're responsible for using the data in line with applicable law and Dice's terms.

**Something broke?** Open an issue on the Issues tab. The Actor is checked automatically every day.

# Actor input Schema

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

One search per entry, e.g. "python developer", "data engineer", "salesforce".

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

City, state or ZIP, e.g. "Austin, TX". Leave empty for the whole US.

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

Search radius around the location. Ignored without a location.

## `postedWithin` (type: `string`):

Only jobs published within this time window.

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

Leave empty for all.

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

Leave empty for all.

## `employerTypes` (type: `array`):

Direct employers vs recruiting agencies. Leave empty for all.

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

Keep only jobs whose employer is willing to sponsor a work visa.

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

Keep only jobs you can apply to with Dice's Easy Apply.

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

Paste any dice.com/jobs search URL with the filters you set on the website.

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

Stop after this many jobs in total. Dice shows at most 750 jobs per search, so split broad searches by location or filters.

## `includeDetails` (type: `boolean`):

Opens each job ad for the full description (text and HTML), expiry date, applicant location requirements and the employer's structured salary when given. Charged as an extra event per job.

## `onlyNewJobs` (type: `boolean`):

Skip jobs returned by earlier runs with the same monitoring key. Schedule it daily for a fresh-jobs feed - you're never charged twice for the same job.

## `monitoringKey` (type: `string`):

Name for the list of already-seen jobs. Use one key per independent feed.

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

Proxy settings. The default US Apify Proxy works well.

## Actor input object example

```json
{
  "searchQueries": [
    "python developer"
  ],
  "radius": 30,
  "postedWithin": "any",
  "visaSponsorshipOnly": false,
  "easyApplyOnly": false,
  "maxResults": 100,
  "includeDetails": false,
  "onlyNewJobs": false,
  "monitoringKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Jobs in the "Jobs" table view.

## `details` (type: `string`):

Jobs in the "Full details" table view.

## `allFields` (type: `string`):

Every field of every job, as returned by the dataset API.

# 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": [
        "python developer"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mftira/dice-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": ["python developer"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mftira/dice-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": [
    "python developer"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call mftira/dice-jobs-scraper --silent --output-dataset

```

## MCP server setup

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