Dwolla Developers Logo
  • Getting Started
    Testing in the Sandbox
    Generate an OAuth Access Token
    Send Money to Users
    Receive Money from Users
    Transfer Money Between Users
    Transfer Money Me-to-Me
    OverviewStep 1: Create a customerStep 2: Add funding sourcesStep 3: Retrieve funding sourcesStep 4: Create transfer
    Building With Drop-in Components
  • Customers
    Create a Business Verified Customer
    Create a Personal Verified Customer
  • Funding Sources
    Add a Debit Card Using Dwolla-cards.js
    Add a Bank Using Dwolla.js
    Add a Bank Using Dwolla.js + IAV
    Verify Bank with Micro-deposits
    Add Bank via Dwolla + Plaid Integration
  • Webhooks
    Create a Webhook Subscription
API DocsOpen in new tabChangelog
Get API Keys
API DocsOpen in new tabChangelog
Get API Keys

Step 2: Adding Funding Sources #

Within Dwolla, the sending party must always verify their bank account in order to be eligible to create a transfer.

Bank Addition and Verification methods #

There are three ways of adding a bank to a Customer with the Dwolla API. A simplified table below outlines the similarities and differences of each method.

Bank Addition MethodWill the bank be verified?Required InformationAPI - Account // Routing NumberOptional - With MicrodepositsBank Account and Routing NumberDwolla.js - Instant Account VerificationYesOnline Bank CredentialsThird party - PlaidYesOnline Bank Credentials

In this guide, we’ll be utilizing Dwolla’s Instant account verification (IAV) method via dwolla.js for adding and verifying our user’s bank account. Micro-deposit verification can take 1-2 business days to complete, so if speed is a primary factor in your user experience then you may want to feature IAV as your preferred bank verification method.

Step 2A: Adding a bank to the Verified Personal Customer #

Next, you will attach a verified funding source for your Customer, which will be done using Instant Account Verification (IAV). This method will give your Customers the ability to add and verify their bank account in a matter of minutes by authenticating with their online banking credentials. Once your Customer reaches the page in your application to add a bank account you’ll ask Dwolla’s server to generate an IAV token.

Generate a single-use IAV token for your Customer (view schema in ‘raw’) #

// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node
var customerUrl =

appToken.post(`${customerUrl}/iav-token`).then((res) => res.body.token); // => 'lr0Ax1zwIpeXXt8sJDiVXjPbwEeGO6QKFWBIaKvnFG0Sm2j7vL'

Then, you’ll pass this single-use IAV token to the client-side of your application where it will be used in the JavaScript function dwolla.iav.start. This token will be used to authenticate the request asking Dwolla to render the IAV flow. Before calling this function you’ll want to include dwolla.js in the HEAD of your page.

  <script src="https://cdn.dwolla.com/1/dwolla.js"></script>

Next, you’ll add in a container to the body of your page where you want to render the IAV flow.

<div id="mainContainer">
  <input type="button" id="start" value="Add Bank" />

<div id="iavContainer"></div>

Now that you have dwolla.js initialized on the page and the container created where you’ll render the IAV flow, you’ll create a JavaScript function that responds when clicking the “Add bank” button on your page. Once your Customer clicks “Add Bank”, your application will call dwolla.iav.start() passing in the following arguments: the iavContainer element where IAV will render, a string value of your single-use IAV token, and a callback function that will handle any error or response.

<script type="text/javascript">
  $('#start').click(function() {
    var iavToken = 'lr0Ax1zwIpeXXt8sJDiVXjPbwEeGO6QKFWBIaKvnFG0Sm2j7vL';
    dwolla.iav.start(iavToken, {
      container: 'iavContainer',
      stylesheets: [
      microDeposits: false,
      fallbackToMicroDeposits: false
    }, function(err, res) {
      console.log('Error: ' + JSON.stringify(err) + ' -- Response: ' + JSON.stringify(res));

Your Customer will complete the IAV flow by authenticating with their online banking credentials. Go through the IAV flow and add the checking account first.

IAV select account screen

You’ll know the bank account was successfully added and verified if you receive a JSON response in your callback that includes a link to the newly created funding source. We recommend storing the full URL for future use, as it will be needed for actions such as creating transfers.

Example success callback #

  "_links": {
    "funding-source": {
      "href": "https://api-sandbox.dwolla.com/funding-sources/80275e83-1f9d-4bf7-8816-2ddcd5ffc197"

Step 2B: Handle Webhooks #

If you have an active webhook subscription, you will receive the customer_funding_source_added webhook after the Customer goes through IAV.

On successful verification, you will receive the customer_funding_source_verified webhook.

Step 2C: Add Savings Account #

In the steps outlined above, we have walked through how to implement IAV and add a Customer's checking account. You will want to repeat these steps and add the savings account.

IAV savings account type select

Test in the Sandbox for free today.

Use sandbox environment to test API requests.

Get API Keys
2021 All Rights Reserved


  • About
  • Blog
  • Pricing
  • Contact Sales
  • Terms of Service
  • Privacy Policy
Financial institutions play an important role in our network.

Dwolla, Inc. is the operator of a software platform that communicates user instructions for funds transfers to our financial institution partners.

Dwolla is an agent of Veridian Credit Union. All ACH and Wire transfers are performed by Veridian Credit Union. Your Dwolla Balance, if any, is held in one or more pooled holding accounts held by Veridian Credit Union. These funds may not be eligible for share insurance by the National Credit Union Share Insurance Fund.

Sponsorship and Settlement of Push-to-Debit payment services provided by MetaBank®, N.A.
Push-to-Debit payments are typically available within 30 minutes.

Real-Time Payments are performed by Cross River Bank, which holds funds on behalf of the Receiver of such transactions in one or more pooled custodial accounts. These funds are not subject to FDIC pass-through deposit insurance.