---
agentTools:
  projectIndex: https://docs.bond.tech/v0/llms.txt
---

# Guide to linking external accounts

Overview of the steps to take to link a card account to an external account.

[block:api-header]
{
  "title": "Overview"
}
[/block]

The <a href="ref:accounts" target="_blank">Accounts</a> API allows you to link a customer's Bond card to their verified external bank account. Once the external account has been linked, the customer can then transfer funds back and forth between their card account and the external account. Once the link is established, we use the `linked_account_id` identifier to represent the customer's external account.

[block:callout]
{
  "type": "info",
  "title": "Verification",
  "body": "An external account can only be linked once it has been verified. This verification takes place as part of the linking process. The type of verification performed depends on the institution the account is held with."
}
[/block]

The following graphic depicts the overall linking process flow and fund transfer.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/9b82d58-Guides_Graphic_-_Guide_to_linking_external_accounts.png",
        "Guides Graphic - Guide to linking external accounts.png",
        1441,
        322,
        "#f0ebd3"
      ]
    }
  ]
}
[/block]

The linking process comprises the following steps:

1. Start the <a href="doc:external-accounts-sdk" target="_blank">Linking external accounts SDK</a> and provide details of the customer's Bond card account.
2. From the returned list of options, select the required institute.
3. The customer enters their external account details.
   The request is either approved or needs to be verified as described below. See [table below](https://docs.bond.tech/docs/guide-to-linking-external-accounts#account-verification) for verification methods.
4. Once these steps have been successfully completed, the customer's external bank account can be used for making <a href="ref:post_transfers" target="_blank">transfers</a>.

For examples of how to use the Linking external account SDK, see <a href="ref:post_plaid_linked_account" target="_blank">Linking external accounts SDK</a>.

[block:api-header]
{
  "title": "Account verification"
}
[/block]

Each of the available methods for verification depends on the intuition. Each method falls into one of these categories:

* Instant—Your customer enters their bank details during the linking process.
* Automatic—The process performs a micro-deposit and automatically verifies the deposit.
* Manual—The process makes two micro-deposits which then need to be manually verified by the customer.

The following graphic depicts the verification options depending on the institution selected.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/d25fb99-methods.png",
        "methods.png",
        512,
        328,
        "#f8f9f9"
      ]
    }
  ]
}
[/block]

The following table describes the verification methods, their types, and how they are work.

[block:parameters]
{
  "data": {
    "h-0": "Verification method",
    "h-1": "Type",
    "0-0": "Instant auth",
    "1-0": "Instant match",
    "2-0": "Automated micro-deposits",
    "4-0": "Unverifiable",
    "0-1": "Instant",
    "1-1": "Instant",
    "2-1": "Automatic",
    "4-1": "",
    "3-0": "Same-day micro-deposits",
    "3-1": "Manual",
    "4-2": "Used in a case where a user wants to send a transfer to an external account that is not their own.",
    "3-2": "Used for institutions that don't support Instant Auth, Instant Match, or Automated Micro-deposit verification. Plaid makes two deposits that post within one business day (using Same Day ACH). Users are instructed to manually verify the deposited amounts within one business day. Expires and needs to be renewed.",
    "2-2": "Plaid makes a single micro-deposit and then automatically verifies it within one to two business days. Expires and needs to be renewed.",
    "1-2": "When using Instant Match, your user is prompted to enter their account number and routing number. The last four digits of the user-provided account number are verified against the account mask retrieved from the financial institution. Instant match is automatically provided at supported institutions as a fall-back method when Instant Auth is not available.",
    "0-2": "The default Auth flow during which the customer selects their banking institution and provides their login credentials. Does not require extra configuration steps if Auth is already configured in your app. Supports more than 3,800 financial institutions with credential-based logins.",
    "h-2": "Description",
    "h-3": "Restrictions",
    "1-3": "",
    "4-3": "Does not support transaction history.",
    "3-3": "Does not support transaction history."
  },
  "cols": 4,
  "rows": 5
}
[/block]

[block:api-header]
{
  "title": "Link Account without Verification"
}
[/block]

Link and transfer funds to a third-party account that you cannot verify.

To link an unverifiable account, use the `POST /accounts` operation and provide the body parameters as shown in the table below.

[block:parameters]
{
  "data": {
    "h-0": "Parameter",
    "h-1": "Type",
    "h-2": "Description",
    "2-0": "`account_number`\n<b><sup>required</sup></b>",
    "0-0": "`type`\n<b><sup>required</sup></b>",
    "0-1": "enum",
    "0-2": "default is: `migrate_account`",
    "1-0": "`customer_id`\n<b><sup>required</sup></b>",
    "1-1": "string",
    "1-2": "`customer_id` to which you will be linking this account",
    "2-1": "string",
    "2-2": "account number for banking institution",
    "5-0": "`bank_name`\n<b><sup>required</sup></b>",
    "5-1": "string",
    "5-2": "Freeform, alphanumeric name of the external bank account being linked, for example `Casino Royale`",
    "3-0": "`routing_number`\n<b><sup>required</sup></b>",
    "4-0": "`account_type`\n<b><sup>required</sup></b>",
    "4-1": "enum",
    "4-2": "`checking` or `savings`",
    "3-1": "string",
    "3-2": "routing number for banking institution"
  },
  "cols": 3,
  "rows": 6
}
[/block]

An example of a request to link an external account is shown below.

[block:code]
{
  "codes": [
    {
      "code": "curl --location --request POST 'https://sandbox.bond.tech/api/v0/accounts' \\\n--header 'Content-Type: application/json' \\\n--header 'Identity: <YOUR_IDENTITY>' \\\n--header 'Authorization: <YOUR_AUTHORIZATION>' \\\n--data-raw '{\n    \"customer_id\": \"7951dd8d-e1f9-4d93-b96c-58e2659694ab\",\n    \"type\":\"migrate_account\", \n    \"account_number\": \"123456789\", \n    \"routing_number\": \"987654321\", \n    \"link_type\": \"bond\",\n    \"bank_account_type\": \"checking\", \n    \"bank_name\": \"Chase\"\n}\n'",
      "language": "curl",
      "name": "cURL"
    },
    {
      "code": "require \"uri\"\nrequire \"json\"\nrequire \"net/http\"\n\nurl = URI(\"https://sandbox.bond.tech/api/v0/accounts\")\n\nhttps = Net::HTTP.new(url.host, url.port)\nhttps.use_ssl = true\n\nrequest = Net::HTTP::Post.new(url)\nrequest[\"Content-Type\"] = \"application/json\"\nrequest[\"Identity\"] = \"<YOUR_IDENTITY>\"\nrequest[\"Authorization\"] = \"<YOUR_AUTHORIZATION>\"\nrequest.body = JSON.dump({\n  \"customer_id\": \"0e510520-4ed9-4748-90d7-f6120b391b26\",\n  \"type\": \"migrate_account\",\n  \"account_number\": \"123456789\",\n  \"routing_number\": \"987654321\",\n  \"link_type\": \"bond\",\n  \"bank_account_type\": \"checking\",\n  \"bank_name\": \"Chase\"\n})\n\nresponse = https.request(request)\nputs response.read_body\n",
      "language": "ruby"
    },
    {
      "code": "var myHeaders = new Headers();\nmyHeaders.append(\"Content-Type\", \"application/json\");\nmyHeaders.append(\"Identity\", \"<YOUR_IDENTITY>\");\nmyHeaders.append(\"Authorization\", \"<YOUR_AUTHORIZATION>\");\n\nvar raw = JSON.stringify({\n  \"customer_id\": \"0e510520-4ed9-4748-90d7-f6120b391b26\",\n  \"type\": \"migrate_account\",\n  \"account_number\": \"123456789\",\n  \"routing_number\": \"987654321\",\n  \"link_type\": \"bond\",\n  \"bank_account_type\": \"checking\",\n  \"bank_name\": \"Chase\"\n});\n\nvar requestOptions = {\n  method: 'POST',\n  headers: myHeaders,\n  body: raw,\n  redirect: 'follow'\n};\n\nfetch(\"https://sandbox.bond.tech/api/v0/accounts\", requestOptions)\n  .then(response => response.text())\n  .then(result => console.log(result))\n  .catch(error => console.log('error', error));",
      "language": "javascript"
    },
    {
      "code": "import requests\nimport json\n\nurl = \"https://sandbox.bond.tech/api/v0/accounts\"\n\npayload = json.dumps({\n  \"customer_id\": \"0e510520-4ed9-4748-90d7-f6120b391b26\",\n  \"type\": \"migrate_account\",\n  \"account_number\": \"123456789\",\n  \"routing_number\": \"987654321\",\n  \"link_type\": \"bond\",\n  \"bank_account_type\": \"checking\",\n  \"bank_name\": \"Chase\"\n})\nheaders = {\n  'Content-Type': 'application/json',\n  'Identity': '<YOUR_IDENTITY>',\n  'Authorization': '<YOUR_AUTHORIZATION>'\n}\n\nresponse = requests.request(\"POST\", url, headers=headers, data=payload)\n\nprint(response.text)",
      "language": "python"
    }
  ]
}
[/block]

A successful request returns an `account_id` to represent the link from the customer's external account, as shown below.

```json
{
    "account_id": "e31a1d35-2aa6-4eee-80a0-08eb48668a34",
    "date_created": "2022-07-05T18:35:50.418488+00:00",
    "date_updated": "2022-07-05T18:35:50.418495+00:00",
    "customer_id": "0e510520-4ed9-4748-90d7-f6120b391b26",
    "status": "active",
    "verification_status": "unverifiable",
    "type": "migrate_account",
    "link_type": null,
    "access_token": null
}
```