Language

Dwolla + Plaid Integration

Dwolla and Plaid are collaborating to offer Access API Partners a solution that enables customers to quickly and securely verify bank account ownership.

Using Plaid Link, your customers will authenticate information with their financial institution through Plaid, and select the bank or credit union account they wish to use for initiating bank transfers. Behind the scenes, you’ll receive a unique token from Plaid that will be used to create a funding source for a Customer via the Dwolla Access API. The Dwolla and Plaid partnership offers an elegantly designed and secure way for our joint customers to verify account ownership with access tokens, removing sensitive financial information from the transaction stream.

In this article we’ll cover the steps involved with obtaining a plaidToken, which will be sent to the Dwolla API in exchange for a funding source URL, used to identify a bank for an Access API Customer. To test the integration in the Sandbox, you’ll use your Plaid Sandbox Credentials along with your Dwolla Sandbox Credentials.

Quick overview

  • Register for a Plaid account and integrate with Plaid Link
  • Create a funding source for an Access API Customer using a plaidToken
  • Obtain and store a unique funding source URL that belongs to the Access API Customer

Screenshot of Dwolla and Plaid Integration

Using Plaid + Dwolla

To get started, verify that your Plaid account is enabled for the Dwolla integration. Your account will be automatically enabled for Plaid’s Sandbox and Development environments once you’ve created an account. Once your Plaid account is setup, add Plaid Link to your site.

A high-level overview of Plaid Link can be referenced below, however reference the Plaid documentation for more information on integrating with Plaid Link.

Plaid Link is handled completely on the client-side using JavaScript. Set up Link using only a few lines of Javascript, and then specify callbacks to handle the public_token after the user has authenticated and created an Item.

Plaid Link handles the entire onboarding flow securely and quickly, but does not actually retrieve data for the selected financial institution. Instead, the Link module returns a public_token and an account_id (an id representing a user selected account at their FI) via a callback.

This public token, along with the account id must be exchanged for a Plaid access_token by your back-end server making a call to the Plaid API. Finally, you’ll send the access_token and account_id to the Plaid API in exchange for a Dwolla processor_token which will be sent to the Dwolla API in the next step.

Step 2 - Create a funding source for a Customer using a plaidToken

This step assumes you’ve created an Access API Customer for the user that you’ve authenticated or will authenticate with Plaid. Using the processor_token obtained from the previous step, you’ll pass this in as the value of the plaidToken request parameter; along with a funding source name in the request to create a funding source for a Customer.

Request and response (view schema in ‘raw’)
POST https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C/funding-sources
Content-Type: application/vnd.dwolla.v1.hal+json
Accept: application/vnd.dwolla.v1.hal+json
Authorization: Bearer pBA9fVDBEyYZCEsLf/wKehyh1RTpzjUj5KzIRfDi0wKTii7DqY

{
  "plaidToken": "processor-sandbox-161c86dd-d470-47e9-a741-d381c2b2cb6f",
  "name": "Jane Doe’s Checking"
}

...

HTTP/1.1 201 Created 
Location: https://api-sandbox.dwolla.com/funding-sources/375c6781-2a17-476c-84f7-db7d2f6ffb31
customer_url = 'https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C'
request_body = {
  plaidToken: 'processor-sandbox-161c86dd-d470-47e9-a741-d381c2b2cb6f',
  name: 'Jane Doe’s Checking'
}

# Using DwollaV2 - https://github.com/Dwolla/dwolla-v2-ruby (Recommended)
funding_source = app_token.post "#{customer_url}/funding-sources", request_body
funding_source.headers[:location] # => "https://api-sandbox.dwolla.com/funding-sources/375c6781-2a17-476c-84f7-db7d2f6ffb31"
/**
 * No example for this language yet.
 **/
customer_url = 'https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C'
request_body = {
  'plaidToken': 'processor-sandbox-161c86dd-d470-47e9-a741-d381c2b2cb6f',
  'name': 'Jane Doe’s Checking'
}

# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python (Recommended)
customer = app_token.post('%s/funding-sources' % customer_url, request_body)
customer.headers['location'] # => 'https://api-sandbox.dwolla.com/funding-sources/375c6781-2a17-476c-84f7-db7d2f6ffb31'
var customerUrl = 'https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C';
var requestBody = {
  'plaidToken': 'processor-sandbox-161c86dd-d470-47e9-a741-d381c2b2cb6f',
  'name': 'Jane Doe’s Checking'
};

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

Step 3 - Obtain a funding source URL that belongs to the Access API Customer

Once you’ve received a successful response from the Access API, you’ll use the unique funding source URL to identify the customer’s bank when initiating ACH transfers.


Financial institutions play an important role in the Dwolla network.

Dwolla, Inc. is an agent of Veridian Credit Union and Compass Bank and all funds associated with your account in the Dwolla network are held in pooled accounts at Veridian Credit Union and Compass Bank. These funds are not eligible for individual insurance, including FDIC insurance and may not be eligible for share insurance by the National Credit Union Share Insurance Fund. Dwolla, Inc. is the operator of a software platform that communicates user instructions for funds transfers to Veridian Credit Union and Compass Bank.