The ACH local payment request containing all necessary payment details.
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
Request
Initiates a domestic same-currency bank transfer over the ACH clearing network. The request carries debtor account, instructed amount, debit currency, creditor account + bank reference, and 1–2 lines of remittance information. JSON and CSV response formats are supported via the Accept header.
Only USD and BMD are accepted. debitCurrency and instructedAmount.currency must be identical - cross-currency is not supported on this endpoint.
Transfers settle same-day when submitted before 3:15 PM local AST; later submissions are queued for the next business day. The value/effective date in the response reflects the settlement date.
Provide creditorBank with the destination bank bankCode and currency. The API validates this combination against the configured bank reference lookup. If the bankCode and currency combination is not found, the API returns 400 Bad Request with error code BANK_REFERENCE_NOT_FOUND.
The ACH local bank reference lookup contains the following values:
| Bank Code | Currency | Bank Name |
|---|---|---|
BUTTERFIELD | BMD | Bank of N.T. Butterfield & Sons |
HSBC | BMD | HSBC Bermuda |
CLARIEN | BMD | Clarien Bank Bermuda |
BUTTERFIELD | USD | Bank of N.T. Butterfield & Sons |
HSBC | USD | HSBC Bermuda |
CLARIEN | USD | Clarien Bank Bermuda |
- Endpoint:
POST https://api.bcb.bm/v1/payments/ach-local - Authorization:
Bearer {token}(required). - Accept:
application/json(default) ortext/csv. - Idempotency-Key: optional UUID v4 header (≤ 255 chars). See below.
The API supports idempotency through the optional Idempotency-Key header. When supplied, the server caches the successful response and replays it on repeat calls.
- If no idempotency key is provided, the request is processed normally (duplicates are possible).
- If a valid UUID key is supplied, the system stores the response of the first
2xxoutcome and replays it on subsequent calls with the same key. - TTL (cache lifetime): the stored response is retained for a limited window (currently on the order of one hour). After expiry the same key is treated as a new request - but
instructionIdentificationdeduplication still applies for 24 hours. Plan client-side retries to land inside the cache window. - Scope: keys are partitioned by client/user, HTTP method, and request path. The same key on
/payments/ach-localand/payments/swiftis not shared - each endpoint has its own cache slot. - Concurrency: if a second request with the same key arrives while the first is still in flight, the second is rejected with
409 Conflictand message"Request is already being processed."Wait and retry. - Body mismatch: request bodies are not compared on replay. If you reuse a key with a different body, the original cached response is returned - the new body is ignored. Mint a fresh key for any logically different request.
- Non-2xx responses are not cached. A
4xxvalidation failure or5xxserver error can be retried with the same key and will execute again.
A separate, business-level guard on the instructionIdentification field, applied independently of the Idempotency-Key header:
- Reusing an
instructionIdentificationfor an active ACH local payment is rejected with409 ACH_LOCAL_DUPLICATE_INSTRUCTION_ID. - Use a fresh
instructionIdentificationfor each new payment intent. Reuse it (with the sameIdempotency-Key) only when retrying the exact same payment. - The deduplication window is currently configured as 24 hours from the first accepted request.
They are independent mechanisms with different purposes.
Idempotency-Key(header) is a transport-level retry token. It lets you safely retry the same HTTP call and get the original response replayed.instructionIdentification(body) is the business identifier of the payment. It is persisted on the payment record and forwarded downstream. To prevent the same payment intent from being submitted twice, a value that is already in flight or recently accepted is rejected with409 ACH_LOCAL_DUPLICATE_INSTRUCTION_ID(window: 24 hours).
Idempotency-Key | instructionIdentification | Behaviour |
|---|---|---|
| no | no | No protection. Each call creates a new payment. |
| yes | no | HTTP retries of the same call replay the original response. A new Idempotency-Key creates a new payment. |
| no | yes | First call is processed normally. Reusing the same business identifier within 24 hours is rejected with 409 ACH_LOCAL_DUPLICATE_INSTRUCTION_ID. The original success response is not replayed - record it client-side. |
| yes | yes | Recommended. HTTP retries of the same call replay the original response. A new Idempotency-Key reusing an in-flight instructionIdentification is rejected with 409. |
The dedupe and idempotency layers together cover three distinct failure modes. The status code tells you what to do next:
503 DEDUPE_LOCK_UNAVAILABLE- the duplicate-check store could not acquire its lock forinstructionIdentification. The payment was not submitted to core banking. Safe to retry after a short backoff with the sameinstructionIdentification(and the sameIdempotency-Key, if you used one). This is not "a duplicate was detected" - it is "we could not verify uniqueness right now."409 ACH_LOCAL_DUPLICATE_INSTRUCTION_ID- thisinstructionIdentificationwas already accepted within the 24-hour window. Do not retry thePOST; query payment status to reconcile.5xx, connection timeout, or no response - outcome unknown. Retry with the sameIdempotency-Keyand sameinstructionIdentification. The server will either replay the original201(if the first attempt landed) or return409 ACH_LOCAL_DUPLICATE_INSTRUCTION_ID(also indicating the first attempt landed).
Decision tree in pseudocode:
async function submitAchLocalPayment(paymentRequest, idempotencyKey) {
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
const res = await postPayment(paymentRequest, idempotencyKey);
switch (res.status) {
case 201:
return res.body; // success - persist paymentId against instructionIdentification
case 409: // ACH_LOCAL_DUPLICATE_INSTRUCTION_ID - intent already submitted
// Do NOT retry with a new instructionId. Reconcile via status lookup.
return await reconcileViaStatusLookup(paymentRequest.instructionIdentification);
case 503: // DEDUPE_LOCK_UNAVAILABLE - NOT submitted, safe to retry as-is
case 502: case 504: // transient gateway
await backoff(attempt); continue;
default:
if (isNetworkError(res)) { // unknown outcome - retry SAME key + SAME instructionId
await backoff(attempt); continue;
}
throw res; // 4xx other - fix request, mint NEW instructionId before retrying
}
}
}// NEW payment intent (user clicks "Send" again, new business event)
const intent = {
instructionIdentification: uuid(),
idempotencyKey: uuid()
};
// RETRY of the SAME intent (5xx, 503 DEDUPE_LOCK_UNAVAILABLE, timeout)
// -> keep BOTH values stable; the server will replay or short-circuit safely
retry(intent);
// After 409 ACH_LOCAL_DUPLICATE_INSTRUCTION_ID
// -> do NOT POST again; query status to reconcile
await getPaymentStatus(intent.instructionIdentification);- Mint the key before the HTTP call and persist it alongside the payment intent so a process restart or retry can still find it.
- Reuse it for every retry of the same intent; treat it as "spent" only after a terminal (
2xxor non-retryable4xx) response. - Plan retries to land inside the cache window (~1 hour). Beyond that,
instructionIdentification(24 h) is your remaining guard.
| Field | Constraint |
|---|---|
instructionIdentification | Optional, max 16 characters |
debtorAccount.identification | Required, max 36 characters |
debitCurrency | Required, exactly 3 characters, USD or BMD only |
instructedAmount.amount | Required, max 18 characters, valid decimal (up to 2 decimal places) |
instructedAmount.currency | Required, exactly 3 characters, USD or BMD only, must equal debitCurrency |
creditorAccount.identification | Required, max 17 characters |
creditorAccount.name | Required, max 22 characters |
creditorBank.bankCode | Required, 1-100 characters (see Creditor Bank Reference below) |
creditorBank.currency | Required, exactly 3 characters, must match debitCurrency |
remittanceInformation | Required, 1–2 non-empty lines, each max 35 characters |
const res = await fetch('https://api.bcb.bm/v1/payments/ach-local', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
'Idempotency-Key': idempotencyKey, // UUID v4, per payment intent
},
body: JSON.stringify(paymentRequest), // shape: see request schema below
});The full request and response schemas, including field types and a worked example, are rendered below from the API contract.
Required Permission: payment-ach
This endpoint requires the permission claim payment-ach 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. Max 16 characters.
ISO 4217 currency code for the debit side of the transfer. Must be USD or BMD and must match InstructedAmount currency.
Identification and name of the creditor (beneficiary) account. Identification max 17 characters; name max 22 characters.
Bank code used to identify the destination bank in the bank reference lookup.
- Mock serverhttps://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/ach-local
- UAT Environment - Used for testing and integration purposeshttps://api-uat.bcb.bm/v1/payments/ach-local
- Production Environment - Live environment for production usehttps://api.bcb.bm/v1/payments/ach-local
- 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/ach-local \
-H 'Authorization: Bearer <YOUR_jwt_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"instructionIdentification": "REF-123456",
"debtorAccount": {
"identification": 123456789012
},
"debitCurrency": "USD",
"instructedAmount": {
"currency": "USD",
"amount": 1500
},
"creditorAccount": {
"identification": 9876543210123,
"name": "John Doe",
"additionalInformation": null
},
"creditorBank": {
"bankCode": "HSBC",
"currency": "USD"
},
"remittanceInformation": [
"Invoice 2026-0001"
]
}'Created - The ACH local 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.
External reference number assigned by the bank's payment processing system. This reference can be used for tracking and reconciliation purposes.
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
The date on which the payment is settled between banks. This is the date when the funds become available to the beneficiary. Format: ISO 8601 date string (YYYY-MM-DD)
Specifies how the charges for the payment are allocated. Possible values:
- OUR: All charges are paid by the sender
- BEN: All charges are paid by the beneficiary
- SHA: Charges are shared between sender and beneficiary
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
Collection of unstructured information provided with the payment to help with reconciliation and payment identification.
Detailed information about the ultimate beneficiary of the payment. Includes identification, name, and additional information.
Information about the beneficiary's bank or financial institution. Typically, includes the BIC/SWIFT code and bank details.
Collection of related financial activities associated with this payment. This may include charges, forex conversions, or other related transactions.
The current processing status of the transaction.
A unique identifier specific to this instance of the activity.
Unique identifier for the arrangement associated with this activity.
Identifier for the type of activity.
Product identifier related to the activity.
{ "id": "PAY-8F2A1C", "status": "success", "transactionStatus": "accepted", "uniqueIdentifier": "20260311-ACH-000123", "details": { "extReference": "REF-123456", "instructedAmount": { … }, "debtorAccount": { … }, "beneficiaryAccount": { … }, "creditorAccount": { … }, "settlementDetails": { … }, "chargeDetails": { … }, "remittanceInformation": [ … ], "beneficiary": { … }, "beneficiaryAgent": { … }, "intermediaryAgent": null }, "linkedActivities": [] }
Request
Initiates an international wire transfer over the SWIFT network. The request carries source and destination account information, payment amount and currency, beneficiary details, and remittance/reference information. Both JSON and CSV response formats are supported via the Accept header.
For cross-currency payments you may supply the debit amount instead of the instructed amount (additive format):
- Send
debitAmount(currency + amount) as the exact amount to be debited. - Send
instructedAmountwithcurrencyonly (amount omitted); the bank assigns the exchange rate and computes the credited amount. - Do not send both
debitAmount.amountandinstructedAmount.amount. - If
debitAmountis omitted,instructedAmount(currency + amount) is used as the standard same-currency behaviour.
- If
creditorAgent.identification(BIC/bank identifier) is provided,creditorAgent.nameandcreditorAgent.additionalInformationare optional and may be omitted. - If
creditorAgent.identificationis not provided, supplycreditorAgent.nameandcreditorAgent.additionalInformationto identify the beneficiary bank.
- Endpoint:
POST https://api.bcb.bm/v1/payments/swift - Authorization:
Bearer {token}. - Accept:
application/json(default) ortext/csv. - Idempotency-Key: optional UUID v4 header (≤ 255 chars). See below.
The API supports idempotency through the optional Idempotency-Key header. When supplied, the server caches the successful response and replays it on repeat calls.
- If no idempotency key is provided, the request is processed normally (duplicates are possible).
- If a valid UUID key is supplied, the system stores the response of the first
2xxoutcome and replays it on subsequent calls with the same key. - TTL (cache lifetime): the stored response is retained for a limited window (currently on the order of one hour). After expiry the same key is treated as a new request - but
instructionIdentificationdeduplication still applies for 24 hours. Plan client-side retries to land inside the cache window. - Scope: keys are partitioned by client/user, HTTP method, and request path. The same key on
/payments/swiftand/payments/ach-localis not shared - each endpoint has its own cache slot. - Concurrency: if a second request with the same key arrives while the first is still in flight, the second is rejected with
409 Conflictand message"Request is already being processed."Wait and retry. - Body mismatch: request bodies are not compared on replay. If you reuse a key with a different body, the original cached response is returned - the new body is ignored. Mint a fresh key for any logically different request.
- Non-2xx responses are not cached. A
4xxvalidation failure or5xxserver error can be retried with the same key and will execute again.
A separate, business-level guard on the instructionIdentification field, applied independently of the Idempotency-Key header:
- Reusing an
instructionIdentificationfor an active payment is rejected with409 PAYMENT_DUPLICATE_INSTRUCTION_ID. - Use a fresh
instructionIdentificationfor each new payment intent. Reuse it (with the sameIdempotency-Key) only when retrying the exact same payment. - The deduplication window is currently configured as 24 hours from the first accepted request.
They are independent mechanisms with different purposes.
Idempotency-Key(header) is a transport-level retry token. It lets you safely retry the same HTTP call and get the original response replayed.instructionIdentification(body) is the business identifier of the payment. It is persisted on the payment record and forwarded downstream. To prevent the same payment intent from being submitted twice, a value that is already in flight or recently accepted is rejected with409 PAYMENT_DUPLICATE_INSTRUCTION_ID(window: 24 hours).
Idempotency-Key | instructionIdentification | Behaviour |
|---|---|---|
| no | no | No protection. Each call creates a new payment. |
| yes | no | HTTP retries of the same call replay the original response. A new Idempotency-Key creates a new payment. |
| no | yes | First call is processed normally. Reusing the same business identifier within 24 hours is rejected with 409 PAYMENT_DUPLICATE_INSTRUCTION_ID. The original success response is not replayed - record it client-side. |
| yes | yes | Recommended. HTTP retries of the same call replay the original response. A new Idempotency-Key reusing an in-flight instructionIdentification is rejected with 409. |
The dedupe and idempotency layers together cover three distinct failure modes. The status code tells you what to do next:
503 DEDUPE_LOCK_UNAVAILABLE- the duplicate-check store could not acquire its lock forinstructionIdentification. The payment was not submitted to core banking. Safe to retry after a short backoff with the sameinstructionIdentification(and the sameIdempotency-Key, if you used one). This is not "a duplicate was detected" - it is "we could not verify uniqueness right now."409 PAYMENT_DUPLICATE_INSTRUCTION_ID- thisinstructionIdentificationwas already accepted within the 24-hour window. Do not retry thePOST; query payment status to reconcile.5xx, connection timeout, or no response - outcome unknown. Retry with the sameIdempotency-Keyand sameinstructionIdentification. The server will either replay the original201(if the first attempt landed) or return409 PAYMENT_DUPLICATE_INSTRUCTION_ID(also indicating the first attempt landed).
Decision tree in pseudocode:
async function submitPayment(paymentRequest, idempotencyKey) {
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
const res = await postPayment(paymentRequest, idempotencyKey);
switch (res.status) {
case 201:
return res.body; // success - persist paymentId against instructionIdentification
case 409: // PAYMENT_DUPLICATE_INSTRUCTION_ID - intent already submitted
// Do NOT retry with a new instructionId. Reconcile via status lookup.
return await reconcileViaStatusLookup(paymentRequest.instructionIdentification);
case 503: // DEDUPE_LOCK_UNAVAILABLE - NOT submitted, safe to retry as-is
case 502: case 504: // transient gateway
await backoff(attempt); continue;
default:
if (isNetworkError(res)) { // unknown outcome - retry SAME key + SAME instructionId
await backoff(attempt); continue;
}
throw res; // 4xx other - fix request, mint NEW instructionId before retrying
}
}
}// NEW payment intent (user clicks "Send" again, new business event)
const intent = {
instructionIdentification: uuid(),
idempotencyKey: uuid()
};
// RETRY of the SAME intent (5xx, 503 DEDUPE_LOCK_UNAVAILABLE, timeout)
// -> keep BOTH values stable; the server will replay or short-circuit safely
retry(intent);
// After 409 PAYMENT_DUPLICATE_INSTRUCTION_ID
// -> do NOT POST again; query status to reconcile
await getPaymentStatus(intent.instructionIdentification);- Mint the key before the HTTP call and persist it alongside the payment intent so a process restart or retry can still find it.
- Reuse it for every retry of the same intent; treat it as "spent" only after a terminal (
2xxor non-retryable4xx) response. - Plan retries to land inside the cache window (~1 hour). Beyond that,
instructionIdentification(24 h) is your remaining guard.
const res = await fetch('https://api.bcb.bm/v1/payments/swift', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
'Idempotency-Key': idempotencyKey, // UUID v4, per payment intent
},
body: JSON.stringify(paymentRequest), // shape: see request schema below
});The full request and response schemas, including field types and a worked example, are rendered below from the API contract.
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.
The SWIFT payment request containing all necessary payment details.
Unique identification as assigned by an instructing party for an instructed party to unambiguously identify the instruction.
Unambiguous identification of the account of the creditor to which a credit entry will be posted as a result of the payment transaction.
Specifies which party/parties will bear the charges associated with the processing of the payment transaction. Max length: 3 characters (e.g., OUR/SHA/BEN).
- Mock serverhttps://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/swift
- UAT Environment - Used for testing and integration purposeshttps://api-uat.bcb.bm/v1/payments/swift
- Production Environment - Live environment for production usehttps://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
},
"debitAmount": null,
"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": [
"383 Madison Avenue",
"New York, NY 10179",
"United States"
]
},
"intermediaryAgent": {
"identification": "BCBKBMHM",
"name": "Bermuda Commercial Bank",
"additionalInformation": [
"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.
External reference number assigned by the bank's payment processing system. This reference can be used for tracking and reconciliation purposes.
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
The date on which the payment is settled between banks. This is the date when the funds become available to the beneficiary. Format: ISO 8601 date string (YYYY-MM-DD)
Specifies how the charges for the payment are allocated. Possible values:
- OUR: All charges are paid by the sender
- BEN: All charges are paid by the beneficiary
- SHA: Charges are shared between sender and beneficiary
The name of the identification scheme, e.g. "BBAN", "AccountNumber".
The identifier within that scheme (e.g. account number).
Collection of unstructured information provided with the payment to help with reconciliation and payment identification.
Detailed information about the ultimate beneficiary of the payment. Includes identification, name, and additional information.
Information about the beneficiary's bank or financial institution. Typically, includes the BIC/SWIFT code and bank details.
Collection of related financial activities associated with this payment. This may include charges, forex conversions, or other related transactions.
The current processing status of the transaction.
A unique identifier specific to this instance of the activity.
Unique identifier for the arrangement associated with this activity.
Identifier for the type of activity.
Product identifier related to the activity.
{ "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
pageTokenfrom previous responses withpageStartto navigate pages. - Page Token: Contains encoded pagination context including pageSize, so don't specify
pageSizein 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/jsonfor JSON responses (default) - Set
Accept: text/csvfor CSV responses If the Accept header is omitted,application/jsonis 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.
- Mock serverhttps://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/accounts/{accountNumber}/payments
- UAT Environment - Used for testing and integration purposeshttps://api-uat.bcb.bm/v1/accounts/{accountNumber}/payments
- Production Environment - Live environment for production usehttps://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?pageToken=string&pageStart=0&pageSize=0' \
-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", "Reversed")
- 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/jsonfor JSON responses (default) - Set
Accept: text/csvfor CSV responses If the Accept header is omitted,application/jsonis 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 serverhttps://developers.bcb.bm/_mock/apis/open-banking-api/open-banking-api/v1/payments/{paymentId}/status
- UAT Environment - Used for testing and integration purposeshttps://api-uat.bcb.bm/v1/payments/{paymentId}/status
- Production Environment - Live environment for production usehttps://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>'{ "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 }