Storing payment credentials for tokenization
You can use Payment Pages in conjunction with our API solutions to allow returning customers to process payments on your checkout without the need to re-enter all of their card details. Not only does this lead to faster and easier payments for your customers, your business also benefits from not needing to store sensitive card numbers (this can simplify your PCI accreditation process).
This process is called Tokenization.

But if preferred, tokenization can also be performed on previous Authorisation requests, in which the customer has been charged, providing the requirements specified by the Credentials on File mandate have been met. To do this, you will need the transactionreference of the payment that you would like to repeat, then skip ahead to the Configuration for tokenized payment section of this document, found below.
Prerequisites
- Account Checks are only available for certain acquiring banks. Before you begin, please contact our Support Team and ensure your acquiring bank supports this functionality.
- Account Checks can only be performed for card-based payment methods.
- This document assumes your system is able to submit an API request to our gateway and handle the response returned. This is required for the tokenized payment.


Process overview





Configuration for storing of payment credentials
First, you will need to configure the Payment Pages solution to perform an Account Check, without processing the payment.
To enable this behaviour, you will need to contact our Support Team and request the following changes to your account:
- Account Checks needs to be enabled on your site reference(s).
- Enhanced Post to be enabled on these site reference(s).
- Update URL notification submitted to your system also include fields securityresponseaddress, securityresponsepostcode and securityresponsesecuritycode.
Once your account has been updated as described above, you will now need to configure your POST to Trust Payments to include the following additional fields:
Field specification
Field | Format | Description | |
![]() |
credentialsonfile | Numeric (1) | This must be set to “1”, to indicate the customer agreed for the payment credentials to be stored for future transactions. See below for further information. |
![]() |
mainamount | Numeric (14) | This will be displayed to the customer on the hosted Payment Pages checkout.
Providing the requesttypedescriptions is submitted as “ACCOUNTCHECK”, the customer will not be debited. Caution: This amount is stored in our records. When performing the tokenized payment, if a new amount is not submitted, the value posted here will be used instead. (Can be submitted with value “0”) |
![]() |
requesttypedescriptions | Alpha (20) | This must be set to “ACCOUNTCHECK”. |
<html> <head> </head> <body> <!--YOUR HTML--> <form method="POST" action="<DOMAIN>/process/payments/choice"> <input type="hidden" name="sitereference" value="test_site12345"> <input type="hidden" name="stprofile" value="default"> <input type="hidden" name="currencyiso3a" value="USD"> <input type="hidden" name="mainamount" value="100.00"> <input type="hidden" name="version" value="2"> <input type="hidden" name="orderreference" value="myorder12345"> <input type="hidden" name="sitesecurity" value="hee879a9ab97753b3a768925d50842f10e19fea03fef0b820026b6df92d415866"> <input type="hidden" name="sitesecuritytimestamp" value="2019-05-28 14:22:37"> <input type="hidden" name="requesttypedescriptions" value="ACCOUNTCHECK"> <input type="hidden" name="credentialsonfile" value="1"> <input type="submit" value="Pay"> </form> </body> </html>

About Credentials on File

The process of storing credentials for future use is known as Credentials on File (CoF).

Identifying transactions as using CoF provides the following advantages:
- Increases the likelihood of transaction authorisation and settlement.
- Greater transparency and improved experience from the customer’s perspective.
- Issuers are less likely to use the absence of a security code as a reason to decline a transaction.
Handling the response
After the request has been processed, you will need to check the URL notification received by your system that contains the response to the ACCOUNTCHECK request:
- Ensure that the errorcode value returned is “0”, indicating success. (You must not store credentials if an error has occurred)
- Check the values returned in the securityresponseaddress, securityresponsepostcode and securityresponsesecuritycode fields. Click here for further information on these checks and only proceed if business requirements have been satisfied.
Following successful tokenization, you can store the transactionreference in your records.
This will be needed later in order to process a new payment with the stored payment credentials. You can also store the last four digits of the maskedpan and paymenttypedescription for purposes of displaying to returning customers when they are choosing their payment method for their next purchase.
Configuration for tokenized payment
Once your system is able to process Account Checks and store the associated transactionreference values for later retrieval, you can configure the tokenized payment. The configuration required depends on the party that is initiating the transaction:
1. Customer-Initiated Transaction (CIT) If the tokenized payment is initiated by the customer (e.g. by clicking “Pay” on your website), the transaction must be authenticated with 3-D Secure. To do this, you will need to utilise our JavaScript Library. To achieve this, the tokenized payment request will need to perform at least the following request types: To learn more about additional requests that can be performed, click here. In the request, you will need to ensure the following additional fields are submitted within the JWT payload: 2. Merchant-Initiated Transaction (MIT) If the tokenized payment is initiated by your own server with the customer not present, you will need to submit an AUTH request using our API. Click here for further information on the different initiationreason values. Note: Because this transaction is Merchant-Initiated, 3-D Secure authentication is not possible.
Field
Format
Description
credentialsonfile
Numeric (1)
This must be set to “2”, to indicate the new transaction is using previously-stored credentials.
parenttransactionreference
Alphanumeric
& hyphens (25)Submit the transaction reference of the previous request from which the card details will be inherited.
requesttypedescriptions
List
To process a 3-D Secure authenticated payment, your server must submit at least [“THREEDQUERY”,”AUTH”].
Example payload for processing tokenized payment (JavaScript Library)
{"payload":{"accounttypedescription":"ECOM","baseamount":"1050","currencyiso3a":"GBP","sitereference":"test_site12345","requesttypedescriptions":["THREEDQUERY","AUTH"]},"credentialsonfile":"2","parenttransactionreference":"1-2-345","iat":1559033849,"iss":"jwt.user"}
Field
Format
Description
credentialsonfile
XPath: /operation/credentialsonfileNumeric (1)
This must be set to “2”, to indicate the new transaction is using previously-stored credentials.
initiationreason
XPath: /operation/initiationreasonChar (1)
It is mandated you provide a reason for processing the tokenized payment. Submit one of the following values that best describes the reason for payment:
parenttransactionreference
XPath: /operation/parenttransactionreferenceAlphanumeric
& hyphens (25)Submit the transaction reference of the previous request from which the card details will be inherited.
requesttypedescriptions
XPath: /@typeList
Your server must submit at least [“AUTH”] in the requesttypedescriptions list.
Request examples:
{"payload":{"accounttypedescription":"ECOM","baseamount":"1050","currencyiso3a":"GBP","sitereference":"test_site12345","credentialsonfile":"2","initiationreason":"S","parenttransactionreference":"1-2-345","requesttypedescriptions":["AUTH"]},"iat":1559033849,"iss":"jwt.user"}
#!/usr/bin/python
import securetrading
stconfig = securetrading.Config()
stconfig.username = "[email protected]"
stconfig.password = "Password1^"
st = securetrading.Api(stconfig)
auth = {
"sitereference": "test_site12345",
"requesttypedescriptions": ["AUTH"],
"accounttypedescription": "ECOM",
"currencyiso3a": "GBP",
"baseamount": "1050",
"orderreference": "My_Order_123",
"credentialsonfile": "2",
"initiationreason": "S",
"parenttransactionreference": "1-2-345"
}
strequest = securetrading.Request()
strequest.update(auth)
stresponse = st.process(strequest) #stresponse contains the transaction response
<?php
if (!($autoload = realpath(__DIR__ . '/../../../autoload.php')) && !($autoload = realpath(__DIR__ . '/../vendor/autoload.php'))) {
throw new Exception('Composer autoloader file could not be found.');
}
require_once($autoload);
$configData = array(
'username' => '[email protected]',
'password' => 'Password1^',
);
$requestData = array(
'sitereference' => 'test_site12345',
'requesttypedescriptions' => array('AUTH'),
'accounttypedescription' => 'ECOM',
'currencyiso3a' => 'GBP',
'baseamount' => '1050',
'orderreference' => 'My_Order_123',
'credentialsonfile' => '2',
'initiationreason' => 'S',
'parenttransactionreference' => '1-2-345'
);
$api = \Securetrading\api($configData);
$response = $api->process($requestData);
var_dump($response->toArray());
?>
curl --user [email protected]:Password1^ <DOMAIN>/json/ -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{
"alias":"[email protected]",
"version": "1.00",
"request": [{
"currencyiso3a": "GBP",
"requesttypedescriptions": ["AUTH"],
"sitereference": "test_site12345",
"baseamount": "1050",
"orderreference": "My_Order_123",
"accounttypedescription": "ECOM",
"credentialsonfile": "2",
"initiationreason": "S",
"parenttransactionreference": "1-2-345"
}]}'
{"alias":"[email protected]","version":"1.00","request":[{"currencyiso3a":"GBP","requesttypedescriptions":["AUTH"],"sitereference":"test_site12345","baseamount":"1050","orderreference":"My_Order_123","accounttypedescription":"ECOM","parenttransactionreference":"1-2-345","initiationreason":"S","credentialsonfile":"2"}]}
<requestblock version="3.67">
<alias>[email protected]</alias>
<request type="AUTH">
<merchant>
<orderreference>My_Order_123</orderreference>
</merchant>
<billing>
<payment>
<expirydate>12/2020</expirydate>
<pan>4111111111111111</pan>
<securitycode>123</securitycode>
</payment>
<amount currencycode="GBP">1050</amount>
</billing>
<operation>
<sitereference>test_site12345</sitereference>
<accounttypedescription>ECOM</accounttypedescription>
<parenttransactionreference>1-2-345</parenttransactionreference>
<initiationreason>S</initiationreason>
<credentialsonfile>2</credentialsonfile>
</operation>
</request>
</requestblock>