Financial infrastructure toolkit: banking connections, market data, credit, cashflows, and brokerage integrations
Project description
fin-infra
Financial infrastructure toolkit for fintech applications. fin-infra provides production-ready building blocks for banking connections, market data, credit scores, tax data, brokerage integrations, and cashflow analysis—everything needed to build comprehensive personal finance management applications.
What is fin-infra?
fin-infra is the financial data layer for fintech apps. While svc-infra handles generic backend operations (auth, API scaffolding, database, billing), fin-infra is purpose-built for financial applications where users need to:
- Connect bank accounts and pull transaction history
- Link brokerage accounts and view portfolio holdings
- Check credit scores and monitor credit reports
- Access tax documents and data
- View real-time market data (stocks, crypto, forex)
- Perform financial calculations (NPV, IRR, loan amortization)
Status
Alpha. Core functionality is stable, but the surface is intentionally small while we stabilize models and provider contracts.
Helper Index
| Area | What it covers | Guide |
|---|---|---|
| Getting Started | Overview and installation | Getting Started |
| API Integration | Building fintech APIs with fin-infra + svc-infra | API Guide |
| Persistence | Scaffold models/schemas/repositories, svc-infra integration, multi-tenancy, soft delete | Persistence Guide |
| Analytics | Cash flow, savings rate, spending insights, portfolio metrics, rebalancing, scenario modeling | Analytics |
| Budgets | Multi-type budget tracking with templates, alerts, and progress monitoring | Budget Management |
| Documents | Tax forms, bank statements, receipts with OCR extraction and AI analysis | Document Management |
| Insights | Unified insights feed with priority-based aggregation from multiple sources | Insights Feed |
| Crypto | Crypto market data, portfolio tracking, and AI-powered insights | Crypto |
| Banking | Account aggregation, transactions, statements | Banking |
| Market Data | Stocks, crypto, forex quotes and historical data | Market Data |
| Credit Scores | Credit reports and monitoring | Credit |
| Brokerage | Trading accounts and portfolio data | Brokerage |
| Tax Data | Tax documents, crypto gains, tax liability estimation, tax-loss harvesting | Tax |
| Cashflows | NPV, IRR, loan calculations | Cashflows |
| Observability | Metrics and route classification for financial endpoints | Observability |
| Compliance | PII boundaries, vendor ToS, GLBA/FCRA/PCI-DSS, data lifecycle | Compliance |
| Contributing | Dev setup and quality gates | Contributing |
| Acceptance | Acceptance testing guide | Acceptance |
Quick Start
Installation
# From PyPI (when published)
pip install fin-infra
# For backend infrastructure (auth, API, DB, cache, jobs), also install:
pip install svc-infra
# For development
git clone https://github.com/your-org/fin-infra
cd fin-infra
poetry install
Note: fin-infra provides ONLY financial data integrations. For backend infrastructure (API framework, auth, database, caching, jobs), you need svc-infra. Applications typically use both packages together.
One-Call Setup
from fin_infra.banking import easy_banking
from fin_infra.markets import easy_market, easy_crypto
from fin_infra.credit import easy_credit
from fin_infra.cashflows import npv, irr
# Banking
banking = easy_banking()
accounts = await banking.get_accounts("access_token")
transactions = await banking.get_transactions("account_id")
# Market Data
market = easy_market()
quote = market.quote("AAPL")
crypto = easy_crypto()
ticker = crypto.ticker("BTC/USDT")
# Credit Scores
credit = easy_credit()
score = await credit.get_credit_score("user_123")
# Cashflows
cashflows = [-1000, 300, 300, 300, 300]
net_value = npv(0.08, cashflows)
rate_of_return = irr(cashflows)
With FastAPI (fin-infra + svc-infra)
from fastapi import FastAPI
from svc_infra.obs import add_observability
from fin_infra.obs import financial_route_classifier
from fin_infra.banking import add_banking
from fin_infra.markets import add_market_data
# Create app with backend framework (svc-infra)
app = FastAPI(title="Fintech API")
# Add financial capabilities (fin-infra)
add_banking(app, provider="plaid")
add_market_data(app, provider="alphavantage")
# Option 1: Basic observability (all routes auto-instrumented)
add_observability(app)
# Option 2: With route classification (recommended for production)
# All routes auto-instrumented + categorized for filtering in Grafana
add_observability(app, route_classifier=financial_route_classifier)
What gets instrumented?
Both options automatically instrument ALL routes in your app:
- ✅ Financial routes:
/banking/*,/market/*,/crypto/* - ✅ Non-financial routes:
/health,/docs,/admin/*
The difference: Route classification adds category labels (|financial, |public) for filtering metrics in Grafana.
Without classifier:
# Metrics: route="/banking/accounts"
http_server_requests_total{route="/banking/accounts", method="GET"} 42
With classifier:
# Metrics: route="/banking/accounts|financial" (can filter by |financial)
http_server_requests_total{route="/banking/accounts|financial", method="GET"} 42
# Filter all financial routes in Grafana:
sum(rate(http_server_requests_total{route=~".*\\|financial"}[5m]))
See Observability Guide for more details.
Persistence
fin-infra is a stateless library - applications own their database schema, migrations, and data storage.
Generate production-ready models, schemas, and repositories for your application:
# Scaffold budgets with multi-tenancy
fin-infra scaffold budgets --dest-dir app/models/ --include-tenant
# Scaffold goals
fin-infra scaffold goals --dest-dir app/models/
# Scaffold net-worth snapshots
fin-infra scaffold net-worth --dest-dir app/models/ --include-soft-delete
What you get:
- ✅ SQLAlchemy models (with svc-infra's
ModelBase) - ✅ Pydantic schemas (Create, Read, Update)
- ✅ Repository pattern (full CRUD with async support)
- ✅ Type hints and docstrings throughout
- ✅ Production-ready patterns (UUID primary keys, timestamps, indexes)
Wire CRUD with ONE function call:
from svc_infra.api.fastapi.db.sql import add_sql_resources, SqlResource
from app.models.budgets import Budget
# ONE FUNCTION CALL → Full CRUD API
add_sql_resources(app, [
SqlResource(
model=Budget,
prefix="/budgets",
search_fields=["name", "description"],
order_fields=["name", "created_at"],
soft_delete=False,
)
])
# Automatic endpoints:
# POST /budgets/ # Create budget
# GET /budgets/ # List budgets (paginated, searchable, orderable)
# GET /budgets/{id} # Get budget by ID
# PATCH /budgets/{id} # Update budget
# DELETE /budgets/{id} # Delete budget
# GET /budgets/search # Search budgets
See Persistence Guide for the complete workflow.
Architecture Overview
fin-infra/
├── src/fin_infra/
│ ├── banking/ # Bank account aggregation
│ │ ├── plaid/ # Plaid provider
│ │ └── teller/ # Teller provider
│ ├── brokerage/ # Trading account connections
│ ├── credit/ # Credit score providers
│ ├── markets/ # Market data (stocks/crypto)
│ ├── tax/ # Tax data and documents
│ ├── cashflows/ # Financial calculations
│ ├── obs/ # Observability (route classification)
│ ├── models/ # Pydantic data models
│ ├── providers/ # Provider implementations
│ └── docs/ # Packaged documentation
├── tests/
│ ├── unit/ # Fast unit tests
│ └── acceptance/ # Provider integration tests
└── examples/ # Example applications
Architecture Documentation:
- Persistence Strategy ADR - Why fin-infra is stateless
- Persistence Guide - Complete scaffold workflow
Configuration
fin-infra uses environment variables for provider credentials:
# Banking providers
PLAID_CLIENT_ID=your_client_id
PLAID_SECRET=your_secret
PLAID_ENV=sandbox
# Market data providers
ALPHAVANTAGE_API_KEY=your_api_key
# Credit providers (v2: OAuth 2.0)
EXPERIAN_CLIENT_ID=your_client_id
EXPERIAN_CLIENT_SECRET=your_client_secret
EXPERIAN_BASE_URL=https://sandbox-us-api.experian.com # or production URL
Development
# Install dependencies
poetry install
# Format code
make format
# Run linting
make lint
# Type check
make type
# Run tests
make unit # Unit tests only
make accept # Acceptance tests
make test # All tests
Acceptance Tests and CI
Acceptance tests are marked with @pytest.mark.acceptance and are excluded by default.
Running locally
Export any required API keys (only Alpha Vantage is needed by default):
ALPHAVANTAGE_API_KEY– required for Alpha Vantage market data tests
Run acceptance tests:
poetry run pytest -q -m acceptance
GitHub Actions Secrets
The acceptance workflow in .github/workflows/acceptance.yml expects:
ALPHAVANTAGE_API_KEY– add it under Repository Settings → Secrets and variables → Actions → New repository secret
If the secret isn't configured, acceptance tests will still run and CoinGecko tests (public) will pass, but Alpha Vantage tests will be skipped.
Contributing
- Keep APIs small and typed. Prefer Pydantic models for IO boundaries.
- Add or update tests for any behavior changes. Keep
pytestpassing andmypyclean. - See Contributing Guide for detailed development workflow.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fin_infra-0.1.21.tar.gz.
File metadata
- Download URL: fin_infra-0.1.21.tar.gz
- Upload date:
- Size: 697.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cbca4d9d25b74bcef4de9d31808656ceca1d4d254fcf435530c9aa1e89d96cc
|
|
| MD5 |
829878aa722b2a23220a9a43239afabb
|
|
| BLAKE2b-256 |
fdd021a9ef60e17ecb10bed0c5fcf7c59b6bd1e98977a652a8a9890e4db58f6b
|
Provenance
The following attestation bundles were made for fin_infra-0.1.21.tar.gz:
Publisher:
publish-pypi.yml on Aliikhatami94/fin-infra
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fin_infra-0.1.21.tar.gz -
Subject digest:
4cbca4d9d25b74bcef4de9d31808656ceca1d4d254fcf435530c9aa1e89d96cc - Sigstore transparency entry: 693458859
- Sigstore integration time:
-
Permalink:
Aliikhatami94/fin-infra@2ac7fa7e245b82b1237f2c5ac3b696819afeb74f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Aliikhatami94
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@2ac7fa7e245b82b1237f2c5ac3b696819afeb74f -
Trigger Event:
push
-
Statement type:
File details
Details for the file fin_infra-0.1.21-py3-none-any.whl.
File metadata
- Download URL: fin_infra-0.1.21-py3-none-any.whl
- Upload date:
- Size: 842.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f724d6c88e4caee5a560cd613e8facb692b8dfb3f929d442953fcae1c6a1017
|
|
| MD5 |
0966a5559eabe218360e3b4387dca348
|
|
| BLAKE2b-256 |
9be5fadbbd96806bfddfd48344827f7a43f0c7b7a447ee14896afea04da807c1
|
Provenance
The following attestation bundles were made for fin_infra-0.1.21-py3-none-any.whl:
Publisher:
publish-pypi.yml on Aliikhatami94/fin-infra
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fin_infra-0.1.21-py3-none-any.whl -
Subject digest:
7f724d6c88e4caee5a560cd613e8facb692b8dfb3f929d442953fcae1c6a1017 - Sigstore transparency entry: 693458891
- Sigstore integration time:
-
Permalink:
Aliikhatami94/fin-infra@2ac7fa7e245b82b1237f2c5ac3b696819afeb74f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/Aliikhatami94
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@2ac7fa7e245b82b1237f2c5ac3b696819afeb74f -
Trigger Event:
push
-
Statement type: