Verified against: Public OpenAPI 2.0.0

Authoritative state

Verify before fulfillment

GET/api/v2/payments/verify/{transaction_id}
Read the merchant-scoped transaction state from your backend.

Redirect parameters are customer-controlled navigation data. Verify the transaction server-side, confirm it belongs to the expected order and amount, then perform fulfillment exactly once.

Idempotent fulfillment

In one database transaction, lock or claim the merchant order, record the Moneybag transaction ID and verified state, and apply fulfillment only when it has not already occurred. Repeated redirects, reads, and webhook deliveries must reach the same result without repeating the side effect.

API reference

The public artifact defines the transaction path parameter, the complete verification response fields, and the validation-error response. It does not define polling intervals or a retry schedule.

GET/api/v2/payments/verify/{transaction_id}

Verify Payment

Verify Payment API This endpoint verifies the status of a payment transaction using the transaction ID. It checks the transaction status and returns the result. Args: transaction_id: Unique identifier for the payment transaction payment_service: Service for managing payment transactions payment_session: Service for managing payment sessions Returns: PaymentResponses: Response with payment verification details Raises: HTTPException: If the transaction doesn't exist or has expired

Operation ID
verify_payment_api_v2_payments_verify__transaction_id__get
Environment
https://sandbox.api.moneybag.com.bd (Moneybag sandbox)
Authentication
X-Merchant-API-Key — Sandbox merchant API key. Live keys are rejected.

Parameters

FieldTypeRequiredConstraints and meaning
path.transaction_idstringYes—
Transaction ID for the payment

Request body

No request body.

Sandbox example

Set the merchant key and replace resource identifiers with values created in your sandbox workspace.

curl --request GET "https://sandbox.api.moneybag.com.bd/api/v2/payments/verify/${TRANSACTION_ID}" \
  --header "X-Merchant-API-Key: $MONEYBAG_MERCHANT_KEY"

Run this reviewed operation in the API Lab →

Responses

200 Successful Response

Content type: application/json. Schema: PaymentResponses.

FieldTypeRequiredConstraints and meaning
dataCheckoutResponse | SessionResponse | ProcessResponse | VerificationResponse | InvoiceDetailsResponse | CancelResponse | CheckoutResponse | SessionResponse | ProcessResponse | VerificationResponse | InvoiceDetailsResponse | CancelResponse[] | nullNo—
data<CheckoutResponse>.checkout_urlstringWhen parent is present—
data<CheckoutResponse>.expires_atstringWhen parent is present—
data<CheckoutResponse>.session_idstringWhen parent is present—
data<SessionResponse>.bleedingbooleanNodefault false
Whether merchant pays service charges (bleeding)
data<SessionResponse>.business_namestring | nullNo—
data<SessionResponse>.can_return_to_merchantbooleanNodefault false
Whether the checkout may offer a 'return to merchant' action — true when the merchant's stored return URL passes moneybag.utils.redirect_guard. Deliberately a BOOLEAN, not the URL: this response is fetched by the hosted checkout from the browser, so any URL here would be readable by page scripts, devtools, error reporters and anyone holding the checkout link, and merchant cancel URLs routinely carry order tokens in their query string. The destination itself is never serialised — the checkout links to GET /payments/sessions/{session_id}/return, which resolves and validates it server-side at click time.
data<SessionResponse>.currencystringWhen parent is present—
data<SessionResponse>.customerobject | nullNo—
data<SessionResponse>.emi_checkout_idstring | nullNo—
Selected EMI configuration UUID if pre-selected
data<SessionResponse>.emi_fee_bleedingbooleanNodefault false
Whether merchant pays EMI fees (emi_fee_bleeding)
data<SessionResponse>.emi_payment_optionsobject[] | nullNo—
EMI payment options with calculations
data<SessionResponse>.expires_atstringWhen parent is present—
data<SessionResponse>.merchant_logostring | nullNo—
data<SessionResponse>.order_amountstringWhen parent is presentpattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
data<SessionResponse>.order_descriptionstring | nullNo—
data<SessionResponse>.order_idstringWhen parent is present—
data<SessionResponse>.payment_optionsobject[]When parent is present—
data<SessionResponse>.requires_emibooleanNodefault false
Whether EMI payment options are available
data<SessionResponse>.selected_emi_configurationSelectedEMIConfiguration | nullNo—
Selected EMI configuration with emi_configuration_id and service_id
data<SessionResponse>.selected_emi_configuration.emi_configuration_idstringWhen parent is present—
Selected EMI configuration ID
data<SessionResponse>.selected_emi_configuration.service_idstring | nullNo—
Public merchant payment service UUID, matches payment_options[].service_id
data<SessionResponse>.session_idstringWhen parent is present—
data<SessionResponse>.statusstringWhen parent is present—
data<ProcessResponse>.metaobject | nullNo—
data<ProcessResponse>.redirect_urlstring | nullNoformat uri; minimum length 1
data<ProcessResponse>.transaction_idstringWhen parent is present—
data<VerificationResponse>.amountstringWhen parent is presentpattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
data<VerificationResponse>.charge_amountstringWhen parent is presentpattern ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
data<VerificationResponse>.currencystringWhen parent is present—
data<VerificationResponse>.customerCustomerWhen parent is present—
data<VerificationResponse>.customer.addressstring | nullNomaximum length 200
Customer's address
data<VerificationResponse>.customer.citystring | nullNomaximum length 50
Customer's city
data<VerificationResponse>.customer.countrystring | nullNomaximum length 50
Customer's country
data<VerificationResponse>.customer.emailstringWhen parent is presentformat email; maximum length 100
Customer's email address
data<VerificationResponse>.customer.metadataobject | nullNo—
Additional customer-specific data
data<VerificationResponse>.customer.namestringWhen parent is presentmaximum length 255
Customer's full name
data<VerificationResponse>.customer.phonestringWhen parent is present—
Customer's phone number
data<VerificationResponse>.customer.postcodestring | nullNomaximum length 20
Customer's postal code
data<VerificationResponse>.customer.statestring | nullNo—
Customer's state/division/province (e.g. 'Dhaka', 'Chattogram'). Optional. Forwarded to processors that require a billing division; supplying a real value improves AVS accuracy and therefore risk and chargeback outcomes.
data<VerificationResponse>.order_idstringWhen parent is present—
data<VerificationResponse>.payment_methodstringWhen parent is present—
data<VerificationResponse>.payment_reference_idstringWhen parent is present—
data<VerificationResponse>.statusstringWhen parent is present—
data<VerificationResponse>.transaction_idstringWhen parent is present—
data<VerificationResponse>.verifiedbooleanWhen parent is present—
data<InvoiceDetailsResponse>.all_totalnumberWhen parent is present—
data<InvoiceDetailsResponse>.business_namestringWhen parent is present—
data<InvoiceDetailsResponse>.customerobject | nullWhen parent is present—
data<InvoiceDetailsResponse>.due_datestring | nullWhen parent is present—
data<InvoiceDetailsResponse>.gross_discountnumberWhen parent is present—
data<InvoiceDetailsResponse>.invoice_idstringWhen parent is present—
data<InvoiceDetailsResponse>.invoice_itemsobject[]When parent is present—
data<InvoiceDetailsResponse>.invoice_statusstringWhen parent is present—
data<InvoiceDetailsResponse>.invoice_typestring | nullNo—
data<InvoiceDetailsResponse>.merchant_logostring | nullNo—
data<InvoiceDetailsResponse>.payable_amountnumberWhen parent is present—
data<InvoiceDetailsResponse>.uuidstringWhen parent is present—
data<CancelResponse>.order_idstringWhen parent is present—
data<CancelResponse>.redirect_urlstringWhen parent is present—
data<CancelResponse>.session_idstringWhen parent is present—
data<CancelResponse>.statusstringNodefault "CANCELLED"
messagestring | nullNo—
metaobject | nullNo—
successbooleanYes—

422 Validation Error

Content type: application/json. Schema: HTTPValidationError.

FieldTypeRequiredConstraints and meaning
detailValidationError[]No—
detail[].locstring | integer[]When parent is present—
detail[].msgstringWhen parent is present—
detail[].typestringWhen parent is present—
OpenAPI 2.0.0 · operation verify_payment_api_v2_payments_verify__transaction_id__get · contract digest 094720c953e300d050a4861f0c64528522ac5879f954e6c2073a5bca00bfb878