Bermuda Commercial Bank RESTful Open Banking API Implementation (v1)

The Bermuda Commercial Bank (BCB) RESTful Open Banking API provides secure, programmatic access to BCB's banking services, enabling developers to integrate financial services into their applications.

Key Features

  • Account details retrieval
  • Internal transfers
  • Payments (Swift)
  • Transaction information access
  • Robust security and compliance
  • Comprehensive documentation

Available Environments

UAT Environment

URL: https://api-uat.bcb.bm

Purpose: Testing and integration

Production Environment

URL: https://api.bcb.bm

Purpose: Live production use

Download OpenAPI description
Overview
URL

https://www.bcb.bm

Bermuda Commercial Bank Limited, 34 Bermudiana Road, Hamilton HM 11, Bermuda

enquiries@bcb.bm

Languages
Servers
Mock server

https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/

UAT Environment - Used for testing and integration purposes

https://api-uat.bcb.bm/

Production Environment - Live environment for production use

https://api.bcb.bm/

Accounts

Operations

InternalTransfers

Operations

Internal Transfer

Request

Initiates an internal funds transfer between two accounts within the institution. The request must include source and destination account details, along with the amount and currency to be transferred. Optionally, clients may provide a transaction reference and remittance information describing the purpose of the payment.

  • debitAccountNumber: The account number from which funds will be debited.
  • debitAmountCurrency: The currency code for the debit amount. Must match the credit account currency.
  • creditAccountNumber: The account number to be credited.
  • creditAmountCurrency: The currency code for the credit amount. Must match the debit account currency.
  • debitAmount: The amount to be transferred.
  • endToEndIdentification: (Optional) A unique reference provided by the client to identify the transaction end-to-end.
  • remittanceInformation: (Optional) Free-text remittance information describing the purpose of the transaction.

Important Notes:

  • Transfers between accounts with different currencies are not allowed. The debit and credit account currencies must match.
  • Ensure all inputs are validated and the source account has sufficient funds before making the request.

Idempotency

The API supports idempotency through the optional Idempotency-Key header:

  • If no idempotency key is provided, the request is processed normally (duplicates are possible).
  • If a valid UUID idempotency key is provided for a new transaction, the system stores the key and associates it with the transaction results.
  • If the same idempotency key is received again for the same endpoint/action, the system returns the previously stored response.
  • Idempotency keys are user-specific - different users don't share cached responses.
  • The idempotency key must be a valid UUID format (e.g., "123e4567-e89b-12d3-a456-426614174000").

Content Negotiation

Clients must use the HTTP Accept header to indicate the desired response format:

  • Set Accept: application/json for JSON responses (default).
  • Set Accept: text/csv for CSV responses. If the Accept header is omitted, application/json is assumed.

Base URL:

All API requests use the versioned base URL:

https://api.bcb.bm/v1/internal-transfers

Sample Request in JavaScript:

async function executeInternalTransfer() {
  try {
    const response = await fetch('https://api.bcb.bm/v1/internal-transfers', {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Idempotency-Key': '123e4567-e89b-12d3-a456-426614174000' // Optional: UUID format required if provided
      },
      body: JSON.stringify({
        debitAccountNumber: "12345678901234567890123456",
        debitAmountCurrency: "USD",
        creditAccountNumber: "98765432109876543210987654",
        creditAmountCurrency: "USD", // Must match debitAmountCurrency
        debitAmount: "100.00",
        endToEndIdentification: "REF-INV-20250417-001", // Optional external transaction reference
        remittanceInformationUnstructured: "Payment for invoice #12345" // Optional payment description
      })
    });
            
    if (!response.ok) {
      const errorData = await response.json();
      throw new Error(`Transfer failed: ${JSON.stringify(errorData)}`);
    }
            
    const data = await response.json();
    console.log('Transfer result:', data);
            
    // Example processing of the returned object
    const { id, status, uniqueIdentifier, internalTransferDetails, linkedActivities } = data;
    const { amountCredited, creditAmountCurrency, debitAmount, amountDebited, chargeAmount, valueDate, chargeAnalysisReceiver, chargeAnalysisSender, debitAccountNumber, creditAccountNumber, chargeAccountNumber } = internalTransferDetails;

    // Log the main transfer details.
    console.log('Transaction ID:', id);
    console.log('Status:', status);
    console.log('Unique Identifier:', uniqueIdentifier);
    console.log('Amount Credited:', amountCredited.amount, amountCredited.currency);
    console.log('Credit Amount Currency:', creditAmountCurrency);
    console.log('Debit Amount:', debitAmount.amount, debitAmount.currency);
    console.log('Amount Debited:', amountDebited.amount, amountDebited.currency);
    console.log('Charge Amount:', chargeAmount.amount, chargeAmount.currency);
    console.log('Value Date:', valueDate);
    console.log('Charge Analysis Receiver:', chargeAnalysisReceiver);
    console.log('Charge Analysis Sender:', chargeAnalysisSender);
            
    // Process debit account information.
    console.log('Debit Account Number:', debitAccountNumber.number);
    if (debitAccountNumber.accountRoutings) {
      debitAccountNumber.accountRoutings.forEach(routing => {
        console.log('Debit Account Routing Scheme:', routing.scheme);
        console.log('Debit Account Routing Address:', routing.address);
      });
    }
            
    // Process credit account information.
    console.log('Credit Account Number:', creditAccountNumber.number);
    if (creditAccountNumber.accountRoutings) {
      creditAccountNumber.accountRoutings.forEach(routing => {
        console.log('Credit Account Routing Scheme:', routing.scheme);
        console.log('Credit Account Routing Address:', routing.address);
      });
    }
            
    // Process charge account information.
    console.log('Charge Account Number:', chargeAccountNumber.number);
    if (chargeAccountNumber.accountRoutings) {
      chargeAccountNumber.accountRoutings.forEach(routing => {
        console.log('Charge Account Routing Scheme:', routing.scheme);
        console.log('Charge Account Routing Address:', routing.address);
      });
    }
            
    // Process linked activities.
    linkedActivities.forEach(activity => {
      console.log('Linked Activity ID:', activity.id);
      console.log('Linked Activity Transaction Status:', activity.transactionStatus);
      console.log('Linked Activity Status:', activity.status);
      console.log('Linked Activity Unique Identifier:', activity.uniqueIdentifier);
      const { arrangementId, activityId, productId, currencyId, effectiveDate } = activity.activityDetails;
      console.log('Linked Activity Arrangement ID:', arrangementId);
      console.log('Linked Activity Activity ID:', activityId);
      console.log('Linked Activity Product ID:', productId);
      console.log('Linked Activity Currency ID:', currencyId);
      console.log('Linked Activity Effective Date:', effectiveDate);
    });
            
    // Final status logging.
    if (status === 'SUCCESS') {
      console.log('The transfer was successful.');
    } else {
      console.log('The transfer failed:', status);
    }
  } catch (error) {
    console.error('Error executing internal transfer:', error);
  }
}
            
executeInternalTransfer();

Required Permission: internal-transfer

This endpoint requires the permission claim internal-transfer to be present in the JWT token. These permissions are embedded in the token during the authentication process and cannot be modified afterward. The token must be obtained with the appropriate permissions to access this endpoint.

Bodyapplication/json

The internal transfer request details.

debitAccountNumberstringnon-emptyrequired

The account number from which the money will be taken. Please ensure this account has enough funds before initiating the transfer.

debitAmountCurrencystringnon-emptyrequired

Gets or sets the currency code of the debit amount.

creditAccountNumberstringnon-emptyrequired

The account number of the recipient's account.

creditAmountCurrencystringnon-emptyrequired

The currency code for the credit amount, such as "USD", "EUR", etc.

debitAmountstringnon-emptyrequired

The amount of money to be debited from the sender's account and credited to the recipient's account. Ensure the amount does not exceed the available balance in the debit account.

endToEndIdentificationstring or null

Reference provided by the client to identify the transaction end-to-end.

remittanceInformationstring or null

Free-text remittance information provided by the client, describing the purpose of the transaction.

curl -i -X POST \
  https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/internal-transfers \
  -H 'Authorization: Bearer <YOUR_jwt_HERE>' \
  -H 'Content-Type: application/json' \
  -d '{
    "debitAccountNumber": 9.876543210987655e+25,
    "debitAmountCurrency": "USD",
    "creditAccountNumber": 1.2345678901234568e+25,
    "creditAmountCurrency": "USD",
    "debitAmount": 100,
    "endToEndIdentification": "REF-INV-20250417-001",
    "remittanceInformation": "Payment for invoice #12345"
  }'

Responses

The transfer was created successfully.

Bodyapplication/json
idstring

Unique identifier for the internal transfer

statusstring

The current processing status of the transaction, e.g. Completed, Pending, Failed

uniqueIdentifierstring

Unique identifier specific to this instance of the internal transfer

internalTransferDetailsInternalTransferDetails (object)

Transfer data

One of:

Transfer data

linkedActivitiesArray of objects(Activity)

List of related financial activities

Response
application/json
{ "id": "internal-transfer-123", "status": "COMPLETED", "uniqueIdentifier": "unique-identifier-123", "internalTransferDetails": { "amountCredited": {}, "creditAmountCurrency": "USD", "debitAmount": {}, "amountDebited": {}, "chargeAmount": {}, "valueDate": "2023-05-31", "chargeAnalysisReceiver": "Receiver Charge Analysis", "chargeAnalysisSender": "Sender Charge Analysis", "debitAccountNumber": {}, "creditAccountNumber": {}, "chargeAccountNumber": {} }, "linkedActivities": [ {} ] }

Payments

Operations

Token

Operations

Transactions

Operations