Multibanco payments
Accept payments through Multibanco, Europe's most widespread reference-based payment method. Your integration generates an entity, reference, and amount. The buyer pays them later at an ATM or through home banking, with no online card and no 3DS.
This guide shows you how to create a payment intent and submit the Multibanco payment. It also covers how to present the reference to the buyer and resolve the final status asynchronously.
This document applies to the following country:
| Europe |
|---|
How it works
Use Multibanco to offer the most widespread reference-based payment method in Europe. It suits buyers who pay without an online card. Its key characteristics are:
- Reference-based — the backend generates an entity, reference, amount, and expiry_date. The buyer pays that reference whenever they want, at an ATM or through home banking.
- Reusable reference — you can show the reference data on screen, send it by email (event MULTIBANCO-REFERENCE-EMAIL), or both.
- Asynchronous / deferred processing — submitting the payment does not confirm it. The payment stays in PENDING until the buyer pays the reference, then resolves to paid (or expired / denied). You get the final status through a webhook.
The end-to-end flow involves the buyer, your frontend, your backend, and the Getnet Web Checkout API:
Before you start
Make sure the following are in place before you integrate:
- The seller (
x-seller-id) has Multibanco enabled (multibanco.enabled). - You have generated your token as described in the Authentication document.
Step 1: Create the payment intent
payment_intent_id and a redirect_url.The table below summarizes the behavior and requirements for Multibanco payment flows.
| Capability | Details |
|---|---|
| Customer experience | You display the payment reference to the customer, who pays asynchronously using bank channels (ATM, online, mobile) |
| Confirmation | Asynchronous: initial PENDING status, then APPROVED or DECLINED depending on the customer's action |
| Notifications | Webhooks for asynchronous status updates when the customer approves or declines |
| Endpoint |
|---|
POST /payment-intent |
| Field | Type | Description | Example |
|---|---|---|---|
payment.payment_method | string | Payment method | CASH_PAYMENT |
payment.brand | string | Multibanco brand identifier | MULTIBANCO |
payment.currency | String | Currency code. | EUR |
payment.amount | Integer | Purchase amount in integer format, where the last 2 digits represent the cents. For countries where cents do not apply, fill in the amount with 2 zeros to the right. | 5000 |
customer.phone_number | string | Purchaser's phone number. | 351#912345678 |
customer.customer_id | String | We recommend the customer's document number, with only letters and numbers and no special characters, separators, or spaces. | 12345678912 |
customer.name | String | Customer's full name. | John Doe Smith |
customer.email | String | Customer's email address. | customer@email.com.br |
customer.billing_address.street | String | Name of a street. | Calle Gran Via |
customer.billing_address.number | String | Number that identifies the position of a building on a street. | 1000 |
customer.billing_address.country | String | Country code. | PT |
customer.billing_address.postal_code | String | Postal or ZIP code. | 90230060 |
| Field | Type | Description | Example |
|---|---|---|---|
configurations.3ds | boolean | Controls 3D Secure authentication. Does not apply to Multibanco. | true or false |
configurations.preauthorization | boolean | Indicates if the payment is a pre-authorization. | true or false |
configurations.card_verification | boolean | Indicates if this is a card verification flow. Does not apply to Bizum. | true or false |
configurations.success_url | string | Redirect URL in case of successful payment. | https://www.mystore.com/checkout/success |
configurations.error_url | string | Redirect URL in case of an error during payment. | https://www.mystore.com/checkout/error |
soft_descriptor | string | Payment description that appears on the customer's receipt. | Tienda ES |
expires_at | string | Payment intent expiration. | 3d4h15m |
Example of request
The following example creates a Multibanco payment intent for a customer with billing and shipping addresses in Portugal.
Step 2: Submit the Multibanco payment
Submit the payment with the Multibanco method. This step bypasses validate-session and 3DS. The backend generates the reference at the provider. It returns the entity, reference, amount, and expiry_date for you to show to the buyer, send by email, or both.
Example of request
The following example submits the Multibanco payment for the customer.
Example of response — pending/waiting
WAITING status with the Multibanco entity and reference.Step 3: Confirm the result
Multibanco is asynchronous / deferred: submitting the payment does not confirm it. The payment stays in PENDING until the buyer pays the reference. Resolve the final status in one of two ways:
- Webhook: receive the approved or denied notification (see payloads below).
Example of response — approved
Authorized.Example of response — denied
The following webhook payload shows a denied payment. In this example, the reference expired without payment.
Multibanco status values (Global API contract)
For Multibanco, consider these statuses from the Global API contract:
- WAITING: reference created, waiting for the customer's payment. This is the initial return.
- APPROVED: payment confirmed. You can release the order.
- EXPIRED: reference expired without payment (D+7 by default).
- DENIED: payment refused by the processor.
- ERROR: processing error.
- PENDING: processing not yet complete. It may appear in intermediate states.
In practice, the expected flow is WAITING → APPROVED or EXPIRED. DENIED and ERROR are terminal failure states.
CANCELED exists in the general transaction set. Don't treat it as a normal Multibanco payment status unless you confirm that the tenant allows cancellation of this APM.
Your webhook must be idempotent. Invoice the order only after APPROVED.
On this page