Public data · active

FRED API

Official programmatic access to FRED economic series, observations, releases, sources, and metadata.

What it covers

Official programmatic access to FRED economic series, observations, releases, sources, and metadata. The profile stays deliberately concise: use the linked official reference for endpoint schemas and current commercial terms.

Integration notes

Authenticate exactly as the provider documents, keep credentials out of client bundles, and retain upstream request identifiers when available. Pagination, retries, caching, and webhook verification should be implemented per product rather than inferred from another API.

Key endpoints

Endpoint Description
GET /fred/series/observations Series observations (data points)
GET /fred/series Series metadata
GET /fred/series/search Search series
GET /fred/series/categories Series categories
GET /fred/category Category details
GET /fred/category/children Child categories
GET /fred/releases Economic releases
GET /fred/release/dates Release dates

Decision notes

Best suited to u.s. macroeconomic time series and economic metadata and release calendars. Before production, verify observation revisions are normal. preserve units, frequency and seasonal adjustment metadata. Mutable limits, prices, and versions were checked on 2026-09-13 and should be rechecked at purchase or deployment time.

Python example: fetching an economic series

import httpx
from decimal import Decimal
from datetime import date

API_KEY = "your_fred_api_key"
BASE = "https://api.stlouisfed.org/fred"

def get_observations(series_id: str, start: str, end: str | None = None) -> list[dict]:
    """Fetch observations for a FRED series. Values come back as strings."""
    params = {
        "series_id": series_id,
        "api_key": API_KEY,
        "file_type": "json",
        "observation_start": start,
    }
    if end:
        params["observation_end"] = end
    resp = httpx.get(f"{BASE}/series/observations", params=params, timeout=30)
    resp.raise_for_status()
    rows = []
    for obs in resp.json().get("observations", []):
        if obs["value"] == ".":  # FRED uses "." for missing values
            continue
        rows.append({"date": date.fromisoformat(obs["date"]), "value": Decimal(obs["value"])})
    return rows

# 10-year Treasury yield, 2024
for obs in get_observations("DGS10", "2024-01-01", "2024-12-31")[:3]:
    print(obs["date"], obs["value"])

Notes:

  • API key goes in the api_key query parameter; file_type=json avoids XML
  • Missing values are the string "." — filter before converting to Decimal
  • Popular series: DGS10 (10Y Treasury), FEDFUNDS, CPIAUCSL, UNRATE, GDP
  • Rate limit is generous (120 req/min); no auth needed for the website, key required for API

Integration surface

Versioning
FRED API v1 paths; FRED API v2 is separately documented
Resource groups
Series, Observations, Categories, Releases, Sources, Tags
Pagination
limit, offset, sort_order and endpoint-specific filters
Errors
Structured XML or JSON error responses
Webhooks
No webhooks documented
Official SDKs
None confirmed in the reviewed official sources.