---
title: Add a contact bank account
slug: add-a-contact-bank-account
docTags: 
createdAt: 2026-02-20T22:12:03.729Z
---

Before you can debit or credit a customer’s bank account, the account must be stored and associated with a contact in Jetpay.

In this guide, you will learn how to add a bank account to an existing contact. Once saved, the bank account can be referenced by its identifier when creating debit or credit transactions.

***

## Prerequisites

- [Jetpay API Key](docId:_zgmIm7QKrrAoX9JjaQrL)
- [An existing Jetpay Contact ID](docId\:BzwF0wyOoqBKGSFuGEnH0)

***

## Flow overview

```mermaid
sequenceDiagram
    participant partner as Platform
    participant api as Jetpay
    
    partner->>+api: Create and associate new bank account to contact.
    Note right of api: PUT /contact/bank-account
    
    api-->>-partner: R: Bank account created.
    Note right of api: 201 Created
```

***

## Implementation details

### Collect account details from your customer

For EFT payments, your application is responsible for collecting the customer’s bank account details. This typically involves presenting a secure form within your frontend, transmitting the data to your backend, and calling the create Contact endpoint from a server-side environment.

Bank account details should never be sent directly from the browser to the Jetpay API.

### Create the bank account for an existing contact

Endpoint: [`PUT /contact/bank-account`](https://extapi.jetpay.baselinepayments.com/docs#tag/Bank-Accounts-\(v0\)/operation/create_bank_account_contact_bank_account_put)

:::CodeblockTabs
```curl
curl https://extapi.demo.jetpay.baselinepayments.com/contact/bank-account \
  -X PUT \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
      "institution": "BMO",
      "title": "Business Chequing",
      "holder_name": "John Smith",
      "contact_id": "contact_123",
      "account_type": "Chequing",
      "transit_number": "27601",
      "institution_number": "001",
      "account_number": "1111111",
      "holder_address": "123 Happy St",
      "holder_address_postal_code": "A1A1A1",
      "holder_address_city": "Vancouver",
      "holder_address_country": "CA",
      "holder_email": "johnsmith@mail.com"
  }'
```

```python
import requests

url = "https://extapi.demo.jetpay.baselinepayments.com/contact/bank-account"

headers = {
    "Authorization": "Bearer <YOUR_API_TOKEN>",
    "Content-Type": "application/json"
}

payload = {
    "institution": "BMO",
    "title": "Business Chequing",
    "holder_name": "John Smith",
    "contact_id": "contact_123",
    "account_type": "Chequing",
    "transit_number": "27601",
    "institution_number": "001",
    "account_number": "1111111",
    "holder_address": "123 Happy St",
    "holder_address_postal_code": "A1A1A1",
    "holder_address_city": "Vancouver",
    "holder_address_country": "CA",
    "holder_email": "johnsmith@mail.com"
}

response = requests.put(url, json=payload, headers=headers)

print("Status Code:", response.status_code)
print("Response Body:", response.text)
```

```nodejs
const url = "https://extapi.demo.jetpay.baselinepayments.com/contact/bank-account";

const payload = {
  institution: "BMO",
  title: "Business Chequing",
  holder_name: "John Smith",
  contact_id: "contact_123",
  account_type: "Chequing",
  transit_number: "27601",
  institution_number: "001",
  account_number: "1111111",
  holder_address: "123 Happy St",
  holder_address_postal_code: "A1A1A1",
  holder_address_city: "Vancouver",
  holder_address_country: "CA",
  holder_email: "johnsmith@mail.com"
};

fetch(url, {
  method: "PUT",
  headers: {
    "Authorization": "Bearer <YOUR_API_TOKEN>",
    "Content-Type": "application/json"
  },
  body: JSON.stringify(payload)
})
  .then(response => {
    console.log("Status Code:", response.status);
    return response.text();
  })
  .then(data => {
    console.log("Response Body:", data);
  })
  .catch(error => {
    console.error("Error:", error);
  });
```
:::

:::hint{type="warning"}
For **sandbox** testing, please use the following values for bank account information (all other fields you can specify any value you'd like that passes field validation):

- "institution": "BMO"
- "transit\_number": "27601"
- "institution\_number": "001"
:::

### Handle the response

If a Bank Account is successfully created, a response will be returned with an HTTP status code of 200, and a response body containing the identifier of the newly created bank account:

```json
{
  "identifier": "bank_456"
}
```

We do not return any sensitive bank account details in the creation response. This is to ensure sensitive financial information is not exposed, transmitted, or stored outside of our secure environment, reducing your PCI/compliance scope and minimizing security risk. Instead, we return a unique identifier that should be **securely stored on your side** and used for initiating future [debit payments](docId:08LAM2GI8077ASxe8snp6).

***

## Using the saved bank account

With a Contact and a saved contact bank account, you can [receive payments](docId:08LAM2GI8077ASxe8snp6) and [send money](docId\:PpCMV4QZuYVZHzFk7-wYT) directly, without requesting payment information from your customer/supplier each time.

## Multiple bank accounts per contact

A contact can have multiple bank accounts associated with it. Jetpay does not impose a limit on how many bank accounts may be stored for a single contact. This allows your platform to support scenarios where a customer or supplier may use different accounts for different transactions.

If your system allows contacts to manage multiple bank accounts, you should store the bank account **`identifier`** returned during creation along with the **`title`** you assign to the account. This allows your application to clearly identify which account should be used for future transactions.

You can also retrieve basic information about a saved bank account at any time using the [`GET /bank-account/{identifier}`](https://extapi.jetpay.baselinepayments.com/docs#tag/Bank-Accounts-\(v0\)/operation/get_bank_account_bank_account__identifier__get) endpoint. This endpoint returns non-sensitive metadata such as the identifier, title, account type, and ownership.
