The Daily Treasury Statement reports the federal government's cash position every business day—receipts, outlays, and the operating cash balance—and is the most granular real-time fiscal data available from the US government.
What the DTS is
Published every business day at 4 PM Eastern time by the Bureau of the Fiscal Service (BFS), a bureau of the Department of the Treasury, the Daily Treasury Statement (DTS) covers the prior business day's complete cash activity of the federal government. If Tuesday is a business day, Wednesday at 4 PM brings the DTS for Tuesday. On weeks containing a federal holiday, the DTS for the last business day before the holiday is published on the next business day after it.
The report is released in two formats: a single-page PDF that mirrors the traditional printed format and a machine-readable CSV file organized by table. Historical data is available back to 1998 on the Fiscal Service's website at fiscal.treasury.gov/reports-statements/dts/, making it one of the longest-running daily fiscal data series the US government has ever published. The DTS is the federal government's equivalent of a daily bank statement—every dollar flowing in or out of the Treasury General Account on any given business day appears somewhere in its tables.
The Treasury General Account (TGA) is the federal government's primary operating account, held at the Federal Reserve Bank of New York. All federal tax receipts flow into it; all federal payments are drawn from it. When the IRS processes a payroll tax deposit, the funds arrive in the TGA. When Social Security benefit checks go out, the outflows come from the TGA. The DTS provides a daily snapshot of that account's activity, down to the line-item level.
Structure of the DTS
Each daily DTS file contains three main tables, each covering a different dimension of federal cash management.
Table I: Operating Cash Balance. The opening balance (yesterday's closing balance), the net of all deposits and withdrawals for the day, and the closing balance of the Treasury General Account. Table I also reports the 12-month debt-to-the-penny—total outstanding public debt compared to the statutory debt ceiling—giving a daily measure of headroom under the debt limit. The closing balance in Table I is the single most widely watched number in the entire DTS during debt ceiling standoffs.
Table II: Deposits and Withdrawals of Operating Cash. The most detailed table in the DTS. It itemizes every major category of receipts deposited into the TGA and every major category of payments drawn from it, with three columns for each line: today's amount, month-to-date, and fiscal year-to-date. Receipts side includes withheld individual income and FICA taxes, non-withheld individual income taxes (quarterly estimated payments), corporation income taxes, excise taxes, estate and gift taxes, customs duties, and Federal Tax Deposit (FTD) receipts. Withdrawals side includes Treasury drawdowns for intergovernmental transfers, Defense vendor payments, Social Security and Medicare outlays, Veterans benefits, federal employee salaries and benefits, and interest on the public debt.
Table III: Federal Tax Deposits, Income Tax Refunds, and Debt Subject to Limit. Table III provides three separate sub-sections. The Federal Tax Deposits section shows employer FTD activity—the payroll tax and withheld income tax remittances that flow through Federal Reserve banks before sweeping into the TGA. The Income Tax Refunds section shows individual and business refunds disbursed on that day, broken out by paper check and electronic payment. The Debt Subject to Limit section shows current outstanding public debt, the statutory ceiling, and the remaining headroom (or the amount of extraordinary measures in use when the ceiling has been reached and Treasury is borrowing against the suspension of intragovernmental fund investments).
The key data fields researchers typically work with include:
| Field | Table | Description |
|---|---|---|
| open_today_bal | I | TGA opening balance for the day (millions of dollars) |
| close_today_bal | I | TGA closing balance for the day (millions of dollars) |
| deposits_withdrawals_net | I | Net cash flow for the day (positive = net receipt) |
| transaction_type | II | “deposit” or “withdrawal” |
| classification_desc | II | Category name (e.g., “Social Security Benefits (EFT)”) |
| today_amt | II | Amount for the reporting day (millions of dollars) |
| mtd_amt | II | Month-to-date cumulative amount (millions of dollars) |
| fytd_amt | II | Fiscal-year-to-date cumulative amount (millions of dollars) |
Why the DTS matters
The DTS is the only daily fiscal data source for the US government. Nothing else comes close in timeliness or granularity. Monthly data from the Monthly Treasury Statement (MTS) is cleaner and easier to analyze, but it arrives weeks after the period it covers. The DTS delivers the information the same business day it becomes available.
Bond traders, hedge funds, and economists use DTS data continuously. Withheld income and FICA tax deposits in Table II are one of the best real-time indicators of payroll growth available anywhere—more current than any BLS employment release. A sustained decline in daily withheld tax deposits signals deteriorating labor market conditions before any survey-based measure can confirm it.
Tax deposit spikes are clearly visible in the raw DTS data. April 15 brings the largest single-day non-withheld individual income tax receipt of the year as balance-due payments and the final round of estimated tax payments arrive simultaneously. Quarterly estimated tax deadlines on June 15, September 15, and January 15 produce smaller but still pronounced spikes in the individual non-withheld and corporate tax lines. September is consistently the largest corporate receipt month, reflecting the estimated payment deadline that falls in the fiscal fourth quarter of most large corporations.
Social Security and Medicare payment days are equally legible in the data. Social Security benefit payments are disbursed on the second, third, and fourth Wednesdays of each month, staggered by the birth date of the beneficiary. On those three Wednesdays each month, the withdrawal side of Table II shows multi-billion-dollar single-day spikes in the Social Security (EFT) line that do not appear on surrounding days. The same pattern holds for Medicare Advantage and Part D plan payments, which follow a predictable monthly schedule tied to CMS payment cycles.
The DTS is perhaps most consequential during debt ceiling crises. When Congress allows the statutory debt limit to be reinstated after a suspension period, the Treasury Department is prohibited from issuing new net debt until Congress acts again. At that point Treasury must use “extraordinary measures”— accounting actions that temporarily reduce debt subject to the limit by suspending new investment into certain intragovernmental funds, principally the Civil Service Retirement and Disability Fund and the Postal Service Retiree Health Benefits Fund. Those suspensions are visible in Table III as the extraordinary measures headroom shrinks day by day.
The 2011, 2013, 2021, and 2023 debt ceiling standoffs each produced periods where analysts tracking the DTS Table I closing balance and Table III debt subject to limit data had the most current public information available about how close the United States was to exhausting its payment capacity. During the 2023 standoff, the Bipartisan Policy Center and the Congressional Budget Office each published “X-date” estimates—the projected date on which extraordinary measures would be exhausted and Treasury would be unable to meet all obligations. Those estimates were built on DTS closing balance trajectories combined with revenue and spending projections. The DTS closing balance fell below \$50 billion on multiple occasions during that episode, a level that prompted significant market volatility in Treasury bills maturing near the projected X-date.
FiscalData API access
The Bureau of the Fiscal Service provides programmatic access to DTS data through the Treasury FiscalData API at https://api.fiscaldata.treasury.gov/services/api/v1/accounting/dts/. No API key is required. The API returns JSON with consistent field names, typed values, and pagination metadata. Three endpoints correspond to the three main DTS tables:
dts_table_1— Operating Cash Balance (TGA opening balance, net deposits and withdrawals, closing balance)dts_table_2— Deposits and Withdrawals of Operating Cash (itemized receipts and outlays with today, MTD, and FYTD columns)dts_table_3— Federal Tax Deposits, Income Tax Refunds, and Debt Subject to Limit
Query parameters follow a consistent pattern across all three endpoints. Use?fields= to select specific columns and avoid downloading unnecessary data. Use &filters= with colon-delimited syntax for server-side filtering: record_date:gte:2025-01-01 restricts to dates on or after January 1, 2025, and account_type:eq:Treasury General Accountrestricts Table I records to the TGA row (excluding the Federal Reserve account and Tax and Loan Note account rows). Pagination usespage[size] and page[number] parameters; the maximum page size is 10,000 rows. Historical bulk downloads covering the full 1998–present archive are available at fiscal.treasury.gov for researchers who need complete longitudinal datasets without paginating through the API.
Rate limits on the FiscalData API are generous for research-scale use. The API is designed for public consumption and does not require registration. Response times are fast for targeted date-range queries; full-history pulls benefit from the bulk download files rather than paginating through thousands of API pages.
Python example: 30-day TGA balance trend and top daily outlays
The following script queries the FiscalData API for the last 30 business days of DTS Table I (operating cash balance) and prints a tabular trend of the closing TGA balance alongside net daily cash flow. It then queries Table II for the most recent available day and prints the top-15 individual withdrawal line items by today's outlay, excluding summary total rows. No API key is required.
import requests
import pandas as pd
from datetime import date, timedelta
# -----------------------------------------------------------------------
# Treasury FiscalData API: DTS Table I (operating cash balance) +
# DTS Table II (top outlays) for the last 30 business days.
# No API key required.
# Docs: https://fiscaldata.treasury.gov/api-documentation/
# -----------------------------------------------------------------------
BASE = "https://api.fiscaldata.treasury.gov/services/api/v1/accounting/dts"
def fetch_dts_table1(days_back: int = 45) -> pd.DataFrame:
"""
Fetch DTS Table I (Operating Cash Balance) for the last ~30 business days.
We request 45 calendar days to ensure we capture at least 30 business days.
"""
start = (date.today() - timedelta(days=days_back)).strftime("%Y-%m-%d")
params = {
"fields": "record_date,account_type,open_today_bal,deposits_withdrawals_net,close_today_bal",
"filters": f"record_date:gte:{start},account_type:eq:Treasury General Account",
"sort": "record_date",
"page[size]": "100",
"page[number]": "1",
}
r = requests.get(f"{BASE}/dts_table_1/", params=params, timeout=60)
r.raise_for_status()
data = r.json().get("data", [])
df = pd.DataFrame(data)
for col in ["open_today_bal", "deposits_withdrawals_net", "close_today_bal"]:
df[col] = pd.to_numeric(df[col], errors="coerce")
df["record_date"] = pd.to_datetime(df["record_date"])
return df.sort_values("record_date").reset_index(drop=True)
def fetch_dts_table2_latest(days_back: int = 5) -> pd.DataFrame:
"""
Fetch DTS Table II (Deposits and Withdrawals of Operating Cash) for the
most recent few days. Returns the withdrawal line items sorted by
today's outlay descending so the largest outflow categories appear first.
"""
start = (date.today() - timedelta(days=days_back)).strftime("%Y-%m-%d")
params = {
"fields": (
"record_date,transaction_type,classification_desc,"
"today_amt,mtd_amt,fytd_amt"
),
"filters": f"record_date:gte:{start},transaction_type:eq:withdrawal",
"sort": "-record_date,-today_amt",
"page[size]": "200",
"page[number]": "1",
}
r = requests.get(f"{BASE}/dts_table_2/", params=params, timeout=60)
r.raise_for_status()
data = r.json().get("data", [])
df = pd.DataFrame(data)
for col in ["today_amt", "mtd_amt", "fytd_amt"]:
df[col] = pd.to_numeric(df[col], errors="coerce")
df["record_date"] = pd.to_datetime(df["record_date"])
return df.sort_values(["record_date", "today_amt"], ascending=[False, False]).reset_index(drop=True)
def print_cash_balance_trend(df: pd.DataFrame) -> None:
"""Print the closing TGA balance for each day in a tabular format."""
print("Date Open ($M) Net ($M) Close ($M) Change")
print("-" * 68)
prev_close = None
for _, row in df.iterrows():
label = row["record_date"].strftime("%Y-%m-%d")
open_b = row["open_today_bal"]
net = row["deposits_withdrawals_net"]
close = row["close_today_bal"]
if prev_close is not None and pd.notna(close) and pd.notna(prev_close):
chg = close - prev_close
arrow = "+" if chg >= 0 else ""
chg_str = arrow + f"{chg:,.0f}"
else:
chg_str = "n/a"
open_str = f"{open_b:>12,.0f}" if pd.notna(open_b) else " n/a"
net_str = f"{net:>12,.0f}" if pd.notna(net) else " n/a"
close_str = f"{close:>12,.0f}" if pd.notna(close) else " n/a"
print(f"{label} {open_str} {net_str} {close_str} {chg_str}")
prev_close = close if pd.notna(close) else prev_close
print()
def print_top_outlays(df: pd.DataFrame, top_n: int = 15) -> None:
"""Print the top outlay line items for the most recent DTS date."""
if df.empty:
print("No Table II withdrawal data found.")
return
latest_date = df["record_date"].max()
daily = df[df["record_date"] == latest_date].copy()
# Exclude the 'total' rows to show only individual line items
daily = daily[~daily["classification_desc"].str.lower().str.contains("total", na=False)]
daily = daily.sort_values("today_amt", ascending=False).head(top_n)
date_str = latest_date.strftime("%Y-%m-%d")
print(f"Top {top_n} DTS withdrawal line items for {date_str}:")
print(f" {\'Category\':<55} {\'Today ($M)\':<12} MTD ($M) FYTD ($M)")
print(" " + "-" * 90)
for _, row in daily.iterrows():
desc = str(row["classification_desc"])[:54]
today = row["today_amt"]
mtd = row["mtd_amt"]
fytd = row["fytd_amt"]
today_s = f"{today:>10,.0f}" if pd.notna(today) else " n/a"
mtd_s = f"{mtd:>10,.0f}" if pd.notna(mtd) else " n/a"
fytd_s = f"{fytd:>10,.0f}" if pd.notna(fytd) else " n/a"
print(f" {desc:<55} {today_s} {mtd_s} {fytd_s}")
print()
def main() -> None:
print("=== Treasury Daily Treasury Statement (DTS) Analysis ===\n")
print("Fetching DTS Table I (Operating Cash Balance, last 45 calendar days)...")
tbl1 = fetch_dts_table1(days_back=45)
# Trim to the most recent 30 rows to approximate 30 business days
tbl1 = tbl1.tail(30)
print(f"Retrieved {len(tbl1)} daily records.\n")
print_cash_balance_trend(tbl1)
print("Fetching DTS Table II (Withdrawals, last 5 calendar days)...")
tbl2 = fetch_dts_table2_latest(days_back=5)
print(f"Retrieved {len(tbl2)} withdrawal rows.\n")
print_top_outlays(tbl2, top_n=15)
if not tbl1.empty:
close_vals = tbl1["close_today_bal"].dropna()
if len(close_vals) > 1:
high = close_vals.max()
low = close_vals.min()
last = close_vals.iloc[-1]
print(f"30-day TGA summary:")
print(f" Current balance : ${last:>12,.0f}M (${last/1000:.1f}B)")
print(f" Period high : ${high:>12,.0f}M (${high/1000:.1f}B)")
print(f" Period low : ${low:>12,.0f}M (${low/1000:.1f}B)")
if __name__ == "__main__":
main()
Reading the output tells a daily story of federal cash management. On a normal mid-week business day the TGA balance moves modestly—a few billion dollars in either direction. On Social Security payment Wednesdays the withdrawal total swells by \$20 to \$30 billion as Electronic Funds Transfer (EFT) payments go out to tens of millions of beneficiaries. On April 15, the closing balance jumps by \$100 billion or more as quarterly estimated payments and annual balance-due payments arrive simultaneously. On days when Treasury settles a large auction of new notes or bonds, the opening balance can jump by \$50 to \$100 billion from the prior day as auction proceeds flow in before the corresponding maturing debt is redeemed.
Interpreting the data in context
The DTS operates on a cash basis. It records dollars actually deposited or disbursed on a given business day, not accrued liabilities or budgetary obligations. A contract obligated by a federal agency does not appear in the DTS until a payment is actually made against that contract. An income tax liability owed to the IRS does not appear in the DTS until the taxpayer actually remits payment. This means the DTS is a real-time record of cash movements but not of the government's full economic position.
The fiscal year runs October 1 through September 30. October typically opens with a large outflow deficit because no quarterly estimated tax payments are due and the Social Security COLA adjustment has not yet taken effect. January brings a permanent ratchet in outflows as the annual COLA increase lifts the monthly Social Security benefit amount for tens of millions of beneficiaries—a step-change in the withdrawal baseline that is permanently visible in the DTS year over year. March through May is the only sustained period of the year when the federal government commonly runs a monthly cash surplus, driven by April tax season receipts. The cumulative fiscal year deficit builds rapidly in the first quarter, stabilizes or narrows through spring, then widens again through summer.
Interest on the public debt has become one of the most analytically significant line items in Table II. Treasury pays coupon interest on notes and bonds on the 15th of February, May, August, and November for instruments with those coupon payment dates, with similar patterns for other issuance dates. As the weighted average interest rate on the public debt has risen with each new auction at post-2022 market rates, the interest line in Table II has grown substantially even without any increase in the primary deficit. Net interest outlays rose from approximately \$352 billion in FY2021 to approximately \$659 billion in FY2023 and approximately \$882 billion in FY2024. Tracking daily interest outflow spikes in the DTS across fiscal years provides a precise measure of debt service escalation that smoothed annual statistics tend to obscure.
Customs duties in the receipts section of Table II have taken on increased analytical significance since 2018 as tariff rates on imports from China and other trading partners have risen substantially. Daily customs duty receipts are directly readable in the DTS and provide a higher-frequency signal of tariff revenue than any other public data source. A tariff rate change that takes effect on a specific date is visible within days in the customs line of Table II as importers accelerate or defer shipments in response.
For the broadest picture of federal finances, the DTS is best read alongside the Monthly Treasury Statement (MTS), which provides cleaner monthly aggregates and the official deficit figures cited in budget analyses, and the Financial Report of the United States Government, which presents GAAP-basis accrual accounting including the unfunded actuarial liabilities of Social Security and Medicare that the cash-basis DTS systematically excludes. The DTS is the real-time instrument; the MTS and Financial Report are the reference documents for longer-run fiscal analysis.
Related: SEC EDGAR financial filings · USASpending federal contracts
Part of the Federal Regulatory Data Hub.