# US DOL H-1B & PERM Tech Hiring & Salary Intent (`afkdigital/newapi27-dol-h1b-perm-hiring-intent`) Actor

Official OFLC LCA and PERM case determinations, employers and filed wages. An administrative determination is not an open vacancy, actual hire or issued visa.

- **URL**: https://apify.com/afkdigital/newapi27-dol-h1b-perm-hiring-intent.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$6.00 / 1,000 unique oflc cases

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

## US DOL H-1B & PERM Tech Hiring & Salary Intent

NEWAPI27 reads the U.S. Department of Labor Office of Foreign Labor Certification (OFLC) public LCA and PERM case disclosure XLSX files. It is a case determination research tool. An application or certification **does not indicate an open job, an actual hire, or an issued visa**. LCA includes H-1B, H-1B1 and E-3; it is not exclusively H-1B.

### Sources and coverage

The Actor discovers links on the [official OFLC performance page](https://www.dol.gov/agencies/eta/foreign-labor/performance), validates the DOL host and disclosure filename, then reads exactly one cumulative file. It supports the verified FY2025 and FY2026 record layouts. As of October 25, 2026, the latest FY2026 publication is Q3 (determinations through June 30, 2026). FY2025 LCA quarters and PERM Q4 are linked on the same page. Published quarters change; an unavailable selection produces a clear error instead of unrelated data.

The FY2026 Q3 [LCA layout](https://www.dol.gov/sites/dolgov/files/ETA/oflc/pdfs/FY26Q3/LCA_Record_Layout_FY2026_Q3.pdf) and [PERM layout](https://www.dol.gov/sites/dolgov/files/ETA/oflc/pdfs/FY26Q3/PERM_Record_Layout_FY2026_Q3.pdf) define the mapped fields. The corresponding FY2025 Q4 layouts are also checked. DOL data is employer-provided and may be incomplete or contain errors.

### Input

| Property | Meaning | Default |
| --- | --- | --- |
| `program` | `LCA` or `PERM` | `LCA` |
| `fiscalYear` | 2025 or 2026 federal fiscal year | 2026 |
| `quarter` | Cumulative published quarter; omit for latest within year | latest published |
| `decisionDateFrom`, `decisionDateTo` | Inclusive YYYY-MM-DD | none |
| `socCode` | SOC prefix, for example `15-`; clear to include all occupations | `15-` |
| `caseStatus` | Exact DOL status; All includes denied and withdrawn | Certified |
| `worksiteState` | Two-letter state | none |
| `jobTitle` | Case-insensitive substring | none |
| `minOfferedWage`, `minWageUnit` | Compare native reported wage only to the same Hour, Week, Bi-Weekly, Month or Year unit | none |
| `maxResults` | Unique case cap, 1–1,000 | 10 |
| `maxCostUsd` | At $0.006 per case, 0.006–6 | 0.06 |

Example: `{"program":"PERM","fiscalYear":2026,"quarter":3,"socCode":"15-","worksiteState":"CA","maxResults":10,"maxCostUsd":0.06}`.

### Output and price

One default Dataset item represents one unique case in the selected cumulative file. Apify provides [JSON and CSV Dataset exports](https://docs.apify.com/platform/storage/dataset). Each item includes case number, program, employer, job title, SOC, prevailing and offered wage, each wage unit, first or primary worksite city/state, case status, decision date, original source filename and URL, file SHA-256, fiscal year and observation time. PERM `prevailing_wage` is `null` because the mapped FY2025/FY2026 PERM disclosure does not include the PWD wage amount. No wage is silently annualized. The minimum wage filter matches only the same original unit. Blank source fields remain null; a missing case number, status or decision date is skipped.

Pay per event: the `apify-default-dataset-item` primary event must be configured at **$0.006 per item** in Apify Console. 1,000 items cost $6 in case events, subject to the user's result and spend caps. A platform synthetic start event, if active, is shown separately in Apify. The Actor does not charge for no-result or failed source downloads. Billing happens only for dataset items written. Re-running a query in a separate run produces a new paid dataset; within one run a case number is emitted once.

### Data handling and limitations

The input XLSX is downloaded with HTTP error, timeout and 340 MB limits; openpyxl reads rows in read-only mode. Large downloads can dominate run time. The default stops after 10 cases, so it is designed to finish within five minutes on a healthy DOL connection; tight filters can scan far more of a million-row sheet, and runs stop at 270 seconds. DOL's cumulative files already retain each case's most recent determination within the fiscal-year snapshot. One selected file is processed per run to avoid reprocessing previous cumulative quarters. File SHA-256 and case number preserve provenance.

Some official files publish named employer contacts and email addresses. They are deliberately excluded from this product. Only allowlisted business and case fields are emitted; adding newly published columns does not add personal fields to output.

Run summary: `NEWAPI27_RUN_SUMMARY` in the default key-value store. Source access failures raise an error and record a failed summary. These records are administrative signals, not verified current hiring opportunities.

# Actor input Schema

## `program` (type: `string`):

Program.

## `fiscalYear` (type: `integer`):

Federal fiscal year.

## `quarter` (type: `integer`):

Published cumulative quarter. Omit to use the latest available file in that fiscal year.

## `decisionDateFrom` (type: `string`):

Decision date from.

## `decisionDateTo` (type: `string`):

Decision date to.

## `socCode` (type: `string`):

SOC code prefix.

## `worksiteState` (type: `string`):

Worksite state code.

## `jobTitle` (type: `string`):

Job title contains.

## `minOfferedWage` (type: `number`):

Native reported unit; requires minWageUnit. No annualization.

## `minWageUnit` (type: `string`):

Unit for minimum wage.

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

Maximum unique cases.

## `maxCostUsd` (type: `number`):

Maximum case event cost USD.

## `caseStatus` (type: `string`):

Exact DOL status; choose All to include denials and withdrawals.

## Actor input object example

```json
{
  "program": "LCA",
  "fiscalYear": 2026,
  "socCode": "15-",
  "maxResults": 10,
  "maxCostUsd": 0.06,
  "caseStatus": "Certified"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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("afkdigital/newapi27-dol-h1b-perm-hiring-intent").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("afkdigital/newapi27-dol-h1b-perm-hiring-intent").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 afkdigital/newapi27-dol-h1b-perm-hiring-intent --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/newapi27-dol-h1b-perm-hiring-intent"
        }
    }
}
```

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/koItRTk0pXNoOV8cC/builds/ubijd64qisphql0iJ/openapi.json
