On this page
No Headings
Last updated: July 10, 2026
MB WAY is a local payment method that a customer can use to place an order and then complete the payment with their MB WAY mobile digital wallet app.
| Countries | Payment type | Payment flow | Currencies | Maximum amount | Refunds |
|---|---|---|---|---|---|
Portugal (PT) | wallet | redirect | EUR | N/A | Within 395 days |
Request approval to enable MB WAY by visiting these Sandbox and Live links:
For Partners: Be sure to onboard your merchants before they accept payments (upfront). Onboarding after making payments, specifically Progressive Onboarding, is not supported for APMs.
The steps to implementing all alternative payment methods using the Orders V2 REST API are similar. If you've implemented an alternative payment method previously, you can likely use that code and adjust it for the specific differences for MB WAY.
Make sure you're subscribed to the following webhook events:
PAYMENT.CAPTURE.COMPLETED webhook event indicates a successful order capture.PAYMENT.CAPTURE.DENIED webhook event indicates a failed order capture.Upon receiving 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 MB WAY and collect the buyer's full name and phone number. Then you'll use the API calls described in the remainder of this topic to:
full name, country_code, and phone.brand_name is supported in create order.Refer to Payment method icons for available icons and download locations.
Use the buyer information you captured from your user interface to create an order with MB WAY as the payment source.
API endpoint used: Create order
curl --location --request POST 'https://api-m.sandbox.paypal.com/v2/checkout/orders' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <Access-Token>' \
--header 'PayPal-Request-Id: <PayPal-RequestId>' \
--data-raw '{
"intent": "CAPTURE",
"payment_source": {
"mbway": {
"country_code": "PT",
"name": "Firstname Lastname",
"phone": {
"national_number": "1234567890",
"country_code": "351"
},
"experience_context": {
"brand_name": "brand name override"
}
}
},
"processing_instruction": "ORDER_COMPLETE_ON_PAYMENT_APPROVAL",
"purchase_units": [
{
"reference_id": "d9f80740-38f0-11e8-b467-0ed5f89f718b",
"amount": {
"currency_code": "EUR",
"value": "100.00"
}
}
]
}'After you copy the code in the sample request, modify the following:
Access-Token - Your access token.PayPal-Request-Id - Replace the sample ID with a unique ID you generate. This ID helps prevent duplicate authorizations in the event that the API call is disrupted. See also: API idempotency.intent - This parameter must be set to CAPTURE as it is in this sample code.payment_source - Specify the following:
mbway as the payment_source and include the country_code.name field.national_number field and country code in the country_code field.experience_context - Specify the brand name in the brand_name field.processing_instruction - Set this value to ORDER_COMPLETE_ON_PAYMENT_APPROVAL as it is in this sample code.purchase_units: amount - Pass the amount of the order and the currency code.reference_id - Provide the ID for the purchase unit.Note: Change or add other parameters in the Create order request body to create an order that reflects the actual order details.
A successful request results in the following:
200 OK.payer-action HATEOAS URL in the next step. See also: HATEOAS links.{
"id": "5V159329PV571861D",
"status": "PAYER_ACTION_REQUIRED",
"payment_source": {
"mbway": {
"name": "Firstname Lastname",
"country_code": "PT"
}
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/5V159329PV571861D",
"rel": "self",
"method": "GET"
}
]
}MB Way sends a push notification directly to the buyer's mobile app. The buyer stays on your website while approving the transaction in the mobile app, and no redirection action is required. After the buyer approves the purchase, the payment is automatically captured.
Listen to the following webhooks to get the result of order capture:
PAYMENT.CAPTURE.COMPLETED webhook event indicates a successful order capture.PAYMENT.CAPTURE.DENIED and CHECKOUT.PAYMENT-APPROVAL.REVERSED webhook events indicate a failed order capture.up HATEOAS link indicates the order associated with this capture.See Subscribe to checkout webhooks for more information.
Here are some additional resources as you create webhook handler code:
{
"id": "WH-9LK14475MF9937440-9EG47645TP521822L",
"event_version": "1.0",
"create_time": "2022-05-10T06:04:12.533Z",
"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"
},
"supplementary_data": {
"related_ids": {
"order_id": "5V159329PV571861D"
}
},
"update_time": "2022-01-19T06:04:08Z",
"create_time": "2022-01-19T06:04:08Z",
"final_capture": true,
"seller_receivable_breakdown": {
"paypal_fee": {
"value": "3.80",
"currency_code": "EUR"
},
"gross_amount": {
"value": "100.00",
"currency_code": "EUR"
},
"net_amount": {
"value": "96.20",
"currency_code": "EUR"
}
},
"custom_id": "Custom-1234",
"invoice_id": "Invoice-12345",
"links": [
{
"method": "GET",
"rel": "self",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/5R102774VL663561J"
},
{
"method": "POST",
"rel": "refund",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/5R102774VL663561J/refund"
},
{
"method": "GET",
"rel": "up",
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/5V159329PV571861D"
}
],
"id": "5R102774VL663561J",
"status": "COMPLETED"
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9LK14475MF9937440-9EG47645TP521822L",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9LK14475MF9937440-9EG47645TP521822L/resend",
"rel": "resend",
"method": "POST"
}
]
}Note: The order ID from Step 2 should match the resource.supplementary_data.related_ids.order_id parameter in the webhook payload.
{
"id": "WH-9LK14475MF9937440-9EG47645TP521822L",
"event_version": "1.0",
"create_time": "2022-05-10T06:04:12.533Z",
"resource_type": "capture",
"resource_version": "2.0",
"event_type": "PAYMENT.CAPTURE.DENIED",
"summary": "Payment denied for EUR 100.0 EUR",
"resource": {
"amount": {
"value": "100.00",
"currency_code": "EUR"
},
"supplementary_data": {
"related_ids": {
"order_id": "5V159329PV571861D"
}
},
"update_time": "2022-05-10T06:04:08Z",
"create_time": "2022-05-10T06:04:08Z",
"final_capture": true,
"seller_receivable_breakdown": {
"paypal_fee": {
"value": "3.80",
"currency_code": "EUR"
},
"gross_amount": {
"value": "100.00",
"currency_code": "EUR"
},
"net_amount": {
"value": "96.20",
"currency_code": "EUR"
}
},
"links": [
{
"method": "GET",
"rel": "self",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/5R102774VL663561J"
},
{
"method": "POST",
"rel": "refund",
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/5R102774VL663561J/refund"
},
{
"method": "GET",
"rel": "up",
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/5V159329PV571861D"
}
],
"id": "5R102774VL663561J",
"status": "DECLINED"
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9LK14475MF9937440-9EG47645TP521822L",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks-events/WH-9LK14475MF9937440-9EG47645TP521822L/resend",
"rel": "resend",
"method": "POST"
}
]
}Note: The order ID from Step 2 should match the resource.supplementary_data.related_ids.order_id parameter in the webhook payload.
Alternatively, you can get the order capture result from the Show order details endpoint.
Important: Exercise caution when polling for order capture result using the Show order details endpoint. PayPal enforces rate limits on API requests.
curl -v -X GET https://api-m.sandbox.paypal.com/v2/checkout/orders/5V159329PV571861D \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Access-Token>"{
"id": "5V159329PV571861D",
"intent": "CAPTURE",
"status": "COMPLETED",
"payment_source": {
"mbway": {
"name": "Firstname Lastname",
"country_code": "PT"
}
},
"processing_instruction": "ORDER_COMPLETE_ON_PAYMENT_APPROVAL",
"purchase_units": [
{
"reference_id": "default",
"amount": {
"currency_code": "EUR",
"value": "100.00"
},
"payments": {
"captures": [
{
"id": "5R102774VL663561J",
"status": "COMPLETED",
"amount": {
"currency_code": "EUR",
"value": "100.00"
},
"final_capture": true,
"seller_receivable_breakdown": {
"gross_amount": {
"currency_code": "EUR",
"value": "100.00"
},
"paypal_fee": {
"currency_code": "EUR",
"value": "3.80"
},
"net_amount": {
"currency_code": "EUR",
"value": "96.20"
}
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/5R102774VL663561J",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/5R102774VL663561J/refund",
"rel": "refund",
"method": "POST"
},
{
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/5V159329PV571861D",
"rel": "up",
"method": "GET"
}
]
}
]
}
}
],
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/5V159329PV571861D",
"rel": "self",
"method": "GET"
}
]
}A successful request returns the HTTP 200 OK status code with a JSON response body that returns a COMPLETED status.
A successfully captured order has the following:
COMPLETED, which means the order was captured successfully.COMPLETED status is present in the response parameter purchase_units[0].payments.captures[0].up HATEOAS link indicates the order associated with this capture.After a successful payment, notify the buyer of a successful transaction. You can do this by sending a confirmation email.
Use these buyer phone numbers to simulate the failure scenarios in the PayPal sandbox environment.
| Scenario | Buyer phone national_number |
|---|---|
The phone number provided is not associated with MB WAY | 111111111 |
The buyer has canceled/denied the payment | 222222222 |
Any buyer phone number not listed in the table will simulate a successful scenario in the PayPal sandbox environment.