This guide is for current implementations. For legacy implementations see Reuse a Payment Instrument. There is also a migration guide at Migration to Secupay Acquiring.
This page explains how to reuse a bank account or credit card to implement a one-click payment solution. This will offer your buyer an express checkout experience.
Please ensure that the customer agrees before you save the payment instrument in order to comply with the regulations.
Requirements
Before you read this, you should understand:
How It Works
Direct debit and credit card payments work with Payment Containers that store the payment instrument (bank account, credit card). These Payment Containers can be used as handle to the payment instrument. You can use the Payment Container ID to make a payment.
Make the Initial Payment
Create the Smart Transaction
When you make the first payment, you must add the needed and "container_instructions" to the "payment_context" when you create the Smart Transaction:
POST /api/v2/Smart/Transactions HTTP/1.1Host: connect-testing.secuconnect.comAuthorization: Bearer qb56tjj1bcvo9n2nj4u38k84loContent-Type: application/jsonAccept: application/json{ "contract": { "id": "GCR_KTSST836QYITQJM1JGYIZ4F4OLKI04" }, "customer": { "contact": { "company_name": "Musterfirma GmbH" "forename": "Max", "surname": "Mustermann", "address": { "street": "Musterallee", "street_number": "23-25", "postal_code": "09005", "city": "Musterstadt", "country": "DE" }, "email": "m.muster@example.net", "mobile": "+491775555555", "phone": "+495555555555" } }, "transactionRef": "Bestellung am 25.02.2026 bei ACME Buero-Paradies auf Example.com", "merchantRef": "20000345", "basket": { "products": [ { "id": 1, "articleNumber": 30037, "ean": "4999012345678", "desc": "Druckerpapier Eco A4 80g", "quantity": 10, "priceOne": 7900, "tax": 19 }, { "id": 2, "item_type": "shipping", "desc": "Versand Spedition", "quantity": 1, "priceOne": 500, "tax": 19 } ] }, "basket_info": { "sum": 8400, "currency": "EUR" }, "payment_context": { "auto_capture": true, "dynamic_descriptor": { "merchant_name": "ACME Buero-Paradies", "merchant_city": "Bielefeld" }, "container_instructions": { "request_token": true, "notification_url": "https://shop.example.com/network-token/update" } }}Please note the element "container_instructions" inside "payment_context" at line 66 .. 70.
If everything is fine, the API responds with 200 OK and the created Smart Transaction.
Details of the related fields:
Field | Type | Meaning |
|---|---|---|
| object | Instructions considered when creating the Payment Container in the next step. |
Details of "container_instructions":
Field | Type | Meaning |
|---|---|---|
| boolean | Requests to save the credit card reference securely on the servers of a credit card network like VISA or MasterCard (“Network Token“) |
| string | Callback URL on your server for status updates for the Payment Container related to the Network Token |
Authorise and Capture the Payment
Imagine you have authorised the Smart Transaction for the first order by using this call, for example:
POST /api/v2/Smart/Transactions/STX_3Z8EUQX0A2PBHRJV9FRY7P56GEDZAK/prepare/creditcard HTTP/1.1Host: connect-testing.secuconnect.comAuthorization: Bearer qb56tjj1bcvo9n2nj4u38k84loContent-Type: application/jsonAccept: application/json{ "container": { "type": "credit_card", "private": { "owner": "Max Mustermann", "pan": "463544XXXXXX2298", "expiration_date": "2034-02-01T00:00:00+00:00", "issuer": "VISA", "transact_container": "MzkzOTQ0MGI1YTBmMDg2ZDkxYTEwNzIyZTMwNTgwNGZjYTU3...", "transact_skey_pubkey": "8ebccbb725d89d6286f227e672f24155e8b50b9688e7a45b...", "transact_skey_keyname": "spp_2025.pem", "transact_hash": "671439c1a91466df0249d8ab1b3595b682def08b1aea05a2d66e6adcf3d37a98" } }, "callback_urls": { "success_url": "https://shop.example.com/payment/success?nonce=ciix8j3qbqffg8dcdc7b", "failure_url": "https://shop.example.com/payment/failure?nonce=ciix8j3qbqffg8dcdc7b" }}If everything was fine, the API would have responded with something with 200 OK and the updated Smart Transaction:
HTTP/1.1 200 OKContent-Type: application/json{ "object": "smart.transactions", "id": "STX_3Z8EUQX0A2PBHRJV9FRY7P56GEDZAK", // ... "container": { "object": "payment.containers", "id": "PCT_3JU4VGYZF2XY8EJHH9FQ7WGYNZGJA4", "type": "credit_card", // ... "token_status": { "status": "requested", // ... } }, "transactions": [ { "object": "payment.transactions", "id": "PCI_W026W643US3TWCGZA0AVZ248W8TSMW", "trans_id": 123456789, "transaction_hash": "abcdefghijkl12345678" } ], "created": "2025-02-25T15:55:58+01:00", "updated": "2025-02-25T15:56:16+01:00", "status": "created", // ... "payment_method": "creditcard", "trans_id": 123456789, "iframe_url": "https://connect-testing.secuconnect.com/spp/challenge/?token=5ab8b08...", // ...}For direct debit it would look similar but there is no 3-D Secure, and thus no iframe_url. Credit card payments require a 3-D Secure check if not exempted. So the iframe_url may be present or not. If auto_capture is set, the payment would be captured immediately after successful authorisation.
Please note the fields with the Payment Container ID (container.id). You need to save the Payment Container ID in relation to your customer account. You would also need to manage the life cycle of the Payment Container ID.
A saved payment instrument may be offered this way:
- "IBAN ending with 3389"
- "MasterCard ending with 5454 (expires 12/25)"
Thus you have to save these details:
- the Payment Container ID (
"PCT_...); - the last 4 characters of the IBAN ("3389");
- the last 4 characters of the credit card number ("5454");
- the credit card brand name ("MasterCard");
- the card expiry date (25-M12).
The credit card iframe ensures that you will not see the full credit card number, nor the security code.
You should only save the Payment Container if the authorisation was successful, this is on status "accepted" or "ok" (line 27), and if the token status is not "failed" (line 12).
Make the Subsequent Payments
There is nothing special when creating the Smart Transaction for a later payment when making a one-click payment.
When the bank account or credit card is reused with a subsequent payment, you pass the Payment Container ID to the Smart Transaction endpoints, when you authorise the payment:
POST /api/v2/Smart/Transactions/STX_MUCAB363K8DIZ97UZLQZRWWDT06XYL/prepare/creditcard HTTP/1.1Host: connect-testing.secuconnect.comAuthorization: Bearer qb56tjj1bcvo9n2nj4u38k84loContent-Type: application/jsonAccept: application/json { "container": { "id": "PCT_W44PJNRAV2NPM7CG6Z0YYE877CJBAZ" }}The Payment Container is contained in the Smart Transaction, which is returned (assuming 200 OK):
HTTP/1.1 200 OKContent-Type: application/json... { "object": "smart.transactions", "id": "STX_MUCAB363K8DIZ97UZLQZRWWDT06XYL", // ... "container": { "object": "payment.containers", "id": "PCT_W44PJNRAV2NPM7CG6Z0YYE877CJBAZ", // ... "token_status": { "status": "active", // ... } }, "transactions": [ { "object": "payment.transactions", "id": "PCI_7OWJ3NESIARHHUKG1RNJ76WTIFHHOQ" } ], "created": "2020-03-27T11:03:56+01:00", "updated": "2020-03-27T11:04:34+01:00", "status": "ok", // ...}The response is the same, except new transaction IDs.
Network Token Lifecycle
Manage Status Changes of the Network Token
Beginning with our new acquiring solution, we will also start to send push notifications for Network Token status changes. This can be used to activate or to remove the Payment Container. The push notification is sent for the Payment Container holding the Network Token.
All details are found here: Network Token Status Notifications
Archive the Network Token
Beginning with our new acquiring solution, you can request the deletion or archiving the network token.
The endpoint for archiving the network token is PUT /api/v2/Payment/Containers/{id}/archive:
PUT /api/v2/Smart/Transactions/PCT_3JU4VGYZF2XY8EJHH9FQ7WGYNZGJA4/archive HTTP/1.1Host: connect-testing.secuconnect.comAuthorization: Bearer qb56tjj1bcvo9n2nj4u38k84loAccept: application/jsonIf everything is fine, the API responds with HTTP status 200 OK, and confirms the successful deletion request:
HTTP/1.1 200 OKContent-Type: application/json{ "result": true}This will cause the following token status flow and actions:
Status | Meaning |
|---|---|
| Token was invalidated, and deletion request is forwarded to the card network. |
| Deletion request was executed. |
You will also receive push notificatiosn, s. Network Token Status Notifications