> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.redpincompany.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.redpincompany.com/_mcp/server.

# Get Bank Transfer Instructions

GET https://sandbox.currenciesdirect.com/v3/customers/{customer_id}/payments/{payment_id}/bank-transfer-instructions

Retrieve bank transfer instructions for a payment.

**Requirements:**
- Payment must be created with Payment v3 API (not v1/v2)
- Payment must use bank transfer method (not wallet-funded)

**Authentication:** [Bearer token required](/api-guide/getting-started/authentication#oauth-20-authentication)


Reference: https://docs.redpincompany.com/api-reference/customers/api-integration/payments/get-payment-bank-transfer-instructions

## Authentication

- `Authorization` header (bearer token, required) — OAuth 2.0 Bearer token authentication. This API uses OAuth 2.0 Client Credentials flow. Please refer to the [Authentication](/api-guide/getting-started/authentication#oauth-20-authentication) section for detailed information on how to obtain and use your OAuth credentials.

## Servers

- `https://sandbox.currenciesdirect.com` (Sandbox, default)
- `https://api.redpincompany.com` (Production)

## Request

### Path parameters

- `customer_id` (string, required) — Unique identifier for the customer who initiated the payment. This is the customer ID of the person or entity that created the payment transaction.
- `payment_id` (string, required) — Unique identifier for a payment created using the Payment v3 API.

### Query parameters

- `from_country` (string, required) — Country code where the payment is being sent from. 3-letter ISO country code. See [ISO 3166-1 on Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1).

## Response

### 200

Successful response with bank transfer instructions

- `payment_method` (enum, required) — Indicates the type of transfer: - `domestic_transfer`: For transfers within the same country (e.g., EFT, Wire). - `international_transfer`: For cross-border transfers requiring SWIFT/IBAN.
  - Allowed values: `domestic_transfer`, `international_transfer`
- `amount` (Amount, required) — The exact currency and amount that the third party must transfer to the bank details provided in this response. The third party should send `amount.value` in `amount.currency` to the specified bank account. Amount must be sent with 2 decimal precision. **Example:** If amount shows `{"currency": "GBP", "value": 1000.45}`, the third party should transfer exactly £1,000.45 GBP to the bank account details provided. **Example:** If amount shows `{"currency": "GBP", "value": 1000.45}` the third party should transfer exactly £1,000.45 GBP to the bank account details provided.
- `account_details` (AccountDetails, required)
- `bank_details` (BankDetails, required)
- `payment_reference` (PaymentReference, required)
- `payment_scheme_note` (string, optional) — Guidance on which payment schemes the beneficiary account accepts. Varies by the [`from_country`](/api-reference/customers/api-integration/payments/get-payment-bank-transfer-instructions#request.query.from_country) query parameter.

## Errors

### 400 Bad Request Error

Bad request - invalid parameters

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

### 401 Unauthorized Error

Customer mismatch error

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

### 404 Not Found Error

Payment not found

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

### 500 Internal Server Error

Internal server error

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

## Types

### Amount

- `currency` (string, required) — Three-letter ISO 4217 currency code.
- `value` (double, required) — Amount of the payment with 2 decimal precision.

### AccountDetails

- `name` (string, required) — Full name of the account holder (beneficiary).
- `address` (string, required) — Full postal address of the account holder, including city, state, ZIP code, and country.

### BankDetails

- `name` (string, required) — Legal name of the recipient's bank.
- `address` (string, required) — Physical address of the bank branch where the account is held.
- `routing_codes` (list of RoutingCode, required) — It returns all the details that need to be displayed to users to make transfers to this account. This array will vary from currency to currency as each one has its requirements. What you get back depends on: - `from_country` Country code where the payment is being sent from. 3-letter ISO country code. See [ISO 3166-1 on Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1) - `sell_currency` used when creating the Quote for this payment For example, international EUR transfers typically includes `IBAN` and `SWIFTBIC`, while domestic GBP transfers typically includes `ACCOUNT_NUMBER` and `SORT_CODE`. Each item in this array will contain the following attributes:

### PaymentReference

- `value` (string, required) — Reference string that must be included in the payment memo/description to identify the transaction.
- `label` (string, required) — Human-readable label for the payment reference field.
- `disclaimer` (string, required) — A message explaining the importance of including this payment reference to ensure successful payment processing and reconciliation.

### RoutingCode

A single routing code entry. Different countries and currencies require different codes, so the set of routing codes can change based on `from_country` and `sell_currency`.

- `type` (string, required) — String informing the routing code type.
- `value` (string, required) — The actual routing code value.
- `label` (string, required) — Label to display in the UI for this routing code.

## Examples

### Domestic Transfer (VBAN)

**Response**

```json
{
  "payment_method": "domestic_transfer",
  "amount": {
    "currency": "GBP",
    "value": 1000.45
  },
  "account_details": {
    "name": "Wattson",
    "address": "Texas, Texas, Texas, 32323, USA"
  },
  "bank_details": {
    "name": "JP Morgan Chase",
    "address": "J.P. Morgan Florida 12345",
    "routing_codes": [
      {
        "type": "ROUTING_EFT",
        "value": "028000024",
        "label": "EFT routing number"
      },
      {
        "type": "ROUTING_WIRE",
        "value": "021000021",
        "label": "Wire routing number"
      },
      {
        "type": "ACCOUNT_NUMBER",
        "value": "20000023381857",
        "label": "Account number"
      },
      {
        "type": "ACCOUNT_TYPE",
        "value": "checking",
        "label": "Account type"
      }
    ]
  },
  "payment_reference": {
    "value": "ABCD123456",
    "label": "Payment reference",
    "disclaimer": "Always include this payment reference – it tells us the money has come from you."
  },
  "payment_scheme_note": "Please note: This account only accepts FPS, BACS and CHAPS payments. FPS payments are available for amounts up to £1 million."
}
```

**SDK Code**

```python Domestic Transfer (VBAN)
import requests

url = "https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions"

querystring = {"from_country":"GBR"}

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript Domestic Transfer (VBAN)
const url = 'https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Domestic Transfer (VBAN)
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Domestic Transfer (VBAN)
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Domestic Transfer (VBAN)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Domestic Transfer (VBAN)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Domestic Transfer (VBAN)
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Domestic Transfer (VBAN)
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### International Transfer (SWIFT + IBAN)

**Response**

```json
{
  "payment_method": "international_transfer",
  "amount": {
    "currency": "GBP",
    "value": 1000.45
  },
  "account_details": {
    "name": "Currencies Direct Inc",
    "address": "4705 South Apopka-Vineland Road, Suite 114, Orlando, Florida, 32819 USA"
  },
  "bank_details": {
    "name": "Barclays",
    "address": "1 Churchill Place, Canary Wharf, London, United Kingdom",
    "routing_codes": [
      {
        "type": "IBAN",
        "value": "GB06BARC20199075274900",
        "label": "IBAN"
      },
      {
        "type": "SWIFTBIC",
        "value": "BARCGB22",
        "label": "SWIFTBIC"
      }
    ]
  },
  "payment_reference": {
    "value": "ABCD123456",
    "label": "Payment reference",
    "disclaimer": "Always include this payment reference – it tells us the money has come from you."
  },
  "payment_scheme_note": "Please note: This account only accepts FPS, BACS and CHAPS payments. FPS payments are available for amounts up to £1 million."
}
```

**SDK Code**

```python International Transfer (SWIFT + IBAN)
import requests

url = "https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions"

querystring = {"from_country":"GBR"}

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript International Transfer (SWIFT + IBAN)
const url = 'https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go International Transfer (SWIFT + IBAN)
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby International Transfer (SWIFT + IBAN)
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java International Transfer (SWIFT + IBAN)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php International Transfer (SWIFT + IBAN)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp International Transfer (SWIFT + IBAN)
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift International Transfer (SWIFT + IBAN)
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v3/customers/020123456789/payments/987654321/bank-transfer-instructions?from_country=GBR")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```