# Dice Technology Jobs Scraper (`jobsapi/dicecom-tech-jobs-search-scraper`) Actor

Discover and detail-enrich public Dice technology jobs with a lightweight HTTP pipeline.

- **URL**: https://apify.com/jobsapi/dicecom-tech-jobs-search-scraper.md
- **Developed by:** [Jobs API](https://apify.com/jobsapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.99 / 1,000 dice tech job records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Technology Jobs Search Scraper

This Apify Actor uses ordinary direct HTTP requests to discover public Dice job cards and enrich each selected row from its canonical public detail page and JobPosting JSON-LD. It emits source-grounded technology-job records with Dice identity, employer, location, applicant-location requirements, employment and workplace labels, skills and badges, salary, dates, legal IDs, description HTML/text and sections, application URL, listing/detail receipts, and runtime provenance.

The source is accessed sequentially with no proxy, custom user-agent, stealth or fingerprint changes, login, alternate identity, or retries. Complete records are staged until source access checks finish. A confirmed access barrier discards staged rows; a later non-block failure preserves successfully written rows and reports a limited result.

### Input

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `startUrls` | request-list array | `https://www.dice.com/jobs` | One to three public HTTPS Dice search URLs. |
| `maxPages` | integer | `1` | Pages per seed URL, from 1 through 5. |
| `maxItems` | integer | `3` | Complete details to emit, from 1 through 50. |

No retry, timeout, proxy, user-agent, fixture, or debug controls are exposed in the public input schema.

Example:

```json
{
  "startUrls": [{ "url": "https://www.dice.com/jobs" }],
  "maxPages": 1,
  "maxItems": 3
}
```

### Dataset fields

The strict target-specific dataset schema retains the existing `jobId`, `title`, `company`, `location`, `description`, `descriptionHtml`, `datePosted`, `validThrough`, `salary`, `applicationUrl`, `url`, and `structuredJobPosting` fields, plus richer fields including:

- `diceJobId`, `diceId`, `positionId`, `employerName`, `companyProfileUrl`, `companyLogoUrl`, `companyBannerUrl`, `companyDescription`, and `companySocialLinks`;
- `locationDetails`, `locality`, `region`, `postalCode`, `country`, `applicantLocationRequirements`, `employmentType`, `employmentTypes`, `employmentTypeLabel`, `workplaceType`, and `workRemoteAllowed`;
- `skills`, `badges`, `salaryText`, `salaryCurrency`, `salaryMin`, `salaryMax`, `salaryUnit`, `datePostedLabel`, `postedLabel`, and `updatedLabel`;
- `descriptionText`, `descriptionTextLength`, `descriptionSections`, `descriptionSectionLabels`, `applicationLabel`, `canonicalUrl`, `detailUrl`, `jobUrl`, `listingUrl`, and `canonicalVerified`;
- `listing`, `listingReceipt`, `detailReceipt`, `requestReceipts`, `fieldCoverage`, `dataQuality`, `sourceDomain`, `sourceWebsite`, `accessMode`, `proxyUsed`, `fingerprintingUsed`, `localOnly`, `runtime`, and `scrapedAt`.

Historical Chrome comparison (2026-09-22; not rechecked during the current lifecycle-only update) produced this representative record: `Senior AI Platform Architect`, Northwestern University, Evanston, IL, `Full Time`, `On-site`, `$125,220 - $165,000/yr`, Dice ID `grayblok`, Position ID `54387`, and seven visible skills. The full description and structured source payload were retained in the historical dataset; the following is an output excerpt.

```json
{
  "recordType": "job",
  "recordStatus": "complete",
  "jobId": "9d817212-ae6f-470c-b346-770a68bab2eb",
  "diceJobId": "9d817212-ae6f-470c-b346-770a68bab2eb",
  "diceId": "grayblok",
  "positionId": "54387",
  "title": "Senior AI Platform Architect",
  "company": "Northwestern University",
  "employerName": "Northwestern University",
  "location": "Evanston, IL, 60201, US",
  "employmentType": "FULL_TIME",
  "employmentTypeLabel": "Full Time",
  "workplaceType": "On-site",
  "skills": ["Enterprise IT", "AI", "Microsoft 365", "Entra ID", "Graph API", "Microsoft 365 Copilot", "AI governance frameworks"],
  "salary": {
    "text": "$125,220 - $165,000/yr",
    "currency": "USD",
    "min": 125220,
    "max": 165000,
    "unit": "YEAR",
    "source": "structured JobPosting"
  },
  "datePosted": "2026-09-21T14:03:11.000Z",
  "descriptionSectionLabels": ["overview", "jobSummary", "specificResponsibilities", "miscellaneous", "minimumQualifications", "preferredQualifications", "benefits", "workLifeAndWellness"],
  "applicationUrl": "https://www.dice.com/dashboard/login?redirectUrl=%2Fjob-applications%2F9d817212-ae6f-470c-b346-770a68bab2eb%2Fstart-apply",
  "canonicalUrl": "https://www.dice.com/job-detail/9d817212-ae6f-470c-b346-770a68bab2eb",
  "canonicalVerified": true,
  "source": "dice.com",
  "sourceDomain": "dice.com",
  "accessMode": "direct",
  "proxyUsed": false,
  "fingerprintingUsed": false,
  "localOnly": true,
  "detailVerified": true
}
```

### Access barriers and validation

Platform run status is only `SUCCEEDED` or `FAILED`; dataset outcome is reported separately as `resultStatus: COMPLETE`, `LIMITED`, `SKIPPED`, `DEFERRED`, `NO_DATA`, or `FAILED`. A clean extraction that stores the requested complete rows is `SUCCEEDED` / `COMPLETE`; stored rows followed by later errors are `SUCCEEDED` / `LIMITED`; fatal zero-row input, runtime, Dataset, or finalization failures are `FAILED` / `FAILED`. Ambiguous zero-row results—including unrecognized empty listings and cases where no complete detail row can be verified—remain `SUCCEEDED` / `DEFERRED`, not fatal failures. The count advances only after `Actor.pushData()` resolves. Diagnostics and request receipts are kept in Key-Value Store artifacts, never as Dataset rows.

If Dice returns HTTP 401, 403, 429, or 451, or visibly serves a CAPTCHA, verification, or access-denial challenge, the Actor stops requests, discards unpersisted staged rows, and records `SUCCEEDED` / `SKIPPED` with the evidence and receipts. If a future execution path has already persisted eligible rows before a confirmed barrier, retain those rows and report `SUCCEEDED` / `LIMITED`. HTTP 407, other unsuccessful HTTP responses, and unverified transport errors are `DEFERRED`, not site blocks. No retry, alternate route, identity switch, or access-control bypass is attempted. `NO_DATA` is emitted only when every requested search returned HTTP 200 and visible Dice empty-results text; the bounded matched excerpt and per-page receipts are recorded in `OUTPUT.noDataEvidence`. Missing or unrecognized empty output is `DEFERRED`. When Chrome control is unavailable, do not claim a current source comparison from offline checks; record source behavior as unverified rather than substituting another browser or route.

Safe offline checks from this directory:

```text
npm test
npm run lint
apify validate-schema
```

`npm run validate:dataset` is a separate storage-backed validator: it reads Dataset and Key-Value Store files from the selected local Apify storage directory. It was not run in this lifecycle audit. Run it only when local-storage validation is explicitly in scope and the exact storage directory has been reviewed; never use `--purge` on an existing store.

# Changelog

This Actor's version history is a separate document: https://apify.com/jobsapi/dicecom-tech-jobs-search-scraper/changelog.md

# Actor input Schema

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

Public Dice job search pages. Access is ordinary direct HTTP only.

## `maxPages` (type: `integer`):

Maximum pages per seed URL.

## `maxItems` (type: `integer`):

Maximum complete jobs to emit.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.dice.com/jobs"
    }
  ],
  "maxPages": 1,
  "maxItems": 3
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

## `diagnostics` (type: `string`):

No description

## `requestReceipts` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("jobsapi/dicecom-tech-jobs-search-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("jobsapi/dicecom-tech-jobs-search-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 '{}' |
apify call jobsapi/dicecom-tech-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jobsapi/dicecom-tech-jobs-search-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/K5hPKWRD47Z0IcGEW/builds/fgtFqar4JzAoBCRlW/openapi.json
