Register for a BLS API key at https://data.bls.gov/registrationEngine/ to increase the daily request limit from 25 (unauthenticated) to 500 series per day
Construct an OES series ID using the pattern: OESM{area_code}{industry_code}{occupation_code}{datatype_code}; e.g., OESM000000000000015-1252008 returns national all-industry annual mean wage for SOC 15-1252
POST to https://api.bls.gov/publicAPI/v2/timeseries/data/ with JSON body: {"seriesid": ["OESM..."], "startyear": "2023", "endyear": "2024", "registrationkey": "YOUR_KEY"}
Parse the response: data array contains year, period (A01 for annual), value (wage in dollars), and footnotes array; footnote code W indicates the estimate has been withheld
Retrieve area-specific wage data by replacing the area code: 0000000 is national; use CBSA codes (from BLS area definitions) for metropolitan area wages relevant to apprenticeship wage schedules
Cross-reference retrieved SOC wage percentiles (10th, 25th, median, 75th, 90th) against apprenticeship program wage schedules to verify compliance with prevailing wage requirements
Known gotchas
The BLS API returns a maximum of 20 years of data per request and a maximum of 50 series per call; requesting more than 50 series in one POST silently truncates the results to 50 without an error message
OEWS data is released once per year (typically May); attempting to query the current year before the release date returns no data, not an error—check the BLS release calendar before scheduling automated pulls
Area codes in OEWS use BLS-specific metropolitan and non-metropolitan area codes, not FIPS or ZIP codes; mapping from a ZIP code to a BLS area code requires a separate crosswalk table downloadable from the BLS OEWS documentation
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp