Create a funding source for a customer #

There are two methods available for adding a bank or credit union account to a Customer. You can either collect the Customer's bank account information and pass it to Dwolla via the Create a Customer Funding Source endpoint, or you can send the Customer through the the Instant Account Verification (IAV) flow which will add and verify a bank account within seconds.

Before a Dwolla account or Dwolla API Customer is eligible to transfer money from their bank or credit union account they need to verify ownership of the account, either via Instant Account Verification (IAV) or micro-deposits. For more information on bank account verification, reference this funding source verification resource article.

Virtual Account Numbers

Just as your Verified Customers can add bank accounts as Funding Sources, they also have the ability to add Virtual Account Numbers, or VANs as Funding Sources. Similarly, VANs that your VCRs create will also have a status of verified by default.

Bank #

HTTP request - bank funding source #

POST https://api.dwolla.com/customers/{id}/funding-sources

Request parameters - bank funding source #

ParameterRequiredTypeDescription
_linksconditionalobjectA _links JSON object containing an on-demand-authorization and/or exchange link relation. See example bash request and response below.
routingNumberyesstringA bank routing number that identifies a bank or credit union in the U.S. Note: Validation of the routing number includes: a checksum, the first two digits of the routing number must fall within the range "01" through "12", or "21" through "32", and the string value must consist of nine digits.
accountNumberyesstringThe bank account number. Note: The account number is validated to check if it is a numeric string of 4-17 digits.
bankAccountTypeyesstringType of bank account: checking, savings, general-ledger or loan.
nameyesstringArbitrary nickname for the funding source. Must be 50 characters or less.
plaidTokennostringA processor token obtained from Plaid for adding and verifying a bank. Reference our Plaid Link developer guide to learn more about this integration.
channelsnoarrayAn array containing a list of processing channels. ACH is the default processing channel for bank transfers. Acceptable value for channels is: "wire". e.g. “channels”: [ “wire” ]. A funding source (Bank Account) added using the wire channel only supports a funds transfer going to the bank account from a balance. As a result, wire as a destination funding source can only be added where the Customer account type is a Verified Customer. Note: channels is a premium feature that must be enabled on your account and is only available to select Dwolla customers.

HTTP status and error codes - bank funding source #

HTTP StatusCodeDescription
400InactiveExchangeThe Exchange was removed or disabled.
400InvalidExchangeTokenThe exchange token is not valid to perform this operation. Either the token is expired, invalid, or the products permissions to the token are invalid or expired.
400ValidationErrorCan be: Duplicate funding source or validation error. Authorization already associated to a funding source.
403ForbiddenNot authorized to create funding source.
404NotFoundCustomer ID not found. Check Customer ID.

Request and response - bank funding source #

JavaScript
// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node
var customerUrl =
  "https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C";
var requestBody = {
  routingNumber: "222222226",
  accountNumber: "123456789",
  bankAccountType: "checking",
  name: "Jane Doe’s Checking",
};

dwolla
  .post(`${customerUrl}/funding-sources`, requestBody)
  .then((res) => res.headers.get("location")); // => 'https://api-sandbox.dwolla.com/funding-sources/375c6781-2a17-476c-84f7-db7d2f6ffb31'

Request and response - using on-demand authorization #

JavaScript
// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node
var customerUrl =
  "https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C";
var requestBody = {
  _links: {
    "on-demand-authorization": {
      href: "https://api-sandbox.dwolla.com/on-demand-authorizations/30e7c028-0bdf-e511-80de-0aa34a9b2388",
    },
  },
  routingNumber: "222222226",
  accountNumber: "123456789",
  bankAccountType: "checking",
  name: "Jane Doe’s Checking",
};

dwolla
  .post(`${customerUrl}/funding-sources`, requestBody)
  .then((res) => res.headers.get("location")); // => 'https://api-sandbox.dwolla.com/funding-sources/375c6781-2a17-476c-84f7-db7d2f6ffb31'

Request and response - using an exchange resource #

JavaScript
// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node
var customerUrl =
  "https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C";
var requestBody = {
  _links: {
    exchange: {
      href: "https://api-sandbox.dwolla.com/exchanges/30e7c028-0bdf-e511-80de-0aa34a9b2388",
    },
  },
  bankAccountType: "checking",
  name: "Jane Doe’s Checking",
};

dwolla
  .post(`${customerUrl}/funding-sources`, requestBody)
  .then((res) => res.headers.get("location")); // => 'https://api-sandbox.dwolla.com/funding-sources/375c6781-2a17-476c-84f7-db7d2f6ffb31'

Virtual Account Number #

HTTP request - VAN funding source #

POST https://api.dwolla.com/customers/{id}/funding-sources

Request parameters - VAN funding source #

ParameterRequiredTypeDescription
nameyesstringArbitrary nickname for the funding source.
typeyesstringDenotes that this is a virtual funding source being created (VAN). Value must be virtual.
bankAccountTypeyesstringValue must be checking. VANs with a bankAccountType of savings are not currently available.

HTTP status and error codes - VAN funding source #

HTTP StatusMessage
403Virtual account numbers are not enabled for this account.

Request and response - VAN funding source #

JavaScript
// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node
var requestBody = {
  name: "My First VAN",
  type: "virtual",
  bankAccountType: "checking",
};

dwolla
  .post(`${customerUrl}/funding-sources`, requestBody)
  .then((res) => res.headers.get("location")); // => 'https://api-sandbox.dwolla.com/funding-sources/04173e17-6398-4d36-a167-9d98c4b1f1c3'

Test in the Sandbox for free today.

Use sandbox environment to test API requests.

Get API Keys
2022 All Rights Reserved
Financial institutions play an important role in our network.

All funds transfers made using the Dwolla Platform are performed by a financial institution partner, and any funds held in a Dwolla Balance are held by a financial institution partner. Learn more about our financial institution partners.