ETA Labor Market Intelligence
ETA Labor Market Intelligence pulls US labor market data from 4 official Department of Labor datasets into a single structured report — covering weekly unemployment insurance claims, registered apprenticeship programs, and Trade Adjustment Assistance petitions, all in one run.
Maintenance Pulse
90/100Cost Estimate
How many results do you need?
Pricing
Pay Per Event model. You only pay for what you use.
| Event | Description | Price |
|---|---|---|
| result-returned | Charged per result returned from the search/lookup. | $0.02 |
Example: 100 events = $2.00 · 1,000 events = $20.00
Documentation
ETA Labor Market Intelligence pulls US labor market data from 4 official Department of Labor datasets into a single structured report — covering weekly unemployment insurance claims, registered apprenticeship programs, and Trade Adjustment Assistance petitions, all in one run.
Built for labor economists, workforce analysts, HR teams, and policy researchers, this actor queries the DOL Employment and Training Administration (ETA) API and produces a comprehensive market health report with trend analysis. No web scraping, no third-party aggregators — direct access to the authoritative federal source.
The actor fetches up to 5,000 records per dataset with automatic pagination, staggered 500ms inter-request delays to respect rate limits, exponential-backoff retry logic (4 attempts), and a market health score (0–100) computed from 11 unemployment, apprenticeship, and trade displacement signals.
What data can you extract?
| Data Point | Source Dataset | Example |
|---|---|---|
| 📊 Initial claims (national) | ui_national_weekly_claims | 224,000 (week ending 2024-12-07) |
| 📊 Continued claims (national) | ui_national_weekly_claims | 1,871,000 |
| 📈 Week-over-week change | Computed from national trend | -11,000 |
| 📉 4-week moving average | Computed from national trend | 230,000 |
| 🗺 Insured unemployment rate | ui_national_weekly_claims | 1.2% |
| 🏛 State-level initial claims | ui_state_weekly_claims | CA: 42,000 / TX: 18,500 / NY: 22,000 |
| 🎓 Apprenticeship programs | apprenticeship_data | Electrician — IBEW Local 11 JATC, CA, FY2023 |
| 🎓 Apprentice demographics | apprenticeship_data | Gender, age group, veteran status, education level |
| 🎓 Program completion rate | Computed (completers / completers + cancellations) | 72.65% (IBEW CA) |
| 📋 TAA petition decisions | otaa_petition | GLOBALTECH MANUFACTURING INC — Certified |
| 📋 Workers affected by trade displacement | otaa_petition | 350 workers (TA-W-96543) |
| 🔢 Market health score | Computed from 11 signals | 62 / 100 — Moderate |
Why use ETA Labor Market Intelligence?
Assembling this data manually means downloading multiple CSVs from the DOL data portal, cleaning inconsistent date formats, calculating week-over-week changes by hand, and rebuilding state summaries from scratch every time. That is a multi-hour task for a single snapshot — and it goes stale immediately.
This actor automates the entire data collection, transformation, and analysis pipeline against 4 DOL ETA datasets in a single run. Configure your filters once and schedule it to run weekly, or call it programmatically from your Python or JavaScript application whenever you need fresh labor market data.
- Scheduling — run weekly every Thursday morning (after DOL releases Thursday claims data) to keep your dashboards current
- API access — trigger runs from Python, JavaScript, or any HTTP client and pipe results directly into your data warehouse
- Proxy rotation — the DOL API is public, so no proxy is needed, keeping per-run cost near zero
- Monitoring — get Slack or email alerts when runs fail or when market health scores drop below a threshold
- Integrations — connect to Zapier, Make, Google Sheets, or webhooks to trigger downstream workflows automatically
Features
- 4 official DOL ETA datasets —
ui_national_weekly_claims,ui_state_weekly_claims,apprenticeship_data, andotaa_petitionqueried fromapiprod.dol.gov/v4 - Automatic pagination — fetches pages of 1,000 records until
maxResultsis reached; no manual offset management needed - Week-over-week change calculation — computed for every national UI record in the sorted time series
- 4-week moving average — computed from at least 4 weeks of national claims data for smoothed trend reading
- State-level unemployment summaries — aggregates raw weekly state records into per-state totals, average insured rates, and latest-week figures
- Apprenticeship completion rate — calculated per program as
completers / (completers + cancellations)with overall summary across all records - Top occupations and top states — ranked by active apprentice count, top 10 each
- TAA decision parsing — classifies petition decisions as Certified or Denied via case-insensitive string matching
- Trade displacement worker totals — sums all
workers_nbrvalues across TAA records with state and industry breakdowns - Market health score (0–100) — 11 scoring signals across unemployment rate, claims volume, week-over-week trends, 4-week moving average deviation, multi-state concentration, apprenticeship completion, enrollment volume, and trade displacement severity
- Trend direction classification — Rising, Slightly rising, Stable, Slightly declining, or Declining based on percentage change thresholds (>5%, >1%, <-1%, <-5%)
- Date range filtering — supports
gte/ltefilter conditions onreflected_week_ended(UI) anddetermination_date(TAA) - Company and occupation search — partial match (
likeoperator with%wildcards) for TAA company name and apprenticeship occupation title - Exponential-backoff retry — 4 attempts with 2^n × 1,000ms delays; 429 rate-limit responses trigger 2^n × 2,000ms waits
- Dry run mode — returns realistic sample data without any API calls when no API key is provided
Use cases for US labor market data
Workforce policy research
Policy researchers and think tanks need weekly snapshots of unemployment trends across all 50 states. Use the state breakdown with date range filtering to track insured unemployment rate changes during economic events — tariff announcements, regional layoffs, or federal program expirations — and export results to a time-series database for longitudinal analysis.
HR and talent acquisition planning
HR directors at mid-to-large employers use unemployment claims trends to calibrate hiring aggressiveness. A declining claims environment with a health score above 70 signals a tighter labor market; use that signal alongside the top-states breakdown to prioritise recruiting spend in states with lower competition. Combine with apprenticeship program data to identify talent pipelines for trades-heavy roles.
Trade compliance and supply chain risk
Trade analysts and supply chain risk teams monitor TAA petitions to identify which companies and industries are experiencing trade-driven layoffs. Filter by NAICS code or company name to track competitors, suppliers, or customers petitioning for TAA certification. A certified petition is an early signal of a company under sustained import pressure.
Workforce development and apprenticeship program management
State workforce agencies and apprenticeship sponsors track program health using completion rates, demographic breakdowns, and new enrollment volume. Filter by state and occupation to compare program performance across regions, identify occupations with low completion rates, and benchmark against national averages.
Economic journalism and market analysis
Journalists and economic researchers covering the labour market need structured weekly data that goes beyond the headline number. This actor delivers the full national trend series, 4-week moving averages, state-by-state summaries, and a computed trend direction narrative — ready to feed directly into data visualisations or briefing documents.
ESG and labour practice reporting
ESG analysts use apprenticeship demographic data — gender, race/ethnicity, veteran status, education level, age group — to assess workforce diversity in registered programs. Filter by sponsor name or state to benchmark specific program operators against national demographic norms.
How to extract US labor market data
- Get a free DOL API key — Register at dataportal.dol.gov/registration. Approval is instant and the key is free. Without a key, the actor runs in dry-run mode and returns sample data.
- Configure your filters — Set
searchModetoallfor a comprehensive report, or tounemployment,apprenticeship, ortradeAdjustmentfor a focused query. Add a two-letterstateabbreviation (e.g.,TX) to filter all three datasets to a single state. - Run the actor — Click "Start" and wait approximately 30–90 seconds for the default
maxResults: 200configuration. LargermaxResultsvalues (up to 5,000) take longer due to pagination and rate-limiting delays. - Download results — The report appears as a single JSON record in the Dataset tab. Export as JSON or CSV from the Apify Console, or fetch programmatically via the dataset API.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
apiKey | string | No | — | DOL Open Data Portal API key. Register free at dataportal.dol.gov/registration. Without this, dry-run mode activates. |
dryRun | boolean | No | true | Return sample data without calling the DOL API. Defaults to true unless apiKey is provided. |
searchMode | string | No | "all" | Which datasets to query: "all", "unemployment", "apprenticeship", or "tradeAdjustment" |
state | string | No | — | Two-letter state abbreviation (e.g., "CA", "TX", "NY") to filter all applicable datasets |
dateFrom | string | No | — | Filter records from this date (YYYY-MM-DD). Applies to UI weekly and TAA determination dates. |
dateTo | string | No | — | Filter records up to this date (YYYY-MM-DD). |
companyName | string | No | — | Partial match search on TAA petition company names (case-insensitive). |
occupation | string | No | — | Partial match search on apprenticeship occupation titles (case-insensitive). |
includeStateBreakdown | boolean | No | true | Include state-level UI claims breakdown in unemployment output. |
includeApprenticeship | boolean | No | true | Include registered apprenticeship program data (only applies when searchMode is "all"). |
includeTradeAdjustment | boolean | No | true | Include Trade Adjustment Assistance petition data (only applies when searchMode is "all"). |
maxResults | integer | No | 200 | Maximum records per dataset (1–5,000). State breakdown fetches up to maxResults × 5. |
Input examples
Comprehensive national report (most common):
{
"apiKey": "YOUR_DOL_API_KEY",
"dryRun": false,
"searchMode": "all",
"maxResults": 200
}
State-focused unemployment and TAA report:
{
"apiKey": "YOUR_DOL_API_KEY",
"dryRun": false,
"searchMode": "all",
"state": "MI",
"dateFrom": "2024-01-01",
"dateTo": "2024-12-31",
"includeApprenticeship": false,
"maxResults": 500
}
Trade adjustment search by company:
{
"apiKey": "YOUR_DOL_API_KEY",
"dryRun": false,
"searchMode": "tradeAdjustment",
"companyName": "STEEL",
"dateFrom": "2023-01-01",
"maxResults": 1000
}
Input tips
- Start with dry run — omit the
apiKeyfield entirely to preview the output structure and field names before committing to a full run. - Weekly scheduling — the DOL releases Thursday UI claims data. Schedule this actor for Thursday at 10:00 AM Eastern to always capture the latest week.
- Use
searchModeto reduce cost and time — if you only need unemployment claims, setsearchMode: "unemployment"to skip the apprenticeship and TAA fetches entirely. - Large date ranges need higher
maxResults— if yourdateFromtodateTowindow spans more than a year, setmaxResultsto 1,000 or higher to avoid truncation. - Company name search is uppercase internally — the filter sends
%STEEL%to the API regardless of how you type it, so"steel","Steel", and"STEEL"all produce the same results.
Output example
{
"reportType": "comprehensive",
"generatedAt": "2024-12-07T18:42:11.032Z",
"filters": {
"state": null,
"dateFrom": null,
"dateTo": null,
"companyName": null,
"occupation": null
},
"unemployment": {
"nationalTrend": [
{
"weekEnded": "2024-12-07",
"initialClaims": 224000,
"continuedClaims": 1871000,
"coveredEmployment": 154500000,
"insuredUnemploymentRate": 1.2,
"weekOverWeekChange": -11000,
"fourWeekMovingAverage": 230000
},
{
"weekEnded": "2024-11-30",
"initialClaims": 235000,
"continuedClaims": 1885000,
"coveredEmployment": 154300000,
"insuredUnemploymentRate": 1.2,
"weekOverWeekChange": 6000,
"fourWeekMovingAverage": 231500
}
],
"stateBreakdown": [
{
"state": "CA",
"totalInitialClaims": 42000,
"totalContinuedClaims": 380000,
"averageInsuredRate": 2.1,
"latestWeek": "2024-12-07",
"latestInitialClaims": 42000,
"weekCount": 4
},
{
"state": "TX",
"totalInitialClaims": 18500,
"totalContinuedClaims": 152000,
"averageInsuredRate": 0.9,
"latestWeek": "2024-12-07",
"latestInitialClaims": 18500,
"weekCount": 4
}
],
"latestNational": {
"weekEnded": "2024-12-07",
"initialClaims": 224000,
"continuedClaims": 1871000,
"coveredEmployment": 154500000,
"insuredUnemploymentRate": 1.2,
"weekOverWeekChange": -11000,
"fourWeekMovingAverage": 230000
},
"trendDirection": "Slightly declining",
"trendDescription": "Initial claims slightly declining from 235,000 to 224,000 (-4.68%). Week ending 2024-12-07."
},
"apprenticeship": {
"records": [
{
"state": "CA",
"fiscalYear": 2023,
"occupation": "Electrician",
"sponsor": "IBEW Local 11 JATC",
"programType": "Joint",
"newApprentices": 1250,
"activeApprentices": 4800,
"completers": 850,
"cancellations": 320,
"completionRate": 72.65,
"demographics": {
"gender": "Male",
"raceEthnicity": null,
"ageGroup": "25-34",
"veteranStatus": "Non-Veteran",
"educationLevel": "High School Diploma"
}
}
],
"summary": {
"totalNewApprentices": 2230,
"totalActiveApprentices": 8000,
"totalCompleters": 1470,
"totalCancellations": 600,
"overallCompletionRate": 71.01,
"topOccupations": [
{ "name": "Electrician", "count": 4800 },
{ "name": "Plumber", "count": 3200 }
],
"topStates": [
{ "name": "CA", "count": 4800 },
{ "name": "TX", "count": 3200 }
]
}
},
"tradeAdjustment": {
"records": [
{
"caseNumber": "TA-W-96543",
"companyName": "GLOBALTECH MANUFACTURING INC",
"city": "DETROIT",
"state": "MI",
"zip": "48201",
"determinationDate": "2024-10-15",
"impactDate": "2024-08-01",
"expirationDate": "2026-10-15",
"workersAffected": 350,
"decision": "Certified",
"naicsCode": "336111",
"sicCode": null
},
{
"caseNumber": "TA-W-96601",
"companyName": "PACIFIC SEMICONDUCTOR CORP",
"city": "SAN JOSE",
"state": "CA",
"zip": "95112",
"determinationDate": "2024-11-20",
"impactDate": "2024-09-15",
"expirationDate": "2026-11-20",
"workersAffected": 180,
"decision": "Certified",
"naicsCode": "334413",
"sicCode": null
}
],
"summary": {
"totalPetitions": 3,
"totalCertified": 2,
"totalDenied": 1,
"totalWorkersAffected": 625,
"certificationRate": 66.67,
"topStates": [
{ "name": "MI", "count": 1 },
{ "name": "CA", "count": 1 },
{ "name": "IN", "count": 1 }
],
"topIndustries": [
{ "code": "336111", "count": 1 },
{ "code": "334413", "count": 1 }
]
}
},
"marketInsight": {
"score": 62,
"level": "Moderate",
"factors": [
"Low insured unemployment rate: 1.2% (+15)",
"Initial claims declining: -11,000 week-over-week (+10)",
"Low initial claims: 224,000 (+10)",
"Strong apprenticeship completion rate: 71.01% (+8)",
"625 workers affected by trade displacement (-6)"
]
}
}
Output fields
| Field | Type | Description |
|---|---|---|
reportType | string | "unemployment", "apprenticeship", "tradeAdjustment", or "comprehensive" |
generatedAt | string | ISO 8601 timestamp of report generation |
filters.state | string | null | State filter applied, if any |
filters.dateFrom | string | null | Date range start filter applied |
filters.dateTo | string | null | Date range end filter applied |
filters.companyName | string | null | TAA company name filter applied |
filters.occupation | string | null | Apprenticeship occupation filter applied |
unemployment.nationalTrend[] | array | Weekly national UI claims records, most recent first |
unemployment.nationalTrend[].weekEnded | string | Week-ending date (YYYY-MM-DD) |
unemployment.nationalTrend[].initialClaims | integer | New UI claims filed that week |
unemployment.nationalTrend[].continuedClaims | integer | Ongoing (continued) UI claims |
unemployment.nationalTrend[].coveredEmployment | integer | null | Total covered employment |
unemployment.nationalTrend[].insuredUnemploymentRate | number | null | IUR as percentage |
unemployment.nationalTrend[].weekOverWeekChange | integer | null | Change in initial claims vs prior week |
unemployment.nationalTrend[].fourWeekMovingAverage | integer | null | 4-week rolling average of initial claims |
unemployment.stateBreakdown[] | array | Per-state UI summary aggregated from weekly records |
unemployment.stateBreakdown[].state | string | Two-letter state abbreviation |
unemployment.stateBreakdown[].totalInitialClaims | integer | Sum of initial claims across all fetched weeks |
unemployment.stateBreakdown[].totalContinuedClaims | integer | Sum of continued claims across all fetched weeks |
unemployment.stateBreakdown[].averageInsuredRate | number | null | Average IUR across fetched weeks |
unemployment.stateBreakdown[].latestWeek | string | null | Most recent week-ending date in data |
unemployment.stateBreakdown[].latestInitialClaims | integer | null | Initial claims for the most recent week |
unemployment.stateBreakdown[].weekCount | integer | Number of weeks included in the aggregation |
unemployment.latestNational | object | null | Single most-recent national UI record |
unemployment.trendDirection | string | "Rising", "Slightly rising", "Stable", "Slightly declining", or "Declining" |
unemployment.trendDescription | string | Human-readable trend summary with percentage change |
apprenticeship.records[] | array | Individual apprenticeship program records |
apprenticeship.records[].state | string | State abbreviation |
apprenticeship.records[].fiscalYear | integer | Federal fiscal year |
apprenticeship.records[].occupation | string | null | Occupation title |
apprenticeship.records[].sponsor | string | null | Program sponsor name |
apprenticeship.records[].programType | string | null | Program type (e.g., Joint) |
apprenticeship.records[].newApprentices | integer | New enrollees in the period |
apprenticeship.records[].activeApprentices | integer | Currently active apprentices |
apprenticeship.records[].completers | integer | Apprentices who completed the program |
apprenticeship.records[].cancellations | integer | Apprentices who cancelled |
apprenticeship.records[].completionRate | number | null | completers / (completers + cancellations) × 100 |
apprenticeship.records[].demographics.gender | string | null | Gender breakdown |
apprenticeship.records[].demographics.raceEthnicity | string | null | Race/ethnicity category |
apprenticeship.records[].demographics.ageGroup | string | null | Age group (e.g., 25-34) |
apprenticeship.records[].demographics.veteranStatus | string | null | Veteran or Non-Veteran |
apprenticeship.records[].demographics.educationLevel | string | null | Highest education level |
apprenticeship.summary.totalNewApprentices | integer | Sum of new apprentices across all records |
apprenticeship.summary.totalActiveApprentices | integer | Sum of active apprentices across all records |
apprenticeship.summary.totalCompleters | integer | Sum of completers |
apprenticeship.summary.totalCancellations | integer | Sum of cancellations |
apprenticeship.summary.overallCompletionRate | number | null | Aggregate completion rate |
apprenticeship.summary.topOccupations[] | array | Top 10 occupations by active apprentice count |
apprenticeship.summary.topStates[] | array | Top 10 states by active apprentice count |
tradeAdjustment.records[].caseNumber | string | TAA petition case number (e.g., TA-W-96543) |
tradeAdjustment.records[].companyName | string | Petitioning company name |
tradeAdjustment.records[].city | string | null | City of affected facility |
tradeAdjustment.records[].state | string | null | State of affected facility |
tradeAdjustment.records[].zip | string | null | ZIP code |
tradeAdjustment.records[].determinationDate | string | null | Date of DOL determination (YYYY-MM-DD) |
tradeAdjustment.records[].impactDate | string | null | Date workers were first impacted |
tradeAdjustment.records[].expirationDate | string | null | Certification expiration date |
tradeAdjustment.records[].workersAffected | integer | null | Number of workers covered by petition |
tradeAdjustment.records[].decision | string | Certification decision (e.g., "Certified", "Denied") |
tradeAdjustment.records[].naicsCode | string | null | NAICS industry code |
tradeAdjustment.records[].sicCode | string | null | SIC industry code |
tradeAdjustment.summary.totalPetitions | integer | Total TAA petitions in result set |
tradeAdjustment.summary.totalCertified | integer | Petitions with certified decisions |
tradeAdjustment.summary.totalDenied | integer | Petitions with denied decisions |
tradeAdjustment.summary.totalWorkersAffected | integer | Total workers across all petitions |
tradeAdjustment.summary.certificationRate | number | null | Certified / total petitions × 100 |
tradeAdjustment.summary.topStates[] | array | Top 10 states by petition count |
tradeAdjustment.summary.topIndustries[] | array | Top 10 NAICS/SIC codes by petition count |
marketInsight.score | integer | Labor market health score 0–100 (Strong 75+, Moderate 50–74, Weak 25–49, Stressed <25) |
marketInsight.level | string | Health level label |
marketInsight.factors[] | array | Scoring factors with point contributions |
How much does it cost to extract US labor market data?
ETA Labor Market Intelligence uses pay-per-result pricing — you pay for the compute used during each run. At 128–512 MB memory and typical run times under 2 minutes, most runs consume under $0.02 of Apify platform compute.
| Scenario | Datasets queried | Approx. run time | Estimated cost |
|---|---|---|---|
| Dry run preview | None (sample data) | < 5 seconds | $0.00 |
| Unemployment only (200 records) | 1 | ~20 seconds | ~$0.004 |
| Comprehensive (all 3, 200 records each) | 4 | ~60 seconds | ~$0.01 |
| Comprehensive (all 3, 1,000 records each) | 4 | ~3 minutes | ~$0.02 |
| Full historical pull (5,000 records each) | 4 | ~15 minutes | ~$0.08 |
You can set a maximum spending limit per run to control costs. The actor stops when your budget is reached.
The DOL data itself is free and the API key is free. Apify's free tier includes $5 of monthly credits, which covers hundreds of standard runs.
Compare this to commercial labour market data vendors (EMSI Burning Glass, Lightcast) at $500–2,000/month for subscription access — this actor delivers the same underlying government source data at near-zero cost.
Extract US labor market data using the API
Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ryanclinton/eta-labor-market-intel").call(run_input={
"apiKey": "YOUR_DOL_API_KEY",
"dryRun": False,
"searchMode": "all",
"maxResults": 200
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
insight = item.get("marketInsight", {})
print(f"Market health: {insight.get('level')} ({insight.get('score')}/100)")
unemployment = item.get("unemployment", {})
latest = unemployment.get("latestNational", {})
if latest:
print(f"Latest initial claims: {latest.get('initialClaims'):,} (week ending {latest.get('weekEnded')})")
print(f"Week-over-week change: {latest.get('weekOverWeekChange'):,}")
taa = item.get("tradeAdjustment", {}).get("summary", {})
if taa:
print(f"TAA petitions: {taa.get('totalPetitions')} ({taa.get('totalWorkersAffected'):,} workers affected)")
JavaScript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "YOUR_API_TOKEN" });
const run = await client.actor("ryanclinton/eta-labor-market-intel").call({
apiKey: "YOUR_DOL_API_KEY",
dryRun: false,
searchMode: "all",
maxResults: 200
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
const { marketInsight, unemployment, tradeAdjustment } = item;
console.log(`Market health: ${marketInsight.level} (${marketInsight.score}/100)`);
const latest = unemployment?.latestNational;
if (latest) {
console.log(`Initial claims: ${latest.initialClaims.toLocaleString()} (${latest.weekEnded})`);
console.log(`4-week moving average: ${latest.fourWeekMovingAverage?.toLocaleString()}`);
}
const taaSummary = tradeAdjustment?.summary;
if (taaSummary) {
console.log(`TAA certified: ${taaSummary.totalCertified}/${taaSummary.totalPetitions} petitions`);
}
}
cURL
# Start the actor run
curl -X POST "https://api.apify.com/v2/acts/ryanclinton~eta-labor-market-intel/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "YOUR_DOL_API_KEY",
"dryRun": false,
"searchMode": "all",
"maxResults": 200
}'
# Fetch results (replace DATASET_ID from the run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN&format=json"
How ETA Labor Market Intelligence works
Phase 1: Parallel dataset fetching with staggered start times
The actor dispatches up to 4 concurrent fetch operations using Promise.all. To avoid hammering the DOL API simultaneously, each dataset fetch is staggered: national UI starts immediately, state UI starts after 1 second, apprenticeship after 2 seconds, and TAA after 3 seconds. Each fetch calls apiprod.dol.gov/v4/get/ETA/{dataset}/json with a page size of 1,000 records and paginating via offset until maxResults is reached or the API returns fewer records than the requested page size.
Phase 2: Filter construction and API query encoding
Date filters are translated into DOL API filter_object conditions using gte/lte operators with ISO 8601 timestamp values (T00:00:00 / T23:59:59). String searches use the like operator with % wildcard wrapping. Multiple conditions are combined under an and object. The complete filter is JSON-serialised and URL-encoded before being appended to the query string as filter_object=.
Phase 3: Data transformation and computed metrics
Raw API records (snake_case) are mapped to typed output objects (camelCase). Week-over-week change is computed by iterating the date-sorted national UI series and subtracting the prior record's initial_claims. The 4-week moving average is computed from the 4-element window ending at each record position once at least 4 records exist. Apprenticeship completion rate is computed per record as completers / (completers + cancellations). TAA decisions are classified via case-insensitive substring matching for "certif" and "denied".
Phase 4: Market health scoring
Starting from a baseline of 50, the scoring function applies 11 adjustments:
| Condition | Score delta |
|---|---|
| IUR > 3.0% | -20 |
| IUR > 2.0% | -10 |
| IUR < 1.0% | +15 |
| IUR 1.0–2.0% | +5 |
| Initial claims surge > 50K WoW | -15 |
| Initial claims rising 10–50K WoW | -8 |
| Initial claims declining > 10K WoW | +10 |
| Initial claims > 300K | -15 |
| Initial claims 250–300K | -5 |
| Initial claims < 200K | +10 |
| Claims > 110% of 4-week MA | -8 |
| > 10 states with IUR > 3% | -10 |
| 5–10 states with IUR > 3% | -5 |
| Apprenticeship completion rate > 60% | +8 |
| New apprentice enrollment > 10,000 | +5 |
| Trade-displaced workers > 50,000 | -12 |
| Trade-displaced workers 20–50K | -6 |
| TAA certification rate > 70% | -5 |
The score is clamped to 0–100. Levels: Strong (75+), Moderate (50–74), Weak (25–49), Stressed (<25).
Tips for best results
-
Schedule on Thursdays at 10:00 AM Eastern. The DOL publishes weekly unemployment insurance claims data every Thursday morning. Scheduling the actor shortly after publication ensures you always capture the freshest week.
-
Use
searchMode: "unemployment"for lean weekly runs. If you only need the claims headline number and state breakdown, skipping apprenticeship and TAA datasets reduces run time from ~60 seconds to ~20 seconds and cuts compute cost by roughly 65%. -
Set
maxResultsproportionally to your date range. One year of weekly national data is about 52 records; setmaxResults: 100for safety. For TAA petitions covering several years, 1,000–2,000 is appropriate. -
Combine with the Company Deep Research actor when a TAA-certified petition names a known competitor or supplier. The petition gives you the NAICS code, worker count, and impact date; deep research fills in the company background.
-
Use state filtering for regional dashboards. Setting
state: "OH"filters the UI state breakdown, apprenticeship records, and TAA petitions simultaneously to Ohio in a single run — no post-processing needed. -
Store the full
nationalTrendarray, not justlatestNational. The trend series is sorted most-recent first and includes all weeks within yourmaxResultslimit. Storing the full array lets you build historical charts without re-running the actor. -
Monitor the
trendDirectionfield programmatically. Set up a webhook or Zapier automation to trigger an alert whentrendDirectionchanges to"Rising"— a useful signal for economic risk monitoring workflows. -
For multi-state comparisons, run once without a state filter and process the
stateBreakdownarray locally. Fetching all states in one run is faster and cheaper than 50 individual state-filtered runs.
Combine with other Apify actors
| Actor | How to combine |
|---|---|
| Company Deep Research | Feed TAA petition company names into Company Deep Research to build a full intelligence profile on trade-displaced employers — useful for supply chain risk analysis. |
| B2B Lead Qualifier | Score companies identified via TAA petitions as acquisition targets or distressed-asset leads — certified companies are under sustained competitive pressure. |
| Website Contact Scraper | Extract contact information from websites of TAA-certified companies to build outreach lists for workforce development, legal, or restructuring services. |
| Trustpilot Review Analyzer | Cross-reference TAA company names against Trustpilot to see if layoffs and trade pressure are reflected in customer and employee sentiment. |
| HubSpot Lead Pusher | Push TAA petition records or high-unemployment state contacts directly into HubSpot as leads for workforce services or outplacement firms. |
| Website Change Monitor | Monitor DOL announcement pages for policy changes affecting unemployment insurance or apprenticeship program eligibility rules. |
| SEC EDGAR Filing Analyzer | Cross-reference TAA-certified companies against EDGAR filings to identify publicly traded companies disclosing trade-related workforce impacts in their 10-K or 8-K. |
Limitations
- Data is only as current as the DOL's publication schedule. National UI claims data is published weekly on Thursdays. Apprenticeship and TAA datasets are updated less frequently — typically quarterly or annually for apprenticeship data.
- No real-time data. The actor fetches from the DOL's production API but cannot access data not yet published by the agency.
maxResultsapplies per dataset independently. SettingmaxResults: 200returns up to 200 national UI records, 200 apprenticeship records, and 200 TAA records — not 200 total across all datasets.- State breakdown fetches up to
maxResults × 5raw weekly records. For amaxResults: 200run, up to 1,000 state-week records are fetched and then aggregated into state summaries. Very long date ranges may require a highermaxResultsto avoid incomplete state data. - Company name and occupation searches use DOL's
likeoperator, which matches only on the raw uppercase values stored in the API. Abbreviations and alternative company names (e.g.,"GM"vs"GENERAL MOTORS") will not match unless the stored value contains the search string. - Market health score requires unemployment data. The score is computed primarily from UI claims signals. If
searchMode: "apprenticeship"orsearchMode: "tradeAdjustment"is used without unemployment data, the score will reflect only apprenticeship/TAA signals from a baseline of 50. - TAA petition NAICS codes are not always populated. Some older petitions contain only SIC codes. The actor includes both fields so you can use whichever is present.
- No demographic disaggregation at summary level. Apprenticeship demographic data (gender, race/ethnicity, etc.) is available at the individual record level but is not aggregated in the summary object. Post-processing is needed for demographic breakdowns across the full dataset.
- The DOL API enforces rate limits. Runs with very high
maxResults(3,000+) across all 4 datasets may encounter 429 responses. The actor handles these with exponential backoff, but extremely large pulls may take 10–15 minutes.
Integrations
- Zapier — trigger a Zapier workflow when the weekly run completes to push the market health score into a Google Sheet or send a Slack message with the latest claims figure
- Make — build a Make scenario that runs this actor weekly and appends the national trend data to an Airtable base for dashboard visualisation
- Google Sheets — export the
stateBreakdownarray to a Google Sheet for a 50-state unemployment rate heat map updated weekly - Apify API — call the actor programmatically from a Python or Node.js data pipeline and pipe TAA records into a PostgreSQL database for longitudinal tracking
- Webhooks — fire a webhook to your internal alert system when the actor finishes so downstream jobs can pick up fresh data immediately
- LangChain / LlamaIndex — feed the JSON report into an LLM chain to generate a plain-English weekly labor market briefing from the structured data
Troubleshooting
-
Run completes but dataset is empty — This happens when
dryRunistrue(the default) and noapiKeyis set. In dry-run mode the actor logs a warning but does not push data to the dataset. SetdryRun: falseand provide a validapiKeyto receive real data. You can verify your key is valid by callinghttps://apiprod.dol.gov/v4/get/ETA/ui_national_weekly_claims/json?X-API-KEY=YOUR_KEY&limit=1directly. -
Actor returns 401 or 403 errors in the log — Your DOL API key is invalid or has expired. Re-register at dataportal.dol.gov/registration. Keys are free and instant; the new key will work immediately.
-
State breakdown is missing or contains very few states — Your date range is too narrow relative to
maxResults. The state weekly dataset is fetched with a limit ofmaxResults × 5. If your date range includes 52 weeks across 50 states, you need at least 2,600 raw records — setmaxResults: 600or higher. -
TAA company name search returns no results — The
likesearch is run against the exact string stored in the API (typically uppercase, full legal name). Try a shorter partial string:"STEEL"will match"MIDWEST STEEL FABRICATION LLC", but"Midwest Steel"with mixed case will not — the actor uppercases the input internally, so this is handled, but the stored name must contain your search string verbatim. -
Run times out on large pulls — The actor has a 30-second per-request timeout and 500ms inter-request delays. A
maxResults: 5000run across all 4 datasets can take 15+ minutes. Increase the actor's timeout in the run settings or reducemaxResultsto avoid timeout failures.
Responsible use
- This actor only accesses publicly available US government data published by the Department of Labor.
- All data is sourced from the DOL Open Data Portal under open government data principles.
- The DOL API terms of service permit programmatic access for research, analysis, and applications.
- Do not use extracted data in ways that misrepresent official government statistics or attribute analysis to the DOL without disclosure.
- For guidance on public API usage and data republication, consult the DOL data portal terms.
FAQ
How current is the unemployment claims data from this actor? The DOL publishes national weekly unemployment insurance claims every Thursday morning, typically by 8:30 AM Eastern. State-level data follows the same schedule. This actor fetches from the live production API, so data is as fresh as the DOL's most recent publication. Schedule the actor to run Thursday at 10:00 AM Eastern to always capture the latest week.
How many records can I extract from the DOL ETA datasets in one run?
Up to 5,000 records per dataset. At the default maxResults: 200, you receive up to 200 national UI weekly records, up to 1,000 state-weekly records (which aggregate into state summaries), up to 200 apprenticeship records, and up to 200 TAA petition records. Set maxResults up to 5,000 for historical pulls.
Do I need a DOL API key to use this actor? No — you can run without a key in dry-run mode, which returns a realistic sample report immediately and for free. To access real DOL data, a free API key is required. Register at dataportal.dol.gov/registration — approval is instant.
What is the market health score and how is it calculated?
The market health score is a 0–100 composite index computed from 11 signals across unemployment rate levels, week-over-week claims changes, absolute claims volume, 4-week moving average deviation, multi-state concentration of high unemployment, apprenticeship completion rates and enrollment, and trade displacement worker counts. A score of 75+ is Strong, 50–74 is Moderate, 25–49 is Weak, and below 25 is Stressed. The marketInsight.factors array lists every signal that contributed to the score with its point impact.
How is this different from downloading data directly from the DOL website? The DOL data portal offers CSV downloads but requires manual steps: navigating multiple dataset pages, applying filters, downloading files, cleaning inconsistent formats, and doing your own calculations. This actor delivers all 4 datasets in a single API call, pre-cleaned, with computed metrics (week-over-week change, moving averages, completion rates, state summaries) and a health score — ready for direct use in code or downstream tools. It also supports programmatic scheduling and integration via Apify's platform.
Can I filter unemployment claims data by state?
Yes. Set the state parameter to a two-letter abbreviation (e.g., "MI"). This filters the state weekly breakdown to that state only. National claims data is not filtered by state — it is a national aggregate by definition.
Is it legal to access and use DOL ETA data this way? Yes. The DOL Open Data Portal is a public government data service operating under open data principles. The API is freely accessible to developers, researchers, and businesses. The data is published by the US federal government for public use. There are no restrictions on programmatic access or use of the data in applications and analysis.
Can I use this actor to monitor a specific company's TAA petition history?
Yes. Set searchMode: "tradeAdjustment" and companyName to the company name (or a partial string). The actor will search for all petitions matching that string. Companies sometimes file multiple petitions over time — setting maxResults: 1000 and a wide date range ensures you capture the full history.
How accurate is the apprenticeship completion rate calculation?
The completion rate is computed directly from the DOL's reported completers and cancellations values as completers / (completers + cancellations) × 100. This matches the standard DOL methodology. Rates are only computed when the denominator is greater than zero; otherwise the field is null. Note that the DOL data includes demographic sub-rows (one row per gender/age/ethnicity combination per program), so totals in individual records may represent sub-cohorts rather than full program totals.
Can I schedule this actor to run automatically every week? Yes. Use the Apify Console's scheduler feature to set a weekly cron (e.g., every Thursday at 10:00 AM Eastern). Each run will fetch the latest available data and push it to the dataset, building a historical archive automatically over time.
How is this different from paid labor market data services like Lightcast or EMSI? Lightcast and EMSI supplement government data with proprietary job posting analysis, occupation demand forecasts, and skills data — useful for detailed labour market analytics but priced at $500–2,000+/month. This actor provides the foundational government data (UI claims, apprenticeships, TAA petitions) from the primary source at near-zero cost. For teams that need the raw official data rather than proprietary enrichments, this actor is a direct and far cheaper alternative.
Help us improve
If you encounter issues, you can help us debug faster by enabling run sharing in your Apify account:
- Go to Account Settings > Privacy
- Enable Share runs with public Actor creators
This lets us see your run details when something goes wrong, so we can fix issues faster. Your data is only visible to the actor developer, not publicly.
Support
Found a bug or have a feature request? Open an issue in the Issues tab on this actor's page. For custom solutions or enterprise integrations, reach out through the Apify platform.
How it works
Configure
Set your parameters in the Apify Console or pass them via API.
Run
Click Start, trigger via API, webhook, or set up a schedule.
Get results
Download as JSON, CSV, or Excel. Integrate with 1,000+ apps.
Use cases
Sales Teams
Build targeted lead lists with verified contact data.
Marketing
Research competitors and identify outreach opportunities.
Data Teams
Automate data collection pipelines with scheduled runs.
Developers
Integrate via REST API or use as an MCP tool in AI workflows.
Related actors
GitHub Repository Search
Search GitHub repositories by keyword, language, topic, stars, forks. Sort by stars, forks, or recently updated. Returns metadata, topics, license, owner info, URLs. Free API, optional token for higher limits.
Website Content to Markdown
Convert any website to clean Markdown for RAG pipelines, LLM training, and AI apps. Crawls pages, strips boilerplate, preserves headings, tables, and code blocks. GFM support.
Weather Forecast Search
Get weather forecasts for any location worldwide using the free Open-Meteo API. Returns current conditions, daily and hourly forecasts with temperature, precipitation, wind, UV index, and more. No API key needed.
EUIPO EU Trademark Search
Search EU trademarks via official EUIPO database. Find registered and pending trademarks by name, Nice class, applicant, or status. Returns full trademark details and filing history.
Ready to try ETA Labor Market Intelligence?
Start for free on Apify. No credit card required.
Open on Apify Store