Skip to content

Payment / Alternative payment methods / Dominican / Bank Transfer

H2H#

POST https://payments.apipro.io/v2/payment

ApiPro H2H Integration: Bank Transfer Dominican#

ApiPro provides options for processing Bank Transfer payments in the Dominican Republic via a server-to-server (H2H) integration. This documentation describes the current integration flow.

When creating a payment, you must set method = bank_transfer_dominican and use the local currency DOP in your request body to avoid configuration errors.

Initial Success Response (200 OK)#

After sending a request to create a payment, you should first inspect the error_code field. If it is not 0, the transaction has failed.

If there are no errors, the payment transitions to a pending status. You must then process the challenge object, which contains the bank accounts available for the transfer.


The bank_transfer_dominican Payment Flow (With Receipt Upload)#

In this integration style, the customer is not redirected to an external hosted page. Instead, the system returns a challenge type of bank_transfer_dominican containing a list of bank accounts the customer may pay to. The customer picks one, transfers the funds manually, and the merchant uploads a copy of the payment receipt to the API.

Why a list rather than a single account: in the Dominican Republic a transfer between accounts of the same bank is free and settles instantly, while a transfer between different banks may take longer and carry a fee. Presenting every available account lets the customer pay "inside their own bank".

Step 1. Obtaining the Bank List from ApiPro#

Once the payment is successfully initiated, the API responds with challenge_type: "bank_transfer_dominican" and the banks array.

Example of a payment creation response:

{
  "type": "payment",
  "method": "bank_transfer_dominican",
  "mode": "initial",
  "currency": "DOP",
  "amount": "4010.00",
  "challenge": {
    "challenge_type": "bank_transfer_dominican",
    "bank_transfer_dominican": {
      "banks": [
        {
          "bank_name": "Banco BDI",
          "account_number": "4010219988",
          "account_type": "Cuenta de Ahorros",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        },
        {
          "bank_name": "Banco de Reservas",
          "account_number": "960-389-947-4",
          "account_type": "Cuenta Corriente",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        },
        {
          "bank_name": "Banco Santa Cruz",
          "account_number": "113-620-100-16159",
          "account_type": "Cuenta de Ahorros",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        }
      ]
    }
  },
  "timestamp": "2026-08-03T14:53:17.8129013Z",
  "identifier": "BAN003108836",
  "reference": "DominicanBTH2HTest(1)",
  "request_id": "1fe34b18-6e3a-4dc3-88ba-858d3d28af85",
  "status": "pending",
  "error_code": 0,
  "error_reason": ""
}

Fields of each entry in banks:

Field Description
bank_name Name of the bank holding the account.
account_number Account number the customer transfers to.
account_type Account type, already spelled out for the payer (Cuenta de Ahorros or Cuenta Corriente).
account_owner Legal name of the recipient.
account_identification Local tax number (RNC) of the recipient.

The list is prepared for you. It is already filtered to the currency of the transaction and ordered by how widely each bank is used in the country, most popular first. Render it in the order received.

Step 2. Displaying the List and Customer Payment#

The merchant renders the banks array on their checkout interface and lets the customer choose one account. Once an account is chosen, display all of its fields.

UI Best Practices for Merchants#

We strongly recommend rendering this list as a dropdown or a grid of selectable cards, with the account details hidden at first and only the bank names visible. Reveal the full requisites — including the critical account_type and account_identification fields — only after the customer has picked a bank. This keeps the payment form free of visual noise, since only one of the accounts is ever relevant to a given customer.

Display the banks in the order you receive them. The list arrives pre-sorted by an internal ranking that puts the banks most widely used in the country first, so the account the customer is most likely to hold is already at the top. Re-sorting the array — alphabetically, by account number, or otherwise — will only push the more common banks down.

account_type is not optional. Dominican banks reject a transfer made to the wrong account type, so the customer must see whether the destination is a savings (Cuenta de Ahorros) or a checking (Cuenta Corriente) account before they confirm.

account_identification (RNC) is frequently required by Dominican banking apps when sending a transfer, so it must be displayed as well.

The customer opens their local banking app and performs a manual bank transfer for the exact requested amount, then saves the payment receipt (screenshot or PDF) and uploads it to the merchant's checkout page.

Step 3. Uploading the Receipt to ApiPro (Upload Receipt)#

Upon receiving the file from the customer, the merchant must convert the receipt image/document into a Base64 string and send a POST request to the /v2/payment/challenge/upload-receipt endpoint.

Example of a receipt upload request:

{
  "reference": "DominicanBTH2HTest(1)",
  "receipt_image_base64": "iVBORw0KGgoAAAANSUhEUgAAAPAAAADwCAAAAAAbPrZO...",
  "receipt_content_type": "image/png",
  "receipt_file_name": "receipt"
}

Example of a receipt upload response:

{
  "error_code": 0,
  "error_reason": "",
  "identifier": "BAN003108836",
  "request_id": "1fe34b18-6e3a-4dc3-88ba-858d3d28af85",
  "reference": "DominicanBTH2HTest(1)",
  "method": "bank_transfer_dominican",
  "type": "payin",
  "mode": "initial",
  "currency": "DOP",
  "amount": "4010.00",
  "status": null,
  "challenge": {
    "challenge_type": "bank_transfer_dominican"
  },
  "timestamp": "0001-01-01T00:00:00"
}

Process Overview (Summary)#

  1. If challenge.challenge_type is bank_transfer_dominican, read challenge.bank_transfer_dominican.banks and display the accounts to the customer in the order received.

  2. The customer selects one account and completes the transaction within their own banking environment, using the account type and RNC exactly as provided.

  3. Collect the confirmation file from the user and submit it via POST /v2/payment/challenge/upload-receipt.

  4. Once the bank verifies the uploaded receipt, ApiPro will deliver a final status callback (success or failed) to your configured callback_url.

Headers#

Header Value
Content-Type application/json
Authorization {{authorization}}
Digest {{digest}}
Host {{host}}
Date {{date}}

See Authentication & Signature for how to build the signed headers.

Request body#

Annotations in the example are the field requirements: required, optional or conditional. Comments are stripped automatically by the Postman collection before signing; remove them in your own requests.

{
    "method": "bank_transfer_dominican", // required, snake_case / lower case only: "bank_transfer_dominican" (not "BANK_TRANSFER_DOMINICAN" or "BankTransferDominican")
    "reference": "DominicanBTH2HTest(1)", // required, unique
    "currency": "DOP", // required
    "amount": 10958, // required
    "description": "Pago de orden", // optional
    "customer": { // required
        "identifier": "1111-1111-2211-2211", // required, any unique value from the merchant's system may be used.
        "email": "juancarlos@hotmail.com", // required
        "phone": "549293201", // conditional
        "first_name": "Juan", // required
        "last_name": "García Rodríguez", // required
        "middle_name": "Carlos", // optional
        "country": "DO", // required
        "state_code": "DN", // optional
        "city": "Santo Domingo", // optional
        "address": "Av. 27 de Febrero No. 211, Ensanche Naco", // optional
        "zip_code": "10121", // optional
        "itn": "00112345678", // required, Cédula de Identidad y Electoral / RNC (Registro Nacional de Contribuyentes)
        "birthday": "2006-01-02", // optional
        "ip": "190.167.12.34", // optional
        "gender": "male" // optional
    },
    "redirect_url": "https://merchant.shop.com/", // optional
    "cancel_url": "https://merchant.shop.com/cancel", // optional
    "callback_url": "https://merchant.shop.com/callback/success", // conditional
    "extra": { // conditional
        "meta": { // conditional
        }
    }
}

Fields#

Field Type Requirement / note
method string required, snake_case / lower case only: "bank_transfer_dominican" (not "BANK_TRANSFER_DOMINICAN" or "BankTransferDominican")
reference string required, unique
currency string required
amount integer required
description string optional
customer object required
customer.identifier string required, any unique value from the merchant's system may be used.
customer.email string required
customer.phone string conditional
customer.first_name string required
customer.last_name string required
customer.middle_name string optional
customer.country string required
customer.state_code string optional
customer.city string optional
customer.address string optional
customer.zip_code string optional
customer.itn string required, Cédula de Identidad y Electoral / RNC (Registro Nacional de Contribuyentes)
customer.birthday string optional
customer.ip string optional
customer.gender string optional
redirect_url string optional
cancel_url string optional
callback_url string conditional
extra object conditional
extra.meta object conditional

Responses#

Response Examples

Merchant not found
{
  "error_code": 35,
  "error_reason": "Merchant not found",
  "description": "The requested resource is undefined",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:01:00.00Z"
}
Required fields are missing: method or widget.method, reference
{
  "error_code": 31,
  "error_reason": "Required fields are missing: method or widget.method, reference",
  "timestamp": "2025-10-26T14:03:00.00Z"
}
Using 'method' and 'widget.method' at the same time.
{
  "error_code": 30,
  "error_reason": "Invalid params",
  "description": "Widget and method cannot be used together",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:04:00.00Z"
}
Card can only be used with specific methods. Check documentation
{
  "error_code": 30,
  "error_reason": "Invalid params",
  "description": "Card can only be used with specific methods. Check documentation",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:05:00.00Z"
}
Customer is blocked
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:06:00.00Z"
}
Customer is blocked for all merchant projects
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked for all merchant projects",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:02.00Z"
}
Customer is blocked for the specified project
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked for the specified project",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:04.00Z"
}
Customer is blocked system-wide
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is blocked system-wide",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:06.00Z"
}
Customer is globally locked
{
  "error_code": 451,
  "error_reason": "General risk decline",
  "description": "Customer is globally locked",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:08.00Z"
}
Timeout while requesting routing
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Routing request timeout",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:01.00Z"
}
Payment transaction timeout after some time
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Payment transaction timeout after 30 seconds",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:03.00Z"
}
Unknown routing error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Unknown routing error",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:02.00Z"
}
Payment transaction was cancelled
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Payment transaction was cancelled",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:04.00Z"
}
Internal error: Data is empty
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Value cannot be null. (Parameter 'data')",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:05.00Z"
}
Endpoint type wasn't found
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Endpoint type cannot be null or empty (Parameter 'endpointType')",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:06.00Z"
}
Mid configuration error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Mid [Mid ID] no longer exists in configuration",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:07.00Z"
}
Routing service error: Converting data error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Routing service error: The JSON value could not be converted to System.Guid.",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:08.00Z"
}
Routing service error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Routing service error",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:08.00Z"
}
Broker transport failure
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error: Broker transport failure",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:09.00Z"
}
Internal error
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "Internal error",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:09.00Z"
}
An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "description": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:08:10.00Z"
}
An unexpected error occurred while processing the request
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "An unexpected error occurred while processing the request",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:09:00.00Z"
}
Invalid method challenge configuration. Settings not found.
{
  "error_code": 121,
  "error_reason": "Invalid method challenge configuration. Please reconfigure method challenge type settings",
  "description": "Invalid method challenge configuration. Settings not found.",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:10:00.00Z"
}
Route is invalid (Incorrect method, mid settings)
{
  "error_code": 121,
  "error_reason": "Route is invalid",
  "description": "There is more than one challenge setting for a method. Please reconfigure method challenge type settings.",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:11:00.00Z"
}
Getting currency rate info error.
{
  "error_code": 200,
  "error_reason": "While getting currency rate, error happend",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:12:00.00Z"
}
Error processing currency information.
{
  "error_code": 200,
  "error_reason": "Error with payment configurations",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:13:00.00Z"
}
Error with wallet
{
  "error_code": 200,
  "error_reason": "Error with wallet",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:14:00.00Z"
}
Failed to register transaction
{
  "error_code": 200,
  "error_reason": "Failed to register transaction",
  "description": "An internal error occurred while processing currency information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:15:00.00Z"
}
Failed saving card info
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "Failed to save card information",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:16:00.00Z"
}
Transaction processing error
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "Failed to register the transaction",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:17:00.00Z"
}
Mid doesn't support challenge type for method (mid or method settings problem)
{
  "error_code": 121,
  "error_reason": "Route is invalid",
  "description": "Mid does not support challenge type [challengeType] for method [method]",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:18:00.00Z"
}
Mid is disabled
{
  "error_code": 121,
  "error_reason": "Route is invalid",
  "description": "Mid is disabled",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:19:00.00Z"
}
Bank doesn't support currency
{
  "error_code": 1051,
  "error_reason": "Bank doesn't support currency",
  "description": "Blocked routing for transaction: Invalid currency",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:20:00.00Z"
}
Bank doesn't support payment method
{
  "error_code": 1054,
  "error_reason": "Bank doesn't support payment method",
  "description": "Blocked routing for transaction: Invalid method: [method]",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:21:00.00Z"
}
Bank does not support transaction: Invalid payment type
{
  "error_code": 1050,
  "error_reason": "Bank does not support transaction",
  "description": "Blocked routing for transaction: Invalid payment type",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:22:00.00Z"
}
Mid request timeout
{
  "error_code": 200,
  "error_reason": "Mid request timeout",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:24:00.00Z"
}
Communication error
{
  "error_code": 200,
  "error_reason": "Communication error",
  "request_id": "[UUID_ТРАНЗАКЦІЇ]",
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:25:00.00Z"
}
Forbidden
{
  "error_code": 5,
  "error_reason": "Forbidden",
  "timestamp": "2025-10-26T14:33:00.00Z"
}
Some unexpected message
{
  "error_code": 5,
  "error_reason": "[Some unexpected message]",
  "timestamp": "2025-10-26T14:33:00.00Z"
}
Failed to register card transaction
{
  "error_code": 200,
  "error_reason": "Failed to register card transaction",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:34:00.00Z"
}
Failed to register cascade transaction
{
  "error_code": 200,
  "error_reason": "Failed to register cascade transaction",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:35:00.00Z"
}
Endpoint type cannot be null or empty
{
  "error_code": 200,
  "error_reason": "Endpoint type cannot be null or empty",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:36:00.00Z"
}
Data is empty
{
  "error_code": 200,
  "error_reason": "Value cannot be null. (Parameter 'data')",
  "request_id": null,
  "reference": "YOUR_REFERENCE",
  "timestamp": "2025-10-26T14:36:00.00Z"
}
An unexpected internal error occured
{
  "error_code": 200,
  "error_reason": "Transaction processing error",
  "description": "An unexpected internal error occurred",
  "request_id": "YOUR_REFERENCE",
  "status": "error",
  "timestamp": "2025-10-26T14:38:00.00Z"
}
Handler returned null response
{
  "error_code": 210,
  "error_reason": "Handler returned null response",
  "description": "Handler returned null response",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:02:00.000Z"
}
Rate limit exceeded
{
  "error_code": 210,
  "error_reason": "Rate limit exceeded",
  "description": "Rate limit exceeded",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:01:00.000Z"
}
Access denied: Invalid or missing access token
{
  "error_code": 210,
  "error_reason": "Access denied: Invalid or missing access token",
  "description": "Access denied: Invalid or missing access token",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:00:00.000Z"
}
Request cannot be null
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Request cannot be null"
}
Flow cache limit exceeded
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow cache limit exceeded"
}
Flow configuration not found for project: {projectId}
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow configuration not found for project: {projectId}"
}
Invalid flow configuration
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Invalid flow configuration"
}
Flow execution failed
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow execution failed"
}
Circular reference detected at node: {NodeIdentifier}
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Circular reference detected at node: {NodeIdentifier}"
}
Node not found: {NodeIdentifier}
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Node not found: {NodeIdentifier}"
}
Flow execution limit exceeded
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow execution limit exceeded"
}
Flow ended without result
{
  "error_code": 121,
  "error_reason": "An issue has been detected in the routing settings. For instance, it could be due to a disabled project or bank",
  "request_id": "[YOUR_REFERENCE]",
  "reference": "",
  "status": "error",
  "timestamp": "2025-10-04T12:56:41.94Z",
  "description": "Flow ended without result"
}
Duplicated reference
{
  "error_code": 108,
  "error_reason": "Duplicated reference",
  "request_id": "3829f5bd-6dcb-41f9-a4ba-3ff8b65a3cfc",
  "reference": "",
  "timestamp": "2025-11-10T08:47:22.81Z"
}
Succesful transaction
{
  "type": "payment",
  "method": "bank_transfer_dominican",
  "mode": "initial",
  "currency": "DOP",
  "amount": "10958.00",
  "challenge": {
    "challenge_type": "bank_transfer_dominican",
    "bank_transfer_dominican": {
      "banks": [
        {
          "bank_name": "Banco BDI",
          "account_number": "4010219988",
          "account_type": "Cuenta de Ahorros",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        },
        {
          "bank_name": "Banco de Reservas",
          "account_number": "960-389-947-4",
          "account_type": "Cuenta Corriente",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        },
        {
          "bank_name": "Banco Santa Cruz",
          "account_number": "113-620-100-16159",
          "account_type": "Cuenta de Ahorros",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        },
        {
          "bank_name": "Banco Vimenca",
          "account_number": "00-001-025-305-72",
          "account_type": "Cuenta de Ahorros",
          "account_owner": "OuroSR SRL",
          "account_identification": "1-32-08672-4"
        }
      ]
    }
  },
  "timestamp": "2026-08-03T14:53:17.8129013Z",
  "identifier": "BAN003108836",
  "reference": "DominicanBTH2HTest(1)",
  "request_id": "1fe34b18-6e3a-4dc3-88ba-858d3d28af85",
  "status": "pending",
  "error_code": 0,
  "error_reason": ""
}
Missing Authorization header
{
  "error_code": 31,
  "error_reason": "Missing Authorization header",
  "timestamp": "2025-10-26T16:01:00.00Z"
}
Invalid Authorization header format
{
  "error_code": 31,
  "error_reason": "Invalid authorization header format",
  "timestamp": "2025-10-26T16:03:00.00Z"
}
Invalid signature format
{
  "error_code": 31,
  "error_reason": "Invalid signature format",
  "timestamp": "2025-10-26T16:03:00.00Z"
}
Unsupported algorithm
{
  "error_code": 31,
  "error_reason": "Unsupported algorithm",
  "timestamp": "2025-10-26T16:04:00.00Z"
}
Invalid API key
{
  "error_code": 31,
  "error_reason": "Invalid API key",
  "timestamp": "2025-10-26T16:05:00.00Z"
}
Missing Date header
{
  "error_code": 31,
  "error_reason": "Missing Date header",
  "timestamp": "2025-10-26T16:06:00.00Z"
}
Invalid date format
{
  "error_code": 31,
  "error_reason": "Invalid date format",
  "timestamp": "2025-10-26T16:07:00.00Z"
}
Date is outdated or invalid
{
  "error_code": 31,
  "error_reason": "Date is outdated or invalid",
  "timestamp": "2025-10-26T16:08:00.00Z"
}
Missing Digest header
{
  "error_code": 31,
  "error_reason": "Missing Digest header",
  "timestamp": "2025-10-26T16:09:00.00Z"
}
Invalid digest
{
  "error_code": 31,
  "error_reason": "Invalid digest",
  "timestamp": "2025-10-26T16:10:00.00Z"
}
Request timestamp has already been used
{
  "error_code": 31,
  "error_reason": "Request timestamp has already been used",
  "timestamp": "2025-10-26T16:11:00.00Z"
}
Invalid headers specification
{
  "error_code": 31,
  "error_reason": "Invalid headers specification",
  "timestamp": "2025-10-26T16:12:00.00Z"
}
Invalid signature
{
  "error_code": 31,
  "error_reason": "Invalid signature",
  "timestamp": "2025-10-26T16:13:00.00Z"
}
Processing error:
{
  "error_code": 210,
  "error_reason": "Processing error:",
  "description": "Processing error:",
  "request_id": "your_transaction_reference",
  "status": "error",
  "timestamp": "2025-10-26T12:03:00.000Z"
}
Missing required authentication headers
{
  "error_code": 31,
  "error_reason": "Missing required authentication headers",
  "timestamp": "2025-10-26T14:04:00.00Z"
}

Callback Notifications

The system sends an HTTP callback to the callback_url of your request when a transaction reaches a final state. Always verify the callback signature; see Callback Verification.

Callback Payload

Callback request
{
  "identifier": "PM0000000BTRDOM1",
  "creation_date": "2025-11-15T18:08:10.190Z",
  "request_id": "b0c1d2e3-f4a5-b6c7-8901-d2e3f4a5b6c7",
  "reference": "ref-btr-do-h2h-1809778899",
  "method": "bank_transfer_dominican",
  "type": "payment",
  "mode": "initial",
  "status": "success",
  "status_date": "2025-11-15T18:10:40.730Z",
  "amount": "150000.00",
  "currency": "DOP",
  "billing_amount": "150000.00",
  "billing_currency": "DOP",
  "fee_amount": "2500.00",
  "fee_currency": "DOP",
  "customer": {
    "identifier": "cust_do_787878",
    "email": "santiago.rodriguez@example.com",
    "phone": "+18093102345",
    "first_name": "Santiago",
    "last_name": "Rodriguez",
    "country": "DO"
  },
  "error_code": 0,
  "error_reason": null,
  "timestamp": "2025-11-15T18:10:41.000Z",
  "meta": {
    "key": "value"
  }
}