Skip to content

Contract pricing benchmark

Return the value distribution of comparable federal contracts for a NAICS code, broken out by contract pricing type (firm-fixed-price, time-and-materials, cost-plus, and the rest). This is a price-analysis benchmark in the sense of FAR 15.404-1: what contracts like this have historically been worth. It is computed over federal prime contract awards (FPDS) at contract grain.

It answers "what does a contract like this go for", which is the market-range input to an independent government cost estimate (IGCE), a competitive price read, or a sanity check on a bid. It is not a price-to-win: the winning number depends on the specific competition, the evaluation method, and your cost structure, none of which live in award history. Treat this as the realistic range, not the answer.

This endpoint reports what the federal record shows and leaves the decision to you. It does not score your win probability, predict whether you will win, or tell you whether to bid. It gives your team the facts to make that call.

Why the response segments by pricing type

Within a single NAICS the median contract value moves by one to three orders of magnitude depending on the contract pricing type. In NAICS 541512 (Computer Systems Design), the firm-fixed-price median is about $66K while the cost-plus-award-fee median is about $207M. A single blended distribution over both would be bimodal and describe no real contract, so the endpoint returns one percentile block per pricing type. A combined block is included for context, with a caveat; do not use it as your comparable.

Parameters

naics is required. Unknown parameters return 400.

  • naics: exactly 6 digits. Required. A benchmark needs a comparison anchor.
  • set_aside: set-aside code (case-insensitive). An unrecognized code returns 400 with the valid list, so a typo never silently returns an empty result. Codes: 8A (8(a) competed), 8AN (8(a) sole source), SBA (small business total), SBP, SDVOSBC (SDVOSB set-aside), SDVOSBS, WOSB, WOSBSS, EDWOSB, EDWOSBSS, HZC (HUBZone), HZS, ISBEE, IEE, BI, HS3, RSB, VSA, VSS, NONE. Common human forms are accepted as aliases (SDVOSBSDVOSBC, 8(a)8A, HUBZONEHZC). Set-aside is a strong value signal: 8(a)-competed 541512 contracts run roughly 60x the un-set-aside median, largely because agencies route larger, deliberately scoped work through set-aside vehicles. Benchmark against your own lane.
  • psc: Product/Service Code, 1 to 4 alphanumeric characters, exact match. PSC is finer than NAICS and is the strongest scope control available: a NAICS alone mixes very different work, while a PSC pins the kind of work. In NAICS 541512, PSC DA01 (IT business applications) has a median around $25K, while PSC R425 (engineering support) has a median around $2.25M. Add psc to turn an industry-wide range into a like-for-like comparable.
  • pricing_type: pin the response to a single contract pricing type (case-insensitive). An unrecognized value returns 400 with the valid list. Values: FIRM FIXED PRICE, FIXED PRICE INCENTIVE, FIXED PRICE AWARD FEE, FIXED PRICE LEVEL OF EFFORT, TIME AND MATERIALS, LABOR HOURS, COST PLUS FIXED FEE, COST PLUS INCENTIVE FEE, COST PLUS AWARD FEE, COST NO FEE, COST SHARING. Common shorthands are accepted (FFP, T&M, LH, CPFF, CPIF, CPAF). When omitted, every pricing type present is returned as its own block.
  • agency: narrow the comparable set to a single buying agency, given as a name, acronym, or CGAC code (Navy, Department of Defense, 1700). A department or a component both work, and the match covers the awarding agency or its sub-agency, so Department of Defense includes Navy, Army, and Air Force while Navy scopes to just the Navy. An unrecognized agency returns 400 with guidance, so a typo never silently returns an off-target benchmark. Agency shifts pricing materially: the same NAICS often benchmarks differently for the Navy than for a civilian buyer, so filtering to the agency you are bidding into yields a truer comparable. Narrowing to one agency shrinks the sample, and any block that drops below the minimum is suppressed rather than published thin.
  • value_basis: which dollar figure to measure. One of:
  • current (default): the award's current total value, base plus exercised options. Populated on about 99% of contracts. The recommended anchor for "what a contract like this is worth".
  • potential: the ceiling if every option is exercised. Use for the option-heavy or IDIQ ceiling question.
  • obligated: money placed on the contract to date. Positive on only about 74% of contracts, and it undercounts multi-year awards mid-life (a five-year deal in year one shows roughly a fifth obligated). Offered for spend-to-date analysis; not the default.
  • date_from / date_to: YYYY-MM-DD bounds on action_date. Older date_from is soft-clamped to the coverage floor; the clamp is surfaced in the window block. When neither is sent, the benchmark spans all coverage (FY2025 onward today).

Response

A flat aggregate object (no pagination; this is not a list):

  • naics, naics_description: the code and its label.
  • value_basis: the basis used (echoes the default when you did not send one).
  • min_sample_size: the suppression floor (20). A pricing type backed by fewer than this many contracts returns percentiles: null and suppressed: true, so a thin cell is never dressed up as a distribution.
  • pricing_types: an array of blocks, ordered by sample_size descending. A small (uncoded) block may appear for contracts with no coded pricing type, so the block sample sizes sum exactly to combined. Each block:
  • pricing_type: the FPDS contract pricing type (or (uncoded)).
  • sample_size: contracts with a positive value on the chosen basis.
  • outliers_ge_1b: how many of those contracts carry a value at or above $1,000,000,000. Reported as context; percentiles (below) are unaffected by them, which is why the endpoint never returns a mean.
  • suppressed: true when sample_size < min_sample_size.
  • suppressed_reason: present only when suppressed.
  • percentiles: p10, p25, p50 (median), p75, p90, in whole dollars; null when suppressed.
  • combined: the same block shape aggregated across all pricing types, plus a note. Provided for context only; the per-pricing-type blocks are the meaningful comparable.
  • filters_applied: every filter the server used, including the defaulted value_basis and the effective date_from.
  • window: coverage-window metadata (plan_window_days, earliest_searchable, clamped, and a human reason when clamped).
  • _sources: source attribution (usaspending_fpds).

Read the range, not a single point. In services NAICS the interquartile spread (p25 to p75) commonly covers more than a 10x range; the median alone hides that.

Example

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/benchmark?naics=541512&set_aside=8A"
{
  "naics": "541512",
  "naics_description": "COMPUTER SYSTEMS DESIGN SERVICES",
  "value_basis": "current",
  "min_sample_size": 20,
  "pricing_types": [
    {
      "pricing_type": "FIRM FIXED PRICE",
      "sample_size": 252,
      "outliers_ge_1b": 0,
      "suppressed": false,
      "percentiles": { "p10": 397785, "p25": 1607325, "p50": 4133341, "p75": 10571906, "p90": 23822397 }
    },
    {
      "pricing_type": "TIME AND MATERIALS",
      "sample_size": 33,
      "outliers_ge_1b": 0,
      "suppressed": false,
      "percentiles": { "p10": 2367075, "p25": 4211567, "p50": 7306509, "p75": 17958212, "p90": 42702045 }
    },
    {
      "pricing_type": "LABOR HOURS",
      "sample_size": 32,
      "outliers_ge_1b": 1,
      "suppressed": false,
      "percentiles": { "p10": 735940, "p25": 1935344, "p50": 4843565, "p75": 11582726, "p90": 30069164 }
    },
    {
      "pricing_type": "COST PLUS FIXED FEE",
      "sample_size": 5,
      "outliers_ge_1b": 0,
      "suppressed": true,
      "percentiles": null,
      "suppressed_reason": "Fewer than 20 contracts; percentiles omitted as not statistically meaningful."
    }
  ],
  "combined": {
    "sample_size": 330,
    "outliers_ge_1b": 1,
    "suppressed": false,
    "percentiles": { "p10": 540789, "p25": 1879901, "p50": 4617629, "p75": 12097016, "p90": 28908197 },
    "note": "Blended across all contract pricing types. Pricing type shifts the median 8x-3000x within a NAICS, so use the per-pricing-type blocks for a meaningful comparable; this combined figure is provided for context only."
  },
  "filters_applied": { "naics": "541512", "value_basis": "current", "set_aside": "8A", "date_from": "2024-10-01" },
  "window": { "plan_window_days": 1825, "earliest_searchable": "2024-10-01", "clamped": true, "reason": "Default search window is the earliest data we carry. This is a data coverage floor, not a plan limit." },
  "_sources": ["usaspending_fpds"]
}

More examples

Pin a single contract pricing type (returns just that block, the honest apples-to-apples comparable):

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/benchmark?naics=541512&pricing_type=FIRM%20FIXED%20PRICE"

Narrow the whole-industry range to a real sub-market with a PSC (turns "all of 541512" into "541512 engineering support"):

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/benchmark?naics=541512&psc=R425"

Read the option-inclusive ceiling instead of current value (for IDIQ / option-heavy work):

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/benchmark?naics=541512&set_aside=8A&value_basis=potential"

Plans and limits

/pricing/benchmark and /pricing/position are Pro capabilities: they compose FPDS award history into a derived price analysis, so they sit with the rest of the derived layer. There is no per-day pricing quota; they ride the standard per-key rate limit.

Plan Access
Free not included (402)
Developer not included (402)
Pro included

The raw inputs stay on the base tier: /pricing/labor-rates (GSA CALC ceiling rates) is available on any paid plan.

Errors

  • 400 , naics missing or not 6 digits, a psc that is not 1 to 4 alphanumeric characters, an unrecognized set_aside code or pricing_type (returned with the valid list), a date_from after date_to, an unknown query parameter, an invalid value_basis, a malformed date_from / date_to, or a query too broad to evaluate within the time budget (narrow it with psc, set_aside, pricing_type, or a tighter date range).
  • 401 , no API key.
  • 402 , a free or Developer key. This endpoint requires the Pro plan.
  • 429 , too many requests.

Error bodies are JSON with a detail string, for example a bad NAICS shape:

{ "detail": "`naics` must be a 6-digit NAICS code (got '23'). Sector- or subsector-level prefixes are not supported; pass a full 6-digit code such as 236220." }

A well-formed but nonexistent NAICS, or a filter combination that matches nothing, returns 200 with an empty pricing_types array and a zero-sample combined block, not an error.

Notes for integrators

  • Contract grain: every modification is collapsed to one contract (contract_award_unique_key) before values are measured, so a heavily modified contract counts once.
  • Values are surfaced exactly as the federal system of record reports them. Implausible source figures are passed through, not cleaned; the outliers_ge_1b count and the percentile design keep them from distorting the result.
  • Coverage today is FY2025 onward. As earlier fiscal years land, the window floor moves toward the plan ceiling with no change to your integration.

A REST API and MCP server for U.S. federal procurement data.

Get a free key, emailed instantly, or follow the quickstart.

Found something wrong, missing or confusing on this page?

Press Ctrl + Enter to send a note. Highlight text first and it travels with your note.