API Console
Help

Sandbox test scenarios

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 Authorization header, and carry the Revolut-Api-Version header.
  • 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) in GBP.
Amount-based Sandbox flows

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:


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
  1. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method.

  3. Retrieve the order by its id and check its state:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
Expected results
  • The create call returns 201 with the order in state: pending.
  • After payment, the retrieved order's state is completed.
  • 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
  1. Create order with capture_mode set to manual:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method, then retrieve the order - the order ends up authorised, not completed:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
  3. Capture the order for the authorised amount:

    Example request
    POST /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
    }
Expected results
  • After payment, the order's state is authorised.
  • The capture call returns the order with state: completed and the payment captured.
  • 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
  1. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  2. Do not pay for the order.

  3. Cancel the order using the order's id:

    Example request
    POST /api/orders/{order_id}/cancel
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
Expected results
  • The cancel call returns the order with state: cancelled.
  • Retrieving the order confirms the cancelled state.

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
  1. Create order with capture_mode set to manual:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method, then retrieve the order - the order ends up authorised, not completed:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
  3. Cancel the order using the order's id:

    Example request
    POST /api/orders/{order_id}/cancel
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
Expected results

Create an order with customer and shipping details

Proves the order carries the customer and delivery data your fulfilment stack needs.

Run this check
  1. Create customer:

    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"
    }
  2. Create order with the customer and shipping details:

    Example request
    POST /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"
        }
      }
    }
Expected results
  • The order response contains the customer object with the details that live on the customer record.
  • The order response contains the shipping object with the address you sent.
  • Retrieving the order confirms the customer and shipping details 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
  1. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method - Retrieve the order by its id and check its state:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
  3. Refund the order for the full amount:

    Example request
    POST /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"
    }
Expected results

Refund part of an order

Proves partial refunds - returns, discounts, goodwill - with the rest of the order untouched.

Run this check
  1. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method - Retrieve the order by its id and check its state:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
  3. Refund the order for a partial amount - £2.00 (amount: 200):

    Example request
    POST /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"
    }
Expected results

Make multiple partial refunds

Proves your refund handling scales past a single partial refund.

Run this check
  1. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method - Retrieve the order by its id and check its state:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
  3. Refund the order for £1.00 (amount: 100):

    Example request
    POST /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"
    }
  4. Refund the order again for £2.00 (amount: 200).

Expected results

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
  1. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  2. Open the order's checkout_url and pay for the order with your Sandbox payment method - Retrieve the order by its id and check its state:

    Example request
    GET /api/orders/{order_id}
    Host: https://sandbox-merchant.revolut.com
    Authorization: Bearer sk_abcdef12347890_...
    Revolut-Api-Version: 2026-08-17
  3. Refund the order for the first partial amount - £1.00 (amount: 100):

    Example request
    POST /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"
    }
  4. Send further partial refunds until the full amount is refunded - for example, another £1.00 (amount: 100), then £3.00 (amount: 300).

  5. Send one more refund request for any amount.

Expected results
  • 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
  1. Create a webhook to listen to events in your payment flow:

    Example request
    POST /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"
      ]
    }
  2. Create order with minimal required parameters:

    Example request
    POST /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"
    }
  3. Pay for the order via its checkout_url and watch your endpoint. Each subscribed event arrives as a POST request to your url:

    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
  1. If your server blocks incoming traffic, allowlist the webhook IP addresses for your environment.

  2. With a webhook live - for example, from Set up and listen to webhooks - create order with minimal required parameters:

    Example request
    POST /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"
    }
  3. Pay for the order via its checkout_url and confirm the events still arrive at your endpoint.

Expected results
  • 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!

Go live
Switch to Production and verify your first live payment
Rate this page