Every federal contractor above the reporting threshold files a VETS-4212 report annually: how many people it employs and hired, and how many of them are protected veterans. The Department of Labor publishes the raw filings. What it does not publish is how to read them without reaching confidently wrong conclusions. We analysed the full 2025 cycle to build the Veteran Hiring Index; this page documents what the dataset actually is, where it bites, and how we processed it — so you can check our work or build your own.
The five traps, in order of damage
1. CoState is the headquarters, not where hiring happens
The most dangerous field in the file. Every filing carries the filer's state
(CoState) and, on multi-establishment forms, the hiring location's state
(HlState). Roll up by CoState and you get a map of where corporations keep
their head offices: in our working copy, one national pharmacy chain's 20,815 establishments all landed
in Rhode Island, and one retailer's 969,005 hires all landed in Washington. Any state-level statistic
built on CoState is fiction. Use HlState; fall back to CoState
only on single-establishment and headquarters forms, where the company address genuinely is the hiring
location (about 4.6% of rows in the 2025 cycle).
2. The row is an establishment, not a company
Large employers file one row per hiring location per cycle — thousands of rows for one firm. Sums are safe; counts and averages are not. “X% of filers” computed over raw rows weights every company by its establishment count. Roll up to company level first — and note the file carries no employer identifier (no EIN, UEI or DUNS), so the only available rollup key is the free-text company name, normalised. Imperfect by construction; our rollup below reports how many raw spellings merged into each row so you can judge.
3. Voluntary self-identification understates everything
Employees and applicants choose whether to disclose protected-veteran status. Every rate in the file is therefore a floor, not a headcount — and the understatement is probably uneven across companies and job categories. A very low filed rate at high volume is at least as likely a broken self-identification pipeline as a hiring failure. Related: “protected veteran” (38 U.S.C. 4212's categories) is a strict subset of “veteran”, so these figures are not comparable to Census or BLS veteran-population numbers.
4. The occupational columns are numbered two different ways
The API's columns NewHire_ProtectedVets1…11 map to the ten EEO-1 job categories
plus a total — but the form's own lettering (C1.1, C1.2, C2…C10) collapses the two
officials-and-managers rows, so “category 9” means Laborers & Helpers in API
numbering and Service Workers in form lettering. Published summaries disagree because they mix
the schemes. The authoritative mapping is DOL's batch-file specification (fields 48–69):
API 1 = Executive/Senior Officials, 2 = First/Mid-Level Officials,
3 = Professionals, 4 = Technicians, 5 = Sales,
6 = Administrative Support, 7 = Craft, 8 = Operatives,
9 = Laborers/Helpers, 10 = Service Workers, 11 = Total.
5. Filing errors are in there, unaudited
Nobody reviews these filings for arithmetic sanity. The 2025 cycle contains employers reporting a 100% veteran hire rate at real volume (429 of 429 hires) — the signature of transposed columns — and a handful reporting more veteran employees than employees. We quarantine such rows in our analyses rather than deleting them from published data; whatever you build, screen for them before quoting any extreme value.
The API, as actually observed
- Page size: the documented cap is 10,000 records or 5 MB per request,
whichever binds first. This table is 78 fields wide, so 5 MB binds:
limit=5000returns HTTP 413;limit=1000works. - Rate limiting exists but is undocumented: bursts of small requests earn a blanket HTTP 429 that persists across subsequent calls. Pace requests and back off exponentially; a full-cycle pull takes hours, not minutes.
- Sorting is load-bearing: rows arrive in ReportID order, so a capped pull of a
large filer silently returns its oldest cycles. Sort by
FilingCycledescending or the cap eats the current year. - Case-sensitive matching: the
likeoperator is case-sensitive; search with case variants. - Server-to-server calls need a User-Agent or they 403.
- The metadata endpoint's field descriptions contain errors — trust the batch-file specification and the data itself over the metadata.
What one cycle cannot tell you
This page and our datasets cover the 2025 filing cycle. Single-cycle data supports no trend claims — not “improving”, not “declining”. Prior cycles exist in the API and we may publish a multi-cycle edition once at least three comparable years are in hand; until then, treat any cross-year comparison built from this file alone as unsupported.
The dataset
Our company-level rollup of the full 2025 cycle — one row per employer, neutral columns only (the filed quantities and their arithmetic rates), with the rollup method and its limits documented in the metadata file. Free to use with attribution to LockLeed International.
- Company rollup, 2025 cycle (CSV, ~1.5 MB, 20,340 employers)
- Methodology & caveats (JSON)
- Industry aggregates and job-level aggregates from the Veteran Hiring Index
Citing this work
LockLeed International, “The VETS-4212 Field Guide,” 2025 filing cycle. lockleed.com/vets-4212-field-guide
Questions, corrections, or a cut you need that we haven't published: [email protected]. We would rather help than see the data misread.
LockLeed International is a veteran-owned staffing agency, not affiliated with the Department of Labor or OFCCP. Nothing here is legal advice; the figures are employers' own public federal filings.