Skip to content

Budget

Beta — surface may change

The /api/budget/... endpoints and the /api/entities/{uei}/budget-flows/ action are beta. Data is real and refreshed on the normal cadence, but field names, shape leaves, default fields, filter names, and URL paths may still change based on early-consumer feedback. Pin a specific request shape (?shape=...) in production code, and watch the changelog for the move-to-stable announcement.

Federal-account budget data — what Congress requested, what it enacted, what got apportioned, what's been obligated, and what's been outlayed — joined to FPDS contract activity. Each row is one (federal account × fiscal year).

For task-oriented walkthroughs, see Explore federal budget data. For field definitions, see the Budget Data Dictionary.

Endpoints

  • GET /api/budget/accounts/ — list + filter + search.
  • GET /api/budget/accounts/{pk}/ — detail.
  • GET /api/budget/accounts/{pk}/recipients/ — funding-office × recipient drill-down with hydrated contracts.
  • GET /api/budget/accounts/{pk}/quarters/ — TAS-grain SF-133 quarterly flow (FY21+).

Related budget surfaces on other resources:

  • GET /api/entities/{uei}/budget-flows/ — federal accounts that paid a given vendor (the inverse of /recipients/). Documented below.
  • GET /api/organizations/{key}/?shape=...,budget_appropriation(*),budget_spending(*) — org-level rollups. See Organizations.

Filtering

Param What it does
search Free-text search across account_title, agency_name, bureau_name.
federal_account_symbol Exact match (also __in for multi). E.g. 075-0512.
fiscal_year Exact match, also __in, __gte, __lte.
agency_code CGAC 3-character code. __in for multi-agency queries.
bureau_name Exact, __in, or __icontains for fuzzy matching.
account_title __icontains for fuzzy matching on account title.
bea_category BEA budget enforcement category (Defense, Nondefense, Mandatory, ...).
on_off_budget ON or OFF budget.
subfunction_code OMB budget subfunction code (e.g. 051, 551).

Every dollar and ratio field also supports __gte / __lte range filters. The full list of range-filterable fields:

  • Dollars: requested_ba, enacted_ba, apportioned, obligated_total, outlayed_total, unobligated_balance, contract_obligated, contract_outlayed, assistance_obligated, assistance_outlayed
  • Ratios (capped + raw): contract_share_of_obligated_capped, obligated_to_apportioned_pct(_capped), apportioned_to_enacted_pct(_capped), obligated_to_enacted_pct(_capped), outlayed_to_obligated_pct(_capped), unobligated_pct
  • Trends: enacted_ba_yoy_pct, obligated_yoy_pct, enacted_ba_5yr_cagr, ba_growth_next_year_pct
  • Request-vs-actual: actual_vs_requested_contract(_capped)

See Budget Data Dictionary for what each field means and the exploration guide for filter recipes.

Ordering

Pass ?ordering=<field> (prefix with - for descending). Allowed sort fields:

fiscal_year, agency_code, federal_account_symbol, enacted_ba, obligated_total, outlayed_total, contract_obligated, contract_share_of_obligated_capped, obligated_to_apportioned_pct_capped, obligated_to_enacted_pct_capped, ba_growth_next_year_pct, actual_vs_requested_contract_capped, enacted_ba_yoy_pct, enacted_ba_5yr_cagr, modified.

Default sort is -fiscal_year, -enacted_ba — the un-filtered list lands on the largest accounts of the most recent fiscal year.

Pagination

Standard page-number pagination: count / next / previous / results.

  • page (default 1)
  • limit (default 25, max 100)

Response shaping

This endpoint supports response shaping via ?shape=.

Default shape (no ?shape= param): identity fields + lifecycle dollars + the capped ratios that show up in the most common workflows + contract_obligated, contract_share_of_obligated_capped, assistance_obligated, ba_growth_next_year_pct.

On-demand expansions:

Expand Returns Notes
appendix(*) President's Budget Appendix object-class breakdown (16 OMB request buckets — personnel comp, travel, contractual services, grants, etc. — plus granule ID and PDF URL). null for accounts with no Appendix data (typically large mandatory programs). Coverage: FY08–FY27.
narratives(*) List of Appendix narrative + appropriations text entries for this (FA, FY). null when no narratives exist. ~5% of accounts have multiple narratives per year (split by subaccount). Text fields can be several KB each — only loaded when explicitly requested.
# Default shape
/api/budget/accounts/

# Pull everything
/api/budget/accounts/{pk}/?shape=*

# Detail + Appendix breakdown
/api/budget/accounts/{pk}/?shape=*,appendix(*)

# Detail + Appendix breakdown + narrative text
/api/budget/accounts/{pk}/?shape=*,appendix(*),narratives(*)

# Trends cluster
/api/budget/accounts/?shape=federal_account_symbol,account_title,enacted_ba,enacted_ba_yoy_pct,enacted_ba_5yr_cagr,contract_obligated_5yr_cagr

Recipients drill-down

GET /api/budget/accounts/{pk}/recipients/
GET /api/budget/accounts/{pk}/recipients/?funding_organization_id={org_uuid}

One row per (funding office × recipient × this account-year) on the contract side, sorted by contract_obligated desc. Each row carries:

Field Meaning
funding_organization_id Organization UUID — resolvable via /api/organizations/{key}/.
funding_office Hydrated payload with full Department / Agency / Office hierarchy for the funding org.
recipient_id UEI — resolvable via /api/entities/{uei}/.
recipient Hydrated payload with uei, legal_business_name, dba_name.
contract_obligated, contract_outlayed Dollar flows.
n_contracts Distinct PIID count under this (FA, funding office, recipient).
contracts[] Minimal Contract shape per PIID — key, piid, naics, psc, obligated, award_date. Use key to follow back to the full Contract record.

The raw PIID array isn't surfaced — each contracts[] row carries its own piid, so the analytics-only consumer can reconstruct the list without bandwidth duplication.

Query params:

  • funding_organization_id — Narrow to a single funding office (Organization UUID).
  • limit — Page size (default 25, max 100).

Top-level response envelope includes federal_account_symbol and fiscal_year for context.

Quarterly cash flow

GET /api/budget/accounts/{pk}/quarters/
GET /api/budget/accounts/{pk}/quarters/?tas=075-2024-2024-0512

One row per (Treasury Account Symbol × quarter × period type) for this account-year. A federal account typically rolls up several TAS (different appropriation-year vintages), so the response is a list rather than a single record.

Field Meaning
tas Full Treasury Account Symbol including appropriation year.
quarter 1 through 4.
period quarterly or cumulative — both shapes are returned per quarter.
obligated_quarterly, outlayed_quarterly Flow during the quarter.
obligated_cumulative, outlayed_cumulative Running total through end of the quarter.
quarterly_source Provenance flag — which SF-133 snapshot the row came from.

Coverage: FY21+. Earlier years return an empty page; use the account detail's lifecycle fields (obligated_total, outlayed_total) for FY17–FY20.

Query params:

  • tas — Narrow to a single TAS.
  • limit — Page size (default 25, max 100).

Entity budget-flows

GET /api/entities/{uei}/budget-flows/
GET /api/entities/{uei}/budget-flows/?fiscal_year=2024

The inverse of /recipients/ — given a UEI, list the federal accounts that paid this vendor. One row per (account × funding office × this UEI) flow, sorted by contract_obligated desc. Each row carries surrounding account context (account title, agency, bureau, BEA category, total enacted BA, contract share of obligated) plus the hydrated funding_office and contracts[] payloads (same shape as the recipients drill-down).

Contract-side only — grants and other assistance flows are not in this index.

Query params:

  • fiscal_year — Restrict to one FY (omit for all years).
  • limit — Page size (default 25, max 100).

This endpoint requires authentication.

Coverage windows

Surface Years covered
/api/budget/accounts/ lifecycle FY17–FY26
appendix(*) shape leaf FY08–FY27
narratives(*) shape leaf FY08–FY27
/quarters/ FY21+
/recipients/, /budget-flows/ FY17–FY26

Out-of-range requests return empty lists or null-valued leaves — no error.

Capped vs raw ratios

Most ratio fields ship in three variants: *_pct, *_pct_capped, and *_pct_capped_flag. The capped variant bounds extreme values (typically at 5.0) so the field sorts and charts cleanly; the flag tells you whether the cap was applied for that row. Use raw when you need exact math, capped when filtering/sorting/visualizing.

SDK examples

The Python and Node SDKs don't yet expose first-class budget methods (beta). Use raw HTTP — see the exploration guide for curl + Python requests recipes.