Frontier Market Observatoryby QuantixMind

Methods

How every figure is made

The rules below were fixed before any number was computed. The methods, completeness and limitations text is reproduced word for word from the study results.

A large white ground station dish antenna on its steel pedestal under a blue sky.Photograph: NASA

Terms used here

Fiscal year (FY)
The federal year, October to September. FY2026 ran from October 2025 to September 2026.
Obligation
A binding commitment of federal money on a contract action. Net obligations subtract money taken back (deobligations).
FPDS
The Federal Procurement Data System, the public system where agencies report their unclassified contract actions.
NAICS
North American Industry Classification System: the industry code on a contract.
PSC
Product and service code: what was bought. Code 18 is space vehicles; AR is space research and development.
IDV
Indefinite delivery vehicle: an umbrella contract that agencies place orders under.
HHI
Herfindahl Hirschman index, a score for how concentrated buying is, from 0 to 10000. A high score means a few agencies place most of the money.
OTA
Other transaction agreement: a flexible agreement outside the standard contract rules. OTAs are not reported to FPDS.
Read this before citing. Do not quote FY2026 figures as final. FY2026 closed on 30 September but was pulled on 2026-10-14, before the Department of Defense (DoD) reporting lag of up to 90 days had passed, so DoD actions late in the year are missing. It is drawn dashed or shaded, and all year totals include it as pulled. Full study scope: every action under the industry codes studied, plus the space product codes. It is not a space series. NAICS 336414 (guided missile and space vehicle manufacturing) includes missile programs such as Javelin; 334220 (radio and wireless equipment) and 517410 (satellite telecommunications) carry much spending that is not space. Use the space only view for space claims.

Source

FPDS, the Federal Procurement Data System, through its public ATOM feed (a machine readable list of records), pulled from the command line, one query per code and fiscal year. Other transaction agreements (OTAs), classified awards and grants are not in FPDS, so no figure here includes them.

Methods

  1. Scope: every contract action (awards and IDVs, base and modifications) with signed date 2015-10-01 to 2026-09-30 whose principal NAICS is 336414, 336419, 334220, 517410 or 927110, or whose PSC begins with 18 (space vehicles) or AR (space R&D). One query per code family per fiscal year; all pages pulled until a short page; overlaps removed by the key (record kind, agency ID, PIID, modification number, transaction number, referenced IDV PIID).
  2. Fiscal year = federal FY of the signed date (October to September).
  3. Obligated dollars = sum of obligatedAmount over all actions (base awards, modifications, deobligations) signed in the period. Nominal dollars, not inflation adjusted.
  4. Award count = actions with modification number 0 (new awards, orders and IDVs). Modifications add dollars, not awards.
  5. Competed = extentCompeted code A (full and open), D (full and open after exclusion of sources), E (follow on to competed action), F (competed under simplified acquisition) or CDO (competitive delivery order). Share competed is over new awards with an extentCompeted value reported. Single offer share is over competed new awards with numberOfOffersReceived of 1 or more; one offer = exactly 1.
  6. Buyer = contracting sub tier agency (contractingOfficeAgencyID name, for example DEPT OF THE AIR FORCE, NATIONAL AERONAUTICS AND SPACE ADMINISTRATION). Concentration uses agencies with positive net obligations. HHI = sum of squared percentage shares (0 to 10,000).
  7. Vendor = ultimate parent UEI, else UEI, else DUNS, else upper cased vendor name. Entrant = vendor whose first in scope action in this dataset falls within the current FY or the four before it (a five year window). Reported only for FY2021 onward so every window is fully inside the data. Measured over competed new awards (count) and their obligations at award.
  8. Development versus services: share of obligated dollars by PSC family (18, AR, other R&D A*, services B to Z, other numeric product codes) and by typeOfContractPricing.
  9. Multi agency firms: vendors (rule 7) with at least one action from two or more contracting sub tier agencies within the same FY; dollar share is their FY obligations over all FY obligations. The overall figure pools FY numerators and denominators.

Space only view

Same rules as the Methods section, restricted to unique actions whose PSC begins with 18 or AR, whatever their NAICS. Vendor first appearance (rule 7) is recomputed inside this cut. Newer firm share for FY2024 to FY2026 pools those three years.

Completeness

77 slices, 0 incomplete or mismatched. Raw entries read: 418,428. Unique in scope contract actions after dedup: 413,031.

Every slice, entries read against the feed total
77 slices, 0 incomplete or mismatched
naics334220_FY2016: 16861 entries, feed total 16861, ok
naics334220_FY2017: 17503 entries, feed total 17503, ok
naics334220_FY2018: 16071 entries, feed total 16071, ok
naics334220_FY2019: 14343 entries, feed total 14343, ok
naics334220_FY2020: 13881 entries, feed total 13881, ok
naics334220_FY2021: 12422 entries, feed total 12422, ok
naics334220_FY2022: 11986 entries, feed total 11986, ok
naics334220_FY2023: 10807 entries, feed total 10807, ok
naics334220_FY2024: 10808 entries, feed total 10808, ok
naics334220_FY2025: 10949 entries, feed total 10949, ok
naics334220_FY2026: 7960 entries, feed total 7960, ok
naics336414_FY2016: 2699 entries, feed total 2699, ok
naics336414_FY2017: 2864 entries, feed total 2864, ok
naics336414_FY2018: 2880 entries, feed total 2880, ok
naics336414_FY2019: 3016 entries, feed total 3016, ok
naics336414_FY2020: 3298 entries, feed total 3298, ok
naics336414_FY2021: 3365 entries, feed total 3365, ok
naics336414_FY2022: 3486 entries, feed total 3486, ok
naics336414_FY2023: 3262 entries, feed total 3262, ok
naics336414_FY2024: 3172 entries, feed total 3172, ok
naics336414_FY2025: 3281 entries, feed total 3281, ok
naics336414_FY2026: 2528 entries, feed total 2528, ok
naics336419_FY2016: 1762 entries, feed total 1762, ok
naics336419_FY2017: 1580 entries, feed total 1580, ok
naics336419_FY2018: 1743 entries, feed total 1743, ok
naics336419_FY2019: 1643 entries, feed total 1643, ok
naics336419_FY2020: 1626 entries, feed total 1626, ok
naics336419_FY2021: 1651 entries, feed total 1651, ok
naics336419_FY2022: 1769 entries, feed total 1769, ok
naics336419_FY2023: 1855 entries, feed total 1855, ok
naics336419_FY2024: 1980 entries, feed total 1980, ok
naics336419_FY2025: 2074 entries, feed total 2074, ok
naics336419_FY2026: 1297 entries, feed total 1297, ok
naics517410_FY2016: 5175 entries, feed total 5175, ok
naics517410_FY2017: 11596 entries, feed total 11596, ok
naics517410_FY2018: 9018 entries, feed total 9018, ok
naics517410_FY2019: 4537 entries, feed total 4537, ok
naics517410_FY2020: 5409 entries, feed total 5409, ok
naics517410_FY2021: 5439 entries, feed total 5439, ok
naics517410_FY2022: 10560 entries, feed total 10560, ok
naics517410_FY2023: 7540 entries, feed total 7540, ok
naics517410_FY2024: 5802 entries, feed total 5802, ok
naics517410_FY2025: 4779 entries, feed total 4779, ok
naics517410_FY2026: 3459 entries, feed total 3459, ok
naics927110_FY2016: 68 entries, feed total 68, ok
naics927110_FY2017: 60 entries, feed total 60, ok
naics927110_FY2018: 61 entries, feed total 61, ok
naics927110_FY2019: 46 entries, feed total 46, ok
naics927110_FY2020: 37 entries, feed total 37, ok
naics927110_FY2021: 66 entries, feed total 66, ok
naics927110_FY2022: 60 entries, feed total 60, ok
naics927110_FY2023: 76 entries, feed total 76, ok
naics927110_FY2024: 160 entries, feed total 160, ok
naics927110_FY2025: 139 entries, feed total 139, ok
naics927110_FY2026: 79 entries, feed total 79, ok
psc18_FY2016: 523 entries, feed total 523, ok
psc18_FY2017: 488 entries, feed total 488, ok
psc18_FY2018: 429 entries, feed total 429, ok
psc18_FY2019: 321 entries, feed total 321, ok
psc18_FY2020: 309 entries, feed total 309, ok
psc18_FY2021: 283 entries, feed total 283, ok
psc18_FY2022: 301 entries, feed total 301, ok
psc18_FY2023: 240 entries, feed total 240, ok
psc18_FY2024: 196 entries, feed total 196, ok
psc18_FY2025: 230 entries, feed total 230, ok
psc18_FY2026: 168 entries, feed total 168, ok
pscAR_FY2016: 15402 entries, feed total 15402, ok
pscAR_FY2017: 15980 entries, feed total 15980, ok
pscAR_FY2018: 17996 entries, feed total 17996, ok
pscAR_FY2019: 17133 entries, feed total 17133, ok
pscAR_FY2020: 17125 entries, feed total 17125, ok
pscAR_FY2021: 15131 entries, feed total 15131, ok
pscAR_FY2022: 13693 entries, feed total 13693, ok
pscAR_FY2023: 10320 entries, feed total 10320, ok
pscAR_FY2024: 8273 entries, feed total 8273, ok
pscAR_FY2025: 8011 entries, feed total 8011, ok
pscAR_FY2026: 5288 entries, feed total 5288, ok

Verification

Two checks sit between the raw feed and any published number. The first is page counts. For every code and fiscal year, entries read are compared with the total the feed reports. A slice that falls short or overshoots is marked incomplete.

The second is independent recomputation. A separate program reads the raw pages with a different parser, checks each page against its recorded hash (a fingerprint that changes if the page changes), recomputes every headline figure and compares it with the published results. It prints pass or fail. It covers the headline and space only figures; the per year series are computed by the main study script.

Independent re-derivation of the RESULTS.md headline numbers from raw/.

Uses xml.etree parsing (space_demand.py uses regex), verifies every raw page's
sha256 against fetch_log.txt, recomputes the headlines, and compares them to the
values printed in RESULTS.md. Prints PASS or FAIL. Run: python3 -I check.py

Limitations

  • Vendor age is proxied by first appearance in this dataset, which starts FY2016 and covers only these codes. A firm new here may be decades old elsewhere in federal contracting; entrant shares are an upper bound on true new firm capture.
  • NAICS 334220 (radio, television and wireless communications equipment) and 517410 (satellite telecommunications) include much non space spending; they are in scope because the study defined them so. PSC family tables let a reader separate them.
  • extentCompeted and numberOfOffersReceived are agency reported. Task orders inherit coding conventions that vary by agency; offer counts are missing on some competed awards and those are excluded from the single offer denominator.
  • Dollars are net obligations by signed date, including deobligations; FY2026 is the year in progress at pull time with FPDS DoD reporting lagging by up to 90 days, so FY2026 is incomplete in the source itself.
  • Classified spending and other transaction agreements (OTs) are not reported to FPDS and are absent.
  • Ultimate parent UEI is as currently recorded in FPDS; corporate acquisitions can merge historically separate firms.

Site notes on the limitations

  • Full study scope: every action under the industry codes studied, plus the space product codes. It is not a space series. NAICS 336414 (guided missile and space vehicle manufacturing) includes missile programs such as Javelin; 334220 (radio and wireless equipment) and 517410 (satellite telecommunications) carry much spending that is not space. Use the space only view for space claims.
  • Where no parent company ID is recorded, firms are matched by name, and one firm can appear under two spellings (for example THE BOEING COMPANY and BOEING COMPANY, THE). That inflates vendor counts and newer firm shares, which are already an upper bound.
  • New award counts fall sharply from FY2021. We have not established whether this reflects buying behaviour or a change in how agencies record orders, so read award based shares after FY2020 with that in mind. Shares resting on fewer than 100 awards are set in grey italic in the tables.
  • Dollars are nominal: not adjusted for inflation.

What is not in FPDS

  • Classified awards are not reported to FPDS. They are absent from every figure.
  • Other transaction agreements (OTAs) are not reported to FPDS. They are absent from every figure.
  • Grants and cooperative agreements are a different record and sit outside this module.

Rebuild steps

A refresh runs these steps in order. The site is republished only after the check in step 3 passes. The study scripts in steps 1 to 3 are available on request; the site scripts in steps 4 to 6 ship with the site.

  1. Fetch every page of the FPDS feed for each code family and fiscal year: python3 -I bidtools/space_demand_fetch.py (in quantix-gov)
  2. Compute every metric into data/space-demand/results.json and RESULTS.md: python3 -I bidtools/space_demand.py (in quantix-gov)
  3. Recompute the headline figures with a second parser and check page hashes: python3 -I data/space-demand/check.py (in quantix-gov)
  4. Export the site data file data.json from results.json: python3 -I tools/export.py (in deploy-space)
  5. Render the pages with the figures written in: python3 -I tools/build.py (in deploy-space)
  6. Run the site checks: node --test test/ (in deploy-space)