Skip to main content
Embedded Payments

Link your client's external bank account

In the Embedded Finance Payments API, a linked account is a type of recipient, and you use the recipients resource to add and manage them. 

A linked account is an external bank account that belongs to your client. This is a validated account associated with your client’s profile that you can use to make payments to your client from their Embedded Payments account.  Linked accounts are required for payout from a LIMITED_DDA and an optional recipient type that can be used to make payments from your client’s LIMITED_DDA_PAYMENTS account.

You can refer to Add third party payee as a recipient to understand how your client can make business payments to others using their LIMITED_DDA_PAYMENTS account.

About linked account validation

When you add a recipient of this type, the name and details are checked using an Account Validation Service (AVS). This means the account is checked to ensure it belongs to the named party, and that it can receive payments. In some cases, your client may be asked to complete a verification exercise, which is detailed in this guide. 

Add your client's linked account using partyId

You add a linked account using a POST /recipients request, referencing the partyId of the party who holds the external account. In your request: 

  • The type property of the recipient must be LINKED_ACCOUNT
  • Include the partyId of the party who owns this account. 

Sample request body:

POST /recipients
{
   "partyId": "2000000111",
   "account": {
      "number": "0182119492",
      "type": "CHECKING",
      "routingInformation": [
         {
            "routingNumber": "122199983",
            "transactionType": "ACH",
            "routingCodeType": "USABA"
         }
      ],
      "countryCode": "US"
   },
   "type": "LINKED_ACCOUNT",
   "clientId": "1000010400"
}

Successful response showing that a linked account has been added and can be paid into using Embedded Payments: 

Sample response
{
  "clientId": "1000010400",
  "partyId": "2000000111",
  "id": "d9dab78e-e366-4dde-ac9d-fb3f9d48437b",
  "partyDetails": {
    "address": {
      "addressLine1": "90 Bedford Street",
      "addressLine2": "Apt 2E",
      "city": "New York",
      "countryCode": "US",
      "state": "NY",
      "postalCode": "10014"
    },
    "firstName": "Monica",
    "lastName": "Gellar",
    "type": "INDIVIDUAL",
    "contacts": [
      {
        "contactType": "PHONE",
        "countryCode": "+1",
        "value": "6316215110"
      }
    ]
  },
  "account": {
    "number": "0182119492",
    "type": "CHECKING",
    "routingCodeType": "USABA",
    "routingNumber": "122199983",
    "countryCode": "US"
  },
  "recipientType": "LINKED_ACCOUNT",
  "status": "ACTIVE",
  "createdAt": "2023-02-22T15:05:46.952+0000"
}

Add a linked account without partyId

If you don't know the partyId, you can use the account owner's name instead. This can be the first and last name of an individual or the business name as it appears on the account. The names provided must match the relevant names of the party details held by J.P. Morgan from your onboarding process:

{
   "partyDetails": {
      "type": "INDIVIDUAL",
      "firstName": "Monica",
      "lastName": "Gellar"
   },
   "account": {
      "number": "0182119492",
      "type": "CHECKING",
      "routingInformation": [
         {
            "routingNumber": "541798298",
            "transactionType": "ACH",
            "routingCodeType": "USABA"
         }
      ],
      "countryCode": "US"
   },
   "type": "LINKED_ACCOUNT",
   "clientId": "1000010400"
}

Add multiple transaction methods

Validation of linked accounts sometimes requires microdeposits issued via ACH rails. To support this, your platform must ensure that all required information is provided to enable ACH payments when setting up a linked account for your client. This includes ACH routing numbers.

If you wish to use wire transfers or Real Time Payments (RTP) methods, you may need to include additional details about the recipient, as well as additional routing codes.  You can add wire transfers or RTP as optional methods of payment at time of linked account creation or update the linked account with the appropriate routing numbers for those payment methods once created.

At a glance, the minimum details of a linked account holder for each payment type are:

  • Wire transfer:
    • Individual or business name. This name must exactly match the name of a business onboarded to Embedded Payments or its owners. 
    • Country code.
    • Address including City, State, Postal Code.
    • Routing and account numbers.
  • ACH or direct payment:
    • Individual or business name. This name must exactly match the name of a business onboarded to Embedded Payments or its owners. 
    • Country code.
    • Routing and account numbers.
    • Account type (Checking or Savings).
  • RTP:
    • Individual or business name. This name must exactly match the name of a business onboarded to Embedded Payments or its owners. 
    • Country code.
    • Routing and account numbers.

Table of mandatory fields for a linked account recipient

Mandatory fields by payment type
Mandatory recipient fields Required by Payment types
Recipient type (Individual or Business) All
First name All if recipient is an individual
Last name All if recipient is an individual
Business name All if recipient is a business
Address line 1 Wire only
City Wire only
State Wire only
County Wire only
Country code All
Account type (checkings or savings) ACH only
   

Routing Numbers

A linked account can have between 1-3 different routing numbers for ACH, Wire and RTP payments respectively. You can represent routing numbers and related information in the routingInformation object. Each routing number consists of:

  • transactionType: the type of transaction. This can be RTP, ACH or WIRE
  • routingCodeType: always USABA
  • routingNumber: the routing number for this payment type

Verify a linked account with microdeposits

When you add a linked account for your client, a verification process is triggered. In most cases, this is a quick, automated check to make sure that the account is valid and that it belongs to your client.

The validation can be tracked in the status field of the response to a POST /recipients request. Most accounts are validated immediately, but sometimes you need to provide additional confirmation from your client.

In this case, two microdeposits (small undisclosed sums) are paid into the proposed linked account. Your client then needs to check the linked account and confirm the exact amount of each microdeposit. This confirms that your client has access to the linked account, and it can be validated.

Here's how the flow works from a user experience perspective:

1. Your client adds a new linked account, which you pass using POST /recipients with the type: "LINKED_ACCOUNT" as described in the sample payload above.

2. The 200 response contains status: "MICRODEPOSITS_INITIATED":

POST /recipients with the recipientType: "LINKED_ACCOUNT"
{
  "id": "1051cd27-1957-4619-9ab5-c6f6dcb31d31",
  "partyDetails": {
    "type": "INDIVIDUAL",
    "firstName": "Monica",
    "lastName": "Gellar",
    "businessName": null,
    "contacts": null
  },
  "partyId": "2000000111",
  "account": {
    "number": "93991289052",
    "type": "CHECKING",
    "routingInformation": [
      {
        "routingNumber": "122199983",
        "transactionType": "ACH",
        "routingCodeType": "USABA"
      }
    ],
    "countryCode": "US"
  },
  "type": "LINKED_ACCOUNT",
  "status": "MICRODEPOSITS_INITIATED",
  "clientId": "1000010400",
  "createdAt": "2024-08-27T16:50:50.870205533Z",
  "updatedAt": "2024-08-27T16:50:50.870210024Z",
  "accountValidationResponse": null
}

3. Two small deposits are made into your client's linked account, followed by one withdrawal (totaling the amount of the two deposits). This may take up to 3-5 business days to appear in your client's account.

4. The status of the linked account is updated to READY_FOR_VALIDATION, which can be checked with the GET /recipients/{id} endpoint.

5. You inform your client that the verification process has started. You explain that in 3-5 business days, they will be able to provide answers to verification questions about their account.

6. Through your UI, you advise your client that two microdeposits have been made into their account. For example, "Two low-value transactions have been made to your new linked account. Please check your account balance, and enter the value of each microdeposit here." Your client can then confirm the value of the two deposits for you to send via the API.

7. Your client's verification response must be sent within 20 business days after the microdeposits process has been initiated. You send your client's answer in the body of a POST /recipients/{id}/verify-microdeposit.request:

{
  "amounts": [
    0.51,
    0.75
  ]
}

8. The response to POST /recipients/{id}/verify-microdeposit is returned with status: "VERIFIED":

POST /recipients/{id}/verify-microdeposit
{
"status": "VERIFIED"
}

9. You have completed the microdeposits verification. Your client can now make transactions to their linked account.

Linked account verification failure

If your client does not correctly answer the microdeposits verification question, the response to a POST /recipients/{id}/verify-microdeposit request is:

POST /recipients/{id}/verify-microdeposit
{
"status": "FAILED"
}

In this case, you can present your client with a user experience to try again.

They can have a maximum of 3 attempts.

After 3 attempts, if your client still fails to answer the question correctly, the response to: POST /recipients/{id}/verify-microdeposit request is:

POST /recipients/{id}/verify-microdeposit
{
"status": "FAILED_MAX_ATTEMPTS_EXCEEDED"
}

If your client exceeds the maximum attempts and still answers incorrectly the recipient status will be updated to show as REJECTED in a request to GET /recipients/{id}

{
  "id": "1051cd27-1957-4619-9ab5-c6f6dcb31d31",
  "partyDetails": {
    "type": "INDIVIDUAL",
    "firstName": "Monica",
    "lastName": "Gellar",
    "businessName": null,
    "contacts": null
  },
  "partyId": "2000000111",
  "account": {
    "number": "93991289052",
    "type": "CHECKING",
    "routingInformation": [
      {
        "routingNumber": "122199983",
        "transactionType": "ACH",
        "routingCodeType": "USABA"
      }
    ],
    "countryCode": "US"
  },
  "type": "LINKED_ACCOUNT",
  "status": "REJECTED",
  "clientId": "1000010400",
  "createdAt": "2024-08-27T16:50:50.870205533Z",
  "updatedAt": "2024-08-27T16:50:50.870210024Z",
  "accountValidationResponse": null
}

To resolve this, you must re-initiate the linked account process for your client. Your client can use the same account number or a different account number to link to their account.

Update routing information for an existing linked account

You may need to update details about a linked account to allow additional payment methods, such as wire or RTP transactions.

You can update details about a recipient using POST /recipients/{id}. In the payload, you  need to include all transaction type details in the account object you wish to add, including existing transaction type details.

In this example, a new wire and RTP routing numbers are added to a linked account:

{
"account": {
      "number": "0182119492",
      "type": "CHECKING",
      "routingInformation": [
         {
            "routingNumber": "021000021",
            "transactionType": "ACH",
            "routingCodeType": "USABA"
          }, {
            "routingNumber": "021000021",
            "transactionType": "WIRE",
            "routingCodeType": "USABA"
        }, {
            "routingNumber": "021000021",
            "transactionType": "RTP",
            "routingCodeType": "USABA"
         }
      ],
      "countryCode": "US" 
} 
}

Response: 

{
    "id": "d9dab78e-e366-4dde-ac9d-fb3f9d48437b",
    "partyDetails": {
        "address": {
            "addressType": null,
            "addressLine1": "90 Bedford Street",
            "addressLine2": "Apt 2E",
            "addressLine3": null,
            "city": "New York",
            "state": "NY",
            "postalCode": "10014",
            "countryCode": "US"
        },
        "type": "ORGANIZATION",
        "firstName": null,
        "lastName": null,
        "businessName": "Central Park Getaways",
        "contacts": [
            {
                "contactType": "EMAIL",
                "countryCode": null,
                "value": "monica@cpgetaways.com"
            },
            {
                "contactType": "PHONE",
                "countryCode": "+1",
                "value": "6316215110"
            }
        ]
    },
    "partyId": "2000000111",
    "account": {
        "number": "122199983",
        "type": "CHECKING",
        "routingInformation": [
            {
                "routingNumber": "021000021",
                "transactionType": "RTP",
                "routingCodeType": "USABA"
            },
            {
                "routingNumber": "021000021",
                "transactionType": "WIRE",
                "routingCodeType": "USABA"
            },
            {
                "routingNumber": "021000021",
                "transactionType": "ACH",
                "routingCodeType": "USABA"
            }
        ],
        "countryCode": "US"
    },
    "type": "LINKED_ACCOUNT",
    "status": "ACTIVE",
    "clientId": "1000010400",
    "createdAt": "2024-11-20T14:17:34.664478Z",
    "updatedAt": "2024-11-20T14:18:29.856377Z",
    "accountValidationResponse": null
}

Remove a linked account

Your client can create one or multiple linked accounts at any given time. In order for your client to receive settlement from a LIMITED_DDA, your client must have at least one linked account operational. If your client wants to remove the external account, change the status of the linked account to "INACTIVE".

You can update the status of a linked account with a request to POST /recipients/{id}, with only the status field populated:

9rejected
{
"status": "INACTIVE"
}

You can then add a new linked account in using the method described in this documentation. 

Reference

The following parameters are used in the recipients resource: 

Parameter used in Recipients resource
Field name Description Format Example
clientId Unique client identifier <= 10 characters 0030000132
type Recipient type to return Enum:  "LINKED_ACCOUNT"  LINKED_ACCOUNT
limit Number of records per page (defaults to 25) [1 .. 25] 25
page Page number (defaults to 0) >=0 2
number Demand deposit account number <=35 characters 0182119492
type Type of bank account (checking or savings). Only required for ACH payments. Exclude field from payload completely if not needed Enum: "CHECKING" / "SAVINGS" CHECKING
countryCode Two letter country code (only US is supported at this time) "US" US
id A unique identifier for a recipient 32 characters 5e64a59d650842cfbabd4efd1f4d1556
routingCodeType Type of routing code (only USABA is currently supported) "USABA" USABA
routingNumber Routing number corresponding to the routing code (only USABA compliant routing numbers are currently supported) 9 digits 541798298
addressType Type of address (e.g. 'Primary Residence' | 'Principal place of business')  
Primary Residence
addressLine 1 Must not be a PO Box and must begin with a number <=34 characters  90 Bedford Street
addressLine 2  
<=34 characters  Apt 2E
addressLine 3  
<=34 characters   
city  
<=34 characters  New York
state State code in alpha-2 format <=30 characters NY
postalCode Postal/ZIP code <=10 characters 10014
countryCode Two letter country code based on ISO 3166 standard (only US is currently supported)  
US
type  
Enum: "INDIVIDUAL" / "ORGANIZATION" INDIVIDUAL
firstName Recipient's first name. Mandatory for recipient type INDIVIDUAL <=70 characters Monica
lastName Recipient's last name. Mandatory for recipient type INDIVIDUAL <=70 characters Gellar
businessName Recipient company name. Mandatory for recipient type ORGANIZATION <=140 characters Company Inc
contactType Type of contact information being provided Enum: "EMAIL" / "WEBSITE" / PHONE" PHONE
countryCode E.164 format compatible telephone country code <=3 digits +1
value Contact information corresponding to contactType: PHONE (E.164-compliant telephone number (excluding country code)) EMAIL (addr-spec in Section 3.4 of RFC 5322), WEBSITE (URL starting with http:// or https://) [ 1 .. 2048 ] characters 6316215110
recipientId A unique identifier for a recipient 32 characters 5e64a59d650842cfbabd4efd1f4d1556

Next steps

Now you can make a payout to your client's linked account.