OTHERAI

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.

Try on Apify Store
$0.02per event
0
Users (30d)
0
Runs (30d)
90
Actively maintained
Maintenance Pulse
$0.02
Per event

Maintenance Pulse

90/100
Last Build
Today
Last Version
1d ago
Builds (30d)
8
Issue Response
N/A

Cost Estimate

How many results do you need?

result-returneds
Estimated cost:$2.00

Pricing

Pay Per Event model. You only pay for what you use.

EventDescriptionPrice
result-returnedCharged 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 PointSource DatasetExample
📊 Initial claims (national)ui_national_weekly_claims224,000 (week ending 2024-12-07)
📊 Continued claims (national)ui_national_weekly_claims1,871,000
📈 Week-over-week changeComputed from national trend-11,000
📉 4-week moving averageComputed from national trend230,000
🗺 Insured unemployment rateui_national_weekly_claims1.2%
🏛 State-level initial claimsui_state_weekly_claimsCA: 42,000 / TX: 18,500 / NY: 22,000
🎓 Apprenticeship programsapprenticeship_dataElectrician — IBEW Local 11 JATC, CA, FY2023
🎓 Apprentice demographicsapprenticeship_dataGender, age group, veteran status, education level
🎓 Program completion rateComputed (completers / completers + cancellations)72.65% (IBEW CA)
📋 TAA petition decisionsotaa_petitionGLOBALTECH MANUFACTURING INC — Certified
📋 Workers affected by trade displacementotaa_petition350 workers (TA-W-96543)
🔢 Market health scoreComputed from 11 signals62 / 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 datasetsui_national_weekly_claims, ui_state_weekly_claims, apprenticeship_data, and otaa_petition queried from apiprod.dol.gov/v4
  • Automatic pagination — fetches pages of 1,000 records until maxResults is 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_nbr values 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/lte filter conditions on reflected_week_ended (UI) and determination_date (TAA)
  • Company and occupation search — partial match (like operator 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

  1. 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.
  2. Configure your filters — Set searchMode to all for a comprehensive report, or to unemployment, apprenticeship, or tradeAdjustment for a focused query. Add a two-letter state abbreviation (e.g., TX) to filter all three datasets to a single state.
  3. Run the actor — Click "Start" and wait approximately 30–90 seconds for the default maxResults: 200 configuration. Larger maxResults values (up to 5,000) take longer due to pagination and rate-limiting delays.
  4. 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

ParameterTypeRequiredDefaultDescription
apiKeystringNoDOL Open Data Portal API key. Register free at dataportal.dol.gov/registration. Without this, dry-run mode activates.
dryRunbooleanNotrueReturn sample data without calling the DOL API. Defaults to true unless apiKey is provided.
searchModestringNo"all"Which datasets to query: "all", "unemployment", "apprenticeship", or "tradeAdjustment"
statestringNoTwo-letter state abbreviation (e.g., "CA", "TX", "NY") to filter all applicable datasets
dateFromstringNoFilter records from this date (YYYY-MM-DD). Applies to UI weekly and TAA determination dates.
dateTostringNoFilter records up to this date (YYYY-MM-DD).
companyNamestringNoPartial match search on TAA petition company names (case-insensitive).
occupationstringNoPartial match search on apprenticeship occupation titles (case-insensitive).
includeStateBreakdownbooleanNotrueInclude state-level UI claims breakdown in unemployment output.
includeApprenticeshipbooleanNotrueInclude registered apprenticeship program data (only applies when searchMode is "all").
includeTradeAdjustmentbooleanNotrueInclude Trade Adjustment Assistance petition data (only applies when searchMode is "all").
maxResultsintegerNo200Maximum 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 apiKey field 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 searchMode to reduce cost and time — if you only need unemployment claims, set searchMode: "unemployment" to skip the apprenticeship and TAA fetches entirely.
  • Large date ranges need higher maxResults — if your dateFrom to dateTo window spans more than a year, set maxResults to 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

FieldTypeDescription
reportTypestring"unemployment", "apprenticeship", "tradeAdjustment", or "comprehensive"
generatedAtstringISO 8601 timestamp of report generation
filters.statestring | nullState filter applied, if any
filters.dateFromstring | nullDate range start filter applied
filters.dateTostring | nullDate range end filter applied
filters.companyNamestring | nullTAA company name filter applied
filters.occupationstring | nullApprenticeship occupation filter applied
unemployment.nationalTrend[]arrayWeekly national UI claims records, most recent first
unemployment.nationalTrend[].weekEndedstringWeek-ending date (YYYY-MM-DD)
unemployment.nationalTrend[].initialClaimsintegerNew UI claims filed that week
unemployment.nationalTrend[].continuedClaimsintegerOngoing (continued) UI claims
unemployment.nationalTrend[].coveredEmploymentinteger | nullTotal covered employment
unemployment.nationalTrend[].insuredUnemploymentRatenumber | nullIUR as percentage
unemployment.nationalTrend[].weekOverWeekChangeinteger | nullChange in initial claims vs prior week
unemployment.nationalTrend[].fourWeekMovingAverageinteger | null4-week rolling average of initial claims
unemployment.stateBreakdown[]arrayPer-state UI summary aggregated from weekly records
unemployment.stateBreakdown[].statestringTwo-letter state abbreviation
unemployment.stateBreakdown[].totalInitialClaimsintegerSum of initial claims across all fetched weeks
unemployment.stateBreakdown[].totalContinuedClaimsintegerSum of continued claims across all fetched weeks
unemployment.stateBreakdown[].averageInsuredRatenumber | nullAverage IUR across fetched weeks
unemployment.stateBreakdown[].latestWeekstring | nullMost recent week-ending date in data
unemployment.stateBreakdown[].latestInitialClaimsinteger | nullInitial claims for the most recent week
unemployment.stateBreakdown[].weekCountintegerNumber of weeks included in the aggregation
unemployment.latestNationalobject | nullSingle most-recent national UI record
unemployment.trendDirectionstring"Rising", "Slightly rising", "Stable", "Slightly declining", or "Declining"
unemployment.trendDescriptionstringHuman-readable trend summary with percentage change
apprenticeship.records[]arrayIndividual apprenticeship program records
apprenticeship.records[].statestringState abbreviation
apprenticeship.records[].fiscalYearintegerFederal fiscal year
apprenticeship.records[].occupationstring | nullOccupation title
apprenticeship.records[].sponsorstring | nullProgram sponsor name
apprenticeship.records[].programTypestring | nullProgram type (e.g., Joint)
apprenticeship.records[].newApprenticesintegerNew enrollees in the period
apprenticeship.records[].activeApprenticesintegerCurrently active apprentices
apprenticeship.records[].completersintegerApprentices who completed the program
apprenticeship.records[].cancellationsintegerApprentices who cancelled
apprenticeship.records[].completionRatenumber | nullcompleters / (completers + cancellations) × 100
apprenticeship.records[].demographics.genderstring | nullGender breakdown
apprenticeship.records[].demographics.raceEthnicitystring | nullRace/ethnicity category
apprenticeship.records[].demographics.ageGroupstring | nullAge group (e.g., 25-34)
apprenticeship.records[].demographics.veteranStatusstring | nullVeteran or Non-Veteran
apprenticeship.records[].demographics.educationLevelstring | nullHighest education level
apprenticeship.summary.totalNewApprenticesintegerSum of new apprentices across all records
apprenticeship.summary.totalActiveApprenticesintegerSum of active apprentices across all records
apprenticeship.summary.totalCompletersintegerSum of completers
apprenticeship.summary.totalCancellationsintegerSum of cancellations
apprenticeship.summary.overallCompletionRatenumber | nullAggregate completion rate
apprenticeship.summary.topOccupations[]arrayTop 10 occupations by active apprentice count
apprenticeship.summary.topStates[]arrayTop 10 states by active apprentice count
tradeAdjustment.records[].caseNumberstringTAA petition case number (e.g., TA-W-96543)
tradeAdjustment.records[].companyNamestringPetitioning company name
tradeAdjustment.records[].citystring | nullCity of affected facility
tradeAdjustment.records[].statestring | nullState of affected facility
tradeAdjustment.records[].zipstring | nullZIP code
tradeAdjustment.records[].determinationDatestring | nullDate of DOL determination (YYYY-MM-DD)
tradeAdjustment.records[].impactDatestring | nullDate workers were first impacted
tradeAdjustment.records[].expirationDatestring | nullCertification expiration date
tradeAdjustment.records[].workersAffectedinteger | nullNumber of workers covered by petition
tradeAdjustment.records[].decisionstringCertification decision (e.g., "Certified", "Denied")
tradeAdjustment.records[].naicsCodestring | nullNAICS industry code
tradeAdjustment.records[].sicCodestring | nullSIC industry code
tradeAdjustment.summary.totalPetitionsintegerTotal TAA petitions in result set
tradeAdjustment.summary.totalCertifiedintegerPetitions with certified decisions
tradeAdjustment.summary.totalDeniedintegerPetitions with denied decisions
tradeAdjustment.summary.totalWorkersAffectedintegerTotal workers across all petitions
tradeAdjustment.summary.certificationRatenumber | nullCertified / total petitions × 100
tradeAdjustment.summary.topStates[]arrayTop 10 states by petition count
tradeAdjustment.summary.topIndustries[]arrayTop 10 NAICS/SIC codes by petition count
marketInsight.scoreintegerLabor market health score 0–100 (Strong 75+, Moderate 50–74, Weak 25–49, Stressed <25)
marketInsight.levelstringHealth level label
marketInsight.factors[]arrayScoring 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.

ScenarioDatasets queriedApprox. run timeEstimated cost
Dry run previewNone (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:

ConditionScore 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

  1. 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.

  2. 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%.

  3. Set maxResults proportionally to your date range. One year of weekly national data is about 52 records; set maxResults: 100 for safety. For TAA petitions covering several years, 1,000–2,000 is appropriate.

  4. 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.

  5. 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.

  6. Store the full nationalTrend array, not just latestNational. The trend series is sorted most-recent first and includes all weeks within your maxResults limit. Storing the full array lets you build historical charts without re-running the actor.

  7. Monitor the trendDirection field programmatically. Set up a webhook or Zapier automation to trigger an alert when trendDirection changes to "Rising" — a useful signal for economic risk monitoring workflows.

  8. For multi-state comparisons, run once without a state filter and process the stateBreakdown array locally. Fetching all states in one run is faster and cheaper than 50 individual state-filtered runs.

Combine with other Apify actors

ActorHow to combine
Company Deep ResearchFeed 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 QualifierScore companies identified via TAA petitions as acquisition targets or distressed-asset leads — certified companies are under sustained competitive pressure.
Website Contact ScraperExtract contact information from websites of TAA-certified companies to build outreach lists for workforce development, legal, or restructuring services.
Trustpilot Review AnalyzerCross-reference TAA company names against Trustpilot to see if layoffs and trade pressure are reflected in customer and employee sentiment.
HubSpot Lead PusherPush TAA petition records or high-unemployment state contacts directly into HubSpot as leads for workforce services or outplacement firms.
Website Change MonitorMonitor DOL announcement pages for policy changes affecting unemployment insurance or apprenticeship program eligibility rules.
SEC EDGAR Filing AnalyzerCross-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.
  • maxResults applies per dataset independently. Setting maxResults: 200 returns 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 × 5 raw weekly records. For a maxResults: 200 run, up to 1,000 state-week records are fetched and then aggregated into state summaries. Very long date ranges may require a higher maxResults to avoid incomplete state data.
  • Company name and occupation searches use DOL's like operator, 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" or searchMode: "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 stateBreakdown array 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 dryRun is true (the default) and no apiKey is set. In dry-run mode the actor logs a warning but does not push data to the dataset. Set dryRun: false and provide a valid apiKey to receive real data. You can verify your key is valid by calling https://apiprod.dol.gov/v4/get/ETA/ui_national_weekly_claims/json?X-API-KEY=YOUR_KEY&limit=1 directly.

  • 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 of maxResults × 5. If your date range includes 52 weeks across 50 states, you need at least 2,600 raw records — set maxResults: 600 or higher.

  • TAA company name search returns no results — The like search 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: 5000 run across all 4 datasets can take 15+ minutes. Increase the actor's timeout in the run settings or reduce maxResults to 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:

  1. Go to Account Settings > Privacy
  2. 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

01

Configure

Set your parameters in the Apify Console or pass them via API.

02

Run

Click Start, trigger via API, webhook, or set up a schedule.

03

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.

Ready to try ETA Labor Market Intelligence?

Start for free on Apify. No credit card required.

Open on Apify Store