Skip to content

One API for U.S. banking. Ship in weeks.

Build against a development environment, then go to production without the 18-month bank build — the diligence is already done.

POST/v1/deposit/us-bank-ach
HTTP
x-api-key: $CFX_API_KEY
x-api-secret: $CFX_API_SECRET
Content-Type: application/json
Idempotency-Key: dep_a1f9c3

{
  "identityId": "id_VfsdSMtd8UdgxCgTnz0tm",
  "amount": { "amount": 1000, "currency": "USD" },
  "speed": "same-day",
  "sourcePaymentInstrumentId": "pi_jk23h4j564rthk32",
  "reference": "DR-123456789",
  "wallet": { "address": "7Np…SoLa", "blockchain": "SOLANA" }
}
Created
Amount
$1,000.00 USD
Speed
Same-day ACH
Reference
DR-123456789
Request
dprq_FiZcY1MG…

Funds post to the customer's balance once the ACH debit clears.

Built for builders.

Every capability shares one set of credentials, one idempotency model, and one webhook envelope, so what you build for one rail carries to the next.

  • Payments on ACH, wire, RTP, and cash
  • Accounts with real account and routing numbers
  • KYB, KYC, sanctions and PEP screening
  • On-chain settlement on Solana, Ethereum, and Base

What your team sees in CFX.

A signed webhook for every status change, retried with backoff until your endpoint accepts it.

How it works.

  1. Get keys

    Sign up and generate an API key and secret in the dashboard.

  2. Build

    Integrate against api.dev.cfx.to with development credentials.

  3. Go live

    Point the same requests at api.cfx.to with production credentials.

See it in code.

Real requests against the CFX API, with the response and the result they produce.

Open a U.S. virtual account with its own ACH, wire, and RTP details.

POST/v1/virtual-accounts/us-deposit
HTTP
x-api-key: $CFX_API_KEY
x-api-secret: $CFX_API_SECRET
Content-Type: application/json

{
  "ledgerAccountId": "la_8Qd2k1nZ",
  "name": "Acme Operating",
  "referenceId": "acct-acme-001"
}
200 OK
JSON
{
  "id": "va_3Rk9TpL2",
  "name": "Acme Operating",
  "referenceId": "acct-acme-001",
  "status": "ACTIVE",
  "type": "US_DEPOSIT",
  "accountNumber": "8779000123456",
  "routingNumber": "021000021",
  "ledgerAccountId": "la_8Qd2k1nZ",
  "achDepositInstructions": {
    "accountNumber": "8779000123456",
    "routingNumber": "021000021",
    "beneficiaryName": "Acme, Inc.",
    "currency": "USD"
  },
  "createdAt": "2026-06-18T09:12:00Z"
}
Active
Account
•••• 3456
Routing
021000021
Rails
ACH · Wire · RTP
Type
US deposit

Share the account and routing number to receive funds directly.

What your engineers need to know.

x-api-key, x-api-secretBoth headers on every request. Development and production keys are separate.
Idempotency-KeyRetry a create safely: a repeated key returns the first result instead of running it twice.
webhook-signatureHMAC-SHA256 under the Standard Webhooks spec. Delivered at least once, retried with backoff up to 10 times.
429 TOO MANY REQUESTSBranch on each error's code field, not its message. A 429 means you hit a rate limit.

Ready to build on regulated U.S. banking rails?

Sign up, spin up a sandbox, and make your first call the same day.