The SWIFT payment request containing all necessary payment details.
- Get payment status
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.
- Account details retrieval
- Internal transfers
- Payments (Swift)
- Virtual Accounts
- Transaction information access
- Robust security and compliance
- Comprehensive documentation
https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/
https://api-uat.bcb.bm/
https://api.bcb.bm/
Request
Initiates a SWIFT payment transfer. The request must include all required payment details including:
- Source and destination account information
- Payment amount and currency
- Beneficiary details
- Payment purpose and reference information
- Supports international wire transfers via SWIFT network
- Implements idempotency to prevent duplicate transactions
- Validates payment requests before processing
- Supports both JSON and CSV response formats
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.
All API requests use the versioned base URL:
https://api.bcb.bm/v1/payments/swift
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")
async function processSwiftPayment() {
try {
const response = await fetch('https://api.bcb.bm/v1/payments/swift', {
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({
instructionIdentification: "PAYMENT-123456",
debtorAccount: {
identification: "DEBTOR-ACC-123"
},
instructedAmount: {
currency: "USD",
amount: "1000.00"
},
creditorAccount: {
identification: "CREDITOR-ACC-456",
name: "John Doe",
additionalInformation: ["Additional details"]
},
creditorAgent: {
identification: "BANKBIC123",
name: "Beneficiary Bank",
additionalInformation: ["SWIFT/BIC code"]
},
chargesType: "OUR",
remittanceInformation: ["Payment for services"]
})
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Error processing payment: ${errorData.message || 'Unknown error'}`);
}
const result = await response.json();
// Check payment status
if (result.status === 'success') {
console.log('Payment processed successfully');
// Log payment details
console.log('Payment ID:', result.id);
console.log('Transaction Status:', result.transactionStatus);
console.log('Unique Identifier:', result.uniqueIdentifier);
// Process payment details
const details = result.details;
console.log('External Reference:', details.extReference);
console.log('Instructed Amount:', details.instructedAmount.amount, details.instructedAmount.currency);
// Process account information
console.log('Debtor Account:', details.debtorAccount.identification);
console.log('Creditor Account:', details.creditorAccount.identification);
console.log('Beneficiary Account:', details.beneficiaryAccount.identification);
// Process settlement details
const settlement = details.settlementDetails;
console.log('Amount Credited:', settlement.amountCredited.amount, settlement.amountCredited.currency);
console.log('Amount Debited:', settlement.amountDebited.amount, settlement.amountDebited.currency);
console.log('Value Date:', settlement.valueDate);
console.log('Record Status:', settlement.recordStatus);
// Process charge details
const charges = details.chargeDetails;
console.log('Charges Type:', charges.chargesType);
console.log('Total Charges:', charges.chargeAmount.amount, charges.chargeAmount.currency);
// Process charge analysis
const chargeAnalysis = charges.chargeAnalysis;
console.log('Sender Charges:', chargeAnalysis.sender.amount, chargeAnalysis.sender.currency);
console.log('Receiver Charges:', chargeAnalysis.receiver.amount, chargeAnalysis.receiver.currency);
// Process beneficiary information
console.log('Beneficiary Name:', details.beneficiary.name);
console.log('Beneficiary Bank:', details.beneficiaryAgent.name);
// Process remittance information
if (details.remittanceInformation) {
console.log('Remittance Information:');
details.remittanceInformation.forEach(info => console.log('-', info));
}
// Process linked activities
if (result.linkedActivities && result.linkedActivities.length > 0) {
console.log('Linked Activities:');
result.linkedActivities.forEach(activity => {
console.log('- Activity ID:', activity.id);
console.log(' Status:', activity.status);
console.log(' Transaction Status:', activity.transactionStatus);
console.log(' Unique Identifier:', activity.uniqueIdentifier);
});
}
} else {
console.error('Payment processing failed:', result.status);
// Handle failed payment
if (result.details) {
console.error('Error details:', result.details);
}
}
} catch (error) {
console.error('Error:', error);
// Handle error appropriately
}
}
// Example usage:
processSwiftPayment();
Field | Type | Description |
---|---|---|
id | string | Unique identifier for the payment |
status | string | Payment status (success or failed ) |
transactionStatus | string | Detailed transaction status |
uniqueIdentifier | string | Unique identifier for tracking |
details | object | Payment details object |
linkedActivities | array | Related financial activities |
Required Permission: payment-swift
This endpoint requires the permission claim payment-swift
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.
Unique identification as assigned by an instructing party for an instructed party to unambiguously identify the instruction.
Unambiguous identification of the account of the debtor to which a debit entry will be made as a result of the transaction.
Unambiguous identification of the account of the debtor to which a debit entry will be made as a result of the transaction.
Amount of money to be moved between the debtor and creditor, before deduction of charges, expressed in the currency as ordered by the initiating party.
Amount of money to be moved between the debtor and creditor, before deduction of charges, expressed in the currency as ordered by the initiating party.
Unambiguous identification of the account of the creditor to which a credit entry will be posted as a result of the payment transaction.
Unambiguous identification of the account of the creditor to which a credit entry will be posted as a result of the payment transaction.
Financial institution servicing an account for the creditor.
Financial institution servicing an account for the creditor.
Agent between the debtor's agent and the creditor's agent.
Agent between the debtor's agent and the creditor's agent.
Specifies which party/parties will bear the charges associated with the processing of the payment transaction.
- Mock server
https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/swift
- UAT Environment - Used for testing and integration purposes
https://api-uat.bcb.bm/v1/payments/swift
- Production Environment - Live environment for production use
https://api.bcb.bm/v1/payments/swift
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/swift \
-H 'Authorization: Bearer <YOUR_jwt_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"instructionIdentification": "PAY-2024-03-21-001",
"debtorAccount": {
"identification": "BM12BCBK00001234567890"
},
"instructedAmount": {
"currency": "USD",
"amount": 50000
},
"creditorAccount": {
"identification": "US12BCBK00001234567890",
"name": "Global Investment Services Inc",
"additionalInformation": [
"350 Fifth Avenue",
"New York, NY 10118",
"United States"
]
},
"creditorAgent": {
"identification": "CHASUS33",
"name": "JPMorgan Chase Bank",
"additionalInformation": [
"SWIFT/BIC: CHASUS33",
"383 Madison Avenue",
"New York, NY 10179",
"United States"
]
},
"intermediaryAgent": {
"identification": "BCBKBMHM",
"name": "Bermuda Commercial Bank",
"additionalInformation": [
"SWIFT/BIC: BCBKBMHM",
"Victoria Place",
"31 Victoria Street",
"Hamilton HM 10, Bermuda"
]
},
"chargesType": "OUR",
"remittanceInformation": [
"Payment for investment management services Q1 2024",
"Invoice #INV-2024-001",
"Service Period: Jan-Mar 2024"
]
}'
Created - The payment was successfully processed.
Unique identifier assigned by the bank for the SWIFT transfer. This ID can be used for future reference and tracking of the payment.
The current status of the payment processing. Possible values include:
- success: Payment has been accepted for processing
- failed: Payment failed
Detailed transaction status indicating the current state of the transfer. This provides more granular status information than the main status field.
A unique identifier specific to this instance of the SWIFT transfer. This identifier remains constant throughout the lifecycle of the payment and can be used for reconciliation purposes.
Detailed information about the payment transaction including amounts, accounts, and settlement information.
Detailed information about the payment transaction including amounts, accounts, and settlement information.
{ "id": "PAY987654321", "status": "success", "transactionStatus": "COMPLETED", "uniqueIdentifier": "unique-identifier-987", "details": { "extReference": "EXT98765", "instructedAmount": { … }, "debtorAccount": { … }, "beneficiaryAccount": { … }, "creditorAccount": { … }, "settlementDetails": { … }, "chargeDetails": { … }, "remittanceInformation": [ … ], "beneficiary": { … }, "beneficiaryAgent": { … }, "intermediaryAgent": { … } }, "linkedActivities": [ { … } ] }
Request
Retrieves status information for all payments associated with a specific account. This endpoint:
- Provides comprehensive payment status details including type, status, transaction ID, external reference, remittance information, amounts, value date, and exchange rate.
- Supports both JSON and CSV response formats based on the Accept header.
- Supports cursor-based pagination for efficient handling of large payment status datasets.
This endpoint uses cursor-based pagination with server-side result-set management:
- First Request: Optionally specify
pageSize
(default: 100, max: 1000). The server creates a cursor and returns apageToken
. - Subsequent Requests: Use the
pageToken
from previous responses withpageStart
to navigate pages. - Page Token: Contains encoded pagination context including pageSize, so don't specify
pageSize
in subsequent requests. - Total Pages: Calculate using
Math.ceil(total_size / page_size)
from the response metadata.
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.
All API requests use the versioned base URL:
https://api.bcb.bm/v1/accounts/{accountNumber}/payments
async function getAllPaymentStatusesPaginated(accountNumber) {
try {
let allPaymentStatuses = [];
let pageStart = 1;
let pageToken = null;
let totalPages = 0;
do {
// Build URL with pagination parameters
let url = `https://api.bcb.bm/v1/accounts/${accountNumber}/payments`;
const params = new URLSearchParams();
if (pageStart === 1) {
// First request: specify pageSize
params.append('pageSize', '100');
} else {
// Subsequent requests: use pageToken and pageStart
params.append('pageToken', pageToken);
params.append('pageStart', pageStart.toString());
}
if (params.toString()) {
url += '?' + params.toString();
}
const response = await fetch(url, {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Error: ${errorData.message || 'Unknown error'}`);
}
const data = await response.json();
console.log(`Page ${pageStart} data:`, data);
// Store pagination info from first request
if (pageStart === 1 && data.meta && data.meta.pagination) {
pageToken = data.meta.pagination.page_token;
totalPages = Math.ceil(data.meta.pagination.total_size / data.meta.pagination.page_size);
console.log(`Total pages: ${totalPages}, Page token: ${pageToken}`);
}
// Collect payment statuses from this page
if (data.data && data.data.length > 0) {
allPaymentStatuses.push(...data.data);
console.log(`Collected ${data.data.length} payment statuses from page ${pageStart}`);
}
pageStart++;
} while (pageStart <= totalPages);
console.log(`Total payment statuses collected: ${allPaymentStatuses.length}`);
// Process all collected payment statuses
allPaymentStatuses.forEach((payment, index) => {
console.log(`Payment ${index + 1}:`, payment.transactionId);
console.log('Type:', payment.type);
console.log('Status:', payment.status);
console.log('External Reference:', payment.externalReference);
console.log('Remittance Information:', payment.remittanceInformation);
console.log('Value Date:', payment.valueDate);
console.log('Debit Amount:', `${payment.debitAmount.amount} ${payment.debitAmount.currency}`);
if (payment.creditAmount && payment.creditAmount.amount) {
console.log('Credit Amount:', `${payment.creditAmount.amount} ${payment.creditAmount.currency}`);
}
console.log('-------------------');
});
return allPaymentStatuses;
} catch (error) {
console.error('There was a problem with the fetch operation:', error.message);
throw error;
}
}
// Alternative: Get single page of payment statuses
async function getPaymentStatusesPage(accountNumber, pageStart = 1, pageToken = null) {
try {
let url = `https://api.bcb.bm/v1/accounts/${accountNumber}/payments`;
const params = new URLSearchParams();
if (pageStart === 1 && !pageToken) {
params.append('pageSize', '50'); // Custom page size
} else {
params.append('pageToken', pageToken);
params.append('pageStart', pageStart.toString());
}
if (params.toString()) {
url += '?' + params.toString();
}
const response = await fetch(url, {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Error: ${errorData.message || 'Unknown error'}`);
}
const data = await response.json();
console.log('Payment statuses page:', data);
return data;
} catch (error) {
console.error('There was a problem with the fetch operation:', error.message);
throw error;
}
}
// Example usage:
getAllPaymentStatusesPaginated('123456789'); // Retrieves all payment statuses across multiple pages
// OR
getPaymentStatusesPage('123456789', 1).then(firstPage => {
console.log('First page:', firstPage);
// Use firstPage.meta.pagination.page_token for subsequent requests
});
Required Permission: get-payment-status
This endpoint requires the permission claim get-payment-status
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.
Optional. The record from which the response should be displayed (default: 1). Use with pageToken for subsequent requests.
Optional. The total number of records per page (default: 100, max: 1000). Only specify in the first request - subsequent requests use the pageSize embedded in the pageToken.
- Mock server
https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/accounts/{accountNumber}/payments
- UAT Environment - Used for testing and integration purposes
https://api-uat.bcb.bm/v1/accounts/{accountNumber}/payments
- Production Environment - Live environment for production use
https://api.bcb.bm/v1/accounts/{accountNumber}/payments
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/accounts/{accountNumber}/payments?pageStart=0&pageSize=0&pageToken=string' \
-H 'Authorization: Bearer <YOUR_jwt_HERE>'
{ "meta": { "pagination": { … } }, "data": [ { … }, { … }, { … } ] }
Request
Retrieves detailed status information for a specific payment identified by its payment ID (also known as transaction ID). This endpoint provides comprehensive status details including:
- Type: The type of payment (e.g., "Outward Swift Payment MT103 API")
- Status: Current status of the payment (e.g., "Pending", "Completed", "Failed")
- TransactionId: Unique payment identifier (or Transaction Id)
- ExternalReference: External reference number for the payment
- RemittanceInformation: Free-text information about the purpose of the payment
- DebitAmount: The amount debited from the account, including currency code
- CreditAmount: The amount credited to the account, including currency code
- ValueDate: The date when the payment was/will be processed
- ExchangeRate: The exchange rate applied to the payment
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.
All API requests use the versioned base URL:
https://api.bcb.bm/v1/payments/{paymentId}/status
async function getPaymentStatus(paymentId) {
try {
const response = await fetch(`https://api.bcb.bm/v1/payments/${paymentId}/status`, {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Error: ${errorData.message || 'Unknown error'}`);
}
const paymentStatus = await response.json();
console.log('Payment Status Details:');
console.log('Payment ID:', paymentStatus.transactionId);
console.log('Type:', paymentStatus.type);
console.log('Status:', paymentStatus.status);
console.log('External Reference:', paymentStatus.externalReference);
console.log('Remittance Information:', paymentStatus.remittanceInformation);
console.log('Value Date:', paymentStatus.valueDate);
console.log('Debit Amount:', `${paymentStatus.debitAmount.amount} ${paymentStatus.debitAmount.currency}`);
if (paymentStatus.creditAmount && paymentStatus.creditAmount.amount) {
console.log('Credit Amount:', `${paymentStatus.creditAmount.amount} ${paymentStatus.creditAmount.currency}`);
}
// Implement business logic based on payment status
if (paymentStatus.status === 'Completed') {
console.log('Payment has been successfully completed.');
} else if (paymentStatus.status === 'Pending') {
console.log('Payment is still being processed.');
} else if (paymentStatus.status === 'Failed') {
console.log('Payment failed. Please check the details or contact support.');
}
} catch (error) {
console.error('There was a problem retrieving the payment status:', error.message);
}
}
// Example usage:
getPaymentStatus('PAY-001-2023');
Required Permission: get-payment-status
This endpoint requires the permission claim get-payment-status
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.
- Mock server
https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/{paymentId}/status
- UAT Environment - Used for testing and integration purposes
https://api-uat.bcb.bm/v1/payments/{paymentId}/status
- Production Environment - Live environment for production use
https://api.bcb.bm/v1/payments/{paymentId}/status
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/{paymentId}/status' \
-H 'Authorization: Bearer <YOUR_jwt_HERE>'
OK - The request was successful.
Free-text remittance information provided by the client, describing the purpose of the transaction.
The amount debited from the account
The amount debited from the account
The amount credited from the account
The amount credited from the account
{ "type": "Outward Swift Payment MT103 API", "externalReference": "REF123456", "status": "Completed", "remittanceInformation": "Invoice payment #INV-2023-001", "transactionId": "TX-001-2023", "debitAmount": { "currency": "USD", "amount": 1000 }, "valueDate": "2023-05-15", "creditAmount": { "currency": "USD", "amount": null }, "exchangeRate": null }