On this page
No Headings
Last updated: June 16, 2026
Note: The integration steps for implementing alternative payment methods are similar. If you've integrated another alternative payment method before, you can reuse that code with adjustments for this payment method.
PAYMENT.CAPTURE.PENDING – Listen for this webhook as an indication that payment initiation was successful, the payment is in a pending state, and is waiting for the buyer to complete the payment.PAYMENT.CAPTURE.COMPLETED – Listen for this webhook as an indication that the buyer has completed the payment, which can take up to seven days. You can ship the order to the buyer at this point.PAYMENT.CAPTURE.DENIED - Listen for this webhook as an indication that the Multibanco payment instruction has expired or the payer didn't complete the payment on time. You can cancel the order at this point. After you receive each webhook, fetch the latest order details using Show order details. The up HATEOAS link in the webhook payload indicates the order associated with the capture.You'll need to create the user interface to offer Multibanco and collect the buyer's information, then you'll use the API calls described in the remainder of this topic to:
Refer to Payment method icons for icons you can use and download locations.
Use the buyer information you captured from your user interface to create an order.
API endpoint used: Create order
curl -v -X POST https://api-m.sandbox.paypal.com/v2/checkout/orders \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Access-Token>" \
-d '{
"intent": "CAPTURE",
"purchase_units": [
{
"amount": {
"currency_code": "EUR",
"value": "100.00"
}
}
]
}'After you copy the code in the sample request, modify the following:
Access-Token - Your access token.intent - To use an alternative payment method, this parameter must be set to CAPTURE as it is in this sample code.purchase_units[0].amount - Pass the value of the order and the currency code.A successful request results in the following:
201 Created.To specify Multibanco as the payment method the buyer selected in your user interface, confirm the payment source for the order.
Orders API endpoint used: Confirm the Order
curl -v -X POST https://api-m.sandbox.paypal.com/v2/checkout/orders/54K10082DX701193V/confirm-payment-source \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Access-Token>" \
-d '{
"payment_source": {
"multibanco": {
"name": "John Doe",
"country_code": "PT"
}
},
"processing_instruction": "ORDER_COMPLETE_ON_PAYMENT_APPROVAL",
"application_context": {
"locale": "en-PT",
"return_url": "https://example.com/returnUrl",
"cancel_url": "https://example.com/cancelUrl"
}
}'After you copy the code in the sample request, modify the following:
Access-Token - Your access token.
Order ID - In the URI for the API call, replace the sample ID with your order ID. In the sample, the order ID is 54K10082DX701193V.
payment_source - Specify the following:
multibanco as the payment_source.PT as the country_code.name field.processing_instruction - Set this value to ORDER_COMPLETE_ON_PAYMENT_APPROVAL for processing Multibanco payments.
application_context - Specify the preferred language for returned errors, the URL the buyer is returned to after approving the purchase with their selected payment method, and the URL the buyer is returned to after canceling an approval with their selected payment method.
Note: While return_url and cancel_url are optional fields, this integration requires you specify them to handle the handoff from the payment method back to your site. You can use the cancel_url to redirect buyers when an error occurs while they're on the payment method's site, so make sure your cancel URL works for that situation as well as an actual cancellation by the buyer.
A successful request results in the following:
200 OK.payer-action redirect in the next step. See also: HATEOAS links.In your user interface, attach the payer-action redirect returned in the Confirm payment source call to the Multibanco payment button. This renders the Multibanco payment instruction.
In the sample, the redirect is: "https://www.sandbox.paypal.com/payment/multibanco?token=54K10082DX701193V".
You can also send the Multibanco payment instruction to your buyers in an email. Obtain the details from Show order details endpoint. References to the payment instruction are present in the payment_source.multibanco.payment_reference and payment_source.multibanco.payment_entity response parameter.
curl -v -X GET https://api-m.sandbox.paypal.com/v2/checkout/orders/54K10082DX701193V \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Access-Token>"After you copy the code in the sample request, modify the following:
Access-Token - Your access token.54K10082DX701193V.A successful request returns the HTTP 200 OK status code with a JSON response body that returns a COMPLETED status.
A successful approval results in the following:
COMPLETED, which means the order was created successfully.PENDING status is present in the response parameter purchase_units[0].payments.captures[0]. The up HATEOAS link indicates the order associated with this capture.PAYMENT.CAPTURE.PENDING webhook event is triggered, which indicates that payment initiation was successful, the payment is in a pending state, and is waiting for the buyer to complete the payment.
payment_reference and payment_entity.{
"id": "WH-3XD97656HT346122M-81M194208A0322526",
"event_version": "1.0",
"create_time": "2021-06-16T22:52:21.351Z",
"resource_type": "capture",
"resource_version": "2.0",
"event_type": "PAYMENT.CAPTURE.PENDING",
"summary": "Payment pending for EUR 100.0 EUR",
"resource": {
"amount": {
"value": "100.00",
"currency_code": "EUR"
},
"seller_protection": {
"dispute_categories": [
"ITEM_NOT_RECEIVED",
"UNAUTHORIZED_TRANSACTION"
],
"status": "ELIGIBLE"
},
"supplementary_data": {
"related_ids": {
"order_id": "54K10082DX701193V"
}
},
"update_time": "2021-06-16T22:52:17Z",
"create_time": "2021-06-16T22:52:17Z",
"final_capture": true,
"links": [
{
"method": "GET",
"rel": "self",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/6AS86814R5412231H"
},
{
"method": "POST",
"rel": "refund",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/6AS86814R5412231H/refund"
},
{
"method": "GET",
"rel": "up",
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/54K10082DX701193V"
}
],
"id": "6AS86814R5412231H",
"status_details": {
"reason": "OTHER"
},
"status": "PENDING"
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-3XD97656HT346122M-81M194208A0322526",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-3XD97656HT346122M-81M194208A0322526/resend",
"rel": "resend",
"method": "POST"
}
]
}When the buyer completes the payment, PAYMENT.CAPTURE.COMPLETED webhook event is triggered, which indicates that payment completion was successful and you can fulfill the order.
Look for one of the following webhooks:
PAYMENT.CAPTURE.COMPLETED – This webhook is an indication that the buyer has completed the payment, which can take up to seven days to complete. You can ship the order to the buyer at this point.PAYMENT.CAPTURE.DENIED - This webhook is an indication that the Multibanco payment has expired or the buyer didn't complete the payment successfully. You should not fulfill the order.{
"id": "WH-6G192137AT164274E-1WK039370M324962E",
"event_version": "1.0",
"create_time": "2021-06-16T22:53:25.068Z",
"resource_type": "capture",
"resource_version": "2.0",
"event_type": "PAYMENT.CAPTURE.COMPLETED",
"summary": "Payment completed for EUR 100.0 EUR",
"resource": {
"amount": {
"value": "100.00",
"currency_code": "EUR"
},
"seller_protection": {
"dispute_categories": [
"ITEM_NOT_RECEIVED",
"UNAUTHORIZED_TRANSACTION"
],
"status": "ELIGIBLE"
},
"supplementary_data": {
"related_ids": {
"order_id": "54K10082DX701193V"
}
},
"update_time": "2021-06-16T22:53:11Z",
"create_time": "2021-06-16T22:52:17Z",
"final_capture": true,
"seller_receivable_breakdown": {
"paypal_fee": {
"value": "2.25",
"currency_code": "EUR"
},
"gross_amount": {
"value": "100.00",
"currency_code": "EUR"
},
"net_amount": {
"value": "97.75",
"currency_code": "EUR"
}
},
"links": [
{
"method": "GET",
"rel": "self",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/6AS86814R5412231H"
},
{
"method": "POST",
"rel": "refund",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/6AS86814R5412231H/refund"
},
{
"method": "GET",
"rel": "up",
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/54K10082DX701193V"
}
],
"id": "6AS86814R5412231H",
"status": "COMPLETED"
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-6G192137AT164274E-1WK039370M324962E",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-6G192137AT164274E-1WK039370M324962E/resend",
"rel": "resend",
"method": "POST"
}
]
}A successful request results in the following:
COMPLETED and you can ship the order.DENIED.Test the integration in the PayPal sandbox environment.
Take your application live in the PayPal production environment once testing is successful.