Skip to content

Labor rate benchmark (should-cost)

Return the distribution of awarded hourly labor rates for a labor category, from the ceiling rates on GSA Multiple Award Schedule (MAS) contracts. Give it a labor category (and optionally an education level, years of experience, NAICS, vendor, or schedule) and it returns the rate percentiles plus real comparable awarded rates. This is the should-cost / IGCE labor input: what a labor category has actually been awarded at, which is how contractors build a cost estimate and how contracting officers benchmark a proposed rate.

Beyond the base distribution the response supports three parts of the actual pricing workflow:

  • Out-year escalation (escalation): the typical year-over-year change in the awarded ceiling rate, so you can set and justify option-year escalation.
  • Competitor / self rate card (vendor filter): scope the distribution to one vendor to read what a specific competitor, or your own company, has been awarded for the category.
  • Category discovery (category_breakdown, suggestions): the category names in this data are free text, so a match pools variants and shows how it decomposes; a query that returns too few rates comes back with the nearest real categories to search instead.

It is the labor-rate companion to the contract pricing benchmark, which reads total contract value. Together they cover both sides of pricing a services bid: what the contract is worth, and what the labor inside it should cost. As with the benchmark, this is a market read, not "the price to win": the winning rate depends on your cost structure, the competition, and the evaluation method.

Parameters

labor_category is required. Unknown parameters return 400.

  • labor_category: the role to benchmark (for example Program Manager, Software Engineer, Systems Administrator). Required.
  • match: contains (default, substring match, so Program Manager catches "Senior Program Manager") or exact.
  • education_level: HS, AA, BA, MA, PHD, or OTHER. Case-insensitive, and common spellings resolve (BS, Bachelors map to BA; Masters to MA). An unrecognized value returns 400 with the valid set, not an empty result.
  • min_experience / max_experience: bound the minimum-years-of-experience the rate is priced at (060).
  • naics: a 6-digit NAICS. Matched through the SIN, so naics=541512 scopes to IT-systems-design labor. (GSA SINs are NAICS-aligned; some are 5-digit families, so this is a prefix match.)
  • vendor: a vendor name (substring, case-insensitive), for the competitor / self rate card. vendor=booz allen scopes the distribution to that vendor.
  • worksite: Customer, Contractor, or Virtual.
  • business_size: S (small business) or O (other than small).
  • security_clearance: Yes or No.
  • value_basis: which year's rate to measure. current (default), next_year, or second_year (the escalated option-year rates).
  • sample_limit: how many comparable rates to return, 0 to 25 (default 10), ordered by rate.

Response

A flat aggregate object:

  • labor_category, value_basis (echoed), min_sample_size.
  • rate_distribution:
  • sample_size: the number of awarded rates matched.
  • unit: always USD_per_hour.
  • suppressed: true when fewer than min_sample_size (20) rates back the query; percentiles is then null with a suppressed_reason.
  • percentiles: p10, p25, p50 (median), p75, p90, in dollars per hour.
  • min, max, avg.
  • escalation: the typical out-year change in the ceiling rate, or null when the sample is too small. median_next_year_pct and median_second_year_pct are the median year-over-year percentage change across the matched awards; basis names the method and sample_size the number of awards behind it.
  • rates_sample: up to sample_limit real awarded rates, each with rate, labor_category, education_level, min_years_experience, vendor_name, idv_piid (the GSA contract), sin, naics, schedule, business_size, security_clearance.
  • category_breakdown: present when the match pooled more than one distinct category name. The top variants by sample size, each with labor_category, sample_size, and median, so you can narrow to the exact one you mean.
  • suggestions: present only when the result is suppressed (too few rates). The nearest real category names with their sample_size, so a thin query points you to a better one.
  • filters_applied, _sources (gsa_calc).

Read the range. Labor-category names vary between vendors, so contains intentionally pools variants (a "Program Manager" query includes "Program Manager II", "Program Manager - SVCM", and so on); the percentiles smooth over the naming noise, and category_breakdown shows the variants if you want to narrow.

Ceiling rates are the maximum billable rate on the schedule, not the average awarded price. The realistic should-cost target for a competitive bid is usually around the lower-middle of the range (p25p50), not the ceiling.

Example

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/labor-rates?labor_category=Program%20Manager&education_level=BA&min_experience=5&max_experience=15&sample_limit=2"
{
  "labor_category": "Program Manager",
  "value_basis": "current",
  "min_sample_size": 20,
  "rate_distribution": {
    "sample_size": 5259,
    "unit": "USD_per_hour",
    "suppressed": false,
    "percentiles": { "p10": 127.99, "p25": 154.67, "p50": 184.76, "p75": 221.56, "p90": 264.78 },
    "min": 36.28,
    "max": 499.91,
    "avg": 192.02
  },
  "escalation": {
    "basis": "median year-over-year change in awarded ceiling rate",
    "sample_size": 5152,
    "median_next_year_pct": 2.6,
    "median_second_year_pct": 2.7
  },
  "rates_sample": [
    {
      "rate": 36.28,
      "labor_category": "Program Manager - SVCM",
      "education_level": "BA",
      "min_years_experience": 7,
      "vendor_name": "SEBA PROFESSIONAL SERVICES LLC",
      "idv_piid": "GS23F057AA",
      "sin": "541614SVC",
      "naics": "541614",
      "schedule": "MAS",
      "business_size": "S",
      "security_clearance": "No"
    }
  ],
  "category_breakdown": [
    { "labor_category": "Program Manager", "sample_size": 1336, "median": 182.42 },
    { "labor_category": "Program Manager II", "sample_size": 318, "median": 197.21 },
    { "labor_category": "Program Manager 2", "sample_size": 81, "median": 188.83 }
  ],
  "filters_applied": { "labor_category": "Program Manager", "match": "contains", "value_basis": "current", "education_level": "BA", "min_experience": 5, "max_experience": 15 },
  "_sources": ["gsa_calc"]
}

More examples

Scope a role to an industry via NAICS (software engineers on IT-systems-design work):

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/labor-rates?labor_category=Software%20Engineer&naics=541512"

Read one vendor's rate card , what a specific competitor (or your own company) has been awarded for the category:

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/labor-rates?labor_category=Program%20Manager&vendor=booz%20allen"

Read the escalated out-year rate instead of the current year:

curl -H "Authorization: Bearer $GOVCON_API_KEY" \
  "https://govconapi.com/api/v1/pricing/labor-rates?labor_category=Systems%20Administrator&value_basis=next_year"

When a query returns too few rates, the response is suppressed and carries suggestions , the nearest real category names to search instead. A labor_category=Program Mgr query, for example, comes back suppressed with suggestions led by Program Manager (1,775 rates), Program Manager II (455), and so on.

Plans and limits

This endpoint requires a paid plan (free returns 402). Unlike /pricing/benchmark and /pricing/position, which are Pro, this is on every paid plan: raw GSA CALC rates are a base dataset. It rides the standard per-key rate limit (1,000 requests/hour on paid plans, with a short per-minute burst cap) like any other data endpoint.

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

Errors

  • 400 , labor_category missing, an invalid match or value_basis, a naics that is not 6 digits, an unrecognized education_level / business_size / security_clearance / worksite, min_experience greater than max_experience, or an unknown query parameter.
  • 401 , no API key.
  • 402 , the free trial. This endpoint requires a paid plan (Developer or Pro).
  • 429 , the standard rate limit was exceeded (1,000 requests/hour on paid plans, or the short per-minute burst).

A labor category with no matching rates returns 200 with a suppressed distribution (sample_size 0), not an error.

Notes for integrators

  • Source: GSA CALC+ Contract-Awarded Labor Category ceiling rates on MAS services schedules, refreshed daily. These are awarded ceiling rates (the maximum billable), the standard IGCE / price-analysis labor reference.
  • naics is derived from the SIN; GSA SINs are NAICS-aligned, and some are 5-digit families, so naics is a prefix match (a 6-digit code matches its SIN family).
  • Escalated next_year / second_year rates are the contract's own option-year pricing where the schedule provides them.

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.