Outlay Methodology
Version: 1.2.0 — this file is versioned in lockstep with
METHODOLOGY_VERSION in pipeline/src/flags.ts. Every stored flag records
the version that produced it. Changing any threshold or definition requires a
version bump here and there.
What Outlay is
Outlay ingests federal contract award data from the USAspending.gov API, normalizes recipient names into stable entities, and surfaces structural patterns in the data using the documented rules below.
A flag is not a finding of waste, fraud, abuse, or wrongdoing. It marks a measurable pattern that is worth a look at the underlying record. Many flagged patterns have routine explanations (incremental funding, option exercises, legitimately specialized markets). Outlay deliberately uses no editorial labels anywhere in the data layer.
Data scope (v1)
- Source: USAspending.gov API v2 (
/search/spending_by_award/,/awards/{id}/,/transactions/). No API key; shapes verified against the published API contracts on 2026-08-04. - Contract awards only (award type codes A, B, C, D). No grants, loans, IDVs, or subawards.
- The ingest scope (fiscal years, agency filter, award-amount band) is set in
outlay.config.json. The pull is a bounded, configured slice, not the census of federal contracting. Totals shown in the UI are totals of the ingested set and are labeled as such. The v1.1.0 verification slice is Department of Veterans Affairs awards between $100K and $300K (a band centered on the $250K simplified acquisition threshold), FY2024–FY2026, pulled in full; an earlier all-agency top-awards sample (≥ $10M) remains in the database and is recorded iningest_runs.
Record versioning (our own archive)
USAspending publishes only the current state of each record; corrections
and revisions overwrite silently, and agencies self-report the underlying
data. Outlay therefore keeps its own append-only archive from the first pull
onward: every ingest stores a content-hashed copy of each award's source
payloads in award_versions. A later pull that returns identical content
only confirms the record; changed content appends a new version with the list
of changed fields. This makes post-publication revision detectable and
preserved — but only from our first observation forward. Data prior to the
first pull is taken as-is from the source and cannot be independently
verified by Outlay.
Revisions are routine: obligation and outlay figures change as spending
proceeds, and error corrections are normal. A recorded revision is a fact
about the record's history, not evidence of wrongdoing. Revision counts per
pull are stored on ingest_runs and shown in the UI.
Entity resolution
Recipient identity, in priority order:
- UEI (SAM.gov Unique Entity Identifier) when the record carries one —
entity id
uei:<UEI>. This is authoritative: two spellings with the same UEI are the same entity; similar names with different UEIs stay distinct. - Normalized name otherwise — entity id
name:<sha256-prefix>of the normalized spelling. Normalization uppercases, strips punctuation, collapses whitespace, expands common abbreviations (INTL,BROS,&), and removes trailing corporate-form suffixes (INC,LLC,CORP,COMPANY, …) — never tokens mid-name.
Every raw spelling observed is kept in entity_aliases with its UEI and seen
counts, so the mapping is auditable. Known limitation: name-only records that
belong to a UEI-bearing entity but never co-occur with its UEI resolve to a
separate name: entity; corporate parents are recorded (parent_uei) but
subsidiaries are not rolled up into parents.
Flag rules
R1 — end_of_fy_obligation_spike
The federal fiscal year ends September 30. Obligation activity concentrated in the final month is a long-documented structural pattern ("use it or lose it" budgeting).
Flag when, over an award's transactions with a non-null obligation amount:
- transaction count ≥ 2, and
- total obligations ≥ $1,000,000, and
- obligations with a September action date ≥ 50% of total obligations.
Single-transaction awards are excluded: an award simply made in September is not a spike within an award's own funding history.
R2 — single_bid_competed
Flag when an award was procured under a competitive procedure but received exactly one offer:
extent_competedcode is A (full and open competition), D (full and open after exclusion of sources), or CDO (competitive delivery order), andnumber_of_offers_received= 1.
Context: single-offer competition can reflect a genuinely specialized market; it can also indicate solicitation terms or timelines that discouraged bidders. The flag states only the recorded facts.
R3 — modification_growth
Flag when total obligations reach 3× the initial obligation:
- transaction count ≥ 2, and
- the base obligation (modification
0, or the earliest transaction when no mod 0 exists) is positive, and - total obligations ≥ $1,000,000, and
- total obligations ÷ base obligation ≥ 3.
Known limitation: contracts that are deliberately incrementally funded
(common in DoD) trigger this rule even when total spending stays within the
contract ceiling. The award page shows base_and_all_options (the potential
value) next to the flag so readers can see whether growth exceeded the
original ceiling.
R4 — split_purchase_pattern
Purchases at or above the simplified acquisition threshold ($250,000) require fuller competition procedures. A known circumvention pattern is splitting one requirement into several smaller awards. Flag every award in a group where:
- the same recipient entity received 2–5 awards issued by the same contracting office within a 7-day window, and
- each award in the group is individually under $250,000 (and ≥ $10,000), and
- the group's combined amount is above $250,000 but at most $750,000 (3× the threshold — larger runs look like routine purchase volume, not a single split requirement).
The contracting office is proxied by the first six characters of the
contract number (PIID), which lead with the issuing office's identifier
(DoD: the issuing DoDAAC, e.g. N00019; VA: 36C + station code, e.g.
36C242). Only maximal windows are considered, and when an award belongs to
overlapping qualifying windows the largest cluster is recorded.
Known limitations: the PIID prefix is coarser or less office-specific at some civilian agencies; recurring same-vendor buys (e.g. quarterly reagent orders across a hospital network) can qualify legitimately. Tuning history: the v1.1.0 rule was calibrated on the VA verification slice, where a sub-agency grouping with a 30-day window flagged 46% of awards and was rejected as non-discriminating. This rule is a lead generator; the source records show whether the awards describe the same requirement.
R5 — just_under_threshold
Flag awards whose amount falls within 5% below the simplified acquisition threshold — $237,500 up to (not including) $250,000.
Context: legitimate awards also land in this band; pricing to a known threshold is not itself improper. The band is interesting in aggregate — a buying office whose award amounts bunch just under the threshold far more than just over it warrants a look — and the per-award flag exists so those populations can be examined. Compare the density just under vs. just over the threshold before reading anything into an individual award.
Outlays (File C) — obligations vs. money out the door
Contract award records (File D1, everything above) record obligations — binding commitments. Actual disbursements ("outlays") come from a different source: File C (Award Financial), submitted monthly by agency financial systems and pulled here via USAspending's Custom Account Data download, scoped by agency and fiscal year.
How Outlay handles File C, and the honesty rules that go with it:
- Cumulative semantics. File C outlay amounts are cumulative within a fiscal year and reset at the FY boundary. Outlay stores one snapshot per fiscal year (the latest available period) and computes an award's lifetime outlays as the sum of each fiscal year's snapshot — never by summing periods within a year. Monthly reporting became mandatory for all agencies in FY2022; earlier data is incomplete and Outlay does not ingest it.
- Linkage is partial, and the coverage number is displayed. File C and
D1 join only on the award ID (PIID); not every award appears in both.
"Who actually got paid" is answerable only for the linked subset.
Every pull records total vs. linked rows, PIIDs, and dollars in
outlay_file_c_coverage, and the UI shows outlay figures with their coverage. An award with no linked File C rows shows "no linked financial data" — which is a statement about linkage, not about spending. - Sign convention. Outlay stores gross outlays with positive = money
disbursed, normalizing the source's sign convention at load time (the
convention is verified against the award-level
Total Outlaysfield from the award search API on each pull). - Reporting lags apply: DoD publishes ~90 days late, and a fiscal year's latest period reflects agency submissions, not real-time cash.
R6 — outlay_lag
Flag awards where money was committed long ago but little has been disbursed:
- obligations ≥ $1,000,000, and
- the award has linked File C data (awards without linkage are skipped — absence of data is never treated as a pattern), and
- the reporting date is at least halfway through the period of performance and at least one year past its start, and
- linked lifetime outlays are under 5% of obligations.
Context: slow spend-out is completely routine for construction, shipbuilding, and multi-year R&D, where costs are incurred late by design. The flag states timing facts only.
Source-data caveats (displayed in the UI, never hidden)
- USAspending is self-reported by agencies; amounts and dates contain errors and late corrections. The API itself returns advisory messages, which Outlay stores per ingest run and displays.
- Department of Defense procurement data is published on a ~90-day delay.
- The current fiscal year is necessarily partial.
- "Award amount" is obligations (binding commitments), not outlays (actual disbursements). Outlays are shown where the API provides them.
- Every award links back to its USAspending.gov source page
(
https://www.usaspending.gov/award/<generated_id>); that record is the authority, not Outlay's copy. - What this data cannot show: USAspending records obligations, not payments. Invoice-level activity (billing, deliveries, disbursement) never appears here. Flags mark structural patterns in procurement records only; confirming or refuting any hypothesis about a flagged award requires the contract file and other independent sources (SAM.gov notices, IG and GAO reports), and ultimately bodies with audit authority.
Changelog
- 1.2.0 (2026-08-05) — File C (Award Financial) outlay ingest with
FY-snapshot cumulative handling, per-pull linkage coverage recorded and
displayed, sign normalization verified against the search API; new rule
R6 (
outlay_lag). - 1.1.0 (2026-08-05) — added R4 (
split_purchase_pattern) and R5 (just_under_threshold); added append-only record versioning (award_versions) with per-run revision counts; ingest scope switched to the VA $100K–$300K verification slice (agency + amount-band filters added to the config). - 1.0.0 (2026-08-04) — initial rules R1–R3, entity resolution v1.