---
updatedAt: 2025-10-02T13:22:01.000Z
agentTools:
  projectIndex: https://developer.alloy.com/public/llms.txt
---

# Linking Funding Accounts

When a user attempts to link a new [External Account](/docs/ongoing-terminology#external-account), it's common to validate ownership with Account Verification vendors to understand the risk associated with the external account in order to determine whether we should approve the request.

<Table align={["left","left"]}>
  <thead>
    <tr>
      <th style={{ textAlign: "left" }}>
        Type
      </th>

      <th style={{ textAlign: "left" }}>
        Values
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td style={{ textAlign: "left" }}>
        **Monitoring Event Type**
      </td>

      <td style={{ textAlign: "left" }}>
        `external_account_created`
      </td>
    </tr>

    <tr>
      <td style={{ textAlign: "left" }}>
        **Minimum Required Fields**
      </td>

      <td style={{ textAlign: "left" }}>
        1\. `external_entity_id` **or** `entity_token`\
        2\. `external_account_id`\
        3\. `timestamp`\
        4\. `link_timestamp`\
        5\. `entities[].external_entity_id`**or**`entities[].entity_token`
      </td>
    </tr>

    <tr>
      <td style={{ textAlign: "left" }}>
        **Recommended Fields**
      </td>

      <td style={{ textAlign: "left" }}>
        1\. `routing_number`\
        2\. `account_number`
      </td>
    </tr>
  </tbody>
</Table>

Please reference [events API](https://alloy-group.readme.io/public/reference/post_events) for a full set of supported fields.

## Account Linking Request

Since we are attempting to link an account to one or more entities, it is important to include all related entities under the `entities[]`. Please note that the array determines the linkage between the External Account that is being created with this event, while the top level `external_entity_id` denotes the entity PII that is being hydrated and sent to data services.

```json json
{
    "event_type": "external_account_created",
    "data": {
        "external_account_id": "9478cf5a-61b6-4c73-a4bf-e71d133f4cd7",
        "external_entity_id": "cf88a0a1-34d6-492d-b617-c8b43785e7b7",
        "account_number": "0123456",
        "routing_number": "021000021",
        "timestamp": "2024-03-28T02:16:26.983Z",
        "entities": [
            {
                "account_holder_type": "primary",
                "external_entity_id": "cf88a0a1-34d6-492d-b617-c8b43785e7b7"
            }
        ],
        "link_timestamp": "2024-03-28T02:16:26.983Z",
        "supplemental_data": {
            "bank_accounts": [
                {
                    "account_number": "0123456",
                    "routing_number": "021000021",
                    "type": "checking"
                }
            ]
        }
    }
}
```

### Account Linking Response

With this example, there is no additional verification or user action to take after evaluating with the source workflow. Hence, we can determine the next system action by retrieving the outcome from `evaluations[].summary.outcome`. Depending on your setup and business logic, an denial can generate an alert that is automatically decision to be suspicious. Under this situation, `journey_applications` will be populated with information related to the alert.

If the request is determined to be suspicious that require additional reviews, or actions, an alert will be generated with `journey_applications` section populated. We recommend subscribing to the [Journeys Webhooks](https://developer.alloy.com/public/docs/journey-events) for any asynchronous response that might dictate your business logic.

```json
{
    "status_code": 201,
    "event_request_token": "EV-05TArFls32OimGO6XEoc",
    "_links": {
        "self": {
            "href": "/v1/events/EV-05TArFls32OimGO6XEoc"
        }
    },
    "event": {
        "event_type": "external_account_created",
        "event_status": "PROCESSED",
        "data": {
            "routing_number": "021000021",
            "is_linked_account": true,
            "link_timestamp": "2024-03-28T02:16:23.862Z",
            "entities": [
                {
                    "entity_token": "P-TfkFe6lCPkElc9Xktd3V",
                    "external_entity_id": "cf88a0a1-34d6-492d-b617-c8b43785e7b7",
                    "account_holder_type": "primary"
                }
            ],
            "account_number": "0123456",
            "external_account_id": "9478cf5a-61b6-4c73-a4bf-e71d133f4cd7",
            "account_token": "A-uiQyEF3kvfvBUZ7fXblb"
        },
        "evaluations": [
            {
                "error": null,
                "evaluation_token": "S-xQ8QXzvKKV2Pw4dQRspm",
                "workflow_token": "ch719NVZb7o7NKZRjStg7L3YqtG85JM8",
                "workflow_version_id": 2,
                "prefiltered": false,
                "summary": {
                    "result": "success",
                    "outcome": "Denied",
                    "tags": [
                        "Unverified Ownership"
                    ]
                },
                "_links": {
                    "self": {
                        "href": "/v1/evaluations/S-xQ8QXzvKKV2Pw4dQRspm"
                    }
                }
            }
        ],
        "journey_applications": []
    }
}
```

## Unlinking Account

When the original account linking request was made, the account was already characterized as “linked” in Alloy with the provided `link_timestamp`. In order to maintain the correct data in Alloy, we recommend sending an update via `external_account_updated` with the `unlink_timestamp` to properly classify the External Account.

<Table align={["left","left"]}>
  <thead>
    <tr>
      <th>
        Type
      </th>

      <th>
        Values
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        **Monitoring Event Type**
      </td>

      <td>
        `external_account_updated`
      </td>
    </tr>

    <tr>
      <td>
        **Minimum Required Fields**
      </td>

      <td>
        1\. `external_account_id`\
        2\. `timestamp`\
        3\. `unlink_timestamp`\
        4\. `entities[].external_entity_id`**or**`entities[].entity_token`
      </td>
    </tr>

    <tr>
      <td>
        **Recommended Fields**
      </td>

      <td>
        \-
      </td>
    </tr>
  </tbody>
</Table>

Since we are not evaluating the unlink request, but simply storing the update to maintain the data integrity in Alloy. The response will return as in a confirmation of the submitted updates.

```json Request
{
    "event_type": "external_account_updated",
    "event_status": "successful",
    "event_lifecycle_id": "X99-43jf-74382",
    "data": {
        "external_account_id": "9478cf5a-61b6-4c73-a4bf-e71d133f4cd7",
        "external_entity_id": "efa4cfa2-379c-4f9e-aab5-1a9a933cde15",
        "timestamp": "2024-03-28T02:32:51.351Z",
        "unlink_timestamp": "2024-03-28T02:32:51.351Z"
    },
  "meta": {},
    "supplemental_data": {}
}
```
```json Response
{
    "status_code": 201,
    "event_request_token": "EV-OYyPwOsoiYE7V6I6ncse",
    "_links": {
        "self": {
            "href": "/v1/events/EV-OYyPwOsoiYE7V6I6ncse"
        }
    },
    "event": {
        "event_type": "external_account_updated",
        "event_status": "PROCESSED",
        "data": {
            "account_number": "0123456",
            "account_number_encrypted": "4f76aaf90607...",
            "account_number_hashed": "3badcec68d9a6...",
            "cif_number": null,
            "account_type": null,
            "product_code": null,
            "product_name": null,
            "opening_date": null,
            "maturity_date": null,
            "closing_date": null,
            "activation_date": null,
            "expiration_date": null,
            "meta": null,
            "routing_number": "021000021",
            "external_ingestion_identifier": null,
            "card_network": null,
            "account_name": null,
            "tokenization_method": null,
            "merchant_category_code": null,
            "name_on_card": null,
            "account_number_last4": null,
            "avs": null,
            "account_class": null,
            "country_code": null,
            "description": null,
            "program_name": null,
            "mcc_description": null,
            "is_linked_account": true,
            "link_timestamp": "2024-03-28T02:16:26.983Z",
            "unlink_timestamp": "2024-03-28T02:32:51.351Z",
            "entities": [
                {
                    "entity_token": "P-pHoEYGBD5I0O7weUUOoo",
                    "external_entity_id": "efa4cfa2-379c-4f9e-aab5-1a9a933cde15",
                    "account_holder_type": "primary"
                }
            ],
            "currency": "USD",
            "account_hash": null,
            "external_account_id": "9478cf5a-61b6-4c73-a4bf-e71d133f4cd7",
            "account_token": "A-uiQyEF3kvfvBUZ7fXblb"
        },
        "evaluations": [],
        "journey_applications": []
    }
}
```