AI Infrastructure Employment (data centers + semiconductors) API v1
Generated from
core.contract.describe_ai_infrastructure_employment_v1()and checked fixture-backed examples. Do not hand-edit the example JSON files.
Capability
- Capability:
ai_infrastructure.employment - Primitive:
query_ai_infrastructure_employment_v1 - Status:
available - Current source:
employment.bls.qcew - Source publisher: U.S. Bureau of Labor Statistics
- Snapshot behavior:
as_of = latestresolves to an exact snapshot date in every response.
What It Can Answer
- Quarterly data-center-industry (NAICS 518210) employment, establishments, and wages by US / state / county, cited to the source row — INDUSTRY employment, not an 'AI jobs' count.
- Quarterly semiconductor-manufacturing (NAICS 334413) employment and wages on the same geography.
- The state/county geography of data-center and semiconductor employment since 2014 (e.g. Loudoun County, VA).
- Whether a county × industry cell is disclosed or withheld — BLS's disclosure_code, carried verbatim; a withheld cell is served as absent (null), never zero.
- Row-level detail records (including avg_wkly_wage) when
include_recordsis true. - Raw BLS QCEW row evidence for any returned row-level citation.
Represented Facts
BLS QCEW reports quarterly establishments, monthly employment, and quarterly wages for the data-center industry (NAICS 518210, computing infrastructure / data processing / web hosting) by national / state / county and ownership, served verbatim and citedBLS QCEW reports the same for semiconductor & related device manufacturing (NAICS 334413); a confidential county × industry cell is served as absent (withheld), never as a measured zeroBLS QCEW reports the same for the place-based local-economy series (PD-069): total all industries ('10'), construction (23), commercial & institutional building construction (236220), retail trade ('44-45'), accommodation (721), and food services (722) — what a facility buildout does to a county's whole economy; jobs count at the employer's establishment, not the work site
Data Point Contract
- Data point:
ai_infrastructure.employment - Product spec:
blocks/ai_infrastructure_employment/card.md - Grain:
area_industry_quarterly - Source basis:
employment.bls.qcew - Represented fact: BLS Quarterly Census of Employment and Wages (QCEW) — quarterly establishment counts, monthly employment, and quarterly wages for eight industry series, by national / state / county and ownership, served exactly as BLS publishes: the two vertical industries — NAICS 518210 (computing infrastructure providers, data processing, web hosting — the data-center industry proxy) and NAICS 334413 (semiconductor manufacturing) — plus the place-based local-economy set (PD-069): total all industries ("10"), construction (23), commercial & institutional building construction (236220), retail trade ("44-45"), accommodation (721), and food services & drinking places (722), so an agent can read what a facility buildout does to a county's whole economy, not just the operator industry. INDUSTRY employment — NOT an "AI jobs" or data-center-only count (NAICS 518210 spans hosting broadly). A confidential county x industry cell is served ABSENT (BLS withholds employment/wages by zeroing them; we never serve that 0 as a measured zero). Jobs are counted at the EMPLOYER'S ESTABLISHMENT, not the work site — a construction crew building in county X for a contractor based in county Y counts in county Y. Each year is served exactly as BLS coded it — 2014-2021 under NAICS 2017, 2022Q1-forward under NAICS 2022; BLS never recodes history.
Does not answer:
an "AI jobs" or data-center-ONLY headcount (NAICS 518210 is the broader computing-infrastructure / hosting industry)employment or wages for a SUPPRESSED county x industry cell (BLS withholds it for confidentiality — served as absent null, never zero)jobs at the WORK SITE — QCEW counts jobs at the employer's establishment, so construction workers building in a county for an out-of-county contractor are counted where the contractor is based, not at the siteindustries beyond the eight pinned series (e.g. electrical contractors 238210 — largely absent/suppressed at county grain; not served)a definition-constant 518210 series across 2022Q1 — the NAICS-2022 revision REDEFINED 518210 (BLS codes 2014-2021 under NAICS 2017, 2022-forward under NAICS 2022, and never recodes history), so a level shift at that boundary (e.g. Loudoun County, -45% in one quarter) is reclassification, not jobs lostMSA / metro-area figures (CBSA codes like 'C1018' do not fit the county_fips anchor — national / state / county only)occupation, job title, or skill detail (QCEW is an INDUSTRY program, not an occupational one)which company or establishment employs (QCEW carries no employer-level breakdown)a measured zero where the cell is withheld (a suppressed 0 is absence, disambiguated by disclosure_code)
REST Surface
GET /v1/healthGET /v1/capabilitiesGET /v1/ai-infrastructure/employment/schemaPOST /v1/ai-infrastructure/employment/queryPOST /v1/evidence/source-row
MCP Surface
list_capabilities_v1describe_ai_infrastructure_employment_v1query_ai_infrastructure_employment_v1get_source_evidence_v1
Local MCP Setup
Some MCP clients launch servers from the user's home directory or ignore a configured cwd. Use uv run --directory so the server always starts from the repository project.
{
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/OSINT",
"python",
"-m",
"core.mcp_server"
]
}
Leave EXASCALE_PARQUET_BASE / EXASCALE_RAW_BASE unset: the one server hosts every data point's tools, and with no override it resolves each block's promoted snapshots and raw archive from the repository layout. Setting either env var points ALL tools at one directory — a per-block path breaks every other block's tools. They exist only for single-source sandboxes and tests.
Request Schema
Filters:
as_ofindustryindustry_codeownershipown_codestatecounty_fipsarea_fipsagglvlyearqtrquarterquarter_fromquarter_to
Input field semantics:
| Field | Answer Label | Source Field | Semantics | Definition | Counting Definition |
|---|---|---|---|---|---|
avg_wkly_wage |
average weekly wage | avg_wkly_wage |
bls_qcew_average_weekly_wage | BLS's published average weekly wage ($) for the cell (total quarterly wages ÷ average monthly employment ÷ 13 weeks, computed by BLS), served on DETAIL records only. | A per-cell average — non-additive: never sum or average it across cells; a withheld (disclosure 'N'/'-') cell carries no value. |
Group by:
industryindustry_codeownershipown_codestatecounty_fipsagglvlyearqtrquarter
Date range parameters:
quarter_fromquarter_to
Controls:
include_recordsinclude_evidencelimitorder_bytop_norderrollup_other
Ranking (how order_by / top_n / order join — order_by ranks groups by a metric, never a group_by dimension; top_n needs both a group_by and an order_by):
{
"no_ranking": "Omit order_by and top_n to return all groups in group-key order.",
"order": {
"default": "desc",
"valid_values": [
"desc",
"asc"
]
},
"order_by": {
"accepts": "one of output.metrics",
"note": "Ranks the groups by a metric (a measure). Not a group_by dimension \u2014 rows already come back grouped by each group_by field.",
"requires": [
"group_by"
],
"valid_values": [
"qtrly_estabs",
"month1_emplvl",
"month2_emplvl",
"month3_emplvl",
"total_qtrly_wages",
"source_record_count"
]
},
"top_n": {
"note": "Keeps the top N groups by order_by; the rest fold into one (other) remainder (additive metrics sum into it, non-additive ones are nulled) so the result still reconciles to summary.totals.",
"requires": [
"group_by",
"order_by"
],
"type": "positive integer"
}
}
Output Schema
Aggregate metrics:
qtrly_estabsmonth1_emplvlmonth2_emplvlmonth3_emplvltotal_qtrly_wagessource_record_count
Metric groups:
{
"employment": [
"month1_emplvl",
"month2_emplvl",
"month3_emplvl"
],
"establishments": [
"qtrly_estabs"
],
"records": [
"source_record_count"
],
"wages": [
"total_qtrly_wages"
]
}
Response summary fields:
group_counttotals
Accepted fact policy:
- Query responses contain accepted, gate-passed facts only.
- Gate, monitor, and audit quality signals are internal controls, not agent-facing answer caveats.
- If a source snapshot is not fit to serve, the source must fail closed before it reaches this API.
Metric metadata:
| Metric | Category | Unit | Aggregation | Additive Across Groups | Authoritative Total | Definition |
|---|---|---|---|---|---|---|
qtrly_estabs |
establishments | count | sum | true | summary.totals.qtrly_estabs |
Count of establishments (physical locations) covered by unemployment insurance in the industry × area × ownership in scope, for the quarter, exactly as BLS publishes it in QCEW. |
month1_emplvl |
employment | count | sum | true | summary.totals.month1_emplvl |
BLS QCEW covered employment in the first month of the quarter for the industry × area × ownership in scope, served verbatim — INDUSTRY employment, not an 'AI jobs' count. |
month2_emplvl |
employment | count | sum | true | summary.totals.month2_emplvl |
BLS QCEW covered employment in the second month of the quarter for the industry × area × ownership in scope, served verbatim — INDUSTRY employment, not an 'AI jobs' count. |
month3_emplvl |
employment | count | sum | true | summary.totals.month3_emplvl |
BLS QCEW covered employment in the third month of the quarter for the industry × area × ownership in scope, served verbatim — INDUSTRY employment, not an 'AI jobs' count. |
total_qtrly_wages |
wages | USD | sum | true | summary.totals.total_qtrly_wages |
Sum of total quarterly wages ($) paid by UI-covered employers in the industry × area × ownership in scope, exactly as BLS publishes it in QCEW. |
source_record_count |
records | count | count source records | true | summary.totals.source_record_count |
Count of normalized source records (area × ownership × industry × quarter cells) contributing to the current result scope. |
Rollup rules:
summary.totals.<metric>is the authoritative total for the full matched query.- Grouped row metrics may be summed only when
additive_across_groupsistrue.
Detail record fields returned when include_records is true:
source_idsheet_namesource_record_keyreport_periodarea_fipsown_codeindustry_codeagglvl_codesize_codeyearqtrdisclosure_codeqtrly_estabsindustryownershipstatecounty_fipscounty_fips_sourcecounty_fips_unresolvedquartermonth1_emplvlmonth2_emplvlmonth3_emplvltotal_qtrly_wagesavg_wkly_wagesource_row_numberas_ofraw_file_sha256citation
Row-level citation fields:
source_idsource_urlsource_filesheetsource_rowraw_file_sha256as_of
Aggregate citation fields:
source_idpublishersource_urlsource_fileraw_file_sha256as_ofsource_rows_countsource_rows_sampleverifylineage_filter
Codebooks
| Field | Coverage | Codes | Examples | Note |
|---|---|---|---|---|
industry |
the eight pinned industry series: the two AI-infrastructure NAICS + the PD-069 place-based local-economy set | 8 | 518210 = Computing infrastructure providers, data processing, web hosting, and related services, 334413 = Semiconductor and related device manufacturing, 10 = Total, all industries, 23 = Construction, 236220 = Commercial and institutional building construction |
DISTINCT series, never conflated. The only ancestries: '10' (total, all industries) contains every other series, and 23 (construction) contains 236220 (commercial building). The remaining series are mutually DISJOINT — 721/722 sit under NAICS 72 (not served), NOT under retail '44-45'. Each code lives at its own agglvl depth ('10' at x0/x1; 23 and '44-45' at x4; 721/722 at x5; 236220/518210/334413 at x8); never sum a series with its ancestor. NAICS vintage: 2014-2021 coded under NAICS 2017, 2022Q1-forward under NAICS 2022 (BLS never recodes history) — the 2022 revision REDEFINED 518210, so its cross-2022Q1 level shift is reclassification, not a real change. |
ownership |
the ownership sectors QCEW publishes | 8 | 0 = Total Covered, 1 = Federal Government, 2 = State Government, 3 = Local Government, 4 = International Government |
own_code 5 = Private (the usual filter). 0 'Total Covered' and 8 'Total Government' are TOTALS that already contain their components — never sum a total with its parts. |
agglvl |
national / state / county at each pinned industry depth (MSA excluded — CBSA codes don't fit the county_fips anchor) | 15 | 10 = National, total covered (all ownerships), 11 = National, total — by ownership, 14 = National, by NAICS sector, 15 = National, by NAICS 3-digit, 18 = National, by 6-digit NAICS |
First digit = geography (1 national / 5 state / 7 county); second digit = industry depth (0 total covered, 1 total by ownership, 4 NAICS sector, 5 NAICS 3-digit, 8 NAICS 6-digit). Geography NESTS — 18 national contains 58 state contains 78 county — and the total depth (x0/x1, industry '10') contains every other depth. Filter to one level (or group_by agglvl) to avoid double-counting. Depth follows the industry_code: '10' lives at x0/x1, 23 and '44-45' at x4, 721/722 at x5, 236220/518210/334413 at x8. |
The complete machine-readable codebooks are included in capability-schema.json.
Checked Examples
| Agent question | Request params | Checked output |
|---|---|---|
| How many people work in the U.S. data-center industry (NAICS 518210, private), by quarter? | {"agglvl": "18", "group_by": ["quarter"], "industry_code": "518210", "own_code": "5"} |
datacenter-employment-national.json |
| Which Virginia counties have the most data-center-industry employment in 2025 Q4? | {"agglvl": "78", "group_by": ["county_fips"], "industry_code": "518210", "order_by": "month3_emplvl", "own_code": "5", "quarter": "2025-10-01", "state": "VA", "top_n": 10} |
datacenter-employment-va-counties.json |
| How does U.S. data-center-industry employment compare to semiconductor manufacturing in 2025 Q4 (private)? | {"agglvl": "18", "group_by": ["industry_code"], "own_code": "5", "quarter": "2025-10-01"} |
datacenter-vs-semiconductor-national.json |
| Return one national data-center-industry employment record with a row-level citation. | {"agglvl": "18", "include_records": true, "industry_code": "518210", "limit": 1, "own_code": "5", "quarter": "2025-10-01"} |
datacenter-employment-detail-with-citation.json |
| Verify the raw workbook row behind a returned citation | citations[ref].verify (aggregate) or records[0].citation (detail) |
source-row-evidence.json |
| Dogfood the tool sequence as an agent | list -> describe -> query -> evidence |
agent-dogfood-transcript.json |
The checked schema output is capability-schema.json.
Agent Workflow
- Call
list_capabilities_v1and selectai_infrastructure.employment. - Call
describe_ai_infrastructure_employment_v1to inspect valid filters, groupings, metrics, and citation fields. - Call
query_ai_infrastructure_employment_v1with bounded JSON params. - If the answer needs proof, pass a returned row-level
citationobject toget_source_evidence_v1. - Answer with the resolved
as_ofand relevant citations. Present returned metrics as authoritative for their declared source, snapshot, grain, and aggregation.