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
typeproperty of the recipient must beLINKED_ACCOUNT - Include the
partyIdof the party who owns this account.
Sample request body:
{
"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:
{
"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 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":
{
"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":
{
"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:
{
"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:
{
"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:
{
"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:
| 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.