Card on file (saved cards & MIT)

Card on file lets you charge a customer's card again later without them re-entering details — for example for top-ups, usage billing, or other merchant-initiated transactions (MIT).

The flow has three steps:

1. Save the card on the first payment

On the customer's first (customer-initiated) payment, set save_card: true when creating the charge. The customer completes this payment as normal, including 3D Secure where required.

📘

3DS is applied on the first payment only

The first payment is authenticated with 3DS per the usual rules. Subsequent merchant-initiated charges against the saved card run off-session and are not sent through 3DS again — the card was already verified on the first payment.

2. Read the card_id from the webhook

When that first payment succeeds, the payment.succeeded webhook contains the saved card's identifier under payment_method.card_id (nested inside the payment_method object — not a top-level field):

{
  "event_type": "payment.succeeded",
  "payment_method": {
    "card_id": "CARD-XXXXXXXXXX",
    "type": "CREDIT VISA",
    "card_last4": "1111"
  }
}

Store card_id against your customer record. See the Payment Object for the full payload.

3. Charge the saved card later (MIT)

To charge the saved card later, call Create Payment with the card_id param. This is the merchant-initiated branch: the charge runs off-session and does not require customer presence or 3DS.

curl --location 'https://business.mamopay.com/manage_api/v1/payments' \
  --header 'Authorization: Bearer <your_api_key>' \
  --header 'Content-Type: application/json' \
  --data '{ "card_id": "CARD-XXXXXXXXXX", "amount": 25.00 }'
🚧

Saved cards are not shown in the dashboard

There is no dashboard view of saved cards — track card_id values in your own system.