Financial Accounts
Financial accounts represent external wallets and bank accounts you connect to your Commerce balance for bi-directional money movement. Push funds out to settle vendors, disburse earnings, or process refunds. Pull funds in to top up your balance, collect recurring payments, or sweep from connected accounts. Each account tracks its own verification status, currency constraints, and push/pull capabilities—giving you granular control over how money flows through your system.
The financial account object
Every financial account captures the complete state needed for bi-directional transfers: account details (wallet or bank), currency constraints, push/pull configurations, mandate authorizations, and verification status. The type field determines which nested object contains the account-specific details.
Properties
- Name
id- Type
- string
- Description
Unique identifier for this financial account—reference this when pushing funds out or pulling funds in.
- Name
type- Type
- enum
- Description
Account type:
walletorbank. This discriminator determines which nested object holds the account-specific details.
- Name
currency- Type
- string
- Description
ISO 4217 currency code in lowercase—must match a currency your Commerce account supports (like
ghs,usd,eur). Enforces currency constraints for transfers involving this account.
- Name
label- Type
- string
- Description
Human-readable display name (5–40 characters) like
Primary settlement wallet,Balance top-up source, orVendor disbursements - MTN. Shows up in dashboards and reconciliation reports.
- Name
reference- Type
- string
- Description
Your internal identifier (5–40 characters) for this account—typically a SKU, vendor code, or reconciliation key from your system.
- Name
description- Type
- string
- Description
Optional long-form text (up to 200 characters) describing how you use this account—useful for team context and audit trails.
- Name
created_at- Type
- timestamp
- Description
When this financial account was created. Immutable once set.
- Name
archived_at- Type
- timestamp|null
- Description
When this account was archived and made unavailable for new operations.
nullwhile the account is active.
push_configurationobjectControls push operations (sending funds from your Commerce balance to this account). Present when you've enabled outbound transfers—lets you disburse earnings, settle invoices, or process refunds.Click or tap to expand- Name
id- Type
- string
- Description
- Unique identifier for this push configuration.
- Name
enabled_at- Type
- timestamp
- Description
- When push capability was activated for this account.
pull_configurationobjectControls pull operations (debiting funds from this account into your Commerce balance). Present when you've enabled inbound transfers—lets you top up your balance, collect recurring payments, or sweep from connected accounts. Includes mandate details and transaction limits for regulatory compliance.Click or tap to expand- Name
id- Type
- string
- Description
- Unique identifier for this pull configuration.
- Name
enabled_at- Type
- timestamp
- Description
- When pull capability was activated.
- Name
min_threshold- Type
- integer
- Description
- Minimum amount (in smallest currency unit) that can be debited in a single pull operation.
- Name
max_threshold- Type
- integer
- Description
- Maximum amount (in smallest currency unit) allowed per pull operation.
- Name
pull_mandate- Type
- object|null
- Description
- Mandate authorization details capturing when and how the account holder granted debit permissions—required for regulatory compliance and dispute resolution.
View pull_mandate attributesClick or tap to expand
- Name
id- Type
- string
- Description
- Unique mandate identifier for audit and dispute resolution.
- Name
granted_at- Type
- timestamp
- Description
- When the account holder authorized pull operations.
- Name
user_agent- Type
- string
- Description
- Browser or app user agent string captured during authorization.
- Name
ip_address- Type
- string
- Description
- IP address recorded at authorization time—used for fraud prevention and compliance.
- Name
verification- Type
- object|null
- Description
Verification lifecycle metadata. When present, includes
initiated_at,completed_at, andrequestdetails showing when and how the account was verified (via micro-deposits, manual review, or other proofing mechanisms).nullfor unverified accounts.
walletobjectPresent whentypeiswallet. Currently supports mobile money wallets—widely used for transfers in Ghana and other African markets.Click or tap to expand- Name
id- Type
- string
- Description
- Platform-generated wallet identifier for internal tracking.
- Name
type- Type
- enum
- Description
- Wallet subtype—either
mobile_moneyordosh. Future versions may support e-wallets and other digital payment accounts.
- Name
mobile_money- Type
- object
- Description
- Mobile money network details—everything needed to route funds to or pull from the correct provider and subscriber.
View mobile_money attributesClick or tap to expand
- Name
network- Type
- string
- Description
- Mobile money provider:
mtn,vodafone,airteltigo, or other supported networks. Must match your Commerce account's enabled networks.
- Name
account- Type
- string
- Description
- Subscriber phone number (MSISDN) in local or international format. The API normalizes format automatically.
- Name
dosh- Type
- object
- Description
- Dosh wallet details—everything needed to route funds to or pull from the correct wallet.
View dosh attributesClick or tap to expand
- Name
name- Type
- string
- Description
- Account holder full name—must match bank records for regulatory compliance.
- Name
account_number- Type
- string
- Description
- Destination account number at the receiving bank.
- Name
country- Type
- string
- Description
- ISO 3166-1 alpha-2 country code where the bank operates (e.g.,
gh,us,gb).
- Name
account_type- Type
- string
- Description
- Account classification:
checking,savings, or other bank-specific types.
bankobjectPresent whentypeisbank. Supports both local and international bank transfers. Note: The create endpoint accepts all fields below, but the response is currently empty as bank transfers are in beta.Click or tap to expand- Name
name- Type
- string
- Description
- Account holder full name—must match bank records for regulatory compliance.
- Name
account_number- Type
- string
- Description
- Destination account number at the receiving bank.
- Name
routing_number- Type
- string
- Description
- Routing identifier: ABA for US banks, SWIFT/BIC for international transfers, or sort code for UK banks.
- Name
bank_code- Type
- string
- Description
- Local bank identifier when different from routing number—used in some markets for domestic transfers.
- Name
country- Type
- string
- Description
- ISO 3166-1 alpha-2 country code where the bank operates (e.g.,
gh,us,gb).
- Name
account_type- Type
- string
- Description
- Account classification:
checking,savings, or other bank-specific types.
Connect a financial account
Connect an existing wallet or bank account for bi-directional money movement. Use this endpoint when the financial account already exists in the real world—you're just registering it in your Commerce account. Supply the account type (wallet or bank), currency constraints, type-specific details, and optionally enable push/pull capabilities in a single request. The API validates field lengths, currency support, and account-specific requirements automatically—if something's misconfigured, you'll get a clear error before any state is persisted.
Common use cases: Connect a mobile money wallet to disburse vendor payments (push) or collect subscription fees (pull). Link a bank account to sweep daily revenue into your operating account (pull) or process customer refunds (push). Connect your founder's wallet to inject working capital when your balance runs low (pull).
Validation rules
labelandreference: Both must be 5–40 characters. Uselabelfor human-readable names,referencefor your internal identifiers.currency: Must match a currency your Commerce account supports (check the dashboard for enabled currencies). Common values:ghs,usd,eur,ngn.type: Determines which nested object is required.walletneeds awalletobject,bankneedsbank. Sending multiple type objects in one request will fail validation.- Wallet-specific: When
typeiswallet, thewallet.typefield must be eithermobile_moneyordosh. The nested object requires network/provider details and account identifiers. - Push/Pull config: Enable
push_configurationto send funds out to this account. Enablepull_configuration(with proper mandate authorization) to debit funds from this account into your Commerce balance. You can enable both for bi-directional flow.
Required attributes
- Name
label- Type
- string
- Description
Human-readable name for dashboards, reports, and team communication. 5–40 characters.
- Name
reference- Type
- string
- Description
Your internal identifier for reconciliation and lookups. 5–40 characters. Use vendor codes, SKUs, or other stable references from your system.
- Name
type- Type
- enum
- Description
Destination type:
walletorbank. This determines which type-specific object you must include in the request body.
- Name
currency- Type
- string
- Description
Lowercase ISO 4217 currency code (e.g.,
ghs,usd,eur). Must be enabled for your Commerce account—the API will reject unsupported currencies.
walletobjectRequired whentypeiswallet. Describes a mobile money wallet or digital wallet for bi-directional transfers.Click or tap to expand- Name
type- Type
- enum
- Description
- Wallet subtype—either
mobile_moneyordosh. Future versions will support additional digital wallet types.
- Name
mobile_money- Type
- object
- Description
- Mobile money network and subscriber details. Used for routing both push and pull operations.
View mobile_money attributesClick or tap to expand
- Name
network- Type
- string
- Description
- Provider identifier:
mtn,vodafone,airteltigo, or other supported networks. Check your Commerce account settings for enabled providers.
- Name
account- Type
- string
- Description
- Subscriber phone number (MSISDN). Accepts international format (
+233...) or clean local format (024...). The API normalizes automatically.
bankobjectRequired whentypeisbank. Describes a bank account for wire transfers, ACH payments, and direct debits.Click or tap to expand- Name
name- Type
- string
- Description
- Account holder full name—must match bank records exactly for compliance and successful transfers (both push and pull).
- Name
account_number- Type
- string
- Description
- Bank account number at the institution.
- Name
routing_number- Type
- string
- Description
- Routing identifier: ABA routing number (US), SWIFT/BIC code (international), or sort code (UK).
- Name
bank_code- Type
- string
- Description
- Local bank code for domestic transfers in markets where routing number and bank code are separate.
- Name
country- Type
- string
- Description
- ISO 3166-1 alpha-2 country code (e.g.,
gh,us,gb) where the bank operates.
- Name
account_type- Type
- string
- Description
- Account classification:
checking,savings, or other institution-specific type.
Optional attributes
- Name
description- Type
- string
- Description
Long-form description (up to 200 characters) of how you use this account. Examples:
Vendor disbursement wallet,Balance top-up source - owner's MTN,Customer refund processing. Useful for team context, compliance documentation, and audit trails.
push_configurationobjectEnable push operations (send funds from your Commerce balance to this account). Use this for vendor disbursements, customer refunds, earnings payouts, or settlement transfers. To make this account the default destination for automatic payouts in a specific currency, enable push and then set it using/payouts/set_destinations.Click or tap to expand- Name
enabled- Type
- boolean
- Description
- Set
trueto enable push operations immediately. Setfalse(or omit) to create the account without push capability—you can enable it later via update.
pull_configurationobjectEnable pull operations (debit funds from this account into your Commerce balance). Use this to top up your balance, collect recurring payments, or sweep revenue from connected accounts. Requires proper mandate authorization from the account holder for regulatory compliance.Click or tap to expand- Name
enabled- Type
- boolean
- Description
- Set
trueonly when you have explicit authorization (mandate) from the account holder to debit funds. Setfalse(or omit) to disable pull operations. Required for balance top-ups and recurring collections.
Request
curl https://api.zebo.dev/financial_accounts/connect \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"label": "Konadu Tailoring Collections",
"reference": "KONADU-MOMO-SETTLEMENT",
"description": "Primary settlement wallet for Konadu's B2C operations.",
"type": "wallet",
"currency": "ghs",
"wallet": {
"type": "mobile_money",
"mobile_money": {
"network": "mtn",
"account": "0242057831"
}
},
"push_config": { "enabled": true },
"pull_config": { "enabled": false }
}'
Response
{
"account": {
"id": "fa_Q90wZdd2P7W8hJ1cN9Mx4Rk5sVWBvY3L6pTz8q0",
"currency": "ghs",
"type": "wallet",
"label": "Konadu Tailoring Collections",
"reference": "KONADU-MOMO-SETTLEMENT",
"description": "Primary settlement wallet for Konadu's B2C operations.",
"created_at": "2025-03-18T10:22:11.745Z",
"archived_at": null,
"verification": null,
"push_configuration": null,
"pull_configuration": null,
"wallet": {
"id": "wal_TJPFxX9C3651K6Sb5RXjc9gIH4KjzqZIiD0WQsZ",
"type": "mobile_money",
"mobile_money": {
"network": "mtn",
"account": "0242057831"
}
}
}
}
Create a financial account
Create a new financial account at a partner bank or mobile money provider, then register it in your Commerce account. Use this endpoint when you need Commerce to provision the account for you—we'll create it with our partner institutions and handle the setup. This differs from Connect, which registers accounts that already exist.
When to use Create vs Connect: Use Connect for accounts your customers or vendors already own (existing mobile money wallets, bank accounts). Use Create when you need Commerce to provision new accounts on your behalf—typically for specialized use cases like creating sub-accounts for marketplace sellers or setting up dedicated collection accounts.
Note: Account creation is currently in beta and requires partner integration setup. Most users should use Connect to register existing accounts. Contact support to enable account creation capabilities for your Commerce account.
Request attributes
The request structure matches Connect but includes additional partner-specific parameters for account provisioning. See the Connect documentation for detailed parameter descriptions.
Request
curl https://api.zebo.dev/financial_accounts/create \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"label": "Marketplace Seller Sub-Account",
"reference": "SELLER-001-COLLECTION",
"description": "Dedicated collection account for seller 001.",
"type": "wallet",
"currency": "ghs",
"wallet": {
"type": "mobile_money",
"mobile_money": {
"network": "mtn",
"account": "0244123456"
}
}
}'
Response
{
"account": {
"id": "fa_X1Y2Z3A4B5C6D7E8F9G0H1I2J3K4L5M6N7O8P9Q",
"currency": "ghs",
"type": "wallet",
"label": "Marketplace Seller Sub-Account",
"reference": "SELLER-001-COLLECTION",
"description": "Dedicated collection account for seller 001.",
"created_at": "2025-03-18T11:30:00.000Z",
"archived_at": null,
"verification": null,
"push_configuration": null,
"pull_configuration": null,
"wallet": {
"id": "wal_Y9Z0A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R",
"type": "mobile_money",
"mobile_money": {
"network": "mtn",
"account": "0244123456"
}
}
}
}
Lookup a financial account
Retrieve the current state of a financial account by its ID. This returns the full account object including any configuration changes, verification status updates, or archive timestamps since creation. Use this to confirm account details before initiating transfers, check if push/pull capabilities have been modified, or inspect mandate authorization status for pull operations.
The response structure matches what you received when creating the account, with all the same nested objects and timestamps. If the account has been archived, archived_at will be populated.
Request attributes
- Name
account_id- Type
- string
- Description
Unique identifier returned from
/financial_accounts/createor found in transfer records. Must be non-empty and match an account in your Commerce account.
Request
curl https://api.zebo.dev/financial_accounts/lookup \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"account_id": "fa_Q90wZdd2P7W8hJ1cN9Mx4Rk5sVWBvY3L6pTz8q0"
}'
Response
{
"account": {
"id": "fa_Q90wZdd2P7W8hJ1cN9Mx4Rk5sVWBvY3L6pTz8q0",
"currency": "ghs",
"type": "wallet",
"label": "Konadu Tailoring Collections",
"reference": "KONADU-MOMO-SETTLEMENT",
"description": "Primary settlement wallet for Konadu's B2C operations.",
"created_at": "2025-03-18T10:22:11.745Z",
"archived_at": null,
"verification": null,
"push_configuration": null,
"pull_configuration": null,
"wallet": {
"id": "wal_TJPFxX9C3651K6Sb5RXjc9gIH4KjzqZIiD0WQsZ",
"type": "mobile_money",
"mobile_money": {
"network": "mtn",
"account": "0242057831"
}
}
}
}