Skip to content
AGENTIC Data Mining
Live ● Public TOOL dla.prior_prices LAST SYNC

DLA prior-award unit prices

For a given NSN: what was paid per unit before, when, who won it last time (the prior CAGE, resolved to a company name for 79% of prior-awardee CAGEs as measured 2026-07-28), how many units they bought, and under which contract. Five answers, one call — the per-item price history DLA's own award search cannot produce.

Where it comes from: DLA prints a Procurement History block inside its own solicitation (RFQ) documents, listing prior buys of that item — CAGE, contract number, quantity, unit cost, award date, surplus flag. That block is the only per-NSN unit-price history this source publishes: the DIBBS awards grid repeats the whole-award total on every line, and its by-NSN award search returns a byte-identical empty page for a known-awarded NSN and a never-awarded one (proven live over eight navigations, 2026-07-26).

Read this before you quote a number

Every row carries price_basis = "published_prior_unit". These are secondhand prices: a prior award's unit cost as republished by the government inside a later solicitation. They were not read from the award instrument and they are not observed transaction records.

Do not blend them with, average them against, or present them as equivalent to a firsthand award price — neither dla.dibbs' awards grain (observed_award_total, the whole-award total off the awards grid) nor the per-CLIN observed_award_unit parsed from award documents. Three different kinds of evidence; the basis travels on every row and in the response's grain block so it cannot be lost in transit.

Status & conduct: Flipped live 2026-07-31 — the tool is advertised in tools/list and this dataset is licensed-live, verified against the production database with exact record-count parity to the pipeline's own synced total. The document-retrieval scope on DLA's document host was signed by the data owner on 2026-07-28 — on measured operational evidence (rate compliance, no adverse source response, extract-and-discard and PII both verified at volume), which is an owner decision and not a legal terms-of-service determination. Coverage is still early relative to a full backfill, so treat the KPI tiles below as the honest current state, not a ceiling. Documents are extract-and-discard — no PDF is ever persisted; pages and API responses deep-link to DLA's own document URL. The parser is a positive extraction allowlist, so the buyer names, phone numbers and mailboxes printed on the source form have no column here at all.

A second tool reads this same table: dla.comparable_prices, for the NSN whose own history here is one row or none. It answers with comparable items rather than the item itself, and every row is labelled with how comparable it actually is. Three tiers are active: same Item Name Code and same unit of issue (the only tier whose unit prices are directly comparable per unit), same Item Name Code alone, and same Federal Supply Class. A fourth tier — same part number — is built but held, not active: it would be the strongest tier, so a wrong row there displaces correct data rather than sitting beside it, and on first contact with the real FLIS cross-reference it matched specifications as if they were part numbers (every "same physical part" comparable for one NSN was matched on MIL-PRF-85285, a coating specification carried by 625 stock numbers, returning six items spanning $83.70–$297.84). It is held pending validation, not withdrawn — while held it returns an explicit not_enabled_pending_validation, which is deliberately a different answer from "we looked and found nothing".

There is a portal for this: DIBIQ puts these prices in front of a DLA bidder as pages rather than tool calls — open solicitations, per-unit prior prices where they exist, approved sources and published item characteristics. Same subscription, same refusals.

Prior-price records

One row per prior procurement of one NSN (deduplicated across every RFQ that republished it)

Coverage

Measured live

The Federal Supply Classes actually priced in this table, read off the table itself and shown here once this dataset goes live. Deliberately no class list is written into this page: the pipeline's target class list is not coverage, and the corpus is expanding — a list hardcoded here on the morning of 2026-07-27 was already wrong by that evening.

Price basis

Secondhand

published_prior_unit — republished by DLA inside a later solicitation, never an observed transaction

Freshness

Daily

New prior prices appear as new solicitations are published · JSON · Public

Coverage syncing from the live ingestion pipeline…

How to tell whether the number is trustworthy

Every caveat below is a queryable field, not a footnote. Nothing here is smoothed over in the response.

Currency is assumed, not read

DLA renders no currency symbol, code or marker of any kind in this block — the measured rendering is a bare 34.48000. A "$" here would be our invention, so we never print one. Each row instead carries an explicit currency_basis:

  • assumed_usd_owner_decisioncurrency = "USD" filled in under the data owner's domain decision that these prices are USD. An assumption, not something the document said.
  • unknown_no_marker_renderedcurrency = null. Parsed before that decision; the honest unknown.
  • document_rendered — a currency DLA actually printed. Not hypothetical: a real DLA delivery order priced every line in GBP is live-confirmed on the award side, so "it's DLA, so it's USD" is a known-false assumption.

Aggregating? Pass require_currency=true, and group by currency. To exclude assumed values entirely, pass currency_basis=document_rendered.

Measured 2026-07-27: not one row in this corpus carries document_rendered — every row is either assumed-USD or an explicit null. So currency_basis=document_rendered correctly returns zero rows today. The value exists because a document that prints a currency will one day arrive, not because this corpus already contains one.

An unresolved CAGE is not an unknown winner

prior_cage_code is always returned — printed by DLA in the same procurement-history row as that prior contract's own number, quantity, unit cost and award date, which is how we read it as the awardee: a routing or source-of-supply code would not carry a contract-specific price and date this way (see dla.flis's sos field, which is exactly a routing/source-of-supply designator and is never a CAGE). That reading is structural, not a literal one: the printed column header on the one document measured so far is the bare word CAGE, not "Awardee CAGE" the way DLA's own separate Awards grid explicitly labels its column "Awardee CAGE Code". A company name is resolved on top of it through a CAGE→company map built across all rows of the FLIS cross-reference, never a same-NIIN join: that table is a per-NIIN approved-source list, so last time's winner may legitimately not appear under this item's NIIN.

When no name resolves, prior_awardee_display falls back to the bare CAGE and prior_awardee_name_status says which case it is. The row is never dropped, and nothing ever renders as "winner unknown" — it means we have no company name for that CAGE.

Measured 2026-07-28, the day that cross-reference finished loading (10,281,724 rows): 590 of the 742 distinct CAGEs that appear as prior awardees resolve to a company name — 79%. The remaining 21% render as the bare CAGE with cage_not_in_flis_cross_reference, which is a missing name, not a missing winner. That percentage is a dated measurement of an expanding corpus, not a service level: read prior_awardee_name_status on each row rather than assuming a name will be there.

Small n, stated as small n

This corpus is small and incomplete by construction: it covers only the Federal Supply Classes whose solicitation documents have actually been parsed, and any document carrying more than one procurement-history NSN is refused outright rather than risk attributing one item's price to another. A missing price is recoverable; a wrong one is not. (That refusal is a stated policy, not an observed filter — as of 2026-07-27 no multi-NSN solicitation had been encountered, so nothing has yet been dropped by it.)

Where it is deep, it is genuinely deep. Measured 2026-07-28, and still growing: of the 544 NSNs on file, 124 carry 20 or more prior awards, 266 carry 10 or more, 396 carry 5 or more, and 50 carry exactly one. Depth per item, not breadth across the catalog, is what this surface is for.

So a per-NSN query returns an exact summary.prior_awards_on_file"1 prior award on file" is a valid answer — and no average, median, trend or "market rate" is computed at any n: unit price at this grain depends on the quantity bought, and part of the corpus carries an assumed currency. An NSN with nothing on file returns an explicit no-history statement with zero rows and no error.

Absence is not non-existence. An NSN with no rows here means no prior-award row has been captured in this corpus. It is not evidence that the item does not exist, that it was never awarded, or that it is unrestricted — the companion DLA FLIS catalog is carve-out filtered (public FSG / DEMIL / CIIC allowlists), so an item absent from it is restricted from public release, not nonexistent. This tool never probes FLIS to "validate" an NSN, precisely so that a restricted item can never be rendered as "no such item".

Query parameters

nsnstring

National Stock Number, exact — the primary question. Dashed (8010-00-111-6384) or bare 13-digit (8010001116384) both work; you never have to reformat. Supplying it also returns a summary with the exact number of prior awards on file.

prior_cagestring

Prior awardee CAGE (5-char), exact and case-insensitive — who won it last time. Trace one supplier's prior wins across NSNs.

prior_contract_numberstring

Prior contract number (PIID), exact — dashed or undashed both work

solicitation_numberstring

The RFQ that published this prior price, exact. Dashed or undashed both work — paste it straight off the DIBBS grid or off dla.dibbs, which renders it dashed (SPE4A1-26-T-2328) while this table stores it undashed. The tool matches either, so a format difference can never look like "no price history". Provenance, not identity — the same prior award is republished by every later RFQ for that NSN.

award_date_from / award_date_toISO date

Inclusive bounds on the PRIOR award's own date

min_unit_price / max_unit_pricenumber

Bounds on unit_price — a published PRIOR unit cost whose currency may be assumed; read currency_basis before comparing values

require_currencyboolean

Default false. true = only rows with a non-null currency (the aggregate-safe set; still includes assumed-USD rows)

currency_basisstring

document_rendered · assumed_usd_owner_decision · unknown_no_marker_rendered. An unrecognized value is rejected, never silently ignored.

limitnumber

Max records per response (default 25, max 50)

Rows are ordered award_date DESC — most recent prior award first. The full input schema is served by the MCP server at connection time.

Example call

Request · dla.prior_prices
{
  "tool": "dla.prior_prices",
  "params": {
    "nsn": "8010-00-111-6384",
    "limit": 10
  }
}

What comes back for an NSN with nothing on file

Response · no history
{
  "rows": [],
  "returned": 0,
  "summary": {
    "nsn": "8030-01-999-9999",
    "prior_awards_on_file": 0,
    "statement": "No prior award history on file for NSN 8030-01-999-9999.",
    "is_error": false,
    "absence_means": "No prior-award row has been captured for this NSN in this corpus ... This is NOT evidence that the item does not exist, that it has never been awarded, or that it is unrestricted."
  }
}

A stated answer, not an error — and distinguishable from one, by design.

View tool & schema

Install in Claude Desktop

One-click .mcpb bundle — adds the dla.prior_prices tool to Claude Desktop. Prompts for your API key on install; nothing is baked in.

Install in Claude Desktop (.mcpb)

Schema

One table (dibbs_rfq_history_records), keyed on the PRIOR PROCUREMENT's own identity — not the document's. The same prior award is republished by every later RFQ for that NSN, so keying on the document would store one price point dozens of times and weight it dozens of times in any count.

Field Type Description
nsnstringCanonical dashed FSC-NN-NNN-NNNN — the item the price is for, and the join key to dla.dibbs / dla.flis
unit_pricenumberPrior award's UNIT cost as printed (five decimals are real on a micro-purchase item and are stored, not rounded away)
currencystringISO 4217, nullable. Never read it without currency_basis
currency_basisstringDerived per row: assumed_usd_owner_decision · unknown_no_marker_rendered · document_rendered
quantitynumberUnits bought on the prior award (three decimals as printed) — the reason a unit price is not comparable across wildly different order sizes
award_datedateDate of the PRIOR award — when that unit price was paid
prior_cage_codestringWho won it last time. Shape-validated (5-character CAGE); a value failing its validator is dropped, never coerced
prior_awardee_name / prior_awardee_displaystringCompany name resolved through the FLIS CAGE→company map (null when unresolved), and the display value that falls back to the bare CAGE
prior_awardee_name_statusstringresolved_from_flis_cage_map · cage_not_in_flis_cross_reference · cage_name_lookup_unavailable · no_cage_on_row
prior_contract_numberstringThe contract it was bought under (13-character undashed PIID), shape-validated the same way
surplus_materialbooleanThe block's Surplus Material flag. null = not stated, which is NOT "no"
price_basisstringAlways "published_prior_unit" — a stored column, never a query-time literal
parse_statusstringThe document parser's status, carried onto every row so trust is one predicate, not a re-join
solicitation_number / source_document_urlstringAn RFQ that published this price and DLA's own document URL — captured verbatim, never synthesized (so solicitation_number is stored UNDASHED here while the RFQ grid renders it dashed; the query layer accepts both). The PDF itself is never mirrored

There is deliberately no buyer, point-of-contact or signature field: the source documents carry individual-person data and the parser is a positive allowlist, so none of it has a column to land in.

Sample record

Sample · dla.prior_prices · a real row, returned live 2026-07-28
{
  "nsn": "8010-00-111-6384",
  "prior_cage_code": "6PVX3",
  "prior_awardee_name": "A.M.S. NETWORK, LLC",
  "prior_awardee_display": "A.M.S. NETWORK, LLC",
  "prior_awardee_name_status": "resolved_from_flis_cage_map",
  "prior_contract_number": "SPE8ES26P0822",
  "quantity": 5,
  "unit_price": 1218.84,
  "currency": null,
  "currency_basis": "unknown_no_marker_rendered",
  "award_date": "2026-05-21",
  "price_basis": "published_prior_unit",
  "parse_status": "parsed"
}

This is one row a live call returned, not an illustration: the whole record was read back off the tool against the production database on 2026-07-28. That NSN carries 20 prior awards spanning 2018-10-27 to 2026-05-21, unit prices from 524.00 to 1,305.00 (no currency symbol: see above), across 4 prior-awardee CAGEs — 6PVX3, 61125, 329E3 and 19151. surplus_material, solicitation_number and source_document_url also come back on every row (shapes in the schema table) and are left out of this excerpt rather than filled with invented values.

Read the two status fields, not the shape. This row resolves to a company name; 21% of prior-awardee CAGEs do not, and those return the bare CAGE with cage_not_in_flis_cross_reference — the winner is still identified, by the CAGE. Note also "currency": null on this particular row: it was parsed before the USD domain decision was armed, so its basis reads unknown_no_marker_rendered rather than assumed_usd_owner_decision. Both appear in the corpus (measured 2026-07-28: 5,695 assumed-USD rows, 36 unknown), and neither is a currency DLA printed.

Use it for

  • Price a micro-purchase quote against what the government actually paid per unit last time for the same NSN — with the quantity and date attached, instead of a whole-award total you have to divide
  • Identify the incumbent: the prior awardee's CAGE, the company name it resolves to through the FLIS cross-reference (79% of prior-awardee CAGEs, measured 2026-07-28 — the rest return the bare CAGE, which is still the winner's identity), and the contract it was bought under
  • Decide whether a price is quotable at all — every row states its basis and its currency provenance, and a single-observation NSN is reported as exactly that rather than dressed up as a market rate
● Public Daily

DLA DIBBS micro-purchases

dla.dibbs

The same source's open solicitations and award history. Firsthand, but whole-award TOTALS (observed_award_total) — the complement to this dataset's secondhand per-unit prices. Same NSN key.

Financial & Government Contracts

Included in subscription View dataset
● Public Monthly

DLA FLIS / PUB LOG item catalog

dla.flis

Item identity by NIIN, plus the CAGE cross-reference this dataset will resolve prior awardee names through once it holds rows (it holds none today). Carve-out filtered — an item absent from it is restricted, not nonexistent.

Financial & Government Contracts

Included in subscription View dataset
● Public Daily

Federal contract awards

contracts.awards

The $25k-and-up half of federal procurement, where DLA micro-purchases never appear. Pair a prior unit price with the awardee's wider federal footprint.

Financial & Government Contracts

Included in subscription View dataset