Bank Account Linking

ACH and RTP payments require linking and verifying a customer's bank account before any money moves.

zerohash leverages Plaid for linking and authenticating ownership of your customers external bank accounts for deposit/withdrawal functionality, leveraging ACH and RTP.

To help choose between the two Plaid models offered, here are some important steps to consider:

StepsPlaid ResellerPlaid Processor Token
ContractingContract with zerohash onlyContract with zerohash and Plaid directly
Plaid KYB approvalzerohash white glove serviceDo it yourself
Plaid environment configurationNot requiredSet up Plaid production and sandbox environments, enable zerohash integration with Plaid
Verify & link end customer bank accountsInvoke zerohash SDKInvoke Plaid SDK, create Plaid processor token, create external accounts through zerohash API
Manage end customer bank accountsInvoke zerohash SDK or call zerohash APIInvoke Plaid SDK, create Plaid processor token, update external accounts through zerohash API

Need help deciding? Contact your zerohash relationship manager, who can walk you through your options.

Plaid Reseller

🔁Plaid Reseller (zerohash Powered Plaid Link)

Contract Plaid services through zerohash and get access to bank account verification services through our SDK.

Onboarding with Plaid

A zerohash relationship manager will coordinate with platforms to gather all necessary information and handle the Plaid KYB verification process from start to finish on their behalf. This process must be completed before platforms can start invoking the zerohash SDK to verify and link end customer’s accounts.

Using the zerohash SDK

Once Plaid onboarding has been completed, platforms can invoke the zerohash SDK with appIdentifier: FIAT_ACCOUNT_LINK to link and manage end customers’ bank accounts. See the example below for how to implement this in a React application. Keep in mind that if you're using a Native Mobile App (Swift, Flutter, etc) instead of using zh-web-sdk you should follow the WebView approach, described here:

import React from 'react';
import ZeroHashSDK, { AppIdentifier } from 'zh-web-sdk';

const App = () => {
  const sdk = new ZeroHashSDK({
    zeroHashAppsURL: "https://web-sdk.cert.zerohash.com",
    PAYJWT: "<JWT_TOKEN_HERE>" 
  });

    sdk.openModal({
    appIdentifier: FIAT_ACCOUNT_LINK, 
  })
  return <></>;
}

export default App;

The Plaid Link UX is wrapped within the zerohash SDK, delivering a streamlined bank account verification and linking process for end customers.

Accept T's and C's

First time users will need to accept the zerohash terms and conditions.

Link a bank account

End customers verify and link their external bank accounts. On success, zerohash will create a corresponding external account and return an external_account_id to the platform which can be stored by platforms and referenced for future payment requests. Adding a bank account is a one-time process for an end customer that verifies account ownership, so it is not something a customer has to do every time they want to initiate a transaction.

📘

There is a limit on external accounts linked to a participant

There is a default limit of three accounts linked per participant. If you need to change this, please contact your account manager.

Successful Bank Account Link

Once an end user has successfully verified and linked their external account, we’ll send you a webhook that looks like this:

{
  "request_id": "0f68333e-2114-469d-b505-c850d776e063",
  "participant_code": "CUST01",
  "platform_code": "TES123",
  "account_nickname": "",
  "status": "approved",
  "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
  "created_at": "1975-08-19T23:15:30.000Z"
}

Managing accounts linked via zerohash SDK

Platforms leveraging zerohash’s Fiat products should subscribe to webhooks to stay notified of external account updates, and can fetch external account details at any time.

Querying accounts

Platforms can fetch linked external accounts via API using the GET /payments/external_accounts endpoint.

Expired accounts

When an external account has expired, platforms will receive the following webhook:

{
  "request_id": "0f68333e-2114-469d-b505-c850d776e063",
  "participant_code": "CUST01",
  "platform_code": "TES123",
  "account_nickname": "",
  "status": "expired",
  "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
  "created_at": "1975-08-19T23:15:30.000Z"
}

Platforms can invoke the zerohash SDK for re-linking:

import React from 'react';
import ZeroHashSDK, { AppIdentifier } from 'zh-web-sdk';

const App = () => {
  const sdk = new ZeroHashSDK({
    zeroHashAppsURL: "https://web-sdk.cert.zerohash.com",
    PAYJWT: "<JWT_TOKEN_HERE>" 
  });

    sdk.openModal({
    appIdentifier: FIAT_ACCOUNT_UPDATE, 
  })
  return <></>;
}

export default App;

Revoked accounts

When an external account has revoked, platforms will receive the following webhook:

{
  "request_id": "0f68333e-2114-469d-b505-c850d776e063",
  "participant_code": "CUST01",
  "platform_code": "TES123",
  "account_nickname": "",
  "status": "revoked",
  "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
  "created_at": "1975-08-19T23:15:30.000Z"
}

Platforms can invoke the zerohash SDK for end customers to link a new account:

import React from 'react';
import ZeroHashSDK, { AppIdentifier } from 'zh-web-sdk';

const App = () => {
  const sdk = new ZeroHashSDK({
    zeroHashAppsURL: "https://web-sdk.cert.zerohash.com",
    PAYJWT: "<JWT_TOKEN_HERE>" 
  });

    sdk.openModal({
    appIdentifier: FIAT_ACCOUNT_LINK, 
  })
  return <></>;
}

export default App;

Close an account

Platforms can close linked external accounts via API with REST endpoint POST payments/external_accounts/{external\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_account\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_id}/close

Plaid Processor Token

➡️Plaid Processor Token (Self Service Plaid Link)

Contract with Plaid directly for the required products (Auth, Balance, Identity, and Identity Match) to link end customer bank accounts through a tokenized solution.

Onboarding with Plaid

To kick things off:

  1. Set up a Plaid production or sandbox account.
  2. Enable zerohash as an integration in your Plaid account settings (Developers > Integrations > search for Zero Hash). Your Plaid Account Manager can assist.

If you need an intro to Plaid please contact your zerohash relationship manager, who can expedite the agreement process.

The most integral implementation lift is linking the end customer account and exchanging it for a token that is shareable with zerohash. This will require a series of Plaid calls* for a platform:

  1. /link/token/create
    1. Plaid's Auth service allows customers to sign in to their bank via the Plaid interface and authorize linking their bank account. This gives you tokenized access to the customer's bank account for debits and credits.
    2. Note: You can also offer manual account linking (account and routing number entry), which can take 1-2 days and requires slight changes to the Auth configuration.
  2. /item/public_token/exchange
  3. /processor/token/create

Once the processor token is created and shared with zerohash, via Create external accounts zerohash can connect the end customer bank account and initiate transactions.

*The listed calls are the minimum calls required to Plaid. To take advantage of the partnerships, you must contract for balance and identity as well, but zerohash can handle the calls.

Adding a bank account is a one-time process for an end customer that verifies account ownership, so it is not something a customer has to do every time they want to initiate an ACH transaction.

Contract Plaid

In order to use ACH or RTP via zerohash, platforms must have the following products enabled with Plaid. Auth and Identity calls are billed to platforms, but zerohash is permitted to access this data thanks to the processor token model.

Product NameReason
AuthEnables platforms to connect end customer bank accounts.
BalanceEnables zerohash to check current and pending bank account balances prior to executing a transaction. This check is done by zerohash for each transaction request. If the platform also chooses to do balance checks, the platform will be charged for their check, and for the check by zerohash.
Identity

Enables zerohash to verify that the participant name matches the name on the bank account. This check is done by zerohash whenever an external account is linked. This check can also be done by platforms, and there will only be one charge to the platform from Plaid.

Also referred to as identity match.
Note: This is different from identity verification, which is not a requirement.

Using the zerohash API

Once a Plaid onboarding has been completed, platforms can use Plaid processor tokens to link end customers’ bank accounts through the zerohash API. zerohash uses the platform supplied Plaid processor token to set up an account via Create external accounts. zerohash returns an external_account_id to the platform which can be used for later payment requests without needing to link another account. Platforms may also Get external accounts if the external_account_id is needed.

📘

There is a limit on external accounts linked to a participant

There is a default limit of three accounts linked per participant. If you need to change this, please contact your account manager.

zerohash API Calls

Request body

ParameterDescriptionType
participant_codeThe code of the participant that wants to create a new ACH transaction, required.string
account_nickname

Name given to the account. This does not impact further zerohash functionality so it is purely for platform reference, required.

For testing only: To simulate identity checks and get a rejected account, use this content: '{"name":0, "email": 0, "address": 0}'

string
plaid_processor_tokenToken retrieved from Plaid that enables zerohash to make API calls on the platform’s behalf, required.string

Additional fields in response

ParameterDescriptionType
request_idThe unique identifier generated by zerohash associated with the request.string
platform_codePlatform unique identifier.string
external_account_idThe unique identifier generated by zerohash for the account. This must be stored and used to make subsequent payment requests.string
account_typeIndicates if the account is checking or savings.string
created_atTimestamp when the account was created.UNIX timestamp

Create, Link, and Manage Bank Accounts via zerohash API

Platforms leveraging zerohash’s fiat products should subscribe to webhooks to stay notified of external account updates, and can fetch external account details at any time.

Create an external account

After end customers verify their bank account details through Plaid, the platform uses the returned plaid_processor_token to create an external account via API.

Querying accounts

Platforms can fetch linked external accounts via API using the GET /payments/external_accounts endpoint.

Expired accounts

When an external account has expired, platforms will receive the following webhook:

{
  "request_id": "0f68333e-2114-469d-b505-c850d776e063",
  "participant_code": "CUST01",
  "platform_code": "TES123",
  "account_nickname": "",
  "status": "expired",
  "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
  "created_at": "1975-08-19T23:15:30.000Z"
}

Platforms can re-verify end customers bank account details through Plaid and use the returned plaid_processor_token to create an external account via API.

Revoked accounts

When an external account has revoked, Platforms will receive the following webhook:

{
  "request_id": "0f68333e-2114-469d-b505-c850d776e063",
  "participant_code": "CUST01",
  "platform_code": "TES123",
  "account_nickname": "",
  "status": "revoked",
  "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
  "created_at": "1975-08-19T23:15:30.000Z"
}

Platforms can re-verify end customers bank account details through Plaid and use the returned plaid_processor_token to create an external account via API.

Close an account

Platforms can close linked external accounts via API with REST endpoint POST payments/external_accounts/{external\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_account\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\_id}/close


Managing linked accounts API Workflow

Whether created via SDK with Plaid Reseller, or created directly through the zerohash API with Plaid Processor Token, external accounts can always be managed by platforms through the zerohash API.


Create external account

POST /payments/external_accounts

This API call is only relevant to platforms using Plaid Processor Token. Platforms using Plaid Reseller should invoke the zerohash SDK to link a new bank account.

Sample Request

{
    "message": {
        "participant_code": "ABC123",
        "account_nickname": "Chase",
        "plaid_processor_token": "db884a3e-7eb7-4253-92ee-04ff5efbc365"
    }
}

Sample Response

{
    "message": {
        "request_id": "0f65678e-2114-469d-b505-c850d776e078",
        "participant_code": "ABC123",
        "platform_code": "XYZ789",
        "account_nickname": "Chase",
        "account_type": "checking",
        "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
        "created_at": 1561996924964
    }
}

Close external accounts

POST /payments/external_accounts/{external\\\\\\\\\\\\\\\_account\\\\\\\\\\\\\\\_id}/close

This enables removing a customer bank account so it cannot be used with zerohash any longer.

Sample response

{
    "message": {
        "request_id": "0f65678e-2114-469d-b505-c850d776e078",
        "participant_code": "ABC123",
        "platform_code": "XYZ789",
        "account_nickname": "Chase",
        "account_type": "checking",
        "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
        "status": "closed",
        "created_at": 1561996924964
    }
}

Get external accounts

External account updates can be fetched via API, and received via external account status webhooks.

Query parameters include

  • page: (optional) the page you would like to request – default value is 1
  • size: (optional) the number of records per page – default value is 200
  • participants: (optional) array of the participants for which to filter the result

Returns an array of all accounts that have been posted for ACH transactions.

Response parameters

ParameterDescriptionType
request_idThe unique identifier generated by zerohash associated with the request.string
account_numberThe full bank account number of the external account. Value will be empty because of the Plaid token relationship.string
routing_numberThe routing number of the bank where the external account is held. Value will be empty because of the Plaid token relationship.string
participant_codeThe code of the participant that wants to create a new ACH transaction, required.string
platform_codePlatform unique identifier.string
account_nicknameName given to the account. This does not impact further zerohash functionality so it is purely for platform reference.string
account_typeIndicates if the account is checking or savings.string
statusAccount status. Could be one of the following:
pending approved rejected locked disabled closed
string
external_account_idThe unique identifier generated by zerohash for the account. This must be stored and used to make subsequent payment requests.string
created_atTimestamp when the account was created.timestamp
updated_atTimestamp when the account was last changed.timestamp

Sample response

{
    "message": [
        {
            "request_id": "0f68333e-2114-469d-b505-c850d776e063",
            "account_number": "",
            "routing_number": "",
            "participant_code": "ALI123",
            "platform_code": "TES123",
            "account_nickname": "test1",
            "account_type": "checking",
            "external_account_id": "0f68333e-2114-469d-b505-c850d776e063",
            "created_at": "1975-08-19T23:15:30.000Z",
            "updated_at": "1975-08-19T23:15:30.000Z"
        }
    ],
    "page": 1,
    "total_pages": 1,
    "page_size": 200,
    "count": 10
}

Did this page help you?