The Column connector polls a Column bank-as-a-service tenant and surfaces accounts, balances, counterparties, and payments. It covers the full US-bank rail set (ACH credit/debit, wire, book transfer) for both observation and outbound initiation, plus webhook ingest.
Prerequisites#
You need a Column tenant and an API key with read access to accounts and transfers, plus write access for the rails you initiate (ach.create, wire.create, book.create, counterparty.create).
Make sure to create an API key dedicated to Formance. Doing so will improve your auditability and security and will allow you to revoke access to Formance at any time if needed.
Installation#
curl -X POST $FORMANCE_API_URL/api/payments/v3/connectors/install/column \
-H "Content-Type: application/json" \
-d @config.jsonConfiguration fields#
| Field | Type | Required | Default |
|---|---|---|---|
apiKey | string | Yes | |
endpoint | string | Yes | |
pageSize | integer | No | 25 |
pollingPeriod | string | No | 30m |
endpoint defaults to https://api.column.com. Sandbox uses the same host with sandbox-scoped keys — no separate base URL.
Capabilities#
FETCH_ACCOUNTS— bank accounts viaGET /bank-accounts.FETCH_BALANCES— available + held + locked balance per account.FETCH_EXTERNAL_ACCOUNTS— counterparties viaGET /counterparties.FETCH_PAYMENTS— ACH, wires, book transfers, and incoming credits, unified intoPSPPayment.CREATE_BANK_ACCOUNT— registers a counterparty viav3CreateBankAccount.CREATE_TRANSFER— book transfer between two Column accounts.CREATE_PAYOUT— ACH credit (POST /transfers/ach) or wire (POST /transfers/wire); rail selected viacom.column.spec/rail.CREATE_WEBHOOKS+TRANSLATE_WEBHOOKS— provisions an endpoint at install and ingestsach.*,wire.*,book.*events.
Account model#
Every Connectivity internal account is one Column bank account from GET /bank-accounts. The reference is the Column account ID; name is the description; defaultAsset is USD/2 (Column is USD-only on the bank-product side). Metadata stamps type, bic, default_account_number, routing_number, is_overdraftable, owners. EXTERNAL accounts come from /counterparties; v3CreateBankAccount registers new ones. See Accounts for the cross-connector model.
Asset model#
USD-only on the bank-product side — every balance and payment is USD/2. Amounts are already in minor units.
Status mapping#
Column statuses vary per rail; the connector collapses them:
| Column status (ACH / wire / book) | Payment status |
|---|---|
initiated, pending, submitted, manual_review, holding | PENDING |
completed, settled, posted | SUCCEEDED |
returned, failed, rejected | FAILED |
canceled | CANCELLED |
ACH credits land settled after the daily ACH return window — the connector folds the window into the PENDING → SUCCEEDED transition.
Metadata keys#
Under com.column.spec/:
- Account:
bank_account_id,account_number_last4,routing_number,account_type. - Counterparty (external account):
counterparty_id,account_number_last4,routing_number,account_type,name. - Payment:
transfer_id,rail(ach/wire/book),direction,network_response_code,idempotency_key,description.
Outbound initiation requires the rail on the PaymentInitiation metadata:
{
"metadata": {
"com.column.spec/rail": "ach",
"com.column.spec/sec_code": "PPD"
}
}Workflow tree#
FetchAccounts (periodic)
├── FetchBalances (periodic) — per account
└── FetchPayments (periodic) — per account, per rail
FetchExternalAccounts (periodic)
CreateBankAccount / CreateTransfer / CreatePayout (event-driven)
└── PollTransferStatus / PollPayoutStatus until terminal
CreateWebhooks (one-shot at install)Pagination and recovery#
Cursor-based pagination via starting_after. The connector persists cursors per stream in platform-managed State and resumes from the last committed cursor on restart.
Known gaps#
- Reverse transfer is not implemented; ACH returns surface as new payment rows rather than reversal events.
- International wires are supported only insofar as Column's API accepts the destination — no extra Connectivity-side metadata mapping for SWIFT BIC / IBAN.