I built a free, CC-BY-licensed financial data API
Most personal-finance APIs are paid, rate-limited behind a credit card, or wrap a single primary source you could hit yourself. I got tired of paying $49/mo for thin wrappers over FRED and BLS, so I built one I wished existed.
It's free. CC BY 4.0. No auth. K-anonymized. Daily refresh at 05:00 UTC. OpenAPI 3.1 spec published.
Live spec: https://calcfi.app/api/insights/openapi.json
Docs: https://calcfi.app/developers
What's in it
Four endpoint families. All read-only. All cite primary sources.
1. Insights — aggregate calculator-run stats
People run financial calculators on calcfi.app. The aggregates (median tax refund by income bracket, score distributions for affordability, etc.) are exposed as a feed. Every row is k-anonymity safe — buckets with fewer than 10 runs are dropped.
curl https://calcfi.app/api/insights/tax-refund
Use cases: blog charts, journalist research, ML training signals, "what's normal?" benchmarks.
2. Macro data — FRED, BLS, IRS, Treasury, Freddie Mac passthrough
JSON + CSV history for every series CalcFi tracks. No API key juggling, no per-provider auth.
# Freddie Mac Primary Mortgage Market Survey, latest values
curl https://calcfi.app/api/data/freddie-pmms
# Full history as CSV
curl https://calcfi.app/api/data/freddie-pmms/history.csv
Currently exposes 30+ series: 30Y mortgage rates, CPI, unemployment, Treasury yields, IRS bracket thresholds, etc. Updated daily.
3. State maps — salary, tax, mortgage, rent, cost-of-living, affordability
Per-state values for every map on the site. CSV for bulk consumers, JSON for one-off lookups, PNG for blog embeds.
# All states, salary medians
curl https://calcfi.app/api/maps/salary/csv
# One state
curl https://calcfi.app/api/maps/salary/TX
# Chart image (1200×630, embed-ready)
https://calcfi.app/api/maps/salary/chart.png
# Choropleth
https://calcfi.app/api/maps/salary/map.png
The PNGs are intentional — they make it possible to drop a live, daily-refreshed chart into a blog post with a single <img> tag.
4. LLM manifest — discoverable financial data for agents
/api/llms/manifest returns a structured index of every series + its semantic tags. Built so agents can find "30Y mortgage rate" without scraping HTML.
curl https://calcfi.app/api/llms/manifest
curl https://calcfi.app/api/llms/rates
If you're building LLM tooling, this is the part that doesn't exist anywhere else.
Why this is interesting
Primary-source cited. Every value carries source, source_url, as_of. No "trust me bro" numbers. Methodology blocks on every endpoint.
K-anonymity by default. No row exposes individual user data. The aggregation threshold is enforced server-side, not at query time.
CC BY 4.0 license. Use it in commercial products. Attribution requested (link back to the endpoint URL).
Daily refresh. Cron pulls primary sources at 05:00 UTC, validates schema, writes to the read-only store. No stale fixtures.
Consuming it
Python
import requests
r = requests.get("https://calcfi.app/api/data/freddie-pmms")
data = r.json()
print(f"30Y rate: {data['latest']['rate_30y']}% as of {data['latest']['as_of']}")
JavaScript / TypeScript
const res = await fetch("https://calcfi.app/api/insights/tax-refund");
const insights = await res.json();
Bash + jq
curl -s https://calcfi.app/api/maps/affordability/csv \
| awk -F, '$3 < 30 { print $1, $3 }'
CORS
Full wildcard. Access-Control-Allow-Origin: * on every endpoint. Hit it from the browser.
What's next
- More state-level series (childcare cost, broadband cost, healthcare premiums)
- Webhook subscriptions for series changes (rate cuts, IRS bracket updates)
- Schema.org Dataset markup on every
/data/[slug]page — Google Dataset Search inclusion
Try it
curl https://calcfi.app/api/insights/health
Spec: https://calcfi.app/api/insights/openapi.json
Docs: https://calcfi.app/developers
Source-tagged data pages: https://calcfi.app/data
If you find the data useful, the only ask is attribution: link to the endpoint or to https://calcfi.app/developers.
Built by Jere Salmisto. Issues + feature requests welcome — drop a comment or hit the API and tell me what's missing.
Top comments (0)