Issuer LCM Account services
Issuer LCM Account services provide general account management services for your full card portfolio. Issuers can take full benefit the scheme agnostic interface that works consistently across the card schemes.
URLs
Authorization server Base URL - Production
Authorization server Base URL - Sandbox
https://api-gateway-pp.nets.eu/
Authentication
Before you can use Account services API, you must go through on-boarding process.
You will receive two keys, one set for Sandbox and another set for Production access, which are the pairs of unique identifier called "Client ID" and "Client Secret". The Client Secret should not be shared with anyone. The two keys will be needed to authenticate your application to the respective environments. The key for the sandbox environment is used for a test transaction, and that of the production environment for a live transaction.
You need access tokens to invoke Account services API's resources. Access tokens are passed in the HTTP header when invoking the API. The Authorization server provides a Token Endpoint that you can use to generate or renew your access token. The response of the Token Endpoint is a JSON message. You extract the token for the JSON and pass it with an HTTP Authorization header to access the API.
In case of theft or a security violation, you can revoke an access token by calling a Revoke Endpoint.
OAuth 2.0
OAuth 2.0 is the industry-standard protocol for authorization. Read more at The OAuth 2.0 Authorization Framework, https://tools.ietf.org/html/rfc6749.
Account services API currently supports OAuth 2.0 Specification with confidential client type. A Confidential client is capable of maintaining the confidentiality of its credentials provided by an authorization server. OAuth 2.0 defines four roles:
- Resource owner: An entity capable of granting access to a protected resource.
- Resource server: The server hosting protected resources, capable of accepting and responding to protected resource requests using access tokens.
- Client: An application making protected resource requests on behalf of the resource owner and with its authorization.
- Authorization server: The server issuing access tokens to the client after successfully authenticating the resource owner obtaining authorization.
At a very high-level, it is possible to break the full OAuth flow into two parts.
- Get a token from the authorization server.
- Use the token to access the resource server. OAuth 2.0 defines a concept called "authorization grant" which is a credential representing the resource owner's authorization (to access its protected resources) used by the client to obtain an access token. Account services API supports Client Credentials grant type.
Authorization server
Token Endpoint
POST /token
With the Client Credentials grant type, the client can request an access token using only its credentials when the client is requesting access to the protected resource under its control. Once the client makes this request to the authorization server, it will return an access token to the protected resource. The access token returned to the client for Account services API is Bearer type.
The client should request access tokens with the minimal necessary scope and lifetime. The authorization server takes the client identity into account when choosing how to honour the requested scope and lifetime, and may issue an access token with less rights than requested.
Generate access token using Client Credential grant type
- Obtain a valid client_id and Client_secret.
- Combine the pair in the format client_id:client_secret and encode the combined string
- using base64. See Encode to Base64 format, https://www.base64encode.org/
- Use the following sample curl command to obtain the access token.
$ curl -k -d "grant_type=client_credentials" \
-H "Authorization: Basic <Base64 encoded client_id:client_secret>" \
-H 'Content-Type: application/x-www-form-urlencoded' \
https://api-gateway2.nets.eu/token
You receive a response similar to the following:
{
"token_type":"Bearer",
"expires_in":2061,
"access_token":"ca19a540f544777860e44e75f605d927"
}
Note that, according to OAuth2.0 Authorization Framework, the Client Credential grant type does not allow for the issuing the refresh tokens. See https://tools.ietf.org/html/rfc6749#section-4.4.3
Revoke Endpoint
POST /revoke
Parameters
-
token (required)
The token to be revoked
-
<Base64 encoded client_id:client_secret> (required)
Combine the pair in the format client_id:client_secret and encode the combined string using base64.
-
token_type_hint (optional)
If you do not specify this parameter, the authentication server will search in both key spaces (access_token and refresh_token) and if it finds a matching token then it will be revoked. Therefore, if this parameter is not specified, it will take longer to revoke the token. However, if you specify this parameter, the authentication server only searches in the respective token space. Hence, it is much faster to revoke the token. For the Client Credentials grant type, you have only the option of access_token.
Example:
$ curl -X POST \
https://api-gateway2.nets.eu/revoke \
-H 'Authorization: Basic <Base64 encoded client_id:client_secret>' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'token=<token_to_be_revoked>&token_type_hint=<access_token_or_refresh_token>'
Responses
-
Valid token - HTTP Status 200 - OK
You receive an empty response with the HTTP status as 200. The following HTTP headers are returned:
Revokedaccesstoken: a0d210c7a3de7d548e03f1986e9a5c39 Authorizeduser: admin@carbon.super Revokedrefreshtoken: 5e87a8235cd4d066e15c4c989f5ecf94 Content-Type: text/html Pragma: no-cache Cache-Control: no-store Date: Tue, 23 Aug 2018 19:28:52 GMT Transfer-Encoding: chunked -
Invalid token - HTTP Status 200 - OK You still receive an empty response with the HTTP status as 200 but only the following HTTP headers are returned:
Content-Type: text/html Pragma: no-cache Cache-Control: no-store Date: Tue, 23 Aug 2018 19:31:45 GMT Transfer-Encoding: chunkedBecause the authorization server cannot find the token in any key space, you will not see Revokedaccesstoken or Revokedrefreshtoken in the HTTP headers.
API Specification
Headers and payload
Request headers are case-sensitive.
Request data must be sent as JSON message. The Content-Type header value must be application/json.
Responses are sent as JSON messages. The Accept header value must be application/json.
Reason codes and account actions
| Account action | Reason code | Service API | Description |
|---|---|---|---|
| 0000 | Create/register account | Add new account | |
| RENEW | 0001 | Update Account Number orExpiry Date | Renewed for new expiry date |
| REPLACE | 0002 | Update Account Number orExpiry Date | Update account info due to replacement |
| REPLACE | 0003 | Update Account Number orExpiry Date | Update account info due to brand flip |
| 0004 | Update IDV | Update contact information | |
| 0005 | Change the state of an account | Delete account due to fraud | |
| 0006 | Change the state of an account | Delete account as card is lost | |
| 0007 | Change the state of an account | Delete account as card is stolen | |
| 0008 | Change the state of an account | Delete account due to expiry and no renewal | |
| 0009 | Change the state of an account | Delete account as per customer request | |
| 0010 | Change the state of an account | Block the existing account | |
| 0011 | Change the state of an account | Resume the blocked account | |
| 0012 | Update Services Needed | Services needed for the account is updated | |
| REPLACE | 0013 | Update Account Number orExpiry Date | Update account info due to portfolio flip |
| 0100 | Change the state of a virtual account | Delete virtual account | |
| 0105 | Change the state of a virtual account | Delete virtual account due to confirmed fraud | |
| 0106 | Change the state of a virtual account | Delete virtual account as devices is confirmed lost | |
| 0107 | Change the state of a virtual account | Delete virtual account as device is confirmed stolen | |
| 0108 | Change the state of a virtual account | Delete virtual account due to expiry and no renewal | |
| 0200 | Change the state of a virtual account | Suspend virtual account | |
| 0205 | Change the state of a virtual account | Suspend virtual account due to fraud | |
| 0206 | Change the state of a virtual account | Suspend virtual account as devices is lost | |
| 0207 | Change the state of a virtual account | Suspend virtual account as device is stolen | |
| 0300 | Change the state of a virtual account | Resume the virtual account | |
| 0311 | Change the state of a virtual account | Resume the virtual account as device is recovered | |
| 0314 | Change the state of a virtual account | Resume the virtual account as no fraudulent transaction is reported | |
| 0400 | Change the state of a virtual account | Activate virtual account | |
| 0401 | Change the state of a virtual account | Activate virtual account as cardholder is pre-authenticated | |
| 0402 | Change the state of a virtual account | Activate virtual account upon request from cardholder | |
| 0501 | Change profile | Card product change | |
| 0502 | Change profile | Terms and conditions change | |
| 0503 | Change profile | Card art change | |
| 0504 | Change profile | Card credentials change | |
| 2000 | Get Encrypted Payload | Push provisioning to Google Pay | |
| 2001 | Get Encrypted Payload | Push provisioning to Apple Pay |
Error codes
| Error code | Description |
|---|---|
| LCM-1011 | Invalid Account ID |
| LCM-1012 | Invalid PAN ID or Card ID |
| LCM-1013 | Invalid PAN |
| LCM-1014 | Input Data Invalid |
| LCM-1015 | Internal Server Error |
| LCM-1016 | Invalid Virtual Account |
| LCM-1018 | Client error related to virtual card presentation |
| LCM-1019 | Server error related to virtual card presentation |
| LCM-1021 | PAR service — client error |
| LCM-1022 | PAR service — server error |
| LCM-1025 | Internal communication error |
| LCM-1026 | External communication error |
| LCM-1027 | Invalid Encrypted Data |
Scroll down for code samples, example requests and responses.
Select a language for code samples from the tabs or the mobile navigation menu.
Health Check
This operation provides health check of the API
Health check
GET /pingThis operation provides health check of the API
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
Health check
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/ping"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); IRestResponse response = client.Execute(request);
Responses
200OKoptional
messagestringoptional
status message of Service
statusstringoptional
status code
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "message": "string", "status": "string" }
Account services - Inbound
Inbound API from issuer backend to LCM
Create an account in LCM. The account must already exist in a backend Card Management System. This request only creates a corresponding account entity in LCM. During TSP and VCARD flows, accounts are created on-the-fly. This request allows the Issuer to create an account even before a token is created (or before the first virtual card image is generated). The account can be created using the account reference IDs (CARDID, PANID, PANREF) without providing the card's PAN.
POST /accountsCreate an account in LCM. The account must already exist in a backend Card Management System. This request only creates a corresponding account entity in LCM. During TSP and VCARD flows, accounts are created on-the-fly. This request allows the Issuer to create an account even before a token is created (or before the first virtual card image is generated). The account can be created using the account reference IDs (CARDID, PANID, PANREF) without providing the card's PAN.
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
Create an account in LCM. The account must already exist in a backend Card Management System. This request only creates a corresponding account entity in LCM. During TSP and VCARD flows, accounts are created on-the-fly. This request allows the Issuer to create an account even before a token is created (or before the first virtual card image is generated). The account can be created using the account reference IDs (CARDID, PANID, PANREF) without providing the card's PAN.
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts"); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountInfoobjectoptional
accountstringoptional
example: 95645644466699990Plain text value of account reference, if accountType is one of: CARDID, PANID, PANREF. Otherwise, the account parameter is sent inside the encryptedData.
accountTypestringoptional
example: CARDIDOne of PAN, CARDID, PANID, PANREF.
accountExpirystringoptional
example: 062029Account expiry in the MMYYYY format. Only necessary if accounType is PAN and when it is sent, it is inside the encryptedData.
encryptedDatastringoptional
example: encrypted_dataA field containing the encrypted JSON object with account and accountExpiry fields inside. In this case the value of the account field will be the PAN. Only to be sent in the request when accountType is PAN.
profileIDstringoptional
example: 3bf7159c-ec9b-484d-922b-2c18d1c7bf9dProfile ID known to the scheme
reasonCodestringoptional
example: 0000Reason code for account creation is 0000
servicesNeededobjectoptional
servicearrayoptional
List of services to be subscribed for this account.
idvMethodsobjectoptional
idvMethodarrayoptional
idvChannelstringoptionalexample: SMS
idvContactInfostringoptionalexample: +48551534591
additionalParametersarrayoptional
Additional parameters to be passed to LCM. This is an array of name-value pairs and their meaning depends on the backend Card Management System in use for a particular Issuer.
namestringoptionalexample: CardholderFName
valuestringoptionalexample: John
Request body
{ "accountInfo": { "account": "95645644466699990", "accountType": "CARDID", "accountExpiry": "062029", "encryptedData": "encrypted_data", "profileID": "3bf7159c-ec9b-484d-922b-2c18d1c7bf9d", "reasonCode": "0000", "servicesNeeded": { "service": [ "TSP", "VCARD" ] } }, "idvMethods": { "idvMethod": [ { "idvChannel": "SMS", "idvContactInfo": "+4529482200" }, { "idvChannel": "EMAIL", "idvContactInfo": "mark@domain.com" } ] }, "additionalParameters": [ { "name": "CardholderFName", "value": "John" } ] }
Responses
201Createdoptional
accountIDstringoptional
example: 12937509823948934803453222LCM account ID
accountStatestringoptional
example: ACTIVEOne of ACTIVE | SUSPENDED
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
201
{ "accountID": "12937509823948934803453222", "accountState": "ACTIVE" }
This endpoints returns the LCM account id, based on the information provided by the caller in the request body. It can be used by the Issuer to learn the LCM account ID and use it in other API calls where it is required.
POST /accounts/accountidThis endpoints returns the LCM account id, based on the information provided by the caller in the request body. It can be used by the Issuer to learn the LCM account ID and use it in other API calls where it is required.
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
This endpoints returns the LCM account id, based on the information provided by the caller in the request body. It can be used by the Issuer to learn the LCM account ID and use it in other API calls where it is required.
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/accountid"); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountInfoobjectoptional
accountstringoptional
example: 95645644466699990Plain text value of account reference, if accountType is one of: CARDID, PANID, PANREF. Otherwise, the account parameter is sent inside the encryptedData.
accountTypestringoptional
example: CARDIDOne of PAN, CARDID, PANID, PANREF.
accountExpirystringoptional
example: 062029Account expiry in the MMYYYY format. Only necessary if accounType is PAN and when it is sent, it is inside the encryptedData.
encryptedDatastringoptional
example: encrypted_dataA field containing the encrypted JSON object with account and accountExpiry fields inside. In this case the value of the account field will be the PAN. Only to be sent in the request when accountType is PAN.
Request body
{ "accountInfo": { "account": "95645644466699990", "accountType": "CARDID", "accountExpiry": "062029", "encryptedData": "encrypted_data" } }
Responses
200OKoptional
accountIDstringoptional
example: 16286581557435413369899891LCM Account ID of the account identified in the request
400Bad Requestoptional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
- 200
- 400
{ "accountID": "16286581557435413369899891" }
Get account information based on accountID
GET /accounts/{accountID}Get account information based on accountID
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountIDstringrequired
accountID
excludeInactivebooleanoptional
excludeInactive
Get account information based on accountID
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/12345678901234567890123456?excludeInactive=SOME_BOOLEAN_VALUE"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); IRestResponse response = client.Execute(request);
Responses
200OKoptional
accountInfoobjectoptional
issuerIdstringoptional
example: PB-11223344556Issuer ID assigned by LCM
issuerNamestringoptional
example: New Bank UEIssuer name
cardSchemestringoptional
example: VISAOne of VISA | MasterCard
accountTypestringoptional
example: PANStatic value - PAN
accountExpirystringoptional
example: 022025Account expiry in the MMYYYY format
accountCreationDatestringoptional
example: 2024-08-19T16:56:22ZDate and time of account creation in the yyyy-MM-ddTHH:mm:ssZ format
accountSuffixstringoptional
example: 5690Last 4 digits of account PAN
servicesNeededobjectoptional
servicearrayoptional
List of services to be subscribed for this account.
idvMethodsobjectoptional
idvMethodarrayoptional
idvChannelstringoptionalexample: SMS
idvContactInfostringoptionalexample: +48551534591
accountStatestringoptional
example: ACTIVEState of the account, one of ACTIVE | SUSPENDED | DELETED | BLOCKED | LOCKED
stateTimeStampstringoptional
example: 2024-03-22T07:33:12ZThe timestamp of the last account state change in the yyyy-MM-ddTHH:mm:ssZ format
virtualAccountsobjectoptional
virtualAccountIDarrayoptional
An array of virtual account IDs. If the request parameter excludeInactive is set to true, the list will not contain the IDs whose tokens have not been created by the scheme yet. This gives the caller a possibility to exclude the cases where the tokenization was not completed yet or abandonded by the cardholder. This is an optional parameter and the default value is false.
400Bad Requestoptional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
- 200
- 400
{ "accountInfo": { "issuerId": "PB-11223344556", "issuerName": "New Bank UE", "cardScheme": "VISA", "accountType": "PAN", "accountExpiry": "022025", "accountCreationDate": "2024-08-19T16:56:22Z", "accountSuffix": "5690", "servicesNeeded": { "service": [ "TSP", "VCARD" ] } }, "idvMethods": { "idvMethod": [ { "idvChannel": "SMS", "idvContactInfo": "+4529482200" }, { "idvChannel": "EMAIL", "idvContactInfo": "mark@domain.com" } ] }, "accountState": "ACTIVE", "stateTimeStamp": "2024-03-22T07:33:12Z", "virtualAccounts": { "virtualAccountID": [ "17110918517574127108316617", "17110927928114877464144012" ] } }
Update account number or expiry date
PUT /accounts/{accountID}/accountinfoUpdate account number or expiry date
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountIDstringrequired
accountID
Update account number or expiry date
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/12345678901234567890123456/accountinfo"); var request = new RestRequest(Method.PUT); request.AddHeader("content-type", "application/json"); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountActionstringoptional
example: RENEWOne of RENEW | REPLACE
accountInfoobjectoptional
accountstringoptional
The account PAN. Required only if the accountAction is REPLACE.
accountTypestringoptional
example: PANRequired only if the accountAction is REPLACE and in that case the value is PAN.
accountExpirystringoptional
example: 062029Account expiry in the MMYYYY format.
reasonCodestringoptionalexample: 0002
Request body
{ "accountAction": "RENEW", "accountInfo": { "account": "string", "accountType": "PAN", "accountExpiry": "062029", "reasonCode": "0002" } }
Responses
200OKoptional
accountIDstringoptional
example: 17056528320153433915168198LCM account ID
accountStatestringoptional
example: UPDATEDAfter a successful operation the value of this field is set to UPDATED
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "accountID": "17056528320153433915168198", "accountState": "UPDATED" }
Change the state of an account
PUT /accounts/{accountID}/accountstateChange the state of an account
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountIDstringrequired
accountID
Change the state of an account
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/12345678901234567890123456/accountstate"); var request = new RestRequest(Method.PUT); request.AddHeader("content-type", "application/json"); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountStatestringoptional
example: SUSPENDOne of SUSPEND | RESUME
accountInfoobjectoptional
reasonCodestringoptional
example: 0010Use reason code:
Request body
{ "accountState": "SUSPEND", "accountInfo": { "reasonCode": "0010" } }
Responses
200OKoptional
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
Update IDV information. The IDV methods will be overwritten with methods passed in in the request.
PUT /accounts/{accountID}/idvUpdate IDV information. The IDV methods will be overwritten with methods passed in in the request.
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountIDstringrequired
accountID
Update IDV information. The IDV methods will be overwritten with methods passed in in the request.
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/12345678901234567890123456/idv"); var request = new RestRequest(Method.PUT); request.AddHeader("content-type", "application/json"); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
idvMethodsobjectoptional
idvMethodarrayoptional
idvChannelstringoptionalexample: SMS
idvContactInfostringoptionalexample: +48551534591
accountInfoobjectoptional
reasonCodestringoptional
example: 0010Use reason code:
Request body
{ "idvMethods": { "idvMethod": [ { "idvChannel": "SMS", "idvContactInfo": "+4529482200" }, { "idvChannel": "EMAIL", "idvContactInfo": "mark@domain.com" } ] }, "accountInfo": { "reasonCode": "0010" } }
Responses
200OKoptional
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
Update services for the account
PUT /accounts/{accountID}/servicesneededUpdate services for the account
Parameters
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountIDstringrequired
accountID
Update services for the account
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/12345678901234567890123456/servicesneeded"); var request = new RestRequest(Method.PUT); request.AddHeader("content-type", "application/json"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountActionstringoptional
example: ADDOne of ADD | REMOVE
accountInfoobjectoptional
reasonCodestringoptional
example: 0012Reason code for service update is 0012
servicesNeededobjectoptional
servicearrayoptional
List of services to be subscribed for this account.
Request body
{ "accountAction": "ADD", "accountInfo": { "reasonCode": "0012", "servicesNeeded": { "service": [ "TSP", "VCARD" ] } } }
Responses
200OKoptional
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
VISA - specific and used along with VISA Transaction Control only. Get account reference based on VISA Transaction Control ID.
POST /accountrefVISA - specific and used along with VISA Transaction Control only. Get account reference based on VISA Transaction Control ID.
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountRefTypestringrequired
VISA - specific and used along with VISA Transaction Control only. Get account reference based on VISA Transaction Control ID.
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accountref?accountRefType=CARDID"); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountstringoptional
VISA Transaction Control ID
accountTypestringoptional
example: VTCIDVTCID is the only possible value
Request body
{ "account": "string", "accountType": "VTCID" }
Responses
200OKoptional
accountRefTypestringoptional
example: CARDIDAccount reference type. One of CARDID | PANREF.
accountRefstringoptional
example: 940300994437660Account reference value
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "accountRefType": "CARDID", "accountRef": "940300994437660" }
Account services - Outbound
Outbound API from LCM to issuer backend
Get IDV methods from Issuer's backend. This is a POST request with empty body.
POST /accounts/{accountID}/idvGet IDV methods from Issuer's backend. This is a POST request with empty body.
Parameters
Authorizationstringrequired
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountIDstringrequired
accountID
Get IDV methods from Issuer's backend. This is a POST request with empty body.
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/12345678901234567890123456/idv"); var request = new RestRequest(Method.POST); request.AddHeader("Authorization", "SOME_STRING_VALUE"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); IRestResponse response = client.Execute(request);
Responses
200OKoptional
idvMethodsobjectoptional
idvMethodarrayoptional
idvChannelstringoptionalexample: SMS
idvContactInfostringoptionalexample: +48551534591
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "idvMethods": { "idvMethod": [ { "idvChannel": "SMS", "idvContactInfo": "+4529482200" }, { "idvChannel": "EMAIL", "idvContactInfo": "mark@domain.com" } ] } }
Get account state from Issuer's backend
POST /accounts/accountstateGet account state from Issuer's backend
Parameters
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
Get account state from Issuer's backend
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/accountstate"); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountInfoobjectoptional
accountstringoptional
example: 95645644466699990Plain text value of account reference, if accountType is one of: CARDID, PANID, PANREF. Otherwise, the account parameter is sent inside the encryptedData.
accountTypestringoptional
example: CARDIDOne of PAN, CARDID, PANID, PANREF.
accountExpirystringoptional
example: 062029Account expiry in the MMYYYY format. Only necessary if accounType is PAN and when it is sent, it is inside the encryptedData.
encryptedDatastringoptional
example: encrypted_dataA field containing the encrypted JSON object with account and accountExpiry fields inside. In this case the value of the account field will be the PAN. Only to be sent in the request when accountType is PAN.
Request body
{ "accountInfo": { "account": "95645644466699990", "accountType": "CARDID", "accountExpiry": "062029", "encryptedData": "encrypted_data" } }
Responses
200OKoptional
accountInfoobjectoptional
accountTypestringoptional
example: CARDIDAccount reference type. One of CARDID | PANID | PANREF.
accountstringoptional
example: 940300994437660Account reference value
accountStatestringoptional
example: ACTIVEState of the account
idvMethodsobjectoptional
idvMethodarrayoptional
idvChannelstringoptionalexample: SMS
idvContactInfostringoptionalexample: +48551534591
additionalParametersarrayoptional
namestringoptionalexample: CardholderFName
valuestringoptionalexample: John
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "accountInfo": { "accountType": "CARDID", "account": "940300994437660" }, "accountState": "ACTIVE", "idvMethods": { "idvMethod": [ { "idvChannel": "SMS", "idvContactInfo": "+4529482200" }, { "idvChannel": "EMAIL", "idvContactInfo": "mark@domain.com" } ] }, "additionalParameters": [ { "name": "CardholderFName", "value": "John" } ] }
Get account details from Issuer's backend based on account reference
GET /accounts/{accountRef}Get account details from Issuer's backend based on account reference
Parameters
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
accountRefstringrequired
Account reference value
Get account details from Issuer's backend based on account reference
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/940300994437660"); var request = new RestRequest(Method.GET); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); IRestResponse response = client.Execute(request);
Responses
200OKoptional
accountInfoobjectoptional
accountstringoptional
example: 95645644466699990Plain text value of account reference, if accountType is one of: CARDID, PANID, PANREF. Otherwise, the account parameter is sent inside the encryptedData.
accountTypestringoptional
example: CARDIDOne of PAN, CARDID, PANID, PANREF.
accountExpirystringoptional
example: 062029Account expiry in the MMYYYY format. Only necessary if accounType is PAN and when it is sent, it is inside the encryptedData.
encryptedDatastringoptional
example: encrypted_dataA field containing the encrypted JSON object with account and accountExpiry fields inside. In this case the value of the account field will be the PAN. Only to be sent in the request when accountType is PAN.
accountStatestringoptional
idvMethodsobjectoptional
idvMethodarrayoptional
idvChannelstringoptionalexample: SMS
idvContactInfostringoptionalexample: +48551534591
additionalParametersarrayoptional
namestringoptionalexample: CardholderFName
valuestringoptionalexample: John
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "accountInfo": { "account": "95645644466699990", "accountType": "CARDID", "accountExpiry": "062029", "encryptedData": "encrypted_data" }, "accountState": "string", "idvMethods": { "idvMethod": [ { "idvChannel": "SMS", "idvContactInfo": "+4529482200" }, { "idvChannel": "EMAIL", "idvContactInfo": "mark@domain.com" } ] }, "additionalParameters": [ { "name": "CardholderFName", "value": "John" } ] }
Get account reference from Issuer's backend based on account PAN
POST /accounts/accountrefGet account reference from Issuer's backend based on account PAN
Parameters
X-Issuer-IDstringrequired
X-Request-IDstringrequired
X-Provider-IDstringrequired
Get account reference from Issuer's backend based on account PAN
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/accountref"); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
accountstringoptional
example: 95645644466699990Plain text value of account reference, if accountType is one of: CARDID, PANID, PANREF. Otherwise, the account parameter is sent inside the encryptedData.
accountTypestringoptional
example: CARDIDOne of PAN, CARDID, PANID, PANREF.
accountExpirystringoptional
example: 062029Account expiry in the MMYYYY format. Only necessary if accounType is PAN and when it is sent, it is inside the encryptedData.
encryptedDatastringoptional
example: encrypted_dataA field containing the encrypted JSON object with account and accountExpiry fields inside. In this case the value of the account field will be the PAN. Only to be sent in the request when accountType is PAN.
Request body
{ "account": "95645644466699990", "accountType": "CARDID", "accountExpiry": "062029", "encryptedData": "encrypted_data" }
Responses
200OKoptional
accountTypestringoptional
example: CARDIDAccount reference type. One of CARDID | PANID | PANREF.
accountstringoptional
example: 940300994437660Account reference value
401Unauthorizedoptional
403Forbiddenoptional
404Not Foundoptional
200
{ "accountType": "CARDID", "account": "940300994437660" }
Issuer Controller V1
Issuer LCM controller endpoints for token and card data operations
Resolve account info and token info from token reference
GET /accounts/tokenreference/{tokenReferenceID}Resolve account info and token info from token reference
Parameters
tokenReferenceIDstringrequired
Resolve account info and token info from token reference
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/tokenreference/{tokenReferenceID}"); var request = new RestRequest(Method.GET); IRestResponse response = client.Execute(request);
Responses
200OKoptional
accountInfoobjectoptional
accountIdstringoptional
accountstringoptional
accountTypestringoptional
CARDID,PANID,PANREF,NULL
tokenInfoobjectoptional
tokenRequestorIDstringoptional
virtualAccountobjectoptional
virtualAccountIDstringoptional
400Bad Requestoptional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
404Not Foundoptional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
406Not Acceptableoptional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
500Internal Server Erroroptional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
- 200
- 400
- 404
- 406
- 500
{ "accountInfo": { "accountId": "string", "account": "string", "accountType": "CARDID" }, "tokenInfo": { "tokenRequestorID": "string" }, "virtualAccount": { "virtualAccountID": "string" } }
Retrieve card data encrypted for the caller based on account identifier
POST /accounts/card-dataReturns sensitive card data encrypted using a hybrid encryption scheme.
Encryption process
- LCM validates caller's public key (X.509 format, RSAPublicKey type check, exact 2048-bit enforcement)
- LCM generates a fresh random symmetric content-encryption key (e.g., AES-256) for this response.
- LCM encrypts the sensitive payload using an AEAD algorithm (e.g., AES-GCM), producing an encrypted blob (ciphertext).
- LCM encrypts the CEK using the caller's public key (e.g., RSA-OAEP with SHA-256 + MGF1-SHA-256).
- The API returns:
encryptedData: the encrypted payload blob - Base64( [12-byte nonce] [ciphertext + 128-bit GCM auth tag] )encryptedSymmetricKey: the CEK encrypted with the provided public key (Base64)
Client responsibility
- Decrypt
encryptedSymmetricKeywith the corresponding private key to recover the CEK. - Use the CEK to decrypt
encryptedDataand verify integrity (AEAD tag).
This operation is read-only and does not change server state.
Parameters
X-Issuer-IDstringrequired
Issuer identifier assigned by LCM.
X-Request-IDstring (uuid)required
Correlation identifier for end-to-end request tracing.
X-Provider-IDstringrequired
Identifier of the upstream provider / CMS integration.
Retrieve card data encrypted for the caller based on account identifier
- C#
- PHP
- Node
- Shell
var client = new RestClient("https://api-gateway2.nets.eu/lcm/v1/accounts/card-data"); var request = new RestRequest(Method.POST); request.AddHeader("content-type", "application/json"); request.AddHeader("X-Issuer-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Request-ID", "SOME_STRING_VALUE"); request.AddHeader("X-Provider-ID", "SOME_STRING_VALUE"); request.AddParameter("application/json", "{\"REPLACE_REQUEST_BODY\":\"REPLACE_REQUEST_BODY\"}", ParameterType.RequestBody); IRestResponse response = client.Execute(request);
Request body
cardDataobjectrequired
accountstringrequired
example: 4111xxxxxxxx1111Account reference value (format depends on
accountType).accountTypestringrequired
example: CARDIDType of account reference provided in
account. Only CARDID is supported at the moment.PAN,CARDID,PANID,PANREF
publicKeystring (byte)required
example: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4f5wg5l2hKsTeNem/V41fGnJm6gOdrj8ym3rFkEU/wT8RDtn4ubWK7wBZNw6ldt+OzV6uYPN2FDZeXKNZKWpXsvCHu8aHhxrEE2dFvN8E5Z79VJAM5lFaELaMXnI/v0JV4j6LW5aeL2vNkFj6wOPCOu1V/P7HNwXkf2Z/WrCRXhKt6yMEQWP2dJNWZHvx4jh7i+j5SvXcXL6H4S/FjV1P5d+yB+PHhBLb8c/DlkjNNlU/tGlxVLOQrEuF0fUCXvccMDN/AZ0HxJTb7cDhcBAJhZDo8uQhJlPVAZ7M4ZYI8gakJb3eO75KL2ypn0YL1Bw3CiMZB7v2yJaExZNDTWkYB+I0HH3BEL1MQIDAQABBase64-encoded caller public key used to encrypt the symmetric CEK for this response.Recommended encoding: X.509 format, RSAPublicKey, 2048-bit
Request body
{ "cardData": { "account": "4111xxxxxxxx1111", "accountType": "CARDID" }, "publicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4f5wg5l2hKsTeNem/V41fGnJm6gOdrj8ym3rFkEU/wT8RDtn4ubWK7wBZNw6ldt+OzV6uYPN2FDZeXKNZKWpXsvCHu8aHhxrEE2dFvN8E5Z79VJAM5lFaELaMXnI/v0JV4j6LW5aeL2vNkFj6wOPCOu1V/P7HNwXkf2Z/WrCRXhKt6yMEQWP2dJNWZHvx4jh7i+j5SvXcXL6H4S/FjV1P5d+yB+PHhBLb8c/DlkjNNlU/tGlxVLOQrEuF0fUCXvccMDN/AZ0HxJTb7cDhcBAJhZDo8uQhJlPVAZ7M4ZYI8gakJb3eO75KL2ypn0YL1Bw3CiMZB7v2yJaExZNDTWkYB+I0HH3BEL1MQIDAQAB" }
Responses
200Encrypted card data successfully returned.optional
encryptedDatastring (byte)required
example: VGhpcy1pcy1qdXN0LWFuLWV4YW1wbGU=Base64-encoded nonce + encrypted payload (ciphertext) produced using a freshly generated symmetric CEK.The decrypted payload structure is documented separately and is not returned in plaintext.
encryptedSymmetricKeystring (byte)required
example: c2FtcGxlLWVuY3J5cHRlZC1rZXk=Base64-encoded symmetric CEK encrypted with the caller's public key.The client decrypts this value using its private key to recover the CEK required to decrypt
encryptedData.
400Invalid request (e.g., missing/invalid fields).optional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
401Missing or invalid access token.optional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
403optional
Authenticated but not permitted (insufficient scope/entitlement).errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
404Account reference not found.optional
errorCodestringrequired
example: LCM-1011Stable, machine-readable error identifier.
messagestringrequired
example: Invalid Account IDHuman-readable error message.
- Normal encrypted response
- Decrypted example (documentation only - NOT returned by API)
- 400
- 401
- 403
- 404
{ "encryptedData": "VGhpcy1pcy1qdXN0LWFuLWV4YW1wbGU=", "encryptedSymmetricKey": "c2FtcGxlLWVuY3J5cHRlZC1rZXk=" }