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 returns400with 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 (SDVOSB→SDVOSBC,8(a)→8A,HUBZONE→HZC). 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, PSCDA01(IT business applications) has a median around $25K, while PSCR425(engineering support) has a median around $2.25M. Addpscto 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 returns400with 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, soDepartment of Defenseincludes Navy, Army, and Air Force whileNavyscopes to just the Navy. An unrecognized agency returns400with 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-DDbounds onaction_date. Olderdate_fromis soft-clamped to the coverage floor; the clamp is surfaced in thewindowblock. 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 returnspercentiles: nullandsuppressed: true, so a thin cell is never dressed up as a distribution.pricing_types: an array of blocks, ordered bysample_sizedescending. A small(uncoded)block may appear for contracts with no coded pricing type, so the block sample sizes sum exactly tocombined. 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:truewhensample_size < min_sample_size.suppressed_reason: present only when suppressed.percentiles:p10,p25,p50(median),p75,p90, in whole dollars;nullwhen suppressed.combined: the same block shape aggregated across all pricing types, plus anote. Provided for context only; the per-pricing-type blocks are the meaningful comparable.filters_applied: every filter the server used, including the defaultedvalue_basisand the effectivedate_from.window: coverage-window metadata (plan_window_days,earliest_searchable,clamped, and a humanreasonwhen 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,naicsmissing or not 6 digits, apscthat is not 1 to 4 alphanumeric characters, an unrecognizedset_asidecode orpricing_type(returned with the valid list), adate_fromafterdate_to, an unknown query parameter, an invalidvalue_basis, a malformeddate_from/date_to, or a query too broad to evaluate within the time budget (narrow it withpsc,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_1bcount 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.