About alterlab-usfiscaldata
A skill for querying the U.S. Treasury Fiscal Data REST API, intended for users analyzing federal financial data. It covers debt, Treasury statements, rates, auctions, and savings bonds, with examples for filtering, pagination, and loading results.
Key features
- 01Debt and Treasury statement data
- 02Interest and exchange rates
- 03Auction and savings bond data
- 04Field selection and filtering
- 05Sorting and paginated retrieval
Use cases
- 01Tracking changes in federal debt
- 02Reviewing Treasury cash flows
- 03Analyzing auction results and rates
- 04Loading fiscal data into a DataFrame
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-usfiscaldataAfter installing, type/alterlab-usfiscaldatain Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
evals/evals.jsonreferences/api-basics.mddatasets-debt.mddatasets-fiscal.mddatasets-interest-rates.mddatasets-securities.mdexamples.mdparameters.mdresponse-format.mdDetails
From the project READMEU.S. Treasury Fiscal Data API
Free, open REST API from the U.S. Department of the Treasury for federal financial data. No API key or registration required.
Base URL: https://api.fiscaldata.treasury.gov/services/api/fiscal_service
The catalog held 56 datasets / 183 data tables when checked on 2026-09-23; browse https://fiscaldata.treasury.gov/datasets/ for the current list and each table's endpoint version (v1 or v2).
When to Use This Skill
- Federal debt (Debt to the Penny, historical debt outstanding, schedules of federal debt)
- Daily and Monthly Treasury Statements: operating cash balance, deposits/withdrawals, receipts, outlays, deficit
- Treasury securities auctions (results and upcoming), average interest rates, interest expense
- Treasury Reporting Rates of Exchange, savings bonds, I bond rates
Does NOT Trigger
| Scenario | Use Instead |
|---|---|
| Market yields (DGS10), Fed funds, or macro series by FRED ID with transformations | alterlab-fred |
| Market quotes or daily FX/crypto prices from a commercial feed | alterlab-alpha-vantage |
| Hedge-fund leverage or repo-market aggregates (Form PF, FICC) | alterlab-hedgefund-monitor |
| Company filings and financial statements from SEC EDGAR | alterlab-edgartools |
Quick Start
import requests
import pandas as pd
BASE_URL = "https://api.fiscaldata.treasury.gov/services/api/fiscal_service"
# Get the current national debt (Debt to the Penny)
resp = requests.get(f"{BASE_URL}/v2/accounting/od/debt_to_penny", params={
"sort": "-record_date",
"page[size]": 1
})
data = resp.json()["data"][0]
print(f"Total public debt as of {data['record_date']}: ${float(data['tot_pub_debt_out_amt']):,.0f}")
# Get Treasury exchange rates for recent quarters
resp = requests.get(f"{BASE_URL}/v1/accounting/od/rates_of_exchange", params={
"fields": "country_currency_desc,exchange_rate,record_date",
"filter": "record_date:gte:2024-01-01",
"sort": "-record_date",
"page[size]": 100
})
df = pd.DataFrame(resp.json()["data"])
Authentication
None required. The API is fully open and free.
Core Parameters
| Parameter | Example | Description |
|---|---|---|
fields= | fields=record_date,tot_pub_debt_out_amt | Select specific columns |
filter= | filter=record_date:gte:2024-01-01 | Filter records |
sort= | sort=-record_date | Sort (prefix - for descending) |
format= | format=json | Output format: json, csv, xml |
page[size]= | page[size]=100 | Records per page (default 100, max 10000) |
page[number]= | page[number]=2 | Page index (starts at 1) |
Filter operators: lt, lte, gt, gte, eq, in
# Multiple filters separated by comma
"filter=country_currency_desc:in:(Canada-Dollar,Mexico-Peso),record_date:gte:2024-01-01"
Key Datasets & Endpoints
Debt
| Dataset | Endpoint | Frequency |
|---|---|---|
| Debt to the Penny | /v2/accounting/od/debt_to_penny | Daily |
| Historical Debt Outstanding | /v2/accounting/od/debt_outstanding | Annual |
| Schedules of Federal Debt | /v1/accounting/od/schedules_fed_debt | Monthly |
Daily & Monthly Statements
| Dataset | Endpoint | Frequency |
|---|---|---|
| DTS Operating Cash Balance | /v1/accounting/dts/operating_cash_balance | Daily |
| DTS Deposits & Withdrawals | /v1/accounting/dts/deposits_withdrawals_operating_cash | Daily |
| Monthly Treasury Statement (MTS) | /v1/accounting/mts/mts_table_1 (16 tables) | Monthly |
Interest Rates & Exchange
| Dataset | Endpoint | Frequency |
|---|---|---|
| Average Interest Rates on Treasury Securities | /v2/accounting/od/avg_interest_rates | Monthly |
| Treasury Reporting Rates of Exchange | /v1/accounting/od/rates_of_exchange | Quarterly |
| Interest Expense on Public Debt | /v2/accounting/od/interest_expense | Monthly |
Securities & Auctions
| Dataset | Endpoint | Frequency |
|---|---|---|
| Treasury Securities Auctions Data | /v1/accounting/od/auctions_query | As Needed |
| Treasury Securities Upcoming Auctions | /v1/accounting/od/upcoming_auctions | As Needed |
| Average Interest Rates | /v2/accounting/od/avg_interest_rates | Monthly |
Savings Bonds
| Dataset | Endpoint | Frequency |
|---|---|---|
| I Bonds Interest Rates | /v1/accounting/od/i_bonds_interest_rates | Semi-Annual |
| U.S. Treasury Savings Bonds: Issues, Redemptions & Maturities | /v1/accounting/od/savings_bonds_report | Monthly |
Response Structure
{
"data": [...],
"meta": {
"count": 100,
"total-count": 3790,
"total-pages": 38,
"labels": {"field_name": "Human Readable Label"},
"dataTypes": {"field_name": "STRING|NUMBER|DATE|CURRENCY"},
"dataFormats": {"field_name": "String|10.2|YYYY-MM-DD"}
},
"links": {"self": "...", "first": "...", "prev": null, "next": "...", "last": "..."}
}
Note: All values are returned as strings. Convert as needed (e.g., float(), pd.to_datetime()). Null values appear as the string "null".
Common Patterns
Load all pages into a DataFrame
def fetch_all_pages(endpoint, params=None):
params = dict(params or {})
params["page[size]"] = 10000 # the API maximum; larger values return HTTP 400
params["page[number]"] = 1
rows = []
while True:
resp = requests.get(f"{BASE_URL}{endpoint}", params=params, timeout=60)
resp.raise_for_status()
result = resp.json()
rows.extend(result["data"])
if params["page[number]"] >= result["meta"]["total-pages"]:
break
params["page[number]"] += 1
return pd.DataFrame(rows)
Aggregation (automatic sum)
Omitting grouping fields triggers automatic aggregation:
# Sum all deposits/withdrawals by record_date and transaction type
resp = requests.get(f"{BASE_URL}/v1/accounting/dts/deposits_withdrawals_operating_cash", params={
"fields": "record_date,transaction_type,transaction_today_amt"
})
Reference Files
- api-basics.md — URL structure, HTTP methods, versioning, data types
- parameters.md — All parameters with detailed examples and edge cases
- datasets-debt.md — Debt datasets: Debt to the Penny, Historical Debt, Schedules of Federal Debt, TROR
- datasets-fiscal.md — Daily Treasury Statement, Monthly Treasury Statement, revenue, spending
- datasets-interest-rates.md — Average interest rates, exchange rates, TIPS/CPI, certified interest rates
- datasets-securities.md — Treasury auctions, savings bonds, SLGS, buybacks
- response-format.md — Response objects, error handling, pagination, response codes
- examples.md — Python, R, and pandas code examples for common use cases
Cite the dataset name, table, and retrieval date (Fiscal Data values are revised; keep the record_date you used).
Part of the AlterLab Academic Skills suite.