The federal contracting data layer

Federal Contract Awards API

Search federal prime contract transactions by recipient UEI, PIID, agency, NAICS, or award type. Every base award and every modification is one row, sourced from the federal procurement system of record and normalized into a stable JSON envelope. Coverage today is FY2025 + FY2026 (October 2024 onward); the plan window is sized for 5 years so older fiscal years drop in as we backfill, without breaking your integration.

9M+
Prime contract transactions
8M+
Distinct contracts (PIIDs)
100K+
Unique recipients (UEI)
Daily
Refresh cadence

The Problem

Federal prime contract data is the foundation under every other procurement question, but accessing it is fragmented across three systems that all return different shapes of the same answer.

FPDS is the official record. The interface is SOAP, the response is XML, and stitching together one company's contract history is a multi-day integration that you redo from scratch every time the schema shifts. USAspending exposes the same data through a modern REST interface, but its search endpoint returns null for NAICS, PIID, total obligation, and contract type. To populate those fields you re-fetch each award individually from a second endpoint, then merge. SAM.gov publishes the subset that becomes a public notice, which is roughly 10 to 30 percent of obligations depending on the agency. Subaward filings live in a fourth dataset entirely.

If you need contract activity to drive BD pipelines, recipient profiles, vendor risk scoring, or supply-chain analysis, you end up integrating all four data sources with different schemas, rate limits, and refresh cadences. This endpoint is the alternative: every federal prime contract transaction in one JSON shape, with stable identifiers, a documented field set, and a single auth header.

Endpoints

Three endpoints cover search, detail, and the full modification trail under a single PIID.

Filter-based search across prime contract transactions:

GET https://govconapi.com/api/v1/contracts/search

Single contract detail — latest transaction plus a roll-up across every transaction under this PIID:

GET https://govconapi.com/api/v1/contracts/{piid}

Full transaction history for one PIID, oldest action first:

GET https://govconapi.com/api/v1/contracts/{piid}/modifications

Query Parameters

Applies to /api/v1/contracts/search. At least one of uei, parent_uei, piid, parent_piid, agency, or naics is required. Unknown parameters return 400.

ParameterTypeDescription
ueistring (12)Recipient Unique Entity Identifier. Exact match, case-insensitive.
parent_ueistring (12)Recipient parent UEI. Use for corporate roll-up across subsidiaries.
piidstringProcurement Instrument Identifier. Exact match, upper-cased server-side.
parent_piidstringParent award PIID (the indefinite delivery vehicle the order sits under).
agencystringAwarding agency name substring, case-insensitive. defense matches every DoD sub-agency.
naicsstringExactly 6 digits. Bad shape returns 400.
award_type_codeA | B | C | DFPDS prime contract types. A = BPA Call, B = Purchase Order, C = Delivery Order, D = Definitive Contract. Not a substantive filter on its own; combine with one of the above.
date_fromYYYY-MM-DDLower bound on action_date. Older dates are soft-clamped to the coverage floor and the clamp is surfaced in the response window block.
date_toYYYY-MM-DDUpper bound on action_date.
amount_minnumberMinimum federal_action_obligation. 0 is honored. Accepts value_min as an alias.
amount_maxnumberMaximum federal_action_obligation. Accepts value_max as an alias.
sort_bystringOne of action_date (default), federal_action_obligation, current_total_value_of_award, recipient_name.
sort_orderasc | descDefault desc. Nulls sort last on descending, first on ascending.
limit1-250Default 50.
offsetintegerPagination offset.
fieldsstringlean (default, 26 fields), expanded (57 fields), full (every column), or a comma-separated explicit list.

Example Requests

Recent IT services contracts to one vendor under Defense:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/search?uei=CKV2L9GZKJK3&naics=541512&agency=defense&limit=50"

Definitive contracts (type D) over $1M in calendar year 2025:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/search?uei=CKV2L9GZKJK3&award_type_code=D&amount_min=1000000&date_from=2025-01-01&date_to=2025-12-31"

Every transaction under a corporate parent, lean projection:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/search?parent_uei=DJUCEANK2KP4&fields=lean&limit=250"

Single contract detail — latest action plus the obligation roll-up:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/W56JSR23F0062"

Full modification trail under one PIID, oldest first:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/W56JSR23F0062/modifications?limit=500"

Tight projection for high-volume polling:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/search?agency=defense&naics=541512&fields=award_id_piid,recipient_name,federal_action_obligation,action_date&limit=250"

Response Format

Search returns a data array, a pagination block, a filters_applied echo of the resolved filters, a window block describing the coverage horizon, and a _sources array naming where the data came from.

{"data": [ {"award_id_piid": "W56JSR23F0062", "parent_award_id_piid": "W56JSR21D0001", "modification_number": "P00093", "action_date": "2026-02-27", "action_type": "EXERCISE AN OPTION", "federal_action_obligation": 2250000.00, "current_total_value_of_award": 392556695.66, "award_type_code": "C", "award_type": "DELIVERY ORDER", "awarding_agency_name": "DEPT OF DEFENSE", "awarding_sub_agency_name": "Department of the Army", "recipient_uei": "CKV2L9GZKJK3", "recipient_name": "DELOITTE CONSULTING LLP", "naics_code": "541512", "naics_description": "COMPUTER SYSTEMS DESIGN SERVICES", /* 12 more lean fields */ } ], "pagination": { "limit": 50, "offset": 0, "total": 2808, "total_is_estimate": false, "has_next": true }, "filters_applied": { "uei": "CKV2L9GZKJK3", "sort_by": "action_date", "sort_order": "desc" }, "window": { "plan_window_days": 1825, "earliest_searchable": "2024-10-01", "clamped": false }, "_sources": ["usaspending_fpds"] }

The detail endpoint returns a singular contract object plus a transaction_rollup sibling block that aggregates obligations, ceiling, distinct recipients, and action-date bounds across every transaction under that PIID. Pro responses also include a subaward_rollup sibling for subaward enrichment.

FieldTypeNotes
award_id_piidstringProcurement Instrument Identifier. Primary lookup key.
parent_award_id_piidstring | nullParent vehicle (IDV) PIID when this is a delivery or task order.
modification_numberstringFPDS modification identifier. Base award is typically 0 or P00000; subsequent actions increment.
action_datestring (ISO date)Date this FPDS transaction was recorded. Drives the search window.
action_typestringPlain-text description of the action (e.g. EXERCISE AN OPTION, SUPPLEMENTAL AGREEMENT FOR WORK WITHIN SCOPE).
federal_action_obligationnumberDollar amount obligated by this single action. Can be negative on deobligations.
current_total_value_of_awardnumber | nullCumulative authorized value of the contract including options that have been exercised. A ceiling, not a draw-down counter.
potential_total_value_of_awardnumber | nullCeiling including all unexercised options.
award_type_codeA | B | C | DFPDS prime contract type. A = BPA Call, B = Purchase Order, C = Delivery Order, D = Definitive Contract.
awarding_agency_namestringTop-level awarding department.
awarding_sub_agency_namestringAwarding sub-agency or component.
recipient_ueistringRecipient Unique Entity Identifier.
recipient_namestringRecipient legal name as published.
recipient_parent_ueistring | nullParent UEI when the recipient is part of a corporate group.
recipient_state_codestring | nullRecipient state, 2 letters.
naics_codestring | null6-digit NAICS classification.
naics_descriptionstring | nullNAICS name.
transaction_descriptionstring | nullFree-text description of the work for this action.
type_of_set_asidestring | nullSmall business / SDVOSB / 8(a) / HUBZone classification, when applicable.
usaspending_permalinkstringUSAspending UI link for cross-checking the same transaction.

For the wider 57-field expanded projection (funding agency, period of performance, place of performance, competition flags) and the 298-column full projection, pass ?fields=expanded or ?fields=full respectively.

Subaward Enrichment Pro

The detail endpoint /api/v1/contracts/{piid} returns a subaward_rollup sibling block on Pro keys, summarizing the FFATA subaward footprint flowing from this prime contract. The block carries the sub-vendor count, total subcontracted dollars, share of the prime obligation, distinct sub-vendor count, first and last subaward dates, plus the top 5 named sub-vendors with per-sub totals.

Within the FY2025+ coverage window the PIID join into the subaward layer is dense: roughly 88 percent of subaward filings match a prime contract row, and 98 percent of in-scope contracts that have subaward activity see a populated block. The corresponding join from SAM Award Notices into subawards covers under 1 percent of the same population, which is why subaward enrichment lives on this endpoint rather than on the SAM-notice surface.

{ "contract": { /* 26 lean fields, latest transaction */ }, "transaction_rollup": { "transaction_count": 52, "total_obligated": 162360657.45, "max_current_total_value": 392556695.66, "max_potential_total_value": 504348015.85, "latest_current_total_value": 392556695.66, "latest_potential_total_value": 504348015.85, "first_action_date": "2024-10-11", "latest_action_date": "2026-02-27", "distinct_recipient_ueis": 1 }, "subaward_rollup": { "subaward_count": 13, "total_subcontracted": 11189001.99, "prime_award_amount_ffata": 183928533.71, "subcontract_share": 0.0608, "distinct_sub_vendors": 7, "first_subaward_date": "2024-10-03", "last_subaward_date": "2025-04-04", "top_subs": [ /* up to 5 named subs with per-sub totals */ ] }, "_sources": ["usaspending_fpds", "usaspending_ffata"] }

What this response shape means for a BD or due-diligence read. The example above is the live response for Deloitte's $392M Army task order under PIID W56JSR23F0062. The customer-actionable signals are visible in one call: transaction_count: 52 says the prime has cycled 52 mods over 16 months (active, well-managed contract). subcontract_share: 0.0608 says Deloitte keeps 94 percent of the work in-house (high incumbency moat for a recompete). max_potential_total_value exceeds latest_potential_total_value only when an earlier mod set a higher ceiling than the current one, which is a scope-reduction signal worth chasing in a recompete play. The top 5 named subs (omitted in the snippet for length) include the same federal IT shops bidding the same recompete cycle, plus often a research partner. None of this requires joining three datasets client-side. The detail call delivers it.

For the full subaward record set under a PIID, use /api/v1/subawards/search?piid={piid}. For vendor-wide subaward activity across every contract a recipient holds, use the UEI-keyed reverse lookup /api/v1/companies/{uei}/subawards.

Modification Trails

Federal contracts have one PIID and many transactions. The base award is one transaction; every option exercised, value added, partial termination, and administrative cleanup is another. /api/v1/contracts/{piid}/modifications returns the full ASC-ordered trail, oldest action first, so you can reconstruct what happened on a single contract over its life.

This endpoint is not date-windowed. When you ask for one PIID's history, you get the full history we carry, regardless of the coverage window that applies to search.

Walk every action on a contract in chronological order:

curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://govconapi.com/api/v1/contracts/W56JSR23F0062/modifications?limit=500"

Quirks and Edge Cases

Action date is not work date.

action_date is when the transaction was recorded in FPDS, which drives the search window. period_of_performance_start_date and period_of_performance_current_end_date describe when work actually happens. A modification recorded today can extend a contract whose work starts next year.

Obligation amounts can be negative.

Deobligations carry negative federal_action_obligation. To get net obligated dollars on a PIID, sum the field across all transactions (which is what transaction_rollup.total_obligated reports on the detail endpoint).

current_total_value_of_award is a ceiling, not a draw-down.

This is the cumulative authorized value of the contract including exercised options. It moves when the ceiling itself moves, not when work is delivered. To track money actually obligated, sum federal_action_obligation.

PIID is not unique across the executive branch.

Two agencies can independently assign the same PIID under different parent vehicles. Disambiguate with parent_award_id_piid alongside award_id_piid, or use contract_award_unique_key which is globally unique.

DUNS columns are present but largely null post-2022.

When SAM retired DUNS for UEI in April 2022, federal systems stopped collecting new DUNS values. Records that started before then carry both; FY2025+ records carry UEI only.

Source values pass through unchanged.

Occasionally the upstream record carries a corrupt action_date (a year of 9202 or 1921) or an implausible obligation amount. These are agency-level reporting errors. We surface them as recorded rather than silently fixing them, so you stay aligned with the system of record.

Unknown query parameters return 400.

A typo in a filter name returns a 400 with the list of valid parameters rather than silently dropping the filter. Same gate prevents accidental full-table dumps: search requires at least one substantive filter; award_type_code alone is not enough.

Awarding Office and Contracting Officer Contacts

Each transaction carries the full agency hierarchy: awarding_agency_name, awarding_sub_agency_name, awarding_office_name, and the matching code fields. These tell you which office issued the contract and which office holds the re-compete.

Personal contact information (specific contracting officer name and email) is not part of the federal procurement record. For that data, use the contracting officer directory below, which indexes contacts by office and by past award.

Pagination

Search caps at 250 results per request, modification trails cap at 500. The wider modification cap reflects that a typical contract has dozens of mods, not thousands of unrelated rows.

# Page 1
GET /api/v1/contracts/search?naics=541512&agency=defense&limit=250&offset=0
→ { "data": [...], "pagination": { "limit": 250, "offset": 0, "total": 54332, "has_next": true } }

# Page 2
GET /api/v1/contracts/search?naics=541512&agency=defense&limit=250&offset=250
→ { "data": [...], "pagination": { "limit": 250, "offset": 250, "total": 54332, "has_next": true } }

# Stop when has_next is false

Rate limits

Two layers, both enforced:

Hit either and you get a 429 with a Retry-After header. Both X-RateLimit-Limit and X-RateLimit-Remaining are present on every response so you can pace your client.

Common Use Cases

Competitive intelligence by NAICS

Filter by NAICS and date range to see every recipient winning work in your category, what they were obligated, which agencies are awarding it, and at what cadence. Sort by federal_action_obligation descending to find the largest single actions, or by current_total_value_of_award for the largest ceilings.

Recipient due diligence

Pull a recipient's full contract activity by UEI to see total obligations, agency mix, NAICS spread, and set-aside posture before teaming or subcontracting. Use parent_uei for the corporate roll-up across subsidiaries.

Re-compete research

Look up a contract by PIID to see the latest action, the ceiling, the period of performance, and the awarding office. Pull the modification trail to understand what changed over the contract's life and where the option exercises sit.

Subaward and supply-chain analysis

On Pro, the detail endpoint returns a populated subaward_rollup for contracts with FFATA filings. For vendor-wide subaward activity, switch to the UEI-keyed reverse lookup at /companies/{uei}/subawards.

BD pipeline polling

Poll with date_from set to your last sync timestamp to fetch only new actions. Combine with NAICS or agency filters to keep the result set scoped. Recipient UEI and PIID are stable identifiers you can store and re-query against.

Contract Context on the Rest of the API Pro

FPDS prime contract activity stitches into the rest of the GovCon API surface so a single endpoint call can return the full federal picture without round-trips:

All enrichment blocks are silently omitted on Free / Developer keys. _sources on every response composes the underlying source identifiers (sam_entities, usaspending_fpds, usaspending_ffata, ...) so callers know exactly which data layers fed the response.

Linking Contracts to Other Surfaces

Beyond the inline enrichment above, contract records cross-link into the rest of the API through stable identifiers.

How It Compares

GovCon API ContractsFPDS directUSAspending APISAM.gov Direct
Response formatJSONSOAP / XMLJSONJSON
Search by recipient UEIYes (exact, case-insensitive)Yes (UEI / CAGE / DUNS)Partial (via recipient profile)No direct filter
Search by PIIDYes (exact)YesYesIndirect (via opportunity)
NAICS in search responseYesYesNo (null on search; fetch detail)Yes
Modification trailYes (dedicated endpoint, ASC)YesPartialNo
Subaward enrichment on detailYes (Pro, ~88% on FY2025+)NoSeparate datasetNo
CoverageFY2025 + FY2026; expandingBack to FY 2008Back to FY 2008Recent notices only
Setup timeMinutesHours (SOAP setup)Minutes (no key required)2-3 weeks (entity reg)

Data Source and Coverage

Data is sourced from the federal procurement system of record (FPDS) for prime contract types A, B, C, and D, refreshed daily.

Pricing

Contract search is included on every paid plan; the Pro plan adds subaward enrichment on the detail endpoint.

Every parameter is available on every paid plan; the differences across tiers are result count per request, enrichment access, and rate limits. See full pricing.

Related Guides