Add Counterparty External Bank Accounts

How do I create external bank accounts for counterparty payouts?

Overview

Create external bank accounts for counterparties to enable third-party payouts. You provide bank routing details and beneficiary information to create accounts using raw routing details.

Counterparty external bank accounts support credit operations only. You can send funds to them but cannot withdraw. The exception is an Interac e-Transfer account, which you can also use to request money from the counterparty. Requesting money from and sending money to a counterparty over Interac e-Transfer requires explicit compliance approval from Cybrid before production use.

Important Notes for Self-Transfer (US to India) Use Cases:

  • When creating a counterparty for self-transfers (e.g., a US customer sending to their own Indian bank account), create the counterparty with the customer_guid and using a customer-scoped token. This ensures the counterparty is only visible to that customer and avoids scoping errors.
  • The counterparty's address should use the most relevant address for the customer (often their US address, especially for NRE accounts that may not have an Indian address).
  • Required fields for counterparties include: type (must be individual), name.first, name.last and address.country_code. The address must also meet your bank's counterparty address requirements for its country, which can require fields such as address.city, address.street and address.postal_code.
  • After creating and verifying the counterparty, create the external bank account using both the customer_guid and the counterparty_guid.
  • If you encounter errors such as "Counterparty not found" or "Invalid bank configuration," ensure that the counterparty was created with the correct scoping and that your bank is configured to support counterparty external bank accounts. Contact support if you need this enabled for your sandbox or production bank.
  • For more details on required fields for counterparties, see the counterparty creation guide.
⚠️

Payment direction

Counterparty external bank accounts can only receive payments (credits), not send them (debits). Interac e-Transfer accounts are the exception: the counterparty can pay a Request for Money addressed to the account.

ℹ️

Feature availability

Cybrid disables this feature by default in Production. Contact Cybrid Support to enable it for your bank.

Prerequisites

Before creating a counterparty external bank account:

Interac e-Transfer counterparty requirements

When creating an Interac e-Transfer external bank account:

  • If you pass counterparty_guid, do not also send counterparty_name, counterparty_address, or counterparty_email_address. Use the counterparty record for the account holder's details.
  • Use a counterparty with plain-letter first and last names and a unique email_address; the e-Transfer partner rejects names with digits or special characters.
  • In counterparty_bank_account_details, account_identifier_type: "EMAIL" is required. PHONE_NUMBER is optional.
  • If the request fails with legal_entity_incomplete_pii, recreate the counterparty with the corrected details, verify it, and then create the external bank account again.

The counterparty must have passed counterparty verification before the external bank account can be created. This is the type: counterparty identity verification described in Verifying a Counterparty, not a customer KYC or KYB verification. From API version 2026-09-01, this precondition is checked on every create. A counterparty that is not yet verified returns 400 with unverified_counterparty.

Create a counterparty external bank account

After you complete the prerequisites, create an external bank account for the counterparty using the POST /api/external_bank_accounts endpoint.

⚠️

Accept-Version header required

Include the header Accept-Version: 2025-10-01 or later in your request. Requests without this header may result in errors about missing required fields.

⚠️

Omit holder details from 2026-09-01

From API version 2026-09-01, do not send counterparty_name, counterparty_address or counterparty_email_address when you supply counterparty_guid. Sending any of them returns 400 with invalid_parameter. The Platform creates the account with the counterparty's own verified details from when you created the counterparty. Earlier versions require counterparty_name and counterparty_address only when counterparty_guid is omitted. See API Versioning.

ℹ️

Ownership is implied

Ownership of a counterparty account is implied to be the counterparty's, so the Platform runs no ownership check: no holder-name match, no bank_account identity verification and no Persona inquiry. The account usually moves storing → pending → completed. If the counterparty matches an existing identity that needs a compliance review, it moves to reviewing and ends completed, failed with compliance_rejection, or expired. Send Accept-Version: 2026-09-01 when you poll the account, or pending and reviewing read as storing and expired as failed. In sandbox, expected_behaviours is accepted and ignored for counterparty accounts.

The following example creates a domestic USD external bank account:

POST /api/external_bank_accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
Accept-Version: 2025-10-01

{
  "name": "external_bank_account_name",
  "account_kind": "raw_routing_details",
  "customer_guid": "customer_guid",
  "counterparty_guid": "counterparty_guid",
  "asset": "USD",
  "counterparty_bank_account_details": [
    {
      "bank_code_type": "ABA",
      "bank_code": "routing_number",
      "account_identifier": "account_number",
      "payment_rail": "ACH"
    }
  ]
}
POST /api/external_bank_accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
Accept-Version: 2026-09-01

{
  "name": "external_bank_account_name",
  "account_kind": "raw_routing_details",
  "customer_guid": "customer_guid",
  "counterparty_guid": "counterparty_guid",
  "asset": "USD",
  "counterparty_bank_account_details": [
    {
      "bank_code_type": "ABA",
      "bank_code": "routing_number",
      "account_identifier": "account_number",
      "payment_rail": "ACH"
    }
  ]
}
{
  "guid": "external_bank_account_guid",
  "name": "external_bank_account_name",
  "account_kind": "raw_routing_details",
  "customer_guid": "customer_guid",
  "counterparty_guid": "counterparty_guid",
  "asset": "USD",
  "state": "completed",
  "counterparty_bank_account_details": [
    {
      "bank_code_type": "ABA",
      "bank_code": "routing_number",
      "account_identifier": "account_number",
      "payment_rail": "ACH"
    }
  ]
}

Interac e-Transfer accounts

From API version 2026-09-01, an Interac e-Transfer entry in counterparty_bank_account_details is addressed by an identifier rather than a bank code. Set payment_rail to ETRANSFER, set account_identifier_type to EMAIL or PHONE_NUMBER, and put the address or number in account_identifier. Do not send bank_code_type. Earlier versions keep the bank code form for this rail, which describes an EFT account at the provider rather than an addressable contact.

⚠️

Restricted functionality

Requesting money from and sending money to a counterparty over Interac e-Transfer is not part of a standard remittance flow. It is reserved for specific use cases that require additional due diligence and explicit compliance approval from Cybrid. The functionality may be available in sandbox, but it is not available in production without that approval. Contact Cybrid support to discuss your use case.

Send the email and phone entries as two entries in the same counterparty_bank_account_details array. They describe one contact, so the request creates a single external bank account rather than one account per identifier.

⚠️

An email identifier is always required

An Interac e-Transfer contact must carry an EMAIL entry. A request with only a PHONE_NUMBER entry returns 400 with invalid_account_number, on every API version. A PHONE_NUMBER identifier must be a Canadian number in E.164 format; a valid number from another country is rejected.

POST /api/external_bank_accounts
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN
Accept-Version: 2026-09-01

{
  "name": "external_bank_account_name",
  "account_kind": "raw_routing_details",
  "counterparty_guid": "counterparty_guid",
  "asset": "CAD",
  "counterparty_bank_account_details": [
    {
      "payment_rail": "ETRANSFER",
      "account_identifier_type": "EMAIL",
      "account_identifier": "[email protected]"
    },
    {
      "payment_rail": "ETRANSFER",
      "account_identifier_type": "PHONE_NUMBER",
      "account_identifier": "+14165550123"
    }
  ]
}

Use an Interac e-Transfer account on an etransfer funding transfer by setting external_bank_account_guid to its guid. On a deposit, the Platform sends a Request for Money to the counterparty; on a withdrawal, it sends the e-transfer to the counterparty. See Request money from a counterparty and Send money to a counterparty.

For foreign fiat external bank accounts, see Foreign Fiat External Bank Accounts.

For detailed API reference, see Create External Bank Account.

Failure codes

The following errors occur when creating a counterparty external bank account:

  • unverified_counterparty: Verify the counterparty before creating a counterparty external bank account. Returned with 400.
  • invalid_parameter: From API version 2026-09-01, remove counterparty_name, counterparty_address and counterparty_email_address from the request. A counterparty account takes the counterparty's own verified details. Returned with 400.
  • create_failed and legal_entity_incomplete_pii: From API version 2026-09-01, a permanent provider or validation error during account creation ends the account in failed with create_failed, or with legal_entity_incomplete_pii where the counterparty's details are incomplete. Re-create the counterparty with the required information, verify it, and then create the external bank account again.

Did this page help you?