Charge a Saved Card

This guide explains how to charge a customer's saved card without them being present. This is a merchant-initiated transaction (MIT) - the customer has already consented to future charges during the initial payment, so no checkout flow or redirect is required.

Charging Stored Card Details

📘 Before you start

This guide assumes you have already completed Save a Card & Take Payment and have both a paymentMethodId (from the customer.payment_method.enabled webhook) and a customerId stored in your system.


❗️

Super does not manage subscription scheduling.

Super will process the charge when you send the request, but it is your responsibility to determine when to trigger each payment - for example, tracking renewal dates, handling billing cycles, and retrying failed charges.


How It Works

The off-session charge is a single server-side API call. There is no SDK component to mount and no redirect for the customer. Because this is a merchant-initiated transaction, it falls outside the scope of Strong Customer Authentication - 3DS is neither required nor triggered.

Once the charge is submitted, the payment moves to a PaymentPending state while it is processed. A payment.success webhook fires when the charge completes successfully.


Prerequisites

  • A paymentMethodId from the customer.payment_method.enabled webhook (e.g. pm_123456)
  • Your paymentInitiatorId from the business portal

Integration Guide

Step 1: Trigger the charge

Call POST to our /payments endpoint from your server with offSession: true and the customer's paymentMethodId. This should be called at the point in your billing logic where you have determined a charge is due e.g. subscription renewal date.

Request

curl --request POST \
     --url https://api.superpayments.com/2026-04-01/payments \
     --header 'accept: application/json' \
     --header 'authorization: YOUR_SECRET_KEY' \
     --header 'content-type: application/json' \
     --data '{
       "amount": 2500,
       "currency": "GBP",
       "externalReference": "order-123",
       "offSession": true,
       "paymentInitiatorId": "YOUR_PAYMENT_INITIATOR_ID",
       "paymentMethodId": "pm_123456"
     }'
curl --request POST \
     --url https://api.test.superpayments.com/2026-04-01/payments \
     --header 'accept: application/json' \
     --header 'authorization: YOUR_SECRET_KEY' \
     --header 'content-type: application/json' \
     --data '{
       "amount": 2500,
       "currency": "GBP",
       "externalReference": "order-123",
       "offSession": true,
       "paymentInitiatorId": "YOUR_PAYMENT_INITIATOR_ID",
       "paymentMethodId": "pm_123456"
     }'
FieldTypeDescription
amountintegerCharge amount in minor units (e.g. 2500 = £25.00).
currencystringISO 4217 currency code (e.g. GBP).
externalReferencestringYour unique reference for this charge (e.g. order or invoice ID).
offSessionbooleanMust be true for merchant-initiated charges.
paymentInitiatorIdstringYour payment initiator ID from the business portal.
paymentMethodIdstringThe paymentMethodId received from the customer.payment_method.enabled webhook.
shippingAddressobjectOptional. Shipping address for the order.
billingAddressobjectOptional. Billing address associated with the card.

Step 2: Handle the response

A successful request returns 200 with a PaymentPending status. This means the charge has been accepted and is being processed - it is not yet confirmed. Do not update your order status to paid at this point.

200 Response

{
  "brandId": "YOUR_BRAND_ID",
  "id": "123456-26f8-48b6-8f94-8c5df6162f7d",
  "offSession": true,
  "paymentInitiatorId": "YOUR_PAYMENT_INITIATOR_ID",
  "paymentReference": "CAM7M2S396SECWJP2Z",
  "status": "PaymentPending"
}

Store the id and paymentReference against the charge in your system. You will need the id to correlate the incoming PaymentSuccess webhook in Step 3.


Step 3: Listen for the PaymentSuccess webhook

Once the payment has been processed, Super fires a payment.success event to your configured webhook endpoint. Update your order status and notify the customer only after receiving this event.

❗️

Never confirm a subscription renewal or dispatch goods based on the PaymentPending response alone. Always wait for the payment.success webhook.

Webhook Event: payment.success

{
"data": {
  "amount": {
    "amount": 5000,
    "amountMultiplier": 100,
    "currency": "GBP"
  },
  "source": "paymentLink",
  "status": "PaymentSuccess",
  "brandId": "123-123-123-123",
  "paymentId": "ae317082-d563-4796-9d75-00c89d4bf8d9",
  "fundingSummary": {
    "cashPayableToMerchant": {
      "amount": 5000,
      "amountMultiplier": 100,
      "currency": "GBP"
    },
    "customerFundedAmount": {
      "amount": 5000,
      "amountMultiplier": 100,
      "currency": "GBP"
    },
    "superFundedAmount": {
      "amount": 0,
      "amountMultiplier": 100,
      "currency": "GBP"
    },
    "merchantFundedAmount": {
      "amount": 0,
      "amountMultiplier": 100,
      "currency": "GBP"
    }
  },
  "paymentReference": "CAGS5FJVNHYMEUAZRP",
  "externalReference": "Test name 12113",
  "paymentInitiatorId": "123-123-123-123"
},
"eventId": "evt_y8bcolwLT_GWFGx5BW4wjw",
"eventType": "payment.success",
"eventDatetime": "2040-12-12T10:51:13.000Z"
}
FieldDescription
data.paymentIdMatches the id returned in the Step 2 response. Use this to correlate the webhook with the pending charge in your system.
data.paymentReferenceSuper's reference for the transaction.
data.externalReferenceThe reference you passed in the charge request.
data.statusWill be PaymentSuccess for a completed charge.
data.amount.amountAmount charged in minor units.
data.fundingSummary.cashPayableToMerchantThe net amount that will be settled to your account.

📘 Webhook setup

Configure your webhook endpoint in the business portal. Subscribe to the payment.success event type. For general webhook guidance, see the Webhook Documentation.


3DS & SCA Reference

Transaction typeCustomer present?3DS required?Who handles it?
Initial payment (card setup)Yes - CITYes, automaticallySuper via redirectUrl
Off-session charge (this guide)No - MITNoN/A - MIT exemption applies

Off-session charges are merchant-initiated transactions and are explicitly exempt from Strong Customer Authentication.


Testing

Use the following test cards in the sandbox. The paymentMethodId used in the charge request must have been saved during an initial payment with one of these cards.

Scenario
Card number
Charge succeeds
4111 1111 1111 1111
Charge succeeds (debit card)
4111 1120 1426 7661

For a full list of test cards and decline scenarios, see Test with Cards.


Next Steps