Skip to content

Federal spending rollups

See where federal contract dollars actually go, rolled up three ways: by the agency that spends them, by the product or service bought (PSC), or by the small-business set-aside program the work flows through. Each rollup covers the trailing 12 months of prime contract obligations and is ranked by dollars, so the biggest buyers, markets, and set-aside lanes are at the top. Free with any key.

How to read these rollups (read this first)

  • Pick a cut with the path. by-agency, by-psc, or by-set-aside. Each returns one ranked list; the key is the agency name, PSC code, or set-aside code, and label is its readable name.
  • obligated is a net figure. It is the sum of obligations minus de-obligations over the window, the same way the federal government reports spend. A category whose de-obligations outweigh new obligations in the window can be negative; those sort to the bottom.
  • by-set-aside is a floor, not a share. It reports the dollars explicitly coded to each set-aside program. Most federal dollars carry no set-aside code (much of that is order-level activity under a parent vehicle), so this cut shows the identified small-business set-aside spend, not "the percentage of the market that is or isn't set aside."
  • For spending by industry (NAICS), use the single NAICS market profile (/api/v1/naics/{code}), which is the richer per-industry view. by-naics is deliberately not a cut here, so a request for it returns 400.
  • The window block echoes the coverage (trailing 12 months) and data_as_of.

Quick start

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/spending/by-agency?limit=3"

Parameters

  • cut (path): one of by-agency, by-psc, by-set-aside. Any other value returns 400 naming the valid set.
  • limit: Results per page. Default 100; maximum 100 on the free trial and 1,000 on paid plans. Over the maximum returns 402.
  • offset: pagination offset (0-based).

No other query parameters are accepted.

Response

{
  "data": [
    { "key": "Department of Defense",         "label": "Department of Defense",         "obligated": 354252849993.53, "action_count": 2848750, "recipient_count": 36637 },
    { "key": "Department of Veterans Affairs","label": "Department of Veterans Affairs","obligated": 83133431851.88,  "action_count": 97698,   "recipient_count": 10513 },
    { "key": "Department of Homeland Security","label": "Department of Homeland Security","obligated": 72243117100.58,"action_count": 50021,   "recipient_count": 7841 }
  ],
  "pagination": { "limit": 3, "offset": 0, "total": 69, "total_is_estimate": false, "has_next": true },
  "filters_applied": { "cut": "by-agency" },
  "window": { "trailing_months": 12, "data_as_of": "2026-08-08" },
  "_sources": ["usaspending_fpds"]
}
  • key / label: the dimension value and its readable name (for by-agency, both are the department; for by-psc, label is the PSC name; for by-set-aside, label is the program name).
  • obligated: net obligated dollars over the trailing 12 months (see the primer above).
  • action_count: contract actions carrying the key over the window.
  • recipient_count: distinct awardees.
  • pagination.total: exact (each rollup is small). has_next is driven by page fullness.
  • window: the coverage window and as-of date.

The three cuts

by-set-aside , identified small-business set-aside spend:

{
  "data": [
    { "key": "SBA",     "label": "Small Business Set-Aside (Total)",                        "obligated": 27273198126.01, "action_count": 175352, "recipient_count": 26361 },
    { "key": "SDVOSBC", "label": "Service-Disabled Veteran-Owned Small Business Set-Aside", "obligated": 9277774028.54,  "action_count": 23319,  "recipient_count": 2512 },
    { "key": "8AN",     "label": "8(a) Competitive",                                        "obligated": 7482072348.14,  "action_count": 18547,  "recipient_count": 2972 }
  ],
  "pagination": { "limit": 3, "offset": 0, "total": 19, "total_is_estimate": false, "has_next": true },
  "filters_applied": { "cut": "by-set-aside" },
  "window": { "trailing_months": 12, "data_as_of": "2026-08-08" },
  "_sources": ["usaspending_fpds"]
}

by-psc , spend by product or service, labeled from the PSC catalog:

{
  "data": [
    { "key": "Q201", "label": "MEDICAL- MANAGED HEALTHCARE",                    "obligated": 37987187431.44, "action_count": 9386, "recipient_count": 492 },
    { "key": "1510", "label": "AIRCRAFT, FIXED WING",                           "obligated": 33814865212.96, "action_count": 1356, "recipient_count": 87 },
    { "key": "Y1PZ", "label": "CONSTRUCTION OF OTHER NON-BUILDING FACILITIES",  "obligated": 28187460354.56, "action_count": 1545, "recipient_count": 515 }
  ],
  "pagination": { "limit": 3, "offset": 0, "total": 2313, "total_is_estimate": false, "has_next": true },
  "filters_applied": { "cut": "by-psc" },
  "window": { "trailing_months": 12, "data_as_of": "2026-08-08" },
  "_sources": ["usaspending_fpds"]
}

Errors

  • 400: cut is not one of by-agency/by-psc/by-set-aside (the body names the valid set; by-naics returns this, pointing you to the NAICS market profile), or an unknown query parameter.
  • 422: limit below 1, negative offset, or a non-integer value. A limit above your plan maximum returns 402.
  • 401: missing API key. 429: rate limit exceeded.

Examples

Top small-business set-aside programs:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/spending/by-set-aside"

Biggest product/service markets, page 2:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://govconapi.com/api/v1/spending/by-psc?limit=25&offset=25"

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.