Referential WS Server
Current version 25R2-1.0 of September 4th 2025

Referential WS Server is the standard referential interfaces exposed by ACS.
The bank is therefore client of ACS.
Thanks to this API the bank can :
- get card information from ACS ;
- update cards/users/credentials information to ACS.
1. End points
1.1. updateCardWithCredentials
POST ~/referential/rest/{version}/public/updateCardWithCredentials/{requestId}
This function will be used to create or update a card with its credentials.
Examples
- Request to manage cards
Input :
{
"cards":[
{ "id":"1",
"principal": { "type": "pan", "value": "4000000000000002"},
"expiry": { "type": "plain", "value": "2023-06"}
},
{ "id":"2",
"principal":{ "type": "pan", "value": "8139986370259068"},
"expiry": { "type": "plain", "value": "2020-12" }
}
],
"service": "ACS_U9F",
"issuerCode": "66666",
"subIssuerCode": "66666",
"status": "ACTIVE",
"deletedTime":"2022-12-23T09:45:35",
“firstName”:“John”,
“lastName”:”Dow”,
"language": "fr",
"credentialsUpdateMode": "DELETE_AND_CREATE",
"credentials": {
"type": "plain",
"value":{\"METHOD:SMS\":[{\"sms\":\"+491741234567\"}],\"METHOD:DDN\":[{\"ddn\":\"19810803\",\"ddnPattern\":\"AAAAMMJJ\"}]}"
}
}
Output :
{
"cardResponses": [
{
"id": "1",
"cardHolderId": "1e8a227f-f34a-4b1f-84d0-32fe5a1eb8d5",
"tokenPan": "mckei58l0k504lpp",
"language": "en"
},
{
"id": "2",
"cardHolderId": "ef9a45e1-2399-4af4-89e4-37011ab3a50b",
"tokenPan": "mck3a8l5947lecip",
"language": "en"
}
]
}
- Request to manage cards
Input :
{
"cards":[
{ "id":"1",
"principal": { "type": "pan", "value": "4000000000000002"},
"expiry": { "type": "plain", "value": "2023-06"}
},
{ "id":"2",
"principal":{ "type": "pan", "value": "8139986370259068"},
"expiry": { "type": "plain", "value": "2020-12" }
}
],
"service": "HUB_NRT",
"issuerCode": "66666",
"subIssuerCode": "66666",
"status": "ACTIVE",
"deletedTime":"2022-12-23T09:45:35",
“firstName”:“John”,
“lastName”:”Dow”,
"language": "fr",
"credentialsUpdateMode": "DELETE_AND_CREATE",
"credentials": {
"type": "plain",
"value": "{\"METHOD:EMAIL\":[{\"email\":\"{{email_address}}\"}]}"
}
}
Output :
{
"cardResponses": [
{
"id": "1",
“cardId”: "30a93d15-c8f0-4bee-848e-b029c3e6c8e1",
"cardHolderId": "81453cf5-afce-4d38-8fec-4bcfc21a7cf3",
"tokenPan": "mckODEzOTk4NjM3MDI1OTA2OA==",
"language": "fr"
},
{
"id": "2",
“cardId”: "bdfe9373-5908-4856-86b1-edc1a4697cb0"
"cardHolderId": "01821c69-ebac-44e2-b963-0abe6f6b1b5a",
"tokenPan": "mckODEzOTk4NjM3MDI1OTA2OA==",
"language": "fr"
}
]
}
- Request to manage cards after adding new format of credentialList
Input :
{
"service": "{{service}}",
"issuerCode": "{{issuerCode}}",
"subIssuerCode": "{{subIssuerCode}}",
"cards": [
{
"id": "1",
"principal": {
"type": "pan",
"value": "{{pan}}"
},
"expiry": {
"type": "plain",
"value": "2023-10"
}
}
],
"credentialList": [
{
"type": "SMS",
"value": "+37477445464"
},
{
"type": "EMAIL",
"value": "tigranyan.argishti@gmail.com"
}
],
"effectiveUpdateDate": "2024-01-16T13:23:55",
"credentialsUpdateMode": "DELETE_AND_CREATE"
}
Output :
{
"cardResponses": [
{
"id": "1",
"cardId": "48c4f206-149a-4d3e-a04d-b0e3c729c92b",
"cardHolderId": "38c83f83-9460-4a13-a7c8-41913d6a0462",
"tokenPan": "mckNDk3NjcwMDAwMDAwMDAxNQ=="
}
]
}
- Request to delete card credentials
Input :
{
"service": "HUB_NRT",
"issuerCode": "66666",
"subIssuerCode": "66666",
"cards": [
{
"id": "GUID",
"principal": {
"type": "pan",
"value": "4532953162392327"
},
"expiry": {
"type": "plain",
"value": "2024-03"
},
"cardHolderId": "ef9a45e1-2399-4af4-89e4-37011ab3a50b"
}
],
"credentials": {
"type": "plain",
"value": "{\"METHOD:SMS\":[{\"sms\":\"DELETE\"}]}"
},
"credentialsUpdateMode": "DELETE"
}
1.2. searchCard
POST ~/referential/rest/{version}/public/searchCard/{requestId}
Search card by pan, token pan and expiry date.
Examples
- Sample 1 of successful search card
Input :
Content-Type: application/json
{
"principal" : {
"type": "pan",
"value": "3569990010059540"
},
"service": "ACS_U5G",
"issuerCode": "00006",
"subIssuerCode":"00006",
"expiry": {
"type": "expiry",
"value": "2017-11"
}
}
Output :
{
"id": "8f7b2bd8-9e9a-46a3-8006-a768e10dee9f",
"createdTime": "2020-11-25T06:37:55",
"updatedTime": "2019-03-05T04:18:26",
"deletedTime": "2022-10-23T08:55:15",
"token": "g00ccbf4c96f5b98",
"cardHolderId": "046949fc-a1b8-49ca-b19b-245619262a1e",
“firstName”:“John”,
“lastName”:”Dow”,
"language": "fr",
"status": "ACTIVE",
"credentials": {
"type": "plain",
"value": "{\"METHOD:DDN\":[{\"ddn\":\"01011970\",\"ddnPattern\":\"DDMMYYYY\"}],\"METHOD:PWD\":[{\"pwd\":\"!@#$,{;(^&*)}:\\\\.?/+-_=|'][~\\\"%!@#$,{;(^&*)}:\\\\.?/+-_=|'][~\\\"%\"}],\"METHOD:SMS\":[{\"sms\":\"+33600000000\"}],\"METHOD:EMAIL\":[{\"email\":\"testworldlinebox1@yopmail.com\"}]}"
}
}
- Sample 2 of successful search card
Input :
Content-Type: application/json
{
"principal" : {
"type": "pan",
"value": "4000000000000002"
},
"service": “HUB_NRT",
"issuerCode": "66666",
"subIssuerCode":"66666",
"expiry": {
"type": "plain",
"value": "2023-06"
}
}
Output :
{
"id": "52b3f168-aef2-40e2-80ff-7974e325b55c",
"createdTime": "2022-12-01T11:43:59",
"deletedTime": "2022-12-23T09:45:35",
"token": "mckNDAwMDAwMDAwMDAwMDAwMg==",
"cardId": "52b3f168-aef2-40e2-80ff-7974e325b55c",
“cardHolderId”: “e57bcbf7-846e-4d5b-bb27-f9a2ec0d6a39”,
"firstName": "John",
"lastName": "Dow",
“language”: “fr”,
"status": "ACTIVE",
“expiryDate”: "2024-06",
"credentials": { "type": "plain", "value": "{\"METHOD:EMAIL\":[{\"email\":\"testnrt@gmail.com\"}]}" },
"label": "cardLabel"
}
- Sample 3 of successful search card
Input :
Content-Type: application/json
{
"principal": {
"type": "pan",
"value": "{{pan}}"
},
"cardHolderId": "{{cardHolderId}}",
"expiry": {
"type": "expiry",
"value": "2023-10"
},
"service": "{{service}}",
"issuerCode": "{{issuerCode}}",
"subIssuerCode": "{{subIssuerCode}}"
}
Output :
{
"id": "bae13888-7deb-4c68-9761-96c265062320",
"createdTime": "2023-03-10T13:28:48",
"updatedTime": "2023-03-10T13:28:59",
"token": "mckNDk3NjcwMDAwMDAwMDAxNQ==",
"cardId": "bae13888-7deb-4c68-9761-96c265062320",
"cardHolderId": "811aa876-4a88-4fd4-815e-0f63fce8bb7c",
"language": "fr",
"status": "ACTIVE",
"expiryDate": "2023-10",
"credentialList": [
{
"type": "IVR",
"value": "+37477445464"
},
{
"type": "EMAIL",
"value": "tigranyan.argishti@gmail.com"
}
]
}
- Sample of error card not found
Output :
{
"issuerCode": "00006",
"subIssuerCode": "00006",
"requestId": "b8b1d1ae-3b65-48a2-b331-9607ab295412",
"service": "ACS_U5G",
"errorCode": "404030000",
"origin": "REFERENTIAL",
"message": "com.wl.gbl.ah.utils.services.exception.AuthenticationHUBExceptionV2: Card not found",
"originVersion": "21R1.5-P-37",
"originHost": "tqahx002v",
"contextTemporary": {}
}
16.3. copyCard
POST ~/referential/rest/{version}/public/copyCard/{requestId}
This function will be used for copying credential data from one card to another.
Examples
Input :
{
"service":"{{service}}",
"issuerCode": "{{issuerCode}}",
"subIssuerCode": "{{subIssuerCode}}",
"oldPan": {
"type": "pan",
"value": "{{pan}}"
},
"oldDeletedTime": "2028-08-01T00:00:00",
"oldCardStatus":"ACTIVE",
"newPan": {
"type": "pan",
"value": "{{pan_4164}}"
},
"newExpiryDate": {
"type": "expiry",
"value": "2022-10"
},
"newDeletedTime": "2025-08-01T00:00:00",
"newCardStatus":"ACTIVE",
"newCardId":""
}
- Output of successful copy card
{
"id": "0be3e040-acfa-4807-88b5-2214cd4b1d1b",
"createdTime": "2023-03-10T13:34:30",
"deletedTime": "2025-08-01T00:00:00",
"token": "mckNDk3NjcwMDAwMDAwMDAyMw==",
"cardId": "0be3e040-acfa-4807-88b5-2214cd4b1d1b",
"cardHolderId": "811aa876-4a88-4fd4-815e-0f63fce8bb7c",
"language": "fr",
"status": "ACTIVE",
"expiryDate": "2022-10",
"credentialList": [
{
"type": "EMAIL",
"value": "tigranyan.argishti@gmail.com"
},
{
"type": "IVR",
"value": "+37477445464"
}
]
}
- Output of error copy card when old PAN is unknown
{
"issuerCode": "66666",
"subIssuerCode": "66666",
"requestId": "4f70f7c9-8a74-411b-aff6-b9744c916fc5",
"service": "ACS_U9F",
"principals": [],
"errorCode": "400100005",
"origin": "REFCLIENT",
"message": "com.wl.gbl.ah.utils.services.exception.AuthenticationHUBExceptionV2: Bad parameter : Undefined Card ",
"originVersion": "21R2-P-05-SNAPSHOT",
"originHost": "tsahx001v",
"contextTemporary": {}
}
1.4. updateUserWithCredentials
POST ~/referential/rest/{version}/public/updateUserWithCredentials/{requestId}
Current method will be used to update credentials of all cards for specified user. In case of request for more than one card, any error on one card will dismiss the update / creation for other cards.
Examples
- Request to update user credentials
Input :
{
"service": "ACS_U9F",
"issuerCode": "66666",
"subIssuerCode": "66666",
"credentials": {
"type": "plain",
"value": "{\"METHOD:SMS\":[{\"sms\":\"+37441901157\"}]}"
},
"credentialsUpdateMode": "UPDATE",
"cardHolderId": "cardholderid",
"firstName": "new first name",
"lastName": "new last name"
}
Output :
{
"cardResponses": [
{
"id": "53d47f12-463e-45d8-95c5-87dd4fc5ce16",
"cardId": "5fddf717-e51f-4507-a439-6dc54d889970",
"cardHolderId": "cardholderid",
"tokenPan": "g02d20a3b496d266"
},
{
"id": "c0931ee5-b195-4660-92b5-6ea54a7e554d",
"cardId": "a9137220-ff21-48de-8120-507bb2283008",
"cardHolderId": "cardholderid",
"tokenPan": "g02d20a3b496d266"
},
{
"id": "7e934f88-15f1-4166-86a1-1e38775dce01",
"cardId": "updatedCardIdv2021R3",
"cardHolderId": "cardholderid",
"tokenPan": "g02d20a3b496d266"
},
...
]
}
- Request to update user credentials after adding credentialList functionality
Input :
{
"service": "{{service}}",
"issuerCode": "{{issuerCode}}",
"subIssuerCode": "{{subIssuerCode}}",
"cardHolderId": "{{cardHolderId}}",
"principal": {
"type": "pan",
"value": "{{pan}}"
},
"expiry": {
"type": "expiry",
"value": "2022-10"
},
"firstName": "firstName",
"lastName": "lastName",
"language": "fr",
"credentialsUpdateMode": "DELETE_AND_CREATE",
"credentialList": [
{
"type": "SMS",
"value": "+37477445464"
},
{
"type": "EMAIL",
"value": "tigranyan.argishti@gmail.com"
},
{
"type": "IVR",
"value": "+37494952595"
}
],
"label": "label"
}
Output :
{
"cardResponses": [
{
"id": "f492fce5-2827-4902-9df9-b3bcd2fca227",
"cardId": "f492fce5-2827-4902-9df9-b3bcd2fca227",
"cardHolderId": "71b2bb27-3aa8-47ee-b594-d52f21f38ea7",
"tokenPan": "mckNDk3NjcwMDAwMDAwMDAxNQ==",
"language": "fr"
}
]
}
- Request to delete user credentials
Input :
{
"service": "HUB_NRT",
"issuerCode": "66666",
"subIssuerCode": "66666",
"context": {
"protocolVersion": "2.2"
},
"cards": [
{
"id": "GUID",
"principal": {
"type": "pan",
"value": "4532953162392327"
},
"expiry": {
"type": "plain",
"value": "2024-03"
},
"cardHolderId": "ef9a45e1-2399-4af4-89e4-37011ab3a50b"
}
],
"credentials": {
"type": "plain",
"value": "{\"METHOD:TA\":[{\"TA\":\"DELETE\"}],\"METHOD:EMAIL\":[{\"email\":\"DELETE\"}]}"
},
"cardHolderId": "ef9a45e1-2399-4af4-89e4-37011ab3a50b",
"firstName": "first name",
"lastName": "last name",
"credentialsUpdateMode": "DELETE"
}
1.5. searchUserCredentials
POST ~/referential/rest/{version}/public/searchUserCredentials/{requestId}
Search user credentials by card holder ID.
Examples
- Sample of successful search user credentials
Input :
Content-Type: application/json
{
"principal": {
"type": "pan",
"value": "4978041601875887"
},
"service": "ASC_U9F",
"issuerCode": "66666",
"subIssuerCode": "66666",
"cardHolderId" : "302fe46b-c234-4386-b034-8227e073cfd9"
}
Output :
{
"cardHolderId": "302fe46b-c234-4386-b034-8227e073cfd9",
"language": "fr",
"cardResponses": [
{
"status": "ACTIVE",
"tokenPan": "mck1oba4c659oadp",
"expiryDate": "2022-10",
"credentials": {
"type": "credentials",
"value": "{\"METHOD:TA\":[{\"TA\":\"38a4a004-2e3b-11eb-adc1-0242ac120002\"}]}"
}
}
]
}
- Sample of successful search user credentials after adding CredentialList functionality
Input :
Content-Type: application/json
{
"principal": {
"type": "pan",
"value": "{{pan}}"
},
"cardHolderId": "{{cardHolderId}}",
"expiry": {
"type": "expiry",
"value": "2023-10"
},
"service": "{{service}}",
"issuerCode": "{{issuerCode}}",
"subIssuerCode": "{{subIssuerCode}}"
}
Output :
{
"cardHolderId": "71b2bb27-3aa8-47ee-b594-d52f21f38ea7",
"firstName": "firstName",
"lastName": "lastName",
"language": "fr",
"cardResponses": [
{
"status": "ACTIVE",
"tokenPan": "mckNDk3NjcwMDAwMDAwMDAxNQ==",
"expiryDate": "2025-03",
"credentialList": [
{
"type": "SMS",
"value": "H##e9fe0c080fb29a7452a34d1fe213f46aeb1a7200cdd1e5fe467c595b"
},
{
"type": "IVR",
"value": "H##9b7b59e57230472c2bb7ab8f5947be9568ccd6447673ff474f6373ee"
},
{
"type": "EMAIL",
"value": "H##1c2a13bed56df2c7f7c1bb97f848643503088e671ac31df63e8238d97376084d2fead3c6f478d16cc220b746"
}
]
}
]
}
- Sample of user credentials not found after adding CredentialList functionality
Output :
{
"cardHolderId": "74e9bf86-ca83-44cd-aa4e-58dd939e2936",
"cardResponses": [
{
"status": "ACTIVE",
"tokenPan": "mck26e5fc4c5hfkp",
"expiryDate": "2022-11"
}
]
}
1.6. createVirtualCard
POST ~/referential/rest/{version}/public/createVirtualCard/{requestId}
Create Virtual Card, based on a real PAN.
Assumptions :
- vPan must be a valid PAN number (13-19c.) with correct luhn key,
- Expiry date could be handle for vPAN - A deleteTime is mandatory for each virtual card,
- A PAN could have multiple vPAN,
- vPAN must be linked to one and only one existing and active PAN.
As it was already mentioned, each virtual card is associated with a real card. But each real card should not have more than 100 active virtual cards connected to it. Aside of that, depending on the bank, the capability to retrieve the real PAN differs.
There are banks which are configured to have external card repository, which means that the real PAN remains unknown in the HUB database until the first transaction is done, For such Banks, a virtual PAN could be created for an unknown PAN in HUB’s database. Both cards, physical card (PAN) and virtual card (vPAN) will be created in one step base on the same request.
Example
Input :
Content-Type: application/json
{
"service": "ASC_U9F",
"issuerCode": "66666",
"subIssuerCode": "66666",
"principal": {
"type": "pan",
"value": "4978041601875887"
},
“vPrincipal”: {
"type": "pan",
"value": "4716636697857207"
}
"vExpiryDate": {
"type": "plain",
"value": "2022-10"
},
"vDeletedTime": "2023-12-03T10:15:30"
}
Output : No Content
1.7. updateVirtualCard
POST ~/referential/rest/{version}/public/updateVirtualCard/{requestId}
Update an existing Virtual Card.
Example
Input :
Content-Type: application/json
{
"service": "ASC_U9F",
"issuerCode": "66666",
"subIssuerCode": "66666",
“vPrincipal”: {
"type": "pan",
"value": "4716636697857207"
},
"vExpiryDate": {
"type": "plain",
"value": "2022-10"
},
"vDeletedTime": "2023-12-03T10:15:30"
}
Output : No Content
2. Data Dictionary
2.1. Credentials
Credentials field is corresponding to information of cardholder which is mandatory to initialize and launch the authentication.
The credentials value field is a String that can be parsed in JSON into a Map of credentials each containing a Map with its value. The value is always a String that needs to be casted to as JSON object, as a result, all the double quotes characters need to be escaped by a backslash. This process is only requested for data provided in plain text. For encrypted data, the encrypted result is in HEX format so compliant with JSON format.
- Example 1: Plain example
"credentials": {
"type": "plain",
"value": "{\"METHOD:PWD\": [{\"pwd\": \"M0nP@sswrOrD\"}], \"METHOD:SMS\": [{\"sms\": \"+33600000000\"}]}"
}
This will be parsed into:
{
"METHOD:PWD": [{
"pwd": "M0nP@sswrOrD"
}],
"METHOD:SMS": [{
"sms": "+33600000000"
}]
}
- Example 2: Encrypted example
"credentials": {
"type": "encrypted",
"value": "4a67ba0915b17c54f41d6bb79e35c0053f418728ccefa6e2c9e6f4b96a63e6c34452b8ced31f45b7bb6c9fb02e7972fd1731bb3e3350b30a4407b4b858f173
2a450434c2f01fc4",
"keyTag": "01"
}
The value in the 2nd example is the encrypted version of the value in the 1st example. When the type is encrypted, the encryption is applied to the entire value field.
| Example 1: Plain | Example 2: Encrypted |
| "value": "{\"METHOD:PWD\": [{\"pwd\": \"M0nP@sswrOrD\"}], \"METHOD:SMS\": [{\"sms\": \"+33600000000\"}]}" | "value": "4a67ba0915b17c54f41d6bb79e35c0053f418728ccefa6e2c9e6f4b96a63e6c 34452b8ced31f45b7bb6c9fb02e7972fd1731bb3e3350b30a4407b4b858f173 2a450434c2f01fc4" |
- Example 3: Hashed example
In some cases, the password can be pushed hashed. In that case here is how it needs to be used :
"METHOD:PWD\":
[{"value":"f2d81a260dea8a100dd517984e53c56a7523d96942a834b9cdc249bd4e8c7aa9","algorithm":"SHA-256"}]
Kinds of credential currently available are in standard are:
- SMS
mobile phone used for authentication by OTP sent by SMS
HUB phone number must be in international standard E.164 format.
164 numbers are formatted [+] [country code] [subscriber number including area code] and can have a maximum of fifteen digits.
"credentials": {
"type": "plain",
"value": "{\"METHOD:SMS\":[{\"sms\":\"+33644190115\"}]}"
},
On old version of Card Repository:
"credentials": {
"type": "plain",
"value": "{\"METHOD:SMS\":[{\"phonenumber\":\"+33644190115\"}]}"
},
- IVR
landline phone used for OTP sent by Interactive Voice Call
HUB phone number must be in international standard E.164 format.
"credentials": {
"type": "plain",
"value": "{\"METHOD:IVR\":[{\"ivr\":\"+33244190115\"}]}"
},
On old version of Card Repository:
"credentials": {
"type": "plain",
"value": "{\"METHOD:SMS\":[{\"phonenumber\":\"+33644190115\", \"ignoreForSms\":\"true\"}]}"
},
- EMAIL
Email address used for authentication by OTP sent by mail.
"credentials": {
"type": "plain",
"value": "{\"METHOD:EMAIL\":[{\"email\":\"testnrt@test.com\"}]}"
}
- SSN
"credentials": {
"type": "plain",
"value": "{\"METHOD:SSN\":[{\"ssn\":\"93e2e023-0784-4d06-ac25-bf7c4bdf2603\"}]}"
}
- TA
"credentials": {
"type": "plain",
"value": "{\"METHOD:TA\":[{\"TA\":\"93e2e023-0784-4d06-ac25-bf7c4bdf2603\"}]}"
}
- DDN
Authentication by Birthdate
"credentials": {
"type": "plain",
"value": "{\"METHOD:DDN\":[{\"ddn\":\"19810803\",\"ddnPattern\":\"AAAAMMJJ\"}]}"
}
- PWD in plain text
Authentication by password – password is provided in plain text but stored in database encrypted
"credentials": {
"type": "plain",
"value": "{\"METHOD:PWD\":[{\"pwd\":\"123456\"}]}"
},
- USERCODE in plain text
"credentials": {
"type": "plain",
"value": "{\"METHOD:USERCODE\":[{\"usercode\":\"9876543210\"}]}"
}





















