FedFlow · Open the interactive explorer

FedFlow data

Every number FedFlow draws is served as plain JSON from a public, CORS-enabled endpoint. The data is US government public-domain material; use it however you like.

Base URL

All endpoints below are relative to https://fedflow-data.fedflow.workers.dev.

curl -s https://fedflow-data.fedflow.workers.dev/snap/top/2025.json | jq '.totals'

Endpoints

PathContents
/manifest.jsonWhich fiscal years are available, when the set was last generated, and any build errors.
/snap/top/<fy>.jsonTop-level flow for one fiscal year: revenue sources → agencies, plus government-wide totals.
/snap/agency-<id>/<fy>.jsonOne agency broken into its federal accounts. <id> is the short agency id, e.g. hhs.
/snap/agency-<id>/fa-<code>/<fy>.jsonOne federal account broken into program activities.
/snap/agency-<id>/fa-<code>/pa-<id>/<fy>.jsonOne program activity broken into object classes.
/geo/<anchor>/<fy>.jsonPrime-award obligations by state for an anchor (top or agency-<id>).

Fiscal years currently published: FY2017, FY2018, FY2019, FY2020, FY2021, FY2022, FY2023, FY2024, FY2025.

Units

Every monetary value in every snapshot is US dollars in billions1873.7 means $1.87 trillion. totals.gdp is nominal GDP in trillions and totals.pop is population in millions, which is what the "% of GDP" and "per capita" views divide by.

Obligations vs. outlays

An obligation is a binding commitment to pay — a signed contract, an awarded grant, an entitlement claim accepted — recorded in the year the government promises the money. An outlay is cash actually leaving the Treasury, which often happens in a later year than the obligation that authorized it, so the two figures for the same account rarely match.

Schema

The TypeScript contract every snapshot satisfies:

export type Measure = 'obligations' | 'outlays';
export type NodeKind = 'revenue' | 'agency' | 'federal_account' | 'program_activity' | 'object_class' | 'gap' | 'other';
export interface SnapNode {
  id: string; name: string; color: string; kind: NodeKind;
  parent?: string; drillable: boolean; note?: string;
  /** USAspending identifiers needed to fetch the next level (worker-internal, harmless in JSON) */
  ref?: { toptier?: string; agencyId?: string; faId?: string; paId?: string };
}
export interface SnapLink { source: string; target: string; obligations: number; outlays: number }
export interface Snapshot {
  meta: { fy: number; period: 12; anchor: string[]; generated: string; caveats: string[] };
  nodes: SnapNode[]; links: SnapLink[];
  totals: { receipts: number; obligations: number; outlays: number; gdp: number; pop: number };
}
export interface Manifest { fys: number[]; generatedAt: string; errors: string[] }
export interface GeoSnapshot { fy: number; anchor: string[]; states: { code: string; name: string; obligations: number }[] }

Refresh, caching and CORS

Known gaps

The figures are a best-effort assembly of several public feeds, and each has real gaps worth knowing about before drawing conclusions:

License

US federal government data is not subject to copyright. The assembled snapshots are released under CC0 1.0. Attribution is appreciated but not required; a link back to FedFlow helps people find the caveats above.