The server-side Merchant API checks to pass in Sandbox before you go live.
Every check on this page is an API call your backend will make in production. This is a usage checklist for the Merchant API: run each call with your Sandbox API key against the Sandbox endpoints, and treat a passing check as proof that the operation works end-to-end.
These checks cover the server-side only. The client-side parts of your integration have their own checks, which live in each integration guide and differ by implementation - run both.
Run the checks once your Sandbox checkout flows work, as the last testing step before you go live. When the checks you need pass, your integration can run the operations your business depends on - move on to Go live to switch to Production and use your integration in full, with real money and real customer data.
How it works
Every check follows the same pattern: make the calls with your Sandbox credentials, then verify the result through the API response and in your Sandbox Merchant dashboard.
- All requests go to the Sandbox endpoints with your Sandbox API key in the
Authorizationheader, and carry theRevolut-Api-Versionheader. - To pay for an order, open its
checkout_url(or run your integrated widget) and pay the way your customers will - see Test cards, 3DS simulator, and Test payment flows. - The examples use a £5.00 order (
amount: 500) inGBP.
Some Sandbox scenarios are triggered by the order amount: specific Revolut Pay account-to-account and Google Pay amounts simulate declines and other outcomes - see Test payment flows for the amount-based scenarios.
The checks on this page verify the default successful behaviour, so pick amounts outside those ranges - the £5.00 (amount: 500) used in the examples is a safe choice.
Before you begin
Before you start, make sure you have:
- A Sandbox account and API key - see Set up test environment.
- Your backend running against the Sandbox endpoints - see Environments.
- A payment method you can exercise in checkout - see Test cards and Test payment flows.
Scenario checks
Each check is independent: run the ones that match the operations your business performs, and skip the rest - if you don't manage refunds through the API, skip the refund checks.
For the full contract behind each call, see the Merchant API reference.
Order management
Every payment your business takes lives on an order - the core object of the Merchant API. These checks prove your backend can create orders, get them paid, and control what happens next: capturing authorised funds, or cancelling orders that won't be fulfilled.
Create and pay for order
The baseline: prove your backend can create an order and see it through to a completed payment.
Run this check
-
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method. -
Retrieve the order by its
idand check its state:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17
- The create call returns
201with the order instate: pending. - After payment, the retrieved order's
stateiscompleted. - The transaction shows as Completed in your Sandbox Merchant dashboard.
Capture an order later
Authorise now, capture when you're ready to fulfil - proves your backend handles the deferred-capture lifecycle.
Run this check
-
Create order with
capture_modeset tomanual:Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP", "capture_mode": "manual" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method, then retrieve the order - the order ends upauthorised, notcompleted:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 -
Capture the order for the authorised amount:
Example requestPOST /api/orders/{order_id}/capture Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500 }
- After payment, the order's
stateisauthorised. - The capture call returns the order with
state: completedand the paymentcaptured. - The transaction shows as Completed in your Sandbox Merchant dashboard.
You can also capture from the dashboard: in your Sandbox Merchant dashboard, select the uncaptured transaction and click Capture.
Cancel an unpaid order
Proves you can void an order the customer never paid - abandoned checkouts, stock issues, changed minds.
Run this check
-
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Do not pay for the order.
-
Cancel the order using the order's
id:Example requestPOST /api/orders/{order_id}/cancel Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17
- The cancel call returns the order with
state: cancelled. - Retrieving the order confirms the
cancelledstate.
Cancel a paid, uncaptured order
Proves you can release an authorised payment you won't capture - without waiting for the authorisation to expire.
Run this check
-
Create order with
capture_modeset tomanual:Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP", "capture_mode": "manual" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method, then retrieve the order - the order ends upauthorised, notcompleted:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 -
Cancel the order using the order's
id:Example requestPOST /api/orders/{order_id}/cancel Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17
- The cancel call returns the order with
state: cancelled. - The transaction shows as Cancelled in your Sandbox Merchant dashboard.
Create an order with customer and shipping details
Proves the order carries the customer and delivery data your fulfilment stack needs.
Run this check
-
Example request
POST /api/customers Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "full_name": "Example Customer", "email": "example.customer@example.com", "phone": "+441234567890" } -
Create order with the customer and shipping details:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP", "customer": { "id": "{customer_id}" }, "shipping": { "address": { "street_line_1": "1 Main Street", "city": "London", "country_code": "GB", "postcode": "E14 5AB" } } }
- The order response contains the
customerobject with the details that live on the customer record. - The order response contains the
shippingobject with the address you sent. - Retrieving the order confirms the
customerandshippingdetails are stored.
Refunds
Refunds are your after-sales operations - money back when a customer returns an item, or goodwill when something went wrong. If your business issues refunds through the API, these checks prove the full range: one total refund, partial refunds, and refunding to the last penny in consecutive steps.
Refund an order in full
Proves the full refund path: money back to the customer, tracked as its own order.
Run this check
-
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method - Retrieve the order by itsidand check its state:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 -
Refund the order for the full amount:
Example requestPOST /api/orders/{order_id}/refund Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" }
- The refund call returns a new order with
type: refundandstate: processing. - Retrieving the refund order by its
idshowsstate: completed. - The refund transaction shows as Completed in your Sandbox Merchant dashboard.
Refund part of an order
Proves partial refunds - returns, discounts, goodwill - with the rest of the order untouched.
Run this check
-
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method - Retrieve the order by itsidand check its state:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 -
Refund the order for a partial amount - £2.00 (
amount: 200):Example requestPOST /api/orders/{order_id}/refund Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 200, "currency": "GBP" }
- The refund call returns a new order with
type: refundandstate: processing. - Retrieving the refund order by its
idshowsstate: completed. - Retrieving the original order shows
refunded_amount: 200.
Make multiple partial refunds
Proves your refund handling scales past a single partial refund.
Run this check
-
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method - Retrieve the order by itsidand check its state:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 -
Refund the order for £1.00 (
amount: 100):Example requestPOST /api/orders/{order_id}/refund Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 100, "currency": "GBP" } -
Refund the order again for £2.00 (
amount: 200).
- Each refund call returns its own order with
type: refund. - Retrieving the refund orders shows
state: completedfor each. - Retrieving the original order shows
refunded_amount: 300.
Fully refund an order through consecutive partial refunds
Proves refunding to the last penny in several steps - and that your integration handles the over-refund error.
Run this check
-
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Open the order's
checkout_urland pay for the order with your Sandbox payment method - Retrieve the order by itsidand check its state:Example requestGET /api/orders/{order_id} Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 -
Refund the order for the first partial amount - £1.00 (
amount: 100):Example requestPOST /api/orders/{order_id}/refund Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 100, "currency": "GBP" } -
Send further partial refunds until the full amount is refunded - for example, another £1.00 (
amount: 100), then £3.00 (amount: 300). -
Send one more refund request for any amount.
- Each refund call returns its own order with
type: refund. - All refund orders reach
state: completed. - The final refund request - sent after the order is fully refunded - returns an error.
Webhooks
Payments complete asynchronously: your customer pays on their device, and the result reaches your backend after the request-response cycle is over. Webhooks are how your backend stays in sync with what actually happened - these checks prove you receive and act on the events in your payment flow.
Set up and listen to webhooks
Proves your backend learns about payments without polling - the events arrive at your URL.
Run this check
-
Create a webhook to listen to events in your payment flow:
Example requestPOST /api/webhooks Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "url": "https://example.com/webhooks", "events": [ "ORDER_AUTHORISED", "ORDER_COMPLETED" ] } -
Create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Pay for the order via its
checkout_urland watch your endpoint. Each subscribed event arrives as a POST request to yoururl:Webhook event
{ "event": "ORDER_COMPLETED", "order_id": "6516e61c-d279-a454-a837-bc52ce55ed49" }
:::tip[Expected results]
- [ ] Your backend receives each event you subscribed to - for example, `ORDER_COMPLETED` for the paid order.
- [ ] The event's `order_id` matches the order you created.
:::
:::note
Respond to each delivery with any `200-399` status code (`204` recommended). If a delivery fails or times out, Revolut retries it 3 more times, 10 minutes apart.
:::Allowlist webhook IPs
Proves your firewall lets Revolut's webhook deliveries through.
Run this check
-
If your server blocks incoming traffic, allowlist the webhook IP addresses for your environment.
-
With a webhook live - for example, from Set up and listen to webhooks - create order with minimal required parameters:
Example requestPOST /api/orders Host: https://sandbox-merchant.revolut.com Authorization: Bearer sk_abcdef12347890_... Revolut-Api-Version: 2026-08-17 Content-Type: application/json { "amount": 500, "currency": "GBP" } -
Pay for the order via its
checkout_urland confirm the events still arrive at your endpoint.
- Your server receives the webhook events with the IP addresses allowlisted.
What's next
All the checks you need pass? Your backend can run the operations your business depends on - time to take it to Production!