National Tunnel Inventory Risk Monitor — FHWA/NTAD avatar

National Tunnel Inventory Risk Monitor — FHWA/NTAD

Pricing

from $4.40 / 1,000 results

Go to Apify Store
National Tunnel Inventory Risk Monitor — FHWA/NTAD

National Tunnel Inventory Risk Monitor — FHWA/NTAD

Tunnel inventory & tunnel risk screening for every US road tunnel in the FHWA National Tunnel Inventory (NTAD). One row per tunnel with a composite 0-100 risk score plus hazmat, load-posting, low-clearance and overdue-inspection flags. For freight/hazmat routing, insurers and asset managers.

Pricing

from $4.40 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Maloney

Kyle Maloney

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

National Tunnel Inventory Risk Monitor — FHWA / NTAD

Screen every US road tunnel in the FHWA National Tunnel Inventory (NTI) — the official federal register of the 580 highway tunnels on public roads — and get back one clean row per tunnel with a composite 0-100 tunnel risk score and the routing-critical facts freight, hazmat, insurance and asset teams actually need: hazmat restriction, posted height restriction, load posting, and inspection status.

Data comes straight from the USDOT/BTS National Transportation Atlas Database (NTAD) ArcGIS service — keyless, authoritative, refreshed by FHWA. No login, no scraping.

Who it's for

  • Freight & hazmat routing / TMS teams — pre-screen tunnels on a corridor for hazmat bans, posted height restrictions, low vertical clearance and posted load limits.
  • Insurers & reinsurers — surface load-posted, closed or overdue-inspection tunnels in a book of infrastructure or transport risk.
  • Infrastructure asset managers, DOT contractors & engineers — a ready-scored inventory by state, ranked worst-first, to triage inspection and rehab backlogs.
  • Journalists & analysts — a defensible, sourced view of aging or restricted tunnels.

What it does

  1. Runs a live drift probe against the NTAD layer before anything billable: the layer resolves, all 69 columns it reads still exist, the national count sits in band, the layer still carries exactly one inventory year, load-posting codes stay inside their closed A/P/R/K vocabulary, a positive canary returns tunnels, a negative control returns exactly zero, portal coordinates are decimal degrees, and the two restriction columns the product rests on are still populated. If any of that fails the run fails loudly and bills nothing.
  2. Pulls tunnels for the states you choose (or the whole national inventory), paging with the service's own maxRecordCount and cross-checking the row count against the service's own returnCountOnly.
  3. Normalizes every record: FIPS state code -> postal + full name, epoch-ms inspection dates -> YYYY-MM-DD, coded restriction fields -> booleans, all-9s sentinels -> null.
  4. Computes a composite tunnel_risk_score (0-100) and boolean risk flags.
  5. Sorts worst-first, assigns a risk_rank, caps to maxResults, and only then pushes.

Example input

{
"states": ["CA"],
"minRiskScore": 0,
"maxResults": 2000
}
  • states — postal codes ("CA"), full names ("California"), or 2-digit FIPS ("06"). Leave empty to scan the whole national inventory (580 tunnels).
  • minRiskScore — optional 0-100 floor; only return tunnels at or above it.
  • maxResults — safety cap; results are taken from the highest-risk end after ranking.

Three things this actor is careful about

1. Over-height routing needs the owner's flag, not just a measurement. NTI item L.10 is the owner-reported posted height restriction and it is set on 349 of 580 tunnels. A measurement-only test at 14 ft misses 182 of them — the Ted Williams and Eisenhower tunnels among them. over_height_routing_risk is a gated verdict that reads both the validated clearance and L.10, and is false only when both were checked and both are negative.

2. A published number is not automatically a fact. The NTI lists the Baltimore Harbor Tunnel at a minimum vertical clearance of 135 ft; MDTA posts it at 13'6". The published value is preserved verbatim in height_restriction, but min_vert_clearance_ft_validated is null, clearance_data_suspect is true, and no verdict is computed from it.

3. The NTI is an ANNUAL snapshot, so "overdue" needs an anchor. The layer carries a single inventory year and its newest reported inspection is 2025-02-20. Comparing that to today measures publication lag, not compliance — it puts 78.3% of the national inventory in "overdue" and climbs toward 100% on its own. overdue_inspection is therefore anchored to data_last_updated (49.7% of the inventory), with the run-time view kept beside it as overdue_inspection_as_of_today.

Output fields (one row per tunnel) — 96 fields

FieldTypeWhat it is
tunnel_numberstringFHWA NTI tunnel number (item I.1) - the tunnel's unique ID within its state.
tunnel_namestringCommon tunnel name (item I.2).
statestringFull US state name, derived from the 2-digit FIPS state code (item I.3).
state_abbrstringUS state postal code, derived from the FIPS state code.
state_fipsstring2-digit FIPS state code exactly as stored in the NTI (item I.3).
county_codestring3-digit county FIPS code (item I.4).
facility_carriedstringRoad or facility carried through the tunnel (item I.10).
latitudenumberDecimal-degrees latitude of the tunnel portal (item I.13).
longitudenumberDecimal-degrees longitude of the tunnel portal (item I.14).
year_builtintegerYear the tunnel was built (item A.1).
year_rehabilitatedintegerYear of the last major rehabilitation (item A.2); null when never rehabilitated.
tunnel_length_ftintegerOverall tunnel length in feet (item G.1).
adtintegerAverage daily traffic through the tunnel (item A.4). Reported for context only - it is NOT an input to tunnel_risk_score.
adttintegerAverage daily truck traffic (item A.5).
adt_yearintegerYear the average daily traffic count was taken (item A.6).
ownerstringOwning agency decoded from the NTI owner code (item C.1).
last_inspection_datestringDate of the last actual routine inspection (item D.2), ISO YYYY-MM-DD; null when none on record.
inspection_interval_monthsintegerDesignated routine inspection interval in months (item D.3), typically 24.
months_since_inspectionintegerWhole months elapsed between the last reported routine inspection and this run. Because the NTI is an annual snapshot this includes publication lag; months_since_inspection_at_vintage removes it.
inventory_load_rating_factornumberInventory-level load rating factor (item L.2). Below 1.0 indicates reduced capacity; 0 means not rated. Interpret alongside load_rating_method_code.
operating_load_rating_factornumberOperating-level load rating factor (item L.3) - the structural-adequacy proxy in the risk score. Interpret alongside load_rating_method_code: 0 means not rated, and 65% of the inventory is method N with a 0 here.
posting_load_gross_tonsintegerPosted gross vehicle load limit in tons (item L.5) when the tunnel is load-posted. Null when not posted - NTI writes 0 for no posting and 99 as its all-9s "no limit" sentinel, and neither is emitted as a tonnage.
worst_condition_ratingstringEditorial condition label derived from load-rating factor and load-posting status (the NTI has no FHWA 0-9 component rating): Closed, Below Legal Load, Load Posted, Adequate, or Unknown.
load_posting_statusstringDecoded tunnel load posting status (item L.4): Open, no restriction / Posted for load / Posted (other than load) / Closed.
load_posting_codestringRaw NTI load posting status letter (item L.4): A, P, R, or K.
hazmat_restrictedbooleanTrue when a hazardous-material routing restriction is in effect (item L.11). Null when the column was not returned - null means not checked, false means checked and negative.
height_restrictionnumberMinimum vertical clearance over the tunnel roadway in FEET exactly as published (item G.2), including values that are not physically plausible. Use min_vert_clearance_ft_validated for a measurement you can act on, clearance_data_suspect to see which rows were rejected, and height_restriction_posted for the owner-reported restriction flag.
overdue_inspectionbooleanTrue when the last reported routine inspection was already older than the designated interval AS OF THE DATA VINTAGE (see data_last_updated and overdue_basis). The NTI is an annual snapshot, so comparing it to today measures publication lag rather than compliance - overdue_inspection_as_of_today carries that run-time view separately.
load_postedbooleanTrue when the tunnel is legally posted for a reduced load (status P or R).
low_clearancebooleanTrue when the VALIDATED minimum vertical clearance is below 14 ft (over-height hazard vs the ~13ft 6in statutory commercial height). Null - never false - when the clearance is missing or implausible. See over_height_routing_risk for the gated verdict that also reads the owner-reported item L.10 flag.
tunnel_risk_scoreintegerComposite EDITORIAL screening score 0-100: condition proxy (operating load rating factor) x load-posting status x inspection staleness measured at the data vintage x restriction multiplier (hazmat, over-height, other). The NTI publishes no FHWA 0-9 condition rating, so this is a screening blend and not an official rating. ADT is not an input.
risk_flagsarrayMachine-readable flags: overdue_inspection, closed, load_posted, below_legal_load, hazmat_restricted, low_clearance, height_restriction_posted, other_restrictions.
risk_rankinteger1-based rank within this run's results, sorted by risk score descending (1 = highest risk).
source_urlstringNTAD ArcGIS query URL returning this tunnel's full raw NTI record.
checked_atstringISO 8601 timestamp of when this run read the NTI.
objectidintegerStable feature id within the NTAD National Tunnel Inventory layer.
data_vintage_yearintegerFHWA inventory year carried on the record itself. The layer holds exactly one year; two would double-count every tunnel and the run fails.
data_last_updatedstringISO date the NTAD layer itself was last edited - the vintage every overdue verdict is anchored to.
county_fipsstringState FIPS + county FIPS concatenated, ready to join to Census county data.
next_inspection_target_datestringTarget date FHWA published for the reported routine inspection cycle (item D.1), ISO YYYY-MM-DD. This is the target for the inspection already reported, NOT a forward-looking next-due date.
months_since_inspection_at_vintageintegerWhole months between the last reported routine inspection and the data vintage, with annual publication lag removed.
overdue_inspection_as_of_todaybooleanTrue when the last reported inspection is older than the interval measured against this run time. Grows toward true for the whole inventory as the annual snapshot ages - use overdue_inspection for the compliance read.
overdue_basisstringWhich clock overdue_inspection used: data_vintage (normal) or run_time (the layer stopped publishing an edit date).
height_restriction_postedbooleanOwner-reported posted height restriction (item L.10) - the authoritative over-height signal, populated on 349 of 580 tunnels. Null when the column was not returned.
over_height_routing_riskbooleanGated over-height verdict: true when EITHER the validated clearance is below 14 ft OR the owner posts a height restriction; false only when both were checked and both are negative; null when neither could be checked.
min_vert_clearance_ft_validatednumberItem G.2 clearance in feet, or null when the published value is not a physically plausible tunnel clearance.
clearance_data_suspectbooleanTrue when the published G.2 clearance is impossible (<=0 ft or >40 ft) and was therefore not used for any verdict.
other_restrictionsbooleanItem L.12 other-restrictions flag. Null when the column was not returned.
closed_to_trafficbooleanTrue when the load-posting status (item L.4) is K, Closed. Null when the status was not returned.
below_legal_loadbooleanTrue when the operating load rating factor is above 0 and below 1.0. Null when no rating was returned.
load_rating_method_codestringRaw item L.1 load-rating method code as published by FHWA. Essential context for the two rating-factor fields: 65% of the inventory is method N with a 0 rating.
total_lanesintegerTotal number of lanes through the tunnel (item A.3).
number_of_boresintegerNumber of tunnel bores (item S.1).
roadway_width_ftnumberCurb-to-curb roadway width in feet (item G.3).
left_sidewalk_width_ftnumberLeft sidewalk width in feet (item G.4).
right_sidewalk_width_ftnumberRight sidewalk width in feet (item G.5).
detour_length_milesintegerDetour length in miles (item A.7); null when FHWA writes its 999 sentinel.
service_in_tunnel_codeintegerRaw item A.8 code for what the tunnel carries, as published by FHWA.
direction_of_traffic_codeintegerRaw item C.3 traffic-direction code as published by FHWA.
toll_codeintegerRaw item C.4 toll code as published by FHWA.
nhs_routebooleanTrue when the tunnel carries a National Highway System route (item C.5).
strahnet_routebooleanTrue when the tunnel carries a Strategic Highway Network route (item C.6) - a defense-mobility corridor.
functional_classification_codeintegerRaw item C.7 functional-classification code as published by FHWA.
urban_codeintegerCensus urban area code (item C.8); null when FHWA writes its 99998/99999 sentinels.
route_numberstringRoute number carried through the tunnel (item I.7).
route_type_codestringRaw item I.9 route-type code as published by FHWA.
route_direction_codestringRaw item I.8 route-direction code as published by FHWA.
highway_districtstringState highway district (item I.6).
place_codestringCensus place code (item I.5).
lrs_route_idstringLinear referencing system route identifier (item I.11), for joining to state roadway networks.
lrs_mile_pointnumberMilepoint of the tunnel along the LRS route (item I.12).
federally_ownedbooleanTrue when a federal agency owns or reports the tunnel (federal_agency = Y).
operatorstringOperating agency decoded from the NTI operator code (item C.2) - often different from the owner.
under_navigable_waterwaybooleanTrue when the tunnel passes beneath a navigable waterway (item N.1).
navigable_waterway_clearance_ftnumberVertical clearance over the tunnel to the navigable waterway (item N.2), feet.
portal_island_protectionbooleanTrue when the tunnel or its portal island has protection works (item N.3).
tunnel_shape_codeintegerRaw item S.2 tunnel-shape code as published by FHWA.
portal_shape_codeintegerRaw item S.3 portal-shape code as published by FHWA.
ground_conditions_codeintegerRaw item S.4 ground-conditions code as published by FHWA.
complex_tunnelbooleanTrue when FHWA classifies the tunnel as complex (item S.5), which drives heightened inspection requirements.
in_depth_inspection_requiredbooleanItem D.4 in-depth inspection requirement flag.
damage_inspection_requiredbooleanItem D.5 damage inspection requirement flag.
special_inspection_requiredbooleanItem D.6 special inspection requirement flag.
border_statestringPartner state for a tunnel on a state border (item I.15), as published (postal or FIPS).
border_tunnel_numberstringPartner state tunnel number for a border tunnel (item I.17).
border_financial_responsibility_pctintegerShare of financial responsibility for a border tunnel (item I.16), percent.
border_inspection_responsibilitystringRaw item I.18 code for which state inspects a border tunnel.
submitted_bystringAgency code that submitted the record to FHWA.
nti_source_statusstringOutcome of the NTI fetch for this row: ok. A run where the source did not answer fails and emits nothing.
nti_layer_namestringName of the NTAD FeatureServer layer this run read.
nti_layer_feature_countintegerTotal tunnels in the layer at run time, from the service's own returnCountOnly.
matching_tunnel_countintegerTunnels matching your filter upstream, from the service's own returnCountOnly - the exact truncation guard.
result_truncatedbooleanTrue when maxResults capped the run below matching_tunnel_count.
tunnels_scannedintegerHow many tunnel records this run actually retrieved before filtering.
where_clausestringThe ArcGIS where clause this run sent, so the answer is reproducible.
drift_checks_passedbooleanTrue when every live drift assertion passed before any row was emitted. A run cannot bill a row with this false.

How the tunnel risk score works (editorial model)

The NTI does not publish an FHWA 0-9 component condition rating like the National Bridge Inventory does, so tunnel_risk_score is an editorial screening blend — a triage aid, not an official FHWA rating. It multiplies four factors and normalizes so the worst realistic combination scores 100:

FactorSignalSource item
Condition proxyoperating load-rating factor (< 1.0 = below legal load)L.3
Load postingOpen / Posted-for-load / Posted-other / ClosedL.4
Inspection stalenessmonths since inspection at the data vintage vs intervalD.2 / D.3
Restrictionshazmat ban, over-height routing risk, other restrictionsL.10-L.12, G.2

adt is not an input to the score — it is reported for context only. worst_condition_rating is a matching human label (Closed / Below Legal Load / Load Posted / Adequate / Unknown). Read the two load-rating factors alongside load_rating_method_code: 65% of the inventory is method N with a 0 rating, which means not rated, not zero capacity.

What "null" means here

null means not checked. false means checked, and the answer is negative. Every restriction flag follows that contract, so an upstream column that stops publishing produces null rather than a confident clear. If the source cannot be reached at all, or a page of the query fails part-way, the run fails rather than emitting an arbitrary partial inventory ranked as though it were complete — nothing is emitted and nothing is billed. Every row also carries nti_source_status, matching_tunnel_count, result_truncated, tunnels_scanned, where_clause and drift_checks_passed so you can see exactly what the answer rests on.

Use as an MCP tool

This actor is a clean, chainable tool for AI agents (Claude, Cursor, etc.) via mcp.apify.com. Every input and output field is described in the schema, so an agent can call it directly — e.g. "list the hazmat-restricted or over-height tunnels in Colorado and Utah" — and get structured, ranked JSON back. Billing is unchanged when it is called as a tool, and a run that cannot answer fails without billing.

Pricing

Pay-per-result: one billable result per tunnel returned, with graduated volume discounts. A run that fails its drift check, or that could only retrieve a partial inventory, emits nothing and bills nothing.

FAQ

Where does the data come from? The FHWA National Tunnel Inventory, published in the USDOT/BTS National Transportation Atlas Database (NTAD) as a public ArcGIS FeatureServer. No API key required.

How many tunnels are there? 580 highway tunnels on US public roads nationwide (measured live 2026-08-10).

Is the risk score an official FHWA rating? No. It is an editorial screening blend of FHWA-published fields meant for triage. Always confirm against the primary record via source_url.

Why is overdue_inspection different from overdue_inspection_as_of_today? The NTI is published annually. The first answers "was this tunnel already past its interval when FHWA published?", the second "is it past its interval right now?" — which for an aging snapshot is mostly a statement about the publication schedule.

Does it cover rail or transit tunnels? No — the NTI covers highway/road tunnels on public roads and publicly accessible federal-land tunnels.

How is it billed? Pay-per-result: one billable result per tunnel returned. Empty results cost only the tiny actor start.

  • FHWA NBI Bridge Risk Monitor — the same treatment for the 620k-structure National Bridge Inventory, including FHWA's official 0-9 condition ratings and scour-critical screening.

Source

FHWA National Tunnel Inventory (NTI) via NTAD: https://services.arcgis.com/xOi1kZaI0eWDREZv/arcgis/rest/services/NTAD_National_Tunnel_Inventory/FeatureServer/0

Each field is a screening aid, not a determination. Confirm against the primary FHWA record before acting on any routing, insurance or engineering decision.