Skip to main content
SimpleFIN provides a privacy-focused alternative to Plaid for connecting US bank accounts. It uses the SimpleFIN Protocol, which allows users to connect their banks through SimpleFIN Bridge without sharing credentials with third parties.

What SimpleFIN Connects To

SimpleFIN supports:
  • Depository Accounts: Checking and savings accounts
  • Credit Cards: Credit card accounts
  • Investment Accounts: Some brokerage accounts
  • Loan Accounts: Mortgages, auto loans, personal loans
  • Crypto Accounts: Cryptocurrency accounts (via manual configuration)
SimpleFIN requires users to set up their own SimpleFIN Bridge ($1.50/month) or use a SimpleFIN-compatible service. There’s no API key required for app developers.

Prerequisites

1

User Sets Up SimpleFIN Bridge

Each user needs their own SimpleFIN Bridge subscription:
  1. Sign up at https://beta-bridge.simplefin.org
  2. Cost: $1.50/month per user
  3. Connect banks via SimpleFIN Bridge interface
  4. Generate a Setup Token
2

No API Keys Required

Unlike Plaid, SimpleFIN doesn’t require developer API keys. Users provide their own access tokens generated from their SimpleFIN Bridge.

Configuration (Optional)

SimpleFIN works out of the box with no configuration, but you can customize behavior:
.env
# Include pending transactions by default (optional)
SIMPLEFIN_INCLUDE_PENDING=1

# Enable debug logging of raw SimpleFIN responses (optional)
SIMPLEFIN_DEBUG_RAW=1
Configuration details: app/models/provider/simplefin_adapter.rb

Connecting a SimpleFIN Account

1

Get Setup Token from SimpleFIN Bridge

Users must first connect their bank in SimpleFIN Bridge, then generate a Setup Token:
  1. Log into SimpleFIN Bridge
  2. Connect desired financial institutions
  3. Click “Generate Setup Token”
  4. Copy the base64-encoded token
2

Add Connection in Sure

  1. Navigate to Settings → Providers
  2. Find the SimpleFIN section
  3. Click “Add SimpleFIN Connection”
  4. Paste the Setup Token
  5. Click “Connect”
3

Setup Accounts

After connecting, SimpleFIN will sync available accounts:
  1. Review the list of discovered accounts
  2. For each account, select the account type:
    • Checking or Savings Account (Depository)
    • Credit Card
    • Investment Account
    • Crypto Account
    • Loan or Mortgage
    • Other Asset
    • Skip this account
  3. Choose account subtype if applicable
  4. Set sync start date (optional)
  5. Click “Complete Setup”
4

Initial Sync

Sure will automatically sync transactions and balances for all linked accounts.
Source: app/controllers/simplefin_items_controller.rb:58

Account Type Detection

SimpleFIN uses intelligent account type detection based on:
  • Account name patterns
  • Institution metadata
  • Holdings data (for investment accounts)
  • Balance characteristics
The system suggests account types with confidence levels, but users can override any suggestion during setup. Source: app/controllers/simplefin_items_controller.rb:153

Data Syncing

What Gets Synced

Transactions:
  • Historical transactions (as far back as the institution provides)
  • Pending transactions (when SIMPLEFIN_INCLUDE_PENDING=1)
  • Foreign exchange metadata for international transactions
  • Transaction descriptions and amounts
Balances:
  • Current balance
  • Available balance
  • Balance history
Holdings (for investment accounts):
  • Security positions
  • Quantity and cost basis
  • Current market value
Institution Metadata:
  • Institution name and domain
  • Account organization data
  • Connection status

Sync Frequency

SimpleFIN Bridge refreshes bank data once every 24 hours. You cannot force more frequent syncs.
Sync behavior:
  • Rate Limited: SimpleFIN enforces a 24-hour refresh limit per account
  • Manual Sync: Triggers a sync if data is stale (>24 hours old)
  • Balance-Only Sync: Available for quick balance checks without full transaction sync
Source: app/controllers/simplefin_items_controller.rb:125

Pending Transactions

SimpleFIN detects pending transactions when:
  1. Provider sends pending: true in transaction data
  2. OR posted date is blank/0 and transacted_at is present
Pending metadata is stored at transaction.extra["simplefin"]["pending"]. Source: Repository Guidelines (AGENTS.md)

Foreign Exchange Support

SimpleFIN provides rich FX metadata:
  • extra["simplefin"]["fx_from"]: Original currency
  • extra["simplefin"]["fx_date"]: Exchange rate date

Updating a Connection

If your SimpleFIN connection expires or needs to be refreshed:
1

Generate New Setup Token

In SimpleFIN Bridge, generate a new Setup Token for the existing connection.
2

Update in Sure

  1. Go to Settings → Providers
  2. Find your SimpleFIN connection
  3. Click “Update Connection”
  4. Paste the new Setup Token
  5. Confirm
3

Preserve Account Links

Updating preserves all existing account linkages and transaction history.
Source: app/controllers/simplefin_items_controller.rb:18

Handling Stale Accounts

When you remove and re-add an institution in SimpleFIN Bridge, account IDs change. Sure detects this automatically:
  • Automatic Repair: Sure matches old and new accounts by name
  • Preserve History: Transactions from the old account are merged into the new one
  • No Data Loss: Your historical data remains intact
Source: app/models/simplefin_item.rb:119

Connection Management

Balance-Only Sync

For quick balance updates without syncing all transactions:
# Endpoint: POST /simplefin_items/:id/balances
# Source: app/controllers/simplefin_items_controller.rb:126
Useful for dashboard widgets that need current balances without the overhead of full transaction processing.

Unlinking Accounts

To disconnect a SimpleFIN account:
  1. Navigate to Settings → Providers
  2. Find the SimpleFIN connection
  3. Click “Delete”
  4. Confirm deletion
This will:
  • Unlink all associated Sure accounts
  • Schedule data cleanup
  • Not affect your SimpleFIN Bridge setup
Source: app/controllers/simplefin_items_controller.rb:104

Troubleshooting

”Rate Limited” or “Make Fewer Requests”

Cause: SimpleFIN Bridge enforces a 24-hour refresh limit. Solution: Wait until the bridge refreshes (up to 24 hours). This is a SimpleFIN limitation, not a Sure limitation. Source: app/models/simplefin_item.rb:344

No New Transactions

Checklist:
  1. Check last sync time (must be >24 hours ago for refresh)
  2. Verify connection status in SimpleFIN Bridge
  3. Ensure accounts are still active in your bank
  4. Check for stale account warnings in Sure

Stale Sync Detection

Sure monitors sync health:
  • Warns if last sync was >3 days ago
  • Alerts if no new transactions in 14+ days
  • Prompts to check SimpleFIN Bridge connections
Source: app/models/simplefin_item.rb:366

Invalid Setup Token

Cause: Token was miscopied or has already been claimed. Solution: Generate a fresh Setup Token from SimpleFIN Bridge and try again. Source: app/controllers/simplefin_items_controller.rb:42

Accounts Need Setup

After initial connection, you may see “Accounts need setup” badge:
  1. Click the badge
  2. Select account types for each discovered account
  3. Complete setup process
  4. Sync will begin automatically
Source: app/controllers/simplefin_items_controller.rb:137

Privacy & Security

Why SimpleFIN?

  • No Credential Sharing: You never share bank passwords with Sure
  • User-Controlled: Each user manages their own SimpleFIN Bridge
  • Direct Connection: SimpleFIN Bridge connects directly to your banks
  • Encrypted Tokens: Access URLs are encrypted in Sure’s database
  • Read-Only: SimpleFIN can only read data, never initiate transactions

Data Storage

SimpleFIN access URLs are encrypted using Rails’ ActiveRecord Encryption:
# Source: app/models/simplefin_item.rb:11
encrypts :access_url, deterministic: true
encrypts :raw_payload

API Reference

Creating a Connection

# Source: app/controllers/simplefin_items_controller.rb:68
Current.family.create_simplefin_item!(
  setup_token: setup_token,
  item_name: "SimpleFIN Connection"
)

Processing Accounts

# Source: app/models/simplefin_item.rb:48
def import_latest_simplefin_data(sync: nil)
  SimplefinItem::Importer.new(
    self, 
    simplefin_provider: simplefin_provider, 
    sync: sync
  ).import
end

Supported Account Types

# Source: app/controllers/simplefin_items_controller.rb:232
valid_types = [
  "Depository",    # Checking/Savings
  "CreditCard",    # Credit cards
  "Investment",    # Brokerage accounts
  "Loan",          # Mortgages, auto loans
  "Crypto",        # Cryptocurrency
  "OtherAsset"     # Other assets
]

Best Practices

  1. Educate Users: Explain that SimpleFIN requires their own Bridge subscription
  2. Set Expectations: Communicate the 24-hour sync limitation upfront
  3. Monitor Staleness: Use the built-in stale sync detection to prompt users
  4. Handle Relinks: SimpleFIN account IDs change when institutions are re-added; rely on automatic repair
  5. Use Balance Sync: For real-time dashboards, use balance-only sync instead of full sync

Comparison: SimpleFIN vs Plaid

FeatureSimpleFINPlaid
Cost$1.50/month per userPer-item fees
PrivacyUser-controlled bridgeCredential sharing
Sync FrequencyOnce per 24 hoursReal-time with webhooks
SetupUser sets up BridgeDeveloper gets API keys
CoverageUS banksUS, Canada, EU banks
API ComplexitySimple token-basedFull OAuth + webhooks
Pending Transactions✅ Supported✅ Supported
FX Metadata✅ Rich FX dataLimited

Additional Resources

SimpleFIN Bridge

Sign up for SimpleFIN Bridge

SimpleFIN Protocol

Learn about the SimpleFIN Protocol

Plaid Alternative

Compare with Plaid integration

Build docs developers (and LLMs) love