Language v1.4

HPP API Reference

The NCR Voyix Hosted Payment Page (HPP) API is a server-driven REST API for creating and finalizing eCommerce payment sessions. Your server creates sessions, your frontend embeds the hosted payment form in an iframe, and your server finalizes the transaction.

The API accepts both application/json and text/xml bodies, uses RSA-SHA256 request signing for authentication, and returns JSON or XML responses with standard HTTP status codes.

⚠️
All API calls are server-side onlyEvery call requires RSA-SHA256 signing with your private key. Never call these endpoints from browser JavaScript — your private key and merchant credentials must stay server-side at all times.

Base URL

All endpoints share a single base URL with a configurable datacenter and environment. All code examples on this page update automatically when you change the values below.

Base URL Builder
https://seps1-rls.paymentslab.ncrvoyix.com/WebEPS

Sample URL: https://seps{datacenter}-{environment}.paymentslab.ncrvoyix.com/WebEPS. Your NCR integration team will confirm your datacenter and environment during onboarding.

API versioning

All endpoints are prefixed with the API version segment. The current production version is v1.4. The URL pattern is: {baseURL}/v1.4/{Service}/{Endpoint}

Content types

All endpoints accept application/json (preferred) or text/xml. The Content-Type you set must exactly match the format of the body you sign — changing the body after signing will invalidate the signature.

Active URL rls
https://seps1-rls.paymentslab.ncrvoyix.com/WebEPS

Postman end-to-end sandbox

Validate the complete purchase flow without writing app code. Use this Postman-first path to verify configuration, RSA signing, and API responses before frontend integration.

Complete these setup items before using the collection:

  1. Generate RSA keys first and secure private key material. Follow RSA key generation (clean setup) below.
  2. Prepare Postman environment with privateEncryptedKeyPEM and password to validate signatures before app integration.
  3. Confirm NCR onboarding values: X-CompanyNumber, X-StoreNumber, and allowed origins for ReturnURL / FrameHostingURL.
  4. Set server environment variables and keep private key usage server-side only.

The zip contains the Postman collection and the sandbox environment file. Import both into Postman to get started immediately.


RSA key generation (clean setup)

Use the Dev Portal RSA Key Generation Studio output as your single source for Postman and backend signing inputs.

⬇ Download RSA Key Generator (.zip)

  1. Open RsaKeyGenerationStudio.exe from the Dev Portal package.
  2. Enter a key prefix (for example: KC250630-STORE190).
  3. Use key size 2048 or 4096 (recommended default: 2048).
  4. Set a key secret so the private PEM is exported as encrypted PKCS#8.
  5. Generate and verify: {Prefix}.Private.pem, {Prefix}.Public.pem, {Prefix}.Private.xml, {Prefix}.Public.xml.

Where each key file is used

FileUsed byPurpose
{Prefix}.Private.pemPostman (privateEncryptedKeyPEM)RSA signing for InitializeSession / CompleteSession scripts
{Prefix}.Public.pemPostman optional verificationSignature verification during troubleshooting
{Prefix}.Public.xmlMobile registration bodyClientPublicKey for RegisterMobileDevice
{Prefix}.Private.xmlLegacy tools onlyNot required in standard HPP browser iframe flow
⚠️
Security baseline Never commit private keys, PEM passwords, or full Postman environments with secrets to source control. Keep key material in secure secret stores and rotate periodically.

Recommended collection flow

  1. Import NCR Postman WebEPS API collection and matching environment.
  2. Set environment values: baseURL, API Version, Company Number, Store Number, Client Application Name.
  3. Set key material: privateEncryptedKeyPEM and password.
  4. Run InitializeSession — the pre-request script auto-injects RequestExpirationUTC and X-Signature.
  5. Open the returned RequestURL in a browser and complete a test payment.
  6. Run CompleteSession using the saved CompleteSession collection variable.
💡
Interactive API Explorer

Prefer a visual Swagger-style explorer? Try all endpoints directly from the browser.

Open Swagger UI →

Authentication

HPP API authentication is stateless and per-request. Every request is authenticated by two components:

  • Merchant identity headers — X-CompanyNumber and X-StoreNumber identify your merchant account.
  • RSA-SHA256 request signature — X-Signature proves the request body was sent by the holder of your registered RSA private key and has not been tampered with.

There are no API keys, Bearer tokens, or session cookies. Every request must carry a freshly computed signature. The RequestExpirationUTC field in every request body acts as a replay-attack guard.

Required headers

All three endpoints share the same required headers. X-Client-Application-Name is additionally required on InitializeSession.

Content-Typestringrequired
application/json or text/xml. Must match the exact format you signed. Mismatches cause a 400.
X-CompanyNumberstringrequired
Your NCR Voyix merchant company number, provisioned during onboarding.
X-StoreNumberstringrequired
Your NCR Voyix store number, provisioned during onboarding.
X-ReferenceIdstringrequired
Unique 32-character hex correlation ID. Generate a fresh value for every request: crypto.randomUUID().replace(/-/g, '').toUpperCase(). Used for tracing and support.
X-Client-Application-NamestringInitializeSession only
Identifier for your integration (e.g. "MyCheckoutApp"). Used by NCR for telemetry and support routing.
X-Client-Application-Versionstringoptional
Version string for your client application (e.g. "2.1.0").
X-Signaturestringrequired
RSA-SHA256 digital signature of the complete request body bytes, uppercase hex-encoded. Generated server-side using your RSA private key. See RSA signing for exact algorithm.
AUTH Required on every request
Example request headers
HTTP Headers
POST /v1.4/PaymentTransactionManagement/InitializeSession
Content-Type: application/json
X-CompanyNumber: YOUR_COMPANY_NUMBER
X-StoreNumber: YOUR_STORE_NUMBER
X-ReferenceId: A1B2C3D4E5F6789012345678901234AB
X-Client-Application-Name: MyEcommerceApp
X-Client-Application-Version: 1.0.0
X-Signature: 3A9F12C8D4...
Generating X-ReferenceId
Node.js
// Fresh unique ID per request
const refId = crypto
  .randomUUID()
  .replace(/-/g, '')
  .toUpperCase();
// → "A1B2C3D4E5F6789012345678901234AB"

RegisterServer

POST /v1.4/EndpointAdministration/RegisterServer Server-side only

Registers your server's RSA public key with NCR Voyix. This establishes the trust relationship that allows WebEPS to verify the RSA-SHA256 signatures on all subsequent API calls. You must call this endpoint before any payment operations can succeed.

The key is tied to your X-CompanyNumber and X-StoreNumber and remains valid for the number of days specified in KeyDurationInDays. Re-register before the key expires to avoid service interruption.

⚠️
One-time setup per key rotation — Call this endpoint once when onboarding and again whenever you rotate your RSA key pair. All subsequent API calls must be signed with the matching private key.
Request body
ClientPublicKeyStringrequired
The public key generated by the client.
ClientPublicKeyFormatStringrequired
The format of the public key being sent by the client. The server reply will be in the same format. See KeyFormat for definitions.
KeyDurationInDaysNullable<Int32>optional
The number of days the key will be valid. Cannot be more than 90 days. Default value: 90.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
Response fields Key registered
ServerPublicKeyStringrequired
The public key generated by the server.
ServerPublicKeyFormatStringrequired
The format of the public key being sent by the server. The server reply will be in the same format requested by the client. See KeyFormat for definitions.
KeyExpirationUTCNullable<DateTime>optional
Timestamp for key expiration in UTC.
POST /v1.4/EndpointAdministration/RegisterServer
Request
cURL
curl -X POST "https://seps1-rls.paymentslab.ncrvoyix.com/WebEPS/v1.4/EndpointAdministration/RegisterServer" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: 3F9B1A..." \
  -d '{
    "ClientPublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjAN...\n-----END PUBLIC KEY-----",
    "ClientPublicKeyFormat": "PEM",
    "KeyDurationInDays": 90,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z"
  }'
Response 200
JSON
{
            "ServerPublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjAN...\n-----END PUBLIC KEY-----",
            "ServerPublicKeyFormat": "PEM",
            "KeyExpirationUTC": "2026-10-13T12:00:00.000Z"
}
Request
register.js
async function registerServer(publicKeyPem) {
  const body = {
    ClientPublicKey: publicKeyPem,
    ClientPublicKeyFormat: 'PEM',
    KeyDurationInDays: 90,
    RequestExpirationUTC: new Date(Date.now() + 5 * 60000).toISOString()
  };
  const signature = signBody(body); // RSA-SHA256 hex, upper-case
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EndpointAdministration/RegisterServer`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CompanyNumber': process.env.COMPANY,
        'X-StoreNumber':   process.env.STORE,
        'X-ReferenceId':   crypto.randomUUID().replace(/-/g,'').toUpperCase(),
        'X-Signature':     signature
      },
      body: JSON.stringify(body)
    }
  );
  return res.json();
}
// Response: { ServerPublicKey, ServerPublicKeyFormat, KeyExpirationUTC }
Request
register.py
import requests, os, uuid
from datetime import datetime, timezone, timedelta
from sign import sign_body  # your RSA-SHA256 helper

def register_server(public_key_pem: str) -> dict:
    body = {
        "ClientPublicKey": public_key_pem,
        "ClientPublicKeyFormat": "PEM",
        "KeyDurationInDays": 90,
        "RequestExpirationUTC": (
            datetime.now(timezone.utc) + timedelta(minutes=5)
        ).strftime("%Y-%m-%dT%H:%M:%S.000Z")
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EndpointAdministration/RegisterServer",
        headers={
            "Content-Type": "application/json",
            "X-CompanyNumber": os.environ["COMPANY"],
            "X-StoreNumber":   os.environ["STORE"],
            "X-ReferenceId":   uuid.uuid4().hex.upper(),
            "X-Signature":     sign_body(body)
        },
        json=body
    )
    r.raise_for_status()
    return r.json()
# Response: {"ServerPublicKey": "...", "ServerPublicKeyFormat": "PEM", "KeyExpirationUTC": "..."}
Request
RegisterServer.cs
public async Task<string> RegisterServerAsync(string publicKeyPem)
{
  var body = new {
        ClientPublicKey = publicKeyPem,
        ClientPublicKeyFormat = "PEM",
        KeyDurationInDays = 90,
        RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5)
            .ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
    };
    var json    = JsonSerializer.Serialize(body);
    var sig     = SignBody(json); // RSA-SHA256 hex upper-case
    var request = new HttpRequestMessage(
        HttpMethod.Post,
        $"{Env("HPP_BASE")}/v1.4/EndpointAdministration/RegisterServer");
    request.Content = new StringContent(json, Encoding.UTF8, "application/json");
    request.Headers.Add("X-CompanyNumber", Env("COMPANY"));
    request.Headers.Add("X-StoreNumber",   Env("STORE"));
    request.Headers.Add("X-ReferenceId",   Guid.NewGuid().ToString("N").ToUpper());
    request.Headers.Add("X-Signature",     sig);
    var response = await _http.SendAsync(request);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}
// Response: { ServerPublicKey, ServerPublicKeyFormat, KeyExpirationUTC }
Request
RegisterServer.java
public String registerServer(String publicKeyPem) throws Exception {
    String expiry = Instant.now().plusSeconds(300).toString();
    String json = String.format(
      "{\"ClientPublicKey\":\"%s\"," +
        "\"ClientPublicKeyFormat\":\"PEM\"," +
        "\"KeyDurationInDays\":90," +
        "\"RequestExpirationUTC\":\"%s\"}",
        publicKeyPem.replace("\n", "\\n"), expiry);
    String sig = signBody(json);
    HttpRequest req = HttpRequest.newBuilder()
        .uri(URI.create(HPP_BASE + "/v1.4/EndpointAdministration/RegisterServer"))
        .header("Content-Type",    "application/json")
        .header("X-CompanyNumber", COMPANY)
        .header("X-StoreNumber",   STORE)
        .header("X-ReferenceId",   UUID.randomUUID().toString().replace("-","").toUpperCase())
        .header("X-Signature",     sig)
        .POST(HttpRequest.BodyPublishers.ofString(json))
        .build();
    return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
}
// Response: {"ServerPublicKey":"...","ServerPublicKeyFormat":"PEM","KeyExpirationUTC":"..."}

InitializeSession

POST /v1.4/PaymentTransactionManagement/InitializeSession Server-side only

Creates a new HPP payment session. Returns a SessionId and a RequestURL. Set RequestURL as the src of your payment <iframe>. Store SessionId server-side — it is required for CompleteSession.

This endpoint must be called from your server. Sign the request body with your RSA private key and pass only sessionId and requestURL back to the browser.

Request headers (additional to common headers)
X-Client-Application-Namestringrequired
Identifier for your client integration (e.g. "MyEcommerceApp"). Required only on this endpoint.
X-Client-Application-Versionstringoptional
Your application version string (e.g. "2.1.0").
Request body
RequestExpirationUTCDateTime (ISO 8601)required
A UTC timestamp after which the message will be considered invalid and rejected. Prevents replay attacks. Format: 2026-07-10T12:05:00.000Z.
Amountdecimal | nullconditional
The amount to authorize. Required when AuthorizationMode is specified.
ReturnURLstringconditional
The URL to receive the response redirect at the end of the session flow. Required when using non-external sessions. NCR appends ?statusCode=NNN on redirect.
ReturnMethodstringoptional
The type of return method to use at the end of the session flow. Default: "Redirect". See CardEnrollmentReturnMethod for all values.
AuthorizationModestringoptional
Defines the type of authorization to perform at the end of the session. If not supplied, a validation only is performed.
"Preauthorization""Purchase"
FrameHostingURLstringoptional
For iframe integrations, specify the primary URL hosting the NCR SecurePay UI. Default behaviour is to use the URL specified in ReturnURL.
AdditionalFrameHostingURLsstring[]optional
For iframe integrations, a list of additional URLs that will be hosting the NCR SecurePay UI.
TokenRetrievalRequiredbooleanoptional
Whether token retrieval is required for this session. Default: true.
AccountAddressCollectionModestringconditional
What parts of the account address should be collected. Must use "Full" for 3-D Secure sessions. Default: "Full".
"None""PostalCodeOnly""Full"
ValidateAccountSecurityCodebooleanoptional
Whether the session flow should collect and validate the account security code (CVV/CVC). Default: false.
ValidateAccountAddressbooleanoptional
Whether the session flow should collect and validate account address details (AVS). Default: false.
AllowCardNamingbooleanoptional
If true, the SecurePay UI presents the user with a dialog for naming their card for wallet storage. Default: false.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for all values.
CardTypeCardTypeoptional
The card type retrieved by the SecurePay UI. Intended for edit scenarios when a token was already received.
TimeoutInMinutesinteger | nulloptional
How long the session should remain open. Must be between 0 and 60 minutes. Default: 15.
CredentialOnFilestringoptional
Specify if the client intends to save the card data or token for use in future payments.
"Initial""Subsequent"
FeeAmountdecimal | nulloptional
The fee amount to display to the customer.
FeeTypestringconditional
Required when using an NPP host. Defines the type of fee being applied.
"Convenience""Surcharge""Service"
StoreNumberinteger | nulloptional
The NCR-issued store number to use when processing transactions for this session. Required when a tenant has multiple eCommerce stores defined and X-StoreNumber header is not sent.
UniqueIdstringoptional
Pass-through external unique ID for the session being created.
CustomerAccountCustomerAccountoptional
Customer details which will pre-populate the SecurePay UI if supplied.
CustomerDefaultAddressCustomerAddressoptional
A default address the customer can select from the SecurePay UI instead of entering a new billing address. Ignored if a shipping address is also specified.
CustomerShippingAddressCustomerAddressoptional
A shipping address the customer can select from the SecurePay UI instead of entering a new billing address.
UseDefaultAddressForBillingbooleanoptional
Whether to use the default address as the billing address. Default: false.
UseShippingAddressForBillingbooleanoptional
Whether to use the shipping address as the billing address. Default: false.
CardProcIdstringoptional
The card processing ID.
DisplayMessagestringoptional
If specified, a message box will be displayed when the SecurePay UI is opened. Intended for edit scenarios when the UI needs to be re-opened.
Edit scenario fields (token already on file)
AccountNicknamestringoptional
The nickname for the stored account if previously specified by the customer. Intended for edit scenarios when a token was already received.
AccountNumberFirstSixstringoptional
The first six digits of the account number retrieved by the SecurePay UI. Intended for edit scenarios.
AccountNumberLastFourstringoptional
The last four digits of the account number retrieved by the SecurePay UI. Intended for edit scenarios.
AccountNumberLengthbyte | nulloptional
The total number of digits in the account number retrieved by the SecurePay UI. Intended for edit scenarios.
AccountNumberReadOnlybooleanoptional
Controls whether the account number field is disabled on the SecurePay UI. Intended for edit scenarios. Default: false.
ExpirationDatestringoptional
The month and year of card expiration in MMYY or MMYYYY format. Intended for edit scenarios when a token was already received.
TokensToken[]optional
Any tokens retrieved by the SecurePay UI. Intended for edit scenarios when a token was already received.
Response fields Session created
SessionIdstring
Unique session identifier. Store server-side — required for CompleteSession. Never expose to browser JavaScript.
RequestURLstring
The HPP iframe URL. Set this as the src of your payment <iframe> element in the browser.
POST /v1.4/PaymentTransactionManagement/InitializeSession
Request
cURL
curl -X POST "https://seps1-rls.paymentslab.ncrvoyix.com/WebEPS/v1.4/PaymentTransactionManagement/InitializeSession" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Client-Application-Name: MyApp" \
  -H "X-Signature: 3A9F12C8D4..." \
  -d '{
    "Amount": 59.99,
    "ReturnMethod": "Redirect",
    "ReturnURL": "https://example.com/pay/return",
    "FrameHostingURL": "https://example.com",
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "PaymentMethodType": ["CreditCard","GooglePay"],
    "GooglePayMerchantId": "YOUR_GPAY_MERCHANT_ID",
    "GooglePayMerchantName": "Your Store",
    "TokenRetrievalRequired": true,
    "AccountAddressCollectionMode": "Full",
    "ValidateAccountSecurityCode": true,
    "ValidateAccountAddress": true
  }'
Response 200
JSON
{
  "SessionId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
  "RequestURL": "https://hpp.ncrvoyix.com/WebEPS/HPP?session=45016f4cce57e5ab4e308a1822b9b9fc3336"
}
Request
initialize.js
const crypto = require('crypto');
const fs     = require('fs');

const key = fs.readFileSync('./private.pem', 'utf8');

async function initializeSession(cart) {
  const payload = {
    Amount: cart.total,
    ReturnMethod: 'Redirect',
    ReturnURL: `${process.env.APP_URL}/pay/return`,
    FrameHostingURL: process.env.APP_URL,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    PaymentMethodType: ['CreditCard', 'GooglePay'],
    GooglePayMerchantId: process.env.GPAY_MERCHANT_ID,
    GooglePayMerchantName: process.env.GPAY_MERCHANT_NAME,
    TokenRetrievalRequired: true,
    AccountAddressCollectionMode: 'Full',
    ValidateAccountSecurityCode: true,
    ValidateAccountAddress: true
  };

  const body = JSON.stringify(payload);
  const sign = crypto.createSign('RSA-SHA256');
  sign.update(body, 'utf8');
  const xSig = sign.sign(
    { key, passphrase: process.env.KEY_PASS }, 'hex'
  ).toUpperCase();

  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentTransactionManagement/InitializeSession`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CompanyNumber': process.env.COMPANY,
        'X-StoreNumber':   process.env.STORE,
        'X-ReferenceId':   crypto.randomUUID().replace(/-/g,'').toUpperCase(),
        'X-Client-Application-Name': 'MyApp',
        'X-Signature': xSig
      },
      body
    }
  );
  return res.json(); // { SessionId, RequestURL }
}
Response 200
JSON
{
  "SessionId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
  "RequestURL": "https://hpp.ncrvoyix.com/WebEPS/HPP?session=45016f4cce57e5ab4e308a1822b9b9fc3336"
}
Request
initialize.py
import json, os, uuid, requests
from datetime import datetime, timedelta, timezone
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

with open("private.pem","rb") as f:
    pkey = serialization.load_pem_private_key(
        f.read(), password=os.environ["KEY_PASS"].encode())

def initialize_session(amount: float) -> dict:
    payload = {
        "Amount": amount,
        "ReturnMethod": "Redirect",
        "ReturnURL": f"{os.environ['APP_URL']}/pay/return",
        "FrameHostingURL": os.environ["APP_URL"],
        "RequestExpirationUTC": (
            datetime.now(timezone.utc) + timedelta(minutes=5)
        ).strftime('%Y-%m-%dT%H:%M:%S.000Z'),
        "PaymentMethodType": ["CreditCard", "GooglePay"],
        "GooglePayMerchantId": os.environ["GPAY_MERCHANT_ID"],
        "GooglePayMerchantName": os.environ["GPAY_MERCHANT_NAME"],
        "TokenRetrievalRequired": True,
        "AccountAddressCollectionMode": "Full",
        "ValidateAccountSecurityCode": True,
        "ValidateAccountAddress": True
    }
    body = json.dumps(payload, separators=(',', ':'))
    sig  = pkey.sign(body.encode(), padding.PKCS1v15(), hashes.SHA256())
    x_sig = sig.hex().upper()

    resp = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentTransactionManagement/InitializeSession",
        headers={
            "Content-Type": "application/json",
            "X-CompanyNumber": os.environ["COMPANY"],
            "X-StoreNumber":   os.environ["STORE"],
            "X-ReferenceId":   uuid.uuid4().hex.upper(),
            "X-Client-Application-Name": "MyApp",
            "X-Signature": x_sig
        },
        data=body, timeout=30
    )
    return resp.json()
Response 200
JSON
{
  "SessionId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
  "RequestURL": "https://hpp.ncrvoyix.com/WebEPS/HPP?session=45016f4cce57e5ab4e308a1822b9b9fc3336"
}
Request
HppService.cs
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

public async Task<(string SessionId, string RequestURL)> InitializeSessionAsync(decimal amount)
{
    using var rsa = RSA.Create();
    rsa.ImportFromEncryptedPem(File.ReadAllText("private.pem"),
        Environment.GetEnvironmentVariable("KEY_PASS"));

    var payload = new {
        Amount = amount,
        ReturnMethod = "Redirect",
        ReturnURL = $"{Env("APP_URL")}/pay/return",
        FrameHostingURL = Env("APP_URL"),
        RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5)
            .ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
        PaymentMethodType = new[] { "CreditCard", "GooglePay" },
        GooglePayMerchantId   = Env("GPAY_MERCHANT_ID"),
        GooglePayMerchantName = Env("GPAY_MERCHANT_NAME"),
        TokenRetrievalRequired = true,
        AccountAddressCollectionMode = "Full",
        ValidateAccountSecurityCode = true,
        ValidateAccountAddress = true
    };

    var body   = JsonSerializer.Serialize(payload);
    var sigBytes = rsa.SignData(Encoding.UTF8.GetBytes(body),
                      HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    var xSig   = Convert.ToHexString(sigBytes); // uppercase

    using var client = new HttpClient();
    using var req = new HttpRequestMessage(HttpMethod.Post,
        $"{Env("HPP_BASE")}/v1.4/PaymentTransactionManagement/InitializeSession");
    req.Headers.TryAddWithoutValidation("X-CompanyNumber", Env("COMPANY"));
    req.Headers.TryAddWithoutValidation("X-StoreNumber",   Env("STORE"));
    req.Headers.TryAddWithoutValidation("X-ReferenceId",   Guid.NewGuid().ToString("N").ToUpper());
    req.Headers.TryAddWithoutValidation("X-Client-Application-Name", "MyApp");
    req.Headers.TryAddWithoutValidation("X-Signature", xSig);
    req.Content = new StringContent(body, Encoding.UTF8, "application/json");

    var res  = await client.SendAsync(req);
    var data = await res.Content.ReadFromJsonAsync<InitResponse>();
    return (data!.SessionId, data.RequestURL);
}
Response 200
JSON
{
  "SessionId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
  "RequestURL": "https://hpp.ncrvoyix.com/WebEPS/HPP?session=45016f4cce57e5ab4e308a1822b9b9fc3336"
}
Request
HppService.java
PrivateKey key = /* load PKCS#8 DER key */;

String expiry = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(5)
    .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));

String body = """
{
  "Amount": 59.99,
  "ReturnMethod": "Redirect",
  "ReturnURL": "https://example.com/pay/return",
  "FrameHostingURL": "https://example.com",
  "RequestExpirationUTC": "%s",
  "PaymentMethodType": ["CreditCard","GooglePay"],
  "GooglePayMerchantId": "GPAY_MERCHANT_ID",
  "GooglePayMerchantName": "Your Store",
  "TokenRetrievalRequired": true,
  "AccountAddressCollectionMode": "Full",
  "ValidateAccountSecurityCode": true,
  "ValidateAccountAddress": true
}""".formatted(expiry);

Signature signer = Signature.getInstance("SHA256withRSA");
signer.initSign(key);
signer.update(body.getBytes(StandardCharsets.UTF_8));
String xSig = HexFormat.of().formatHex(signer.sign()).toUpperCase();

HttpResponse<String> res = HttpClient.newHttpClient().send(
    HttpRequest.newBuilder()
        .uri(URI.create(HPP_BASE + "/v1.4/PaymentTransactionManagement/InitializeSession"))
        .header("Content-Type", "application/json")
        .header("X-CompanyNumber", COMPANY)
        .header("X-StoreNumber",   STORE)
        .header("X-ReferenceId",   UUID.randomUUID().toString().replace("-","").toUpperCase())
        .header("X-Client-Application-Name", "MyApp")
        .header("X-Signature", xSig)
        .POST(HttpRequest.BodyPublishers.ofString(body))
        .build(),
    HttpResponse.BodyHandlers.ofString()
);
Response 200
JSON
{
  "SessionId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
  "RequestURL": "https://hpp.ncrvoyix.com/WebEPS/HPP?session=45016f4cce57e5ab4e308a1822b9b9fc3336"
}

CompleteSession

POST /v1.4/PaymentTransactionManagement/CompleteSession Server-side only

Finalizes a payment session and captures the authorised funds. Call this from your server only after receiving a PAYMENT_RETURN postMessage with statusCode === 100. Must be called exactly once per session.

⚠️
Guard against double-invocation (React StrictMode)React StrictMode double-invokes effects in development. Use a useRef boolean flag (completingRef.current) to ensure CompleteSession is called at most once. Calling it twice may cause a 409 conflict or duplicate charges.
Request body
SessionIdstringrequired
The session identifier returned by InitializeSession. Identifies which session to finalize. Store this server-side after InitializeSession — never expose it to the browser.
RequestExpirationUTCstring (ISO 8601)required
Request expiry timestamp in UTC. Typically 5 minutes from now. Prevents replay attacks — NCR rejects requests whose timestamp has already passed.
Response fields Transaction finalised
IsApprovedbooleanrequired
Indicates whether the transaction was approved.
ErrorCodeintegerrequired
Error code assigned to the session. See WebEPSResponseCode for definitions.
ErrorMessagestringrequired
Error message assigned to the session. See WebEPSResponseCode for definitions.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by the payment host.
HostTypeinteger | nullrequired
The type of host that generated the response.
AuthorizationCodestring
Transaction authorization code. Present on approved transactions. Store for receipts and dispute resolution.
TokensToken[]
Payment tokens retrieved by the SecurePay UI. Present when TokenRetrievalRequired: true was set in InitializeSession.
CardTypeCardType
The resolved card type for the account number collected by the SecurePay UI.
AccountNumberFirstSixstring
First six digits of the account number collected by the SecurePay UI.
AccountNumberLastFourstring
Last four digits of the account number collected by the SecurePay UI.
AccountNumberLengthbyte | null
Total number of digits in the account number collected by the SecurePay UI.
ExpirationDatestring
Card expiration month and year as collected by the SecurePay UI.
AccountNicknamestring
Nickname for the stored account if specified by the customer.
AccountBillingAddressVerificationResultstring
AVS validation result, if address validation was performed.
AccountSecurityCodeValidationResultstring
CVV/CVC validation result, if security code validation was performed.
AuditIdinteger | null
System Trace Audit Number (STAN).
HostRetrievalNumberstring
Host retrieval number returned by the payment host.
RetrievalReferenceNumberstring
Retrieval reference number returned by the payment host.
PaymentAccountReferencestring
Payment Account Reference (PAR number), if any.
CustomerAccountCustomerAccount
Customer details collected by the SecurePay UI.
CardProcIdstring
The card processing ID.
StoreNumberinteger | null
The NCR-issued store number used to process the session.
UniqueIdstring
Pass-through external unique ID specified when the session was created.
IsDefaultCardboolean
Whether the customer selected to configure their card as the wallet default. Default: false.
UseDefaultAddressForBillingboolean
Whether the default address was used as the billing address. Default: false.
UseShippingAddressForBillingboolean
Whether the shipping address was used as the billing address. Default: false.
HostValuesobject
Host-specific data map with additional host response values.
DebugErrorMessagestring
Debug error message for the session. Typically only available on integration/sandbox environments.
POST /v1.4/PaymentTransactionManagement/CompleteSession
Request
cURL
curl -X POST "https://seps1-rls.paymentslab.ncrvoyix.com/WebEPS/v1.4/PaymentTransactionManagement/CompleteSession" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: B2C3D4E5F6789012345678901234ABCD" \
  -H "X-Signature: 7F2A9B3C1E..." \
  -d '{
    "SessionId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
    "RequestExpirationUTC": "2026-07-10T12:10:00.000Z"
  }'
Response 200
JSON
{
  "TransactionStatus": "Approved",
  "AuthorizationCode": "A12345",
  "ReferenceNumber": "TXN-2026-001234",
  "Token": "tok_xxxxxxxxxxxxxxxxxxxxxxxx",
  "CardType": "Visa",
  "Last4Digits": "4242"
}
Request
complete.js
const crypto = require('crypto');
const fs     = require('fs');

const key = fs.readFileSync('./private.pem', 'utf8');

// completingRef guards against double-call (React StrictMode)
let completing = false;

async function completeSession(sessionId) {
  if (completing) return;
  completing = true;
  try {
    const payload = {
      SessionId: sessionId,
      RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
    };
    const body = JSON.stringify(payload);
    const sign = crypto.createSign('RSA-SHA256');
    sign.update(body, 'utf8');
    const xSig = sign.sign(
      { key, passphrase: process.env.KEY_PASS }, 'hex'
    ).toUpperCase();

    const res = await fetch(
      `${process.env.HPP_BASE}/v1.4/PaymentTransactionManagement/CompleteSession`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'X-CompanyNumber': process.env.COMPANY,
          'X-StoreNumber':   process.env.STORE,
          'X-ReferenceId':   crypto.randomUUID().replace(/-/g,'').toUpperCase(),
          'X-Signature': xSig
        },
        body
      }
    );
    return res.json();
  } finally { completing = false; }
}
Response 200
JSON
{
  "TransactionStatus": "Approved",
  "AuthorizationCode": "A12345",
  "ReferenceNumber": "TXN-2026-001234",
  "Token": "tok_xxxxxxxxxxxxxxxxxxxxxxxx",
  "CardType": "Visa",
  "Last4Digits": "4242"
}
Request
complete.py
def complete_session(session_id: str) -> dict:
    payload = {
        "SessionId": session_id,
        "RequestExpirationUTC": (
            datetime.now(timezone.utc) + timedelta(minutes=5)
        ).strftime('%Y-%m-%dT%H:%M:%S.000Z')
    }
    body = json.dumps(payload, separators=(',', ':'))
    sig  = pkey.sign(body.encode(), padding.PKCS1v15(), hashes.SHA256())
    x_sig = sig.hex().upper()

    resp = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentTransactionManagement/CompleteSession",
        headers={
            "Content-Type": "application/json",
            "X-CompanyNumber": os.environ["COMPANY"],
            "X-StoreNumber":   os.environ["STORE"],
            "X-ReferenceId":   uuid.uuid4().hex.upper(),
            "X-Signature": x_sig
        },
        data=body, timeout=30
    )
    return resp.json()
Response 200
JSON
{
  "TransactionStatus": "Approved",
  "AuthorizationCode": "A12345",
  "ReferenceNumber": "TXN-2026-001234",
  "CardType": "Visa",
  "Last4Digits": "4242"
}
Request
HppService.cs
public async Task<CompleteResponse> CompleteSessionAsync(string sessionId)
{
    using var rsa = RSA.Create();
    rsa.ImportFromEncryptedPem(File.ReadAllText("private.pem"), Env("KEY_PASS"));

    var payload  = new { SessionId = sessionId,
        RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5)
            .ToString("yyyy-MM-ddTHH:mm:ss.fffZ") };
    var body     = JsonSerializer.Serialize(payload);
    var sigBytes = rsa.SignData(Encoding.UTF8.GetBytes(body),
                     HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    var xSig     = Convert.ToHexString(sigBytes);

    using var client = new HttpClient();
    using var req = new HttpRequestMessage(HttpMethod.Post,
        $"{Env("HPP_BASE")}/v1.4/PaymentTransactionManagement/CompleteSession");
    req.Headers.TryAddWithoutValidation("X-CompanyNumber", Env("COMPANY"));
    req.Headers.TryAddWithoutValidation("X-StoreNumber",   Env("STORE"));
    req.Headers.TryAddWithoutValidation("X-ReferenceId",   Guid.NewGuid().ToString("N").ToUpper());
    req.Headers.TryAddWithoutValidation("X-Signature", xSig);
    req.Content = new StringContent(body, Encoding.UTF8, "application/json");

    var res = await client.SendAsync(req);
    return await res.Content.ReadFromJsonAsync<CompleteResponse>()!;
}
Response 200
JSON
{
  "TransactionStatus": "Approved",
  "AuthorizationCode": "A12345",
  "ReferenceNumber": "TXN-2026-001234",
  "CardType": "Visa",
  "Last4Digits": "4242"
}
Request
HppService.java
public String completeSession(String sessionId) throws Exception {
    String expiry = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(5)
        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));

    String body = String.format(
        "{\"SessionId\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
        sessionId, expiry);

    Signature signer = Signature.getInstance("SHA256withRSA");
    signer.initSign(privateKey);
    signer.update(body.getBytes(StandardCharsets.UTF_8));
    String xSig = HexFormat.of().formatHex(signer.sign()).toUpperCase();

    return HttpClient.newHttpClient().send(
        HttpRequest.newBuilder()
            .uri(URI.create(HPP_BASE + "/v1.4/PaymentTransactionManagement/CompleteSession"))
            .header("Content-Type", "application/json")
            .header("X-CompanyNumber", COMPANY)
            .header("X-StoreNumber",   STORE)
            .header("X-ReferenceId",   UUID.randomUUID().toString().replace("-","").toUpperCase())
            .header("X-Signature", xSig)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build(),
        HttpResponse.BodyHandlers.ofString()
    ).body();
}
Response 200
JSON
{
  "TransactionStatus": "Approved",
  "AuthorizationCode": "A12345",
  "ReferenceNumber": "TXN-2026-001234",
  "CardType": "Visa",
  "Last4Digits": "4242"
}

ReverseTransaction

POST /v1.4/ReversalAdministration/ReverseTransaction Server-side only

Reverses (voids) a previously authorised or completed transaction. Use for timeout scenarios where the session expired before CompleteSession was called, or for merchant-initiated voids. Uses the same signed-header model as the other endpoints.

Request body
AccountNumberAccountNumberoptional
Encrypted account number for the account being transacted.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
MICRLineEncryptionInfooptional
Machine-readable characters printed on the bottom of the check.
OriginalReferenceIdstringrequired
The original ReferenceId of the authorization request.
QueueAndRetryNullable<Boolean>optional
Whether the reversal transaction should be queued and retried until successful. All transactions with ReversalType "Timeout" will automatically be queued and retried.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. Prevents replay attacks. Format: 2026-07-10T12:10:00.000Z.
ReversalTypestringrequired
The reason for the reversal of the authorization request.
"timeout""void"
TrackAccountNumberoptional
Encrypted track details read from the card for the account being validated.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fields Transaction reversed
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the Transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostResponseCodestringrequired
Response code returned by host.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
HostValuesDataMapoptional
Host-specific data map.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID. Identifies the network which authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/ReversalAdministration/ReverseTransaction
Request
cURL
curl -X POST "https://seps1-rls.paymentslab.ncrvoyix.com/WebEPS/v1.4/ReversalAdministration/ReverseTransaction" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: C3D4E5F6789012345678901234ABCDEF" \
  -H "X-Signature: 2E8A4F..." \
  -d '{
    "OriginalReferenceId": "45016f4cce57e5ab4e308a1822b9b9fc3336",
    "ReversalType": "timeout",
    "RequestExpirationUTC": "2026-07-10T12:10:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TXN987",
            "HostRetrievalNumber": "123456",
            "RetrievalReferenceNumber": "RRN-2026-001235",
            "CardType": { "Type": "Credit", "Name": "Visa" },
            "MerchantID": "MID-001",
            "MerchantCategoryCode": "5411",
            "NetworkID": "VISA",
            "StoreNumber": 190,
            "AuditId": 42,
            "BusinessTransactionDate": "2026-07-14T12:05:00.000Z",
            "CardProcId": "PROC-001",
            "PaymentAccountReference": null,
            "CreditToDebitConversionType": null,
            "HostValues": {}
          }
Request
reverse.js
async function reverseTransaction(originalRefId, type = 'timeout') {
  const payload = {
    OriginalReferenceId: originalRefId,
    ReversalType: type,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const body = JSON.stringify(payload);
  const sign = crypto.createSign('RSA-SHA256');
  sign.update(body, 'utf8');
  const xSig = sign.sign(
    { key, passphrase: process.env.KEY_PASS }, 'hex'
  ).toUpperCase();

  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/ReversalAdministration/ReverseTransaction`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CompanyNumber': process.env.COMPANY,
        'X-StoreNumber':   process.env.STORE,
        'X-ReferenceId':   crypto.randomUUID().replace(/-/g,'').toUpperCase(),
        'X-Signature': xSig
      },
      body
    }
  );
  return res.json();
}
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TXN987",
            "HostRetrievalNumber": "123456",
            "RetrievalReferenceNumber": "RRN-2026-001235",
            "CardType": { "Type": "Credit", "Name": "Visa" },
            "MerchantID": "MID-001",
            "MerchantCategoryCode": "5411",
            "NetworkID": "VISA",
            "StoreNumber": 190,
            "AuditId": 42,
            "BusinessTransactionDate": "2026-07-14T12:05:00.000Z",
            "CardProcId": "PROC-001",
            "PaymentAccountReference": null,
            "CreditToDebitConversionType": null,
            "HostValues": {}
          }
Request
reverse.py
def reverse_transaction(original_ref_id: str, reversal_type: str = "timeout") -> dict:
    payload = {
        "OriginalReferenceId": original_ref_id,
        "ReversalType": reversal_type,
        "RequestExpirationUTC": (
            datetime.now(timezone.utc) + timedelta(minutes=5)
        ).strftime('%Y-%m-%dT%H:%M:%S.000Z')
    }
    body  = json.dumps(payload, separators=(',', ':'))
    sig   = pkey.sign(body.encode(), padding.PKCS1v15(), hashes.SHA256())
    x_sig = sig.hex().upper()

    return requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/ReversalAdministration/ReverseTransaction",
        headers={
            "Content-Type": "application/json",
            "X-CompanyNumber": os.environ["COMPANY"],
            "X-StoreNumber":   os.environ["STORE"],
            "X-ReferenceId":   uuid.uuid4().hex.upper(),
            "X-Signature": x_sig
        },
        data=body, timeout=30
    ).json()
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TXN987",
            "HostRetrievalNumber": "123456",
            "RetrievalReferenceNumber": "RRN-2026-001235",
            "CardType": { "Type": "Credit", "Name": "Visa" },
            "MerchantID": "MID-001",
            "MerchantCategoryCode": "5411",
            "NetworkID": "VISA",
            "StoreNumber": 190,
            "AuditId": 42,
            "BusinessTransactionDate": "2026-07-14T12:05:00.000Z",
            "CardProcId": "PROC-001",
            "PaymentAccountReference": null,
            "CreditToDebitConversionType": null,
            "HostValues": {}
          }
Request
HppService.cs
public async Task<string> ReverseTransactionAsync(string originalRefId, string type = "timeout")
{
    using var rsa = RSA.Create();
    rsa.ImportFromEncryptedPem(File.ReadAllText("private.pem"), Env("KEY_PASS"));

    var payload = new { OriginalReferenceId = originalRefId, ReversalType = type,
        RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("yyyy-MM-ddTHH:mm:ss.fffZ") };
    var body     = JsonSerializer.Serialize(payload);
    var sigBytes = rsa.SignData(Encoding.UTF8.GetBytes(body),
                     HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    var xSig     = Convert.ToHexString(sigBytes);

    using var client = new HttpClient();
    using var req = new HttpRequestMessage(HttpMethod.Post,
        $"{Env("HPP_BASE")}/v1.4/ReversalAdministration/ReverseTransaction");
    req.Headers.TryAddWithoutValidation("X-CompanyNumber", Env("COMPANY"));
    req.Headers.TryAddWithoutValidation("X-StoreNumber",   Env("STORE"));
    req.Headers.TryAddWithoutValidation("X-ReferenceId",   Guid.NewGuid().ToString("N").ToUpper());
    req.Headers.TryAddWithoutValidation("X-Signature", xSig);
    req.Content = new StringContent(body, Encoding.UTF8, "application/json");

    var res = await client.SendAsync(req);
    return await res.Content.ReadAsStringAsync();
}
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TXN987",
            "HostRetrievalNumber": "123456",
            "RetrievalReferenceNumber": "RRN-2026-001235",
            "CardType": { "Type": "Credit", "Name": "Visa" },
            "MerchantID": "MID-001",
            "MerchantCategoryCode": "5411",
            "NetworkID": "VISA",
            "StoreNumber": 190,
            "AuditId": 42,
            "BusinessTransactionDate": "2026-07-14T12:05:00.000Z",
            "CardProcId": "PROC-001",
            "PaymentAccountReference": null,
            "CreditToDebitConversionType": null,
            "HostValues": {}
          }
Request
HppService.java
public String reverseTransaction(String originalRefId, String type) throws Exception {
    String expiry = ZonedDateTime.now(ZoneOffset.UTC).plusMinutes(5)
        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));

    String body = String.format(
        "{\"OriginalReferenceId\":\"%s\",\"ReversalType\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
        originalRefId, type, expiry);

    Signature signer = Signature.getInstance("SHA256withRSA");
    signer.initSign(privateKey);
    signer.update(body.getBytes(StandardCharsets.UTF_8));
    String xSig = HexFormat.of().formatHex(signer.sign()).toUpperCase();

    return HttpClient.newHttpClient().send(
        HttpRequest.newBuilder()
            .uri(URI.create(HPP_BASE + "/v1.4/ReversalAdministration/ReverseTransaction"))
            .header("Content-Type", "application/json")
            .header("X-CompanyNumber", COMPANY)
            .header("X-StoreNumber",   STORE)
            .header("X-ReferenceId",   UUID.randomUUID().toString().replace("-","").toUpperCase())
            .header("X-Signature", xSig)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build(),
        HttpResponse.BodyHandlers.ofString()
    ).body();
}
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TXN987",
            "HostRetrievalNumber": "123456",
            "RetrievalReferenceNumber": "RRN-2026-001235",
            "CardType": { "Type": "Credit", "Name": "Visa" },
            "MerchantID": "MID-001",
            "MerchantCategoryCode": "5411",
            "NetworkID": "VISA",
            "StoreNumber": 190,
            "AuditId": 42,
            "BusinessTransactionDate": "2026-07-14T12:05:00.000Z",
            "CardProcId": "PROC-001",
            "PaymentAccountReference": null,
            "CreditToDebitConversionType": null,
            "HostValues": {}
          }

InitializeSessionKey (RFC4050XML)

POST /v1.4/EndpointAdministration/InitializeSessionKey

Generates a symmetric session encryption key, wrapping it with the client's ECC public key supplied in RFC4050 XML format. The returned EncryptedSessionKey can decrypt subsequent AccountNumber and AccountSecurityCode fields in EncryptedPaymentAdministration calls.

Request headers
X-CompanyNumberstringrequired
Your company number.
X-StoreNumberstringrequired
Your store number.
X-ReferenceIdstring (32 hex)required
Unique 32-character hex request ID.
X-Signaturestringrequired
RSA-SHA256 hex signature of the request body.
Request body
ClientPublicKeyStringrequired
The public key generated by the client.
ClientPublicKeyFormatStringrequired
The format of the public key being sent by the client. The server reply will be in the same format. See SessionKeyFormat for definitions. Must be "RFC4050XML" for this variant.
ExchangeFormatStringrequired
The type of key exchange being requested by the client. See SessionKeyExchangeFormat for definitions.
KeyDurationInHoursNullable<Int32>optional
The number of hours the key will be valid. Cannot be more than 72 hours. Default: 72.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. Prevents replay attacks.
Response fieldsSession key initialised
KeyExpirationUTCNullable<DateTime>optional
Timestamp for key expiration in UTC.
KeyIdStringrequired
The Id of the Session Key created by the server. Supply as EncryptionInfo.EncryptionKeyId when using the Session Key for encryption.
ServerPublicKeyStringrequired
The public key generated by the server.
ServerPublicKeyFormatStringrequired
The format of the public key being sent by the server. The server reply will be in the same format requested by the client. See SessionKeyFormat for definitions.
POST /v1.4/EndpointAdministration/InitializeSessionKey
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EndpointAdministration/InitializeSessionKey" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "ClientPublicKey": "<ECDHKeyValue>...</ECDHKeyValue>",
    "ClientPublicKeyFormat": "RFC4050XML",
    "ExchangeFormat": "ECDH",
    "KeyDurationInHours": 72,
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "<ECDHKeyValue>...</ECDHKeyValue>",
            "ServerPublicKeyFormat": "RFC4050XML",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
initSessionKey.js
async function initSessionKey(eccPublicKeyXml) {
  const body = {
    ClientPublicKey: eccPublicKeyXml,
    ClientPublicKeyFormat: 'RFC4050XML',
    ExchangeFormat: 'ECDH',
    KeyDurationInHours: 72,
    RequestExpirationUTC: new Date(Date.now() + 5 * 60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EndpointAdministration/InitializeSessionKey`,
    { method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CompanyNumber': process.env.COMPANY,
        'X-StoreNumber':   process.env.STORE,
        'X-ReferenceId':   crypto.randomUUID().replace(/-/g,'').toUpperCase(),
        'X-Signature':     signBody(body)
      },
      body: JSON.stringify(body) }
  );
  return res.json();
}
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "<ECDHKeyValue>...</ECDHKeyValue>",
            "ServerPublicKeyFormat": "RFC4050XML",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
init_session_key.py
def init_session_key(ecc_public_key_xml: str) -> dict:
    body = {
        "ClientPublicKey": ecc_public_key_xml,
        "ClientPublicKeyFormat": "RFC4050XML",
        "ExchangeFormat": "ECDH",
        "KeyDurationInHours": 72,
        "RequestExpirationUTC": (
            datetime.now(timezone.utc) + timedelta(minutes=5)
        ).strftime("%Y-%m-%dT%H:%M:%S.000Z")
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EndpointAdministration/InitializeSessionKey",
        headers={
            "Content-Type": "application/json",
            "X-CompanyNumber": os.environ["COMPANY"],
            "X-StoreNumber":   os.environ["STORE"],
            "X-ReferenceId":   uuid.uuid4().hex.upper(),
            "X-Signature":     sign_body(body)
        }, json=body)
    r.raise_for_status()
    return r.json()
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "<ECDHKeyValue>...</ECDHKeyValue>",
            "ServerPublicKeyFormat": "RFC4050XML",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
InitSessionKey.cs
var body = new { ClientPublicKey = eccPublicKeyXml,
                  ClientPublicKeyFormat = "RFC4050XML",
                  ExchangeFormat = "ECDH",
                  KeyDurationInHours = 72,
                  RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o") };
var req = BuildRequest(HttpMethod.Post,
    "/v1.4/EndpointAdministration/InitializeSessionKey", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
return await resp.Content.ReadAsStringAsync();
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "<ECDHKeyValue>...</ECDHKeyValue>",
            "ServerPublicKeyFormat": "RFC4050XML",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
InitSessionKey.java
String json = String.format(
    "{\"ClientPublicKey\":\"%s\",\"ClientPublicKeyFormat\":\"RFC4050XML\"," +
    "\"ExchangeFormat\":\"ECDH\",\"KeyDurationInHours\":72," +
    "\"RequestExpirationUTC\":\"%s\"}", eccPublicKeyXml.replace("\"","\\\""),
    Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/EndpointAdministration/InitializeSessionKey", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "<ECDHKeyValue>...</ECDHKeyValue>",
            "ServerPublicKeyFormat": "RFC4050XML",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }

InitializeSessionKey (Base64MicrosoftECCBlob)

POST /v1.4/EndpointAdministration/InitializeSessionKey

Alternative form of InitializeSessionKey using a Microsoft CNG ECC public key blob encoded as Base64. Use this variant on Windows/.NET platforms where CNG key export produces a BCRYPT_ECCPUBLIC_BLOB.

Request body
ClientPublicKeyStringrequired
The public key generated by the client.
ClientPublicKeyFormatStringrequired
The format of the public key being sent by the client. The server reply will be in the same format. See SessionKeyFormat for definitions. Must be "Base64MicrosoftECCBlob" for this variant.
ExchangeFormatStringrequired
The type of key exchange being requested by the client. See SessionKeyExchangeFormat for definitions.
KeyDurationInHoursNullable<Int32>optional
The number of hours the key will be valid. Cannot be more than 72 hours. Default: 72.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. Prevents replay attacks.
Response fieldsSession key initialised
KeyExpirationUTCNullable<DateTime>optional
Timestamp for key expiration in UTC.
KeyIdStringrequired
The Id of the Session Key created by the server. Supply as EncryptionInfo.EncryptionKeyId when using the Session Key for encryption.
ServerPublicKeyStringrequired
The public key generated by the server.
ServerPublicKeyFormatStringrequired
The format of the public key being sent by the server. The server reply will be in the same format requested by the client. See SessionKeyFormat for definitions.
POST /v1.4/EndpointAdministration/InitializeSessionKey
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EndpointAdministration/InitializeSessionKey" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "ClientPublicKey": "AQAB...BASE64BLOB==",
    "ClientPublicKeyFormat": "Base64MicrosoftECCBlob",
    "ExchangeFormat": "ECDH",
    "KeyDurationInHours": 72,
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "AQAB...BASE64BLOB==",
            "ServerPublicKeyFormat": "Base64MicrosoftECCBlob",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
initSessionKey.js
async function initSessionKeyBlob(eccPublicKeyBase64) {
  const body = {
    ClientPublicKey: eccPublicKeyBase64,
    ClientPublicKeyFormat: 'Base64MicrosoftECCBlob',
    ExchangeFormat: 'ECDH',
    KeyDurationInHours: 72,
    RequestExpirationUTC: new Date(Date.now() + 5 * 60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EndpointAdministration/InitializeSessionKey`,
    { method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CompanyNumber': process.env.COMPANY,
        'X-StoreNumber':   process.env.STORE,
        'X-ReferenceId':   crypto.randomUUID().replace(/-/g,'').toUpperCase(),
        'X-Signature':     signBody(body)
      },
      body: JSON.stringify(body) }
  );
  return res.json();
}
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "AQAB...BASE64BLOB==",
            "ServerPublicKeyFormat": "Base64MicrosoftECCBlob",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
init_session_key.py
def init_session_key_blob(ecc_public_key_b64: str) -> dict:
    body = {
        "ClientPublicKey": ecc_public_key_b64,
        "ClientPublicKeyFormat": "Base64MicrosoftECCBlob",
        "ExchangeFormat": "ECDH",
        "KeyDurationInHours": 72,
        "RequestExpirationUTC": (
            datetime.now(timezone.utc) + timedelta(minutes=5)
        ).strftime("%Y-%m-%dT%H:%M:%S.000Z")
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EndpointAdministration/InitializeSessionKey",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "AQAB...BASE64BLOB==",
            "ServerPublicKeyFormat": "Base64MicrosoftECCBlob",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
InitSessionKey.cs
// Export CNG key as Base64 blob
using var ecdh = ECDiffieHellman.Create(ECCurve.NamedCurves.nistP256);
string blob = Convert.ToBase64String(
    ecdh.PublicKey.ExportSubjectPublicKeyInfo());
var body = new { ClientPublicKey = blob,
                  ClientPublicKeyFormat = "Base64MicrosoftECCBlob",
                  ExchangeFormat = "ECDH",
                  KeyDurationInHours = 72,
                  RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o") };
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EndpointAdministration/InitializeSessionKey", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "AQAB...BASE64BLOB==",
            "ServerPublicKeyFormat": "Base64MicrosoftECCBlob",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }
Request
InitSessionKey.java
String json = String.format(
    "{\"ClientPublicKey\":\"%s\",\"ClientPublicKeyFormat\":\"Base64MicrosoftECCBlob\"," +
    "\"ExchangeFormat\":\"ECDH\",\"KeyDurationInHours\":72," +
    "\"RequestExpirationUTC\":\"%s\"}", eccPublicKeyBase64,
    Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/EndpointAdministration/InitializeSessionKey", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
Response 200
JSON
{
            "KeyId": "key-abc123",
            "ServerPublicKey": "AQAB...BASE64BLOB==",
            "ServerPublicKeyFormat": "Base64MicrosoftECCBlob",
            "KeyExpirationUTC": "2026-07-16T12:05:00.000Z"
          }

InitializeSession (EndpointAdministration)

POST /v1.4/EndpointAdministration/InitializeSession

Creates a new payment session from the server side using stored endpoint credentials. Unlike PaymentTransactionManagement/InitializeSession, this variant is intended for server-initiated flows and returns a SessionId without HPP interaction.

Request body
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
Response fieldsSession created
IsValidBooleanrequired
Whether or not the provision for the endpoint is valid. A false response means the endpoint needs to be provisioned by calling one of the registration methods.
KeyExpirationUTCNullable<DateTime>optional
Timestamp for key expiration in UTC.
POST /v1.4/EndpointAdministration/InitializeSession
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EndpointAdministration/InitializeSession" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsValid": true,
            "KeyExpirationUTC": "2026-07-11T12:05:00.000Z"
          }
Request
initSession.js
async function initEndpointSession() {
  const body = { RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString() };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EndpointAdministration/InitializeSession`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsValid: true, KeyExpirationUTC: "2026-07-11T12:05:00.000Z" }
Request
init_session.py
def endpoint_init_session() -> dict:
    body = {"RequestExpirationUTC": utc_plus(5)}
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EndpointAdministration/InitializeSession",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsValid": True, "KeyExpirationUTC": "2026-07-11T12:05:00.000Z"}
Request
EndpointInitSession.cs
var body = new { RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o") };
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EndpointAdministration/InitializeSession", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { "IsValid": true, "KeyExpirationUTC": "2026-07-11T12:05:00.000Z" }
Request
EndpointInitSession.java
String json = String.format(
    "{\"RequestExpirationUTC\":\"%s\"}", Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/EndpointAdministration/InitializeSession", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsValid":true,"KeyExpirationUTC":"2026-07-11T12:05:00.000Z"}

GetReceiptTemplates

POST /v1.4/EndpointAdministration/GetReceiptTemplates

Returns the configured receipt templates for a given company and store. Templates define the print layout for customer and merchant copies of transaction receipts.

Request body
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
Response fieldsTemplates returned
Footerstringoptional
Receipt footer.
Headerstringoptional
Receipt header.
LastModifiedAtUTCNullable<DateTime>optional
The UTC timestamp for receipt templates currently configured on the server. Store this and send back as ReceiptTemplateLastModifiedAtUTC during initialization.
TemplatesIDictionary<String, IDictionary<String, ICollection<ReceiptTemplate>>>optional
Receipt templates keyed by template category and sub-type.
POST /v1.4/EndpointAdministration/GetReceiptTemplates
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EndpointAdministration/GetReceiptTemplates" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{ "RequestExpirationUTC": "2026-07-10T12:05:00.000Z" }'
Response 200
JSON
{
            "Footer": "Thank you for your purchase!",
            "Header": "ACME Store - 123 Main St",
            "LastModifiedAtUTC": "2026-06-01T00:00:00.000Z",
            "Templates": {
              "Receipt": {
                "CustomerCopy": [ { "Line": "{{MerchantName}}", "Format": "Center" } ],
                "MerchantCopy": [ { "Line": "{{MerchantName}}", "Format": "Center" } ]
              }
            }
          }
Request
getReceiptTemplates.js
async function getReceiptTemplates() {
  const body = { RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString() };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EndpointAdministration/GetReceiptTemplates`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { Footer, Header, LastModifiedAtUTC, Templates }
Request
get_receipt_templates.py
def get_receipt_templates() -> dict:
    body = {"RequestExpirationUTC": utc_plus(5)}
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EndpointAdministration/GetReceiptTemplates",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"Footer": "...", "Header": "...", "LastModifiedAtUTC": "...", "Templates": {...}}
Request
GetReceiptTemplates.cs
var body = new { RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o") };
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EndpointAdministration/GetReceiptTemplates", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { Footer, Header, LastModifiedAtUTC, Templates }
return await resp.Content.ReadAsStringAsync();
Request
GetReceiptTemplates.java
String json = String.format("{\"RequestExpirationUTC\":\"%s\"}",
    Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/EndpointAdministration/GetReceiptTemplates", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"Footer":"...","Header":"...","LastModifiedAtUTC":"...","Templates":{...}}

PurchaseForToken

POST /v1.4/PaymentAdministration/PurchaseForToken

Processes a purchase transaction using a stored payment token. The token references a previously stored card and removes the need to transmit full PAN data. Use for repeat or subscription billing scenarios.

Request body
TokenCardTokenrequired
Token object to be used for this purchase transaction.
AmountNullable<Decimal>required
Total amount to be captured from the provided account. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
AccountSecurityCodeEncryptionInfoconditional
The security code for the supplied account. Must be specified when ValidateAccountSecurityCode is set to true.
AllowPartialAuthorizationNullable<Boolean>optional
Whether or not partial authorization is allowed for less-than originally requested Amount. Default: false.
CardProcIdstringoptional
The Card Processing Id.
CashbackAmountNullable<Decimal>optional
Cashback sub-amount to be captured from the provided account. Non-zero, non-negative.
CurrencyCurrencyCodeoptional
The currency. Default is ISO 4217 "USD".
CurrencyConversionCurrencyConversionoptional
The currency conversion.
CustomerAccountCustomerAccountoptional
The customer account address.
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify if the client intends to choose the Fee Type: Convenience, Surcharge, or Service.
IndustrySpecificInfostringoptional
Used to pass TAA information.
PurchaseOrderNumberstringoptional
Purchase Order Number to be used for this purchase transaction.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
ValidateAccountAddressBooleanoptional
Whether or not the customer account address information should be validated. Default: false.
ValidateAccountSecurityCodeBooleanoptional
Whether or not the security code for the account should be validated. Default: false.
Response fieldsPurchase processed
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
AccountBillingAddressVerificationResultstringoptional
The account address validation result if validation was performed.
AccountNumberFirstSixstringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourstringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
AccountSecurityCodeValidationResultstringoptional
The account security code validation result if validation was performed.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
ApprovedCashbackAmountNullable<Decimal>optional
Cashback sub-amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
ExpirationDatestringoptional
The card expiration date.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/PaymentAdministration/PurchaseForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/PurchaseForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 1200,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Visa",
            "HostRetrievalNumber": "123456789012",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1,
            "ApprovedAmount": 1200,
            "AccountNumberLastFour": "1234",
            "Tokens": []
          }
Request
purchaseForToken.js
async function purchaseForToken(tokenValue, amount, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/PurchaseForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, CardType, MerchantID, NetworkID, StoreNumber, Tokens }
Request
purchase_for_token.py
def purchase_for_token(token_value: str, amount: int, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/PurchaseForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
PurchaseForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/PurchaseForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, Tokens, ... }
Request
PurchaseForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/PurchaseForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}

VoidPurchaseForToken

POST /v1.4/PaymentAdministration/VoidPurchaseForToken

Voids a previously authorised token-based purchase before settlement. The original transaction must be unsettled. Provide the OriginalReferenceId returned from the PurchaseForToken call.

Request body
TokenCardTokenrequired
Token object to be used for this payment transaction.
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
CardProcIdstringoptional
The Card Processing Id.
CashbackAmountNullable<Decimal>optional
Cashback amount to be captured from or returned to the provided account. Non-zero, non-negative.
CurrencyCurrencyCodeoptional
The currency code. Default is ISO 4217 "USD".
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount requested on the original, not the approved amount in case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
Response fieldsPurchase voided
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
ApprovedCashbackAmountNullable<Decimal>optional
Cashback sub-amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/PaymentAdministration/VoidPurchaseForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/VoidPurchaseForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 1200,
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 1200,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "ApprovedAmount": 1200,
            "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1
          }
Request
voidPurchaseForToken.js
async function voidPurchaseForToken(tokenValue, amount, originalReferenceId, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, OriginalReferenceId: originalReferenceId,
    OriginalAmount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/VoidPurchaseForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, MerchantID, ... }
Request
void_purchase_for_token.py
def void_purchase_for_token(token_value: str, amount: int,
                             original_ref: str, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "OriginalReferenceId": original_ref,
        "OriginalAmount": amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/VoidPurchaseForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
VoidPurchaseForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, OriginalReferenceId = originalReferenceId,
    OriginalAmount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/VoidPurchaseForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, ... }
Request
VoidPurchaseForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"OriginalReferenceId\":\"%s\",\"OriginalAmount\":%d," +
    "\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, originalRefId, amount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/VoidPurchaseForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}

RefundForToken

POST /v1.4/PaymentAdministration/RefundForToken

Issues a refund against a settled token-based purchase. The refund amount can be partial or full. Provide the original transaction reference and the token used.

Request body
TokenCardTokenrequired
Token object to be used for this purchase transaction.
AmountNullable<Decimal>required
Total amount to be captured from the provided account. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The currency. Default is ISO 4217 "USD".
CurrencyConversionCurrencyConversionoptional
The currency conversion.
CustomerAccountCustomerAccountoptional
The customer account address.
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
PurchaseOrderNumberstringoptional
Purchase Order Number to be used for this transaction.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
Response fieldsRefund processed
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/PaymentAdministration/RefundForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/RefundForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 1200,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
  "IsApproved": true,
  "ResponseCode": "000",
  "ResponseMessage": "APPROVAL",
  "HostResponseCode": "00",
  "HostType": 1,
  "AuthorizationCode": "TAS123",
  "AuditId": 123456,
  "ApprovedAmount": 1200,
  "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
  "CardType": "Visa",
  "HostRetrievalNumber": "123456789012",
  "MerchantID": "MERCH001",
  "NetworkID": "NET01",
  "RetrievalReferenceNumber": "123456789012",
  "StoreNumber": 1
}
Request
refundForToken.js
async function refundForToken(tokenValue, amount, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/RefundForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, MerchantID, ... }
Request
refund_for_token.py
def refund_for_token(token_value: str, amount: int, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/RefundForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
RefundForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/RefundForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, ... }
Request
RefundForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/RefundForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}

VoidRefundForToken

POST /v1.4/PaymentAdministration/VoidRefundForToken

Cancels an unsettled token-based refund. Must be called before the refund batch closes. Provide the reference ID from the original RefundForToken response.

Request body
TokenCardTokenrequired
Token object to be used for this payment transaction.
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The currency code. Default is ISO 4217 "USD".
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount on the original, not the approved amount in case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
Response fieldsRefund voided
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/PaymentAdministration/VoidRefundForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/VoidRefundForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 1200,
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 1200,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "ApprovedAmount": 1200,
            "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1
          }
Request
voidRefundForToken.js
async function voidRefundForToken(tokenValue, amount, originalReferenceId, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, OriginalReferenceId: originalReferenceId,
    OriginalAmount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/VoidRefundForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, MerchantID, ... }
Request
void_refund_for_token.py
def void_refund_for_token(token_value: str, amount: int,
                          original_ref: str, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "OriginalReferenceId": original_ref,
        "OriginalAmount": amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/VoidRefundForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
VoidRefundForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, OriginalReferenceId = originalReferenceId,
    OriginalAmount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/VoidRefundForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, ... }
Request
VoidRefundForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"OriginalReferenceId\":\"%s\",\"OriginalAmount\":%d," +
    "\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, originalRefId, amount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/VoidRefundForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}

PreauthorizeForToken

POST /v1.4/PaymentAdministration/PreauthorizeForToken

Places a hold on funds for a token-based card without capturing. Follow with CompleteAuthorizationForToken to capture, or VoidPreauthorizeForToken to release the hold.

Request body
TokenCardTokenrequired
Token object to be used for this purchase transaction.
AmountNullable<Decimal>required
Total amount to be captured from the provided account. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
AccountSecurityCodeEncryptionInfoconditional
The security code for the supplied account. Must be specified when ValidateAccountSecurityCode is set to true.
AllowPartialAuthorizationNullable<Boolean>optional
Whether or not partial authorization is allowed for less-than originally requested Amount. Default: false.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The currency. Default is ISO 4217 "USD".
CustomerAccountCustomerAccountoptional
The customer account address.
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
IndustrySpecificInfostringoptional
Used to pass TAA information.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
ValidateAccountAddressBooleanoptional
Whether or not the customer account address information should be validated. Default: false.
ValidateAccountSecurityCodeBooleanoptional
Whether or not the security code for the account should be validated. Default: false.
Response fieldsPre-auth placed
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
AccountBillingAddressVerificationResultstringoptional
The account address validation result if validation was performed.
AccountNumberFirstSixstringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourstringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
AccountSecurityCodeValidationResultstringoptional
The account security code validation result if validation was performed.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
ExpirationDatestringoptional
The card expiration date.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/PaymentAdministration/PreauthorizeForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/PreauthorizeForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 5000,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "ApprovedAmount": 5000,
            "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
            "CardType": "Visa",
            "AccountNumberLastFour": "1234",
            "HostRetrievalNumber": "123456789012",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1,
            "Tokens": []
          }
Request
preauthorizeForToken.js
async function preauthorizeForToken(tokenValue, amount, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/PreauthorizeForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, Tokens, ... }
Request
preauthorize_for_token.py
def preauthorize_for_token(token_value: str, amount: int, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "TenderType": "Credit", "EntryMode": "ComputerOrder",
        "ExpirationDate": expiry, "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/PreauthorizeForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
PreauthorizeForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/PreauthorizeForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, Tokens, ... }
Request
PreauthorizeForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/PreauthorizeForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123","Tokens":[],...}

VoidPreauthorizeForToken

POST /v1.4/PaymentAdministration/VoidPreauthorizeForToken

Releases a fund hold placed by PreauthorizeForToken. Use when the pre-authorised transaction will not be captured.

Request body
TokenCardTokenrequired
Token object to be used for this payment transaction.
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The currency code. Default is ISO 4217 "USD".
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount on the original, not the approved amount in case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
Response fieldsPre-auth voided
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/PaymentAdministration/VoidPreauthorizeForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/VoidPreauthorizeForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 5000,
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 5000,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "ApprovedAmount": 5000,
            "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1
          }
Request
voidPreauthorizeForToken.js
async function voidPreauthorizeForToken(tokenValue, amount, originalReferenceId, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, OriginalReferenceId: originalReferenceId,
    OriginalAmount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/VoidPreauthorizeForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, MerchantID, ... }
Request
void_preauthorize_for_token.py
def void_preauthorize_for_token(token_value: str, amount: int,
                                original_ref: str, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "OriginalReferenceId": original_ref,
        "OriginalAmount": amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/VoidPreauthorizeForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
VoidPreauthorizeForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, OriginalReferenceId = originalReferenceId,
    OriginalAmount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/VoidPreauthorizeForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, ... }
Request
VoidPreauthorizeForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"OriginalReferenceId\":\"%s\",\"OriginalAmount\":%d," +
    "\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, originalRefId, amount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/VoidPreauthorizeForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}

CompleteAuthorizationForToken

POST /v1.4/PaymentAdministration/CompleteAuthorizationForToken

Captures a pre-authorised token-based transaction. The capture amount can equal or be less than the pre-auth amount. Provide the OriginalReferenceId from the PreauthorizeForToken response.

Request body
TokenCardTokenrequired
Token object to be used for this payment transaction.
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The currency code. Default is ISO 4217 "USD".
CustomerAccountCustomerAccountoptional
The customer account address.
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
FulfillmentDetailsOrderFulfillmentoptional
Details about the order fulfillment for Ecommerce transactions.
IndustrySpecificInfostringoptional
Used to pass TAA information.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount on the original, not the approved amount in case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
ValidateAccountAddressBooleanoptional
Whether or not the customer account address information should be validated. Default: false.
Response fieldsAuthorization completed
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
AccountBillingAddressVerificationResultstringoptional
The account address validation result if validation was performed.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/PaymentAdministration/CompleteAuthorizationForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/CompleteAuthorizationForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 4800,
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 5000,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "ApprovedAmount": 4800,
            "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
            "CardType": "Visa",
            "HostRetrievalNumber": "123456789012",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1
          }
Request
completeAuthForToken.js
async function completeAuthForToken(tokenValue, amount, originalReferenceId,
                                    originalAmount, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, OriginalReferenceId: originalReferenceId,
    OriginalAmount: originalAmount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/CompleteAuthorizationForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, MerchantID, ... }
Request
complete_auth_for_token.py
def complete_auth_for_token(token_value: str, amount: int, original_ref: str,
                            original_amount: int, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "OriginalReferenceId": original_ref,
        "OriginalAmount": original_amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/CompleteAuthorizationForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
CompleteAuthForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, OriginalReferenceId = originalReferenceId,
    OriginalAmount = originalAmount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/CompleteAuthorizationForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, ... }
Request
CompleteAuthForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"OriginalReferenceId\":\"%s\",\"OriginalAmount\":%d," +
    "\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, originalRefId, originalAmount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/CompleteAuthorizationForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "AUTH12",
            "HostRetrievalNumber": "123456",
            "RetrievalReferenceNumber": "RRN-001",
            "CardType": { "Type": "Credit", "Name": "Visa" },
            "AuditId": 42,
            "StoreNumber": 190
          }

VoidCompleteAuthorizationForToken

POST /v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken

Voids a captured token-based authorization before settlement. Provide the reference ID from the CompleteAuthorizationForToken response.

Request body
TokenCardTokenrequired
Token object to be used for this payment transaction.
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The currency code. Default is ISO 4217 "USD".
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Specify the Fee Type: Convenience, Surcharge, or Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount on the original, not the approved amount in case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
Response fieldsCapture voided
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken
Request
cURL
curl -X POST "$HPP_BASE/v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Token": { "TokenType": "201", "TokenValue": "371449551708431" },
    "Amount": 4800,
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 5000,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-15T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "TAS123",
            "AuditId": 123456,
            "ApprovedAmount": 4800,
            "BusinessTransactionDate": "2026-07-15T12:05:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "123456789012",
            "StoreNumber": 1
          }
Request
voidCompleteAuthForToken.js
async function voidCompleteAuthForToken(tokenValue, amount, originalReferenceId,
                                        originalAmount, expiry) {
  const body = {
    Token: { TokenType: '201', TokenValue: tokenValue },
    Amount: amount, OriginalReferenceId: originalReferenceId,
    OriginalAmount: originalAmount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, CardType, MerchantID, ... }
Request
void_complete_auth_for_token.py
def void_complete_auth_for_token(token_value: str, amount: int, original_ref: str,
                                 original_amount: int, expiry: str) -> dict:
    body = {
        "Token": {"TokenType": "201", "TokenValue": token_value},
        "Amount": amount, "OriginalReferenceId": original_ref,
        "OriginalAmount": original_amount, "TenderType": "Credit",
        "EntryMode": "ComputerOrder", "ExpirationDate": expiry,
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS123", ...}
Request
VoidCompleteAuthForToken.cs
var body = new {
    Token = new { TokenType = "201", TokenValue = tokenValue },
    Amount = amount, OriginalReferenceId = originalReferenceId,
    OriginalAmount = originalAmount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, ... }
Request
VoidCompleteAuthForToken.java
String json = String.format(
    "{\"Token\":{\"TokenType\":\"201\",\"TokenValue\":\"%s\"}," +
    "\"Amount\":%d,\"OriginalReferenceId\":\"%s\",\"OriginalAmount\":%d," +
    "\"TenderType\":\"Credit\",\"EntryMode\":\"ComputerOrder\"," +
    "\"ExpirationDate\":\"%s\",\"RequestExpirationUTC\":\"%s\"}",
    tokenValue, amount, originalRefId, originalAmount, expiry, Instant.now().plusSeconds(300));
HttpRequest req = buildSignedRequest(
    "/v1.4/PaymentAdministration/VoidCompleteAuthorizationForToken", json);
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS123",...}
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "Approved",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "AUTH12",
            "AuditId": 42,
            "StoreNumber": 190
          }

Purchase (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/Purchase

Processes a purchase with an encrypted card number and security code. The card data must be encrypted using the AES session key obtained from InitializeSessionKey. No plain-text PAN is transmitted.

Request body
AccountNumberEncryptionInforequired
Encrypted PAN object containing EncryptionType, EncryptionKeyId, EncryptionAlgorithm, EncryptionInitializationVector, and EncryptedValue.
AmountNullable<Decimal>required
Total amount to be captured from the provided account. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. Prevents replay attacks.
AccountSecurityCodeEncryptionInfoconditional
Encrypted CVV/security code — same structure as AccountNumber. Required when ValidateAccountSecurityCode is true.
AllowPartialAuthorizationNullable<Boolean>optional
Whether partial authorization is allowed for less than the originally requested amount. Default: false.
CardProcIdstringoptional
The Card Processing Id.
CashbackAmountNullable<Decimal>optional
Cashback sub-amount to be captured from the provided account. Non-zero, non-negative.
CurrencyCurrencyCodeoptional
The currency. Default is ISO 4217 "USD".
CurrencyConversionCurrencyConversionoptional
The currency conversion details.
CustomerAccountCustomerAccountoptional
The customer account address information.
EntryModestringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server auth mode.
ExpirationDatestringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FeeTypestringconditional
Fee type if applicable: Convenience, Surcharge, or Service.
IndustrySpecificInfostringoptional
Used to pass TAA information.
PurchaseOrderNumberstringoptional
Purchase Order Number for this transaction.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
ValidateAccountAddressBooleanoptional
Whether the customer account address should be validated. Default: false.
ValidateAccountSecurityCodeBooleanoptional
Whether the account security code should be validated. Default: false.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsPurchase processed
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AccountBillingAddressVerificationResultstringoptional
The account address validation result if validation was performed.
AccountNumberFirstSixstringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourstringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
AccountSecurityCodeValidationResultstringoptional
The account security code validation result if validation was performed.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
ApprovedCashbackAmountNullable<Decimal>optional
Cashback sub-amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
ExpirationDatestringoptional
The card expiration date.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID identifying the network that authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
AvailableBalanceDetailsICollection<AvailableBalanceInfo>optional
Collection of available balance information for the account.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedPaymentAdministration/Purchase
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/Purchase" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "AccountNumber": {
      "EncryptionType": "SessionKey",
      "EncryptionKeyId": "YOUR_KEY_ID",
      "EncryptionAlgorithm": "AES128",
      "EncryptionInitializationVector": "BASE64_IV==",
      "EncryptedValue": "BASE64_ENCRYPTED_PAN=="
    },
    "AccountSecurityCode": {
      "EncryptionType": "SessionKey",
      "EncryptionKeyId": "YOUR_KEY_ID",
      "EncryptionAlgorithm": "AES128",
      "EncryptionInitializationVector": "BASE64_IV==",
      "EncryptedValue": "BASE64_ENCRYPTED_CVV=="
    },
    "Amount": 2500,
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AuthorizationCode": "TAS456",
            "AuditId": 234567,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Visa",
            "HostRetrievalNumber": "234567890123",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "234567890123",
            "StoreNumber": 1,
            "ApprovedAmount": 2500,
            "AccountNumberFirstSix": "411111",
            "AccountNumberLastFour": "1111",
            "Tokens": []
          }
Request
encPurchase.js
async function encPurchase(encPan, encCvv, keyId, amount, expiry) {
  const encObj = (encVal) => ({
    EncryptionType: 'SessionKey', EncryptionKeyId: keyId,
    EncryptionAlgorithm: 'AES128',
    EncryptionInitializationVector: encVal.iv,
    EncryptedValue: encVal.data
  });
  const body = {
    AccountNumber: encObj(encPan), AccountSecurityCode: encObj(encCvv),
    Amount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/Purchase`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, CardType, MerchantID, Tokens, ... }
Request
enc_purchase.py
def enc_obj(encrypted_value: str, iv: str, key_id: str) -> dict:
    return {"EncryptionType": "SessionKey", "EncryptionKeyId": key_id,
            "EncryptionAlgorithm": "AES128",
            "EncryptionInitializationVector": iv, "EncryptedValue": encrypted_value}

def enc_purchase(enc_pan, enc_cvv, key_id: str, amount: int, expiry: str) -> dict:
    body = {
        "AccountNumber": enc_obj(enc_pan["data"], enc_pan["iv"], key_id),
        "AccountSecurityCode": enc_obj(enc_cvv["data"], enc_cvv["iv"], key_id),
        "Amount": amount, "TenderType": "Credit", "EntryMode": "ComputerOrder",
        "ExpirationDate": expiry, "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/Purchase",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AuthorizationCode": "TAS456", ...}
Request
EncPurchase.cs
object EncObj(string val, string iv, string kid) => new {
    EncryptionType = "SessionKey", EncryptionKeyId = kid,
    EncryptionAlgorithm = "AES128",
    EncryptionInitializationVector = iv, EncryptedValue = val };
var body = new {
    AccountNumber = EncObj(encPan, panIv, keyId),
    AccountSecurityCode = EncObj(encCvv, cvvIv, keyId),
    Amount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/Purchase", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, Tokens, ... }
Request
EncPurchase.java
// Use a JSON library (e.g. Jackson) to build the encrypted payload
ObjectNode body = mapper.createObjectNode();
body.set("AccountNumber", encryptedField(encPan, panIv, keyId));
body.set("AccountSecurityCode", encryptedField(encCvv, cvvIv, keyId));
body.put("Amount", amount).put("TenderType", "Credit")
    .put("EntryMode", "ComputerOrder").put("ExpirationDate", expiry)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString());
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/Purchase", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AuthorizationCode":"TAS456",...}

VoidPurchase (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/VoidPurchase

Voids an unsettled encrypted purchase transaction. Provide the reference ID and other transaction details returned from the Purchase response.

Request body
AmountNullable<Decimal>required
Total amount of the original transaction. Non-zero, non-negative.
OriginalReferenceIdstring (GUID)required
Reference ID from the encrypted Purchase response.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected.
OriginalAmountNullable<Decimal>conditional
Amount of the original purchase transaction.
OriginalApprovalCodestringconditional
Approval code returned by the original Purchase response.
OriginalAuditIdNullable<Int32>conditional
Audit Id (STAN) from the original Purchase response.
OriginalBusinessTransactionDateNullable<DateTime>conditional
Business transaction date from the original Purchase response.
OriginalHostResponseCodestringconditional
Host response code from the original Purchase response.
OriginalHostRetrievalNumberstringconditional
Host retrieval number from the original Purchase response.
OriginalNetworkIDstringconditional
Network ID from the original Purchase response.
OriginalRetrievalReferenceNumberstringconditional
Retrieval reference number from the original Purchase response.
CardProcIdstringoptional
The Card Processing Id.
CashbackAmountNullable<Decimal>optional
Cashback sub-amount of the original transaction.
CurrencyCurrencyCodeoptional
The currency. Default is ISO 4217 "USD".
EntryModestringoptional
The type of entry mode used. Default: "ComputerOrder".
ExpirationDatestringoptional
Card expiration in MMYY or MMYYYY format.
TenderTypestringoptional
The type of tender. Default: "Credit".
TipAmountNullable<Decimal>optional
The tip sub-amount of the original transaction.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsPurchase voided
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the void was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
TokensICollection<Token>optional
Collection of generated token objects.
AccountNumberFirstSixstringoptional
The first six digits of the account number.
AccountNumberLastFourstringoptional
The last four digits of the account number.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number.
POST /v1.4/EncryptedPaymentAdministration/VoidPurchase
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/VoidPurchase" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Amount": 2500,
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "OriginalAmount": 2500,
    "OriginalApprovalCode": "TAS456",
    "OriginalAuditId": 234567,
    "OriginalBusinessTransactionDate": "2026-07-10T12:00:00.000Z",
    "OriginalHostResponseCode": "00",
    "OriginalRetrievalReferenceNumber": "234567890123"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AuthorizationCode": "TAS456",
            "AuditId": 234568,
            "BusinessTransactionDate": "2026-07-10T12:06:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "StoreNumber": 1
          }
Request
encVoidPurchase.js
async function encVoidPurchase(originalReferenceId, amount, originalData) {
  const body = {
    Amount: amount,
    OriginalReferenceId: originalReferenceId,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    OriginalAmount: originalData.amount,
    OriginalApprovalCode: originalData.approvalCode,
    OriginalAuditId: originalData.auditId,
    OriginalBusinessTransactionDate: originalData.businessDate,
    OriginalHostResponseCode: originalData.hostResponseCode,
    OriginalRetrievalReferenceNumber: originalData.retrievalReferenceNumber
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/VoidPurchase`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, CardType, ... }
Request
enc_void_purchase.py
def enc_void_purchase(original_ref: str, amount: int, original_data: dict) -> dict:
    body = {
        "Amount": amount,
        "OriginalReferenceId": original_ref,
        "RequestExpirationUTC": utc_plus(5),
        "OriginalAmount": original_data["amount"],
        "OriginalApprovalCode": original_data["approval_code"],
        "OriginalAuditId": original_data["audit_id"],
        "OriginalBusinessTransactionDate": original_data["business_date"],
        "OriginalHostResponseCode": original_data["host_response_code"],
        "OriginalRetrievalReferenceNumber": original_data["retrieval_ref"]
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/VoidPurchase",
        headers=signed_headers(body), json=body)
  r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None", "AuthorizationCode": "TAS456", ...}
Request
EncVoidPurchase.cs
var body = new {
    Amount = amount,
    OriginalReferenceId = originalReferenceId,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o"),
    OriginalAmount = originalAmount,
    OriginalApprovalCode = originalApprovalCode,
    OriginalAuditId = originalAuditId,
    OriginalBusinessTransactionDate = originalBusinessDate,
    OriginalHostResponseCode = originalHostResponseCode,
    OriginalRetrievalReferenceNumber = originalRetrievalRef
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/VoidPurchase", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, VerificationMethod, AuthorizationCode, ... }
Request
EncVoidPurchase.java
ObjectNode body = mapper.createObjectNode();
body.put("Amount", amount)
    .put("OriginalReferenceId", originalReferenceId)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString())
    .put("OriginalAmount", originalAmount)
    .put("OriginalApprovalCode", originalApprovalCode)
    .put("OriginalAuditId", originalAuditId)
    .put("OriginalBusinessTransactionDate", originalBusinessDate)
    .put("OriginalHostResponseCode", originalHostResponseCode)
    .put("OriginalRetrievalReferenceNumber", originalRetrievalRef);
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/VoidPurchase", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"TAS456",...}

Refund (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/Refund

Issues a refund against a settled encrypted purchase. The card data must be re-submitted encrypted. Refunds can be partial or full.

Request body
AmountNullable<Decimal>required
Total amount to be captured from the provided account. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
EntryModeStringconditional
The type of entry mode used to capture the account number. Required when using MobileDevice or MobileApplication authentication mode. Default: "ComputerOrder" in Server mode. See EntryMode for definitions.
ExpirationDateStringconditional
Card expiration in MMYY or MMYYYY format. Required when submitting to a financial host.
FeeTypeStringconditional
Required when using NPP Host, optional for other hosts. Defined values: Convenience, Surcharge, Service.
AccountNumberAccountNumberoptional
Encrypted account number for the account being transacted.
AccountSecurityCodeEncryptionInfooptional
Encrypted security code for the supplied account.
CardProcIdStringoptional
The Card Processing Id.
ClientDispositionClientDispositionoptional
Specified when the client has already reached a final disposition for the request.
CredentialOnFileStringoptional
Specify if the client intends to save the card data or token for future payments. Defined values: Initial, Subsequent.
CurrencyCurrencyCodeoptional
The currency. Default is ISO 4217 "USD".
CurrencyConversionCurrencyConversionoptional
The currency conversion.
CustomerAccountCustomerAccountoptional
The customer account address.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FsaAmountsFsaAmountsoptional
FSA (Flexible Spending Account) / HSA (Health Saving Account) transaction amounts.
HostRetrievalNumberStringoptional
Host retrieval number.
ManagerNumberStringoptional
Manager number used in transaction processing for scenarios such as overrides.
MarketBasketDataStringoptional
Market Basket Data — contains all the UPCs presented in bitmapped datasets. Used with TenderType BenefitsProgram.
OverrideBooleanoptional
Ability to override transaction limits on offline and online transactions.
PINEncryptionInfooptional
Encrypted PIN for the supplied account.
RetrievalReferenceNumberStringoptional
Retrieval reference number.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypeStringoptional
The type of tender represented by the account number. Default: "Credit". See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
TokenCardTokenoptional
A token for the account being transacted.
TokenRetrievalRequiredBooleanoptional
Whether a token is required for downstream operations. If true, the operation fails when a token cannot be retrieved. Default: false.
TrackAccountNumberoptional
Encrypted track details read from the card for the account being transacted.
Track1EncryptionInfooptional
Encrypted track 1 details read from the card.
Track2EncryptionInfooptional
Encrypted track 2 details read from the card.
Track3EncryptionInfooptional
Encrypted track 3 details read from the card.
Response fieldsRefund processed
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodeStringrequired
Response code returned by WebEPS.
ResponseMessageStringrequired
Response message returned by WebEPS.
HostResponseCodeStringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
VerificationMethodStringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AccountNumberFirstSixStringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourStringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodeStringoptional
Transaction authorization code.
AvailableBalanceDetailsICollection<AvailableBalanceInfo>optional
Available balance details for the account.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdStringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypeStringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
ExpirationDateStringoptional
The card expiration date.
HostRetrievalNumberStringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MarketBasketDataStringoptional
Market Basket Data — contains all the UPCs in bitmapped datasets. Used with TenderType BenefitsProgram.
MerchantCategoryCodeStringoptional
Merchant Category Code (MCC).
MerchantIDStringoptional
Merchant ID.
NetworkIDStringoptional
Authorizer Network ID. Identifies the network which authorized the transaction.
PaymentAccountReferenceStringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberStringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedPaymentAdministration/Refund
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/Refund" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "AccountNumber": {
      "EncryptionType": "SessionKey",
      "EncryptionKeyId": "YOUR_KEY_ID",
      "EncryptionAlgorithm": "AES128",
      "EncryptionInitializationVector": "BASE64_IV==",
      "EncryptedValue": "BASE64_ENCRYPTED_PAN=="
    },
    "Amount": 2500,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "AuthorizationCode": "REF789",
            "AuditId": 345678,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "StoreNumber": 1,
            "ApprovedAmount": 2500,
            "AccountNumberFirstSix": "411111",
            "AccountNumberLastFour": "1111",
            "Tokens": []
          }
Request
encRefund.js
async function encRefund(encPan, keyId, amount, expiry) {
  const body = {
    AccountNumber: { EncryptionType: 'SessionKey', EncryptionKeyId: keyId,
      EncryptionAlgorithm: 'AES128',
      EncryptionInitializationVector: encPan.iv, EncryptedValue: encPan.data },
    Amount: amount, TenderType: 'Credit', EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/Refund`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AuthorizationCode, AuditId, ApprovedAmount, Tokens, ... }
Request
enc_refund.py
def enc_refund(enc_pan, key_id: str, amount: int, expiry: str) -> dict:
    body = {
        "AccountNumber": enc_obj(enc_pan["data"], enc_pan["iv"], key_id),
        "Amount": amount, "TenderType": "Credit", "EntryMode": "ComputerOrder",
        "ExpirationDate": expiry, "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/Refund",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "ApprovedAmount": 2500, ...}
Request
EncRefund.cs
var body = new {
    AccountNumber = EncObj(encPan, panIv, keyId),
    Amount = amount, TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/Refund", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AuthorizationCode, ApprovedAmount, Tokens, ... }
Request
EncRefund.java
ObjectNode body = mapper.createObjectNode();
body.set("AccountNumber", encryptedField(encPan, panIv, keyId));
body.put("Amount", amount).put("TenderType", "Credit")
    .put("EntryMode", "ComputerOrder").put("ExpirationDate", expiry)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString());
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/Refund", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","ApprovedAmount":2500,...}

VoidRefund (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/VoidRefund

Cancels an unsettled encrypted refund transaction before it is batched.

Request body
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
EntryModestringconditional
The type of entry mode used to capture the account number provided. Required when using MobileDevice or MobileApplication authentication mode. Default value is ComputerOrder when using Server authentication mode.
ExpirationDatestringconditional
The month and year of card expiration in MMYY or MMYYYY format. Required when submitting a transaction to a financial Host.
FeeTypestringconditional
Specify if the client intends to choose the Fee Type. Needs to be set if using NPP Host, optional for other hosts. Values: Convenience, Surcharge, Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount requested on the original, not approved amount in the case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) that was generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
AccountNumberAccountNumberoptional
Encrypted account number for the account being transacted.
AccountSecurityCodeEncryptionInfooptional
Encrypted security code for the supplied account.
CardProcIdStringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The CurrencyCode. Default is ISO 4217 "USD".
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FsaAmountsFsaAmountsoptional
FSA (Flexible Spending Account) / HSA (Health Saving Account) transactions amount.
PINEncryptionInfooptional
Encrypted PIN for the supplied account.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender that is represented by the account number provided. Default value: Credit.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
TokenCardTokenoptional
A Token for the account being transacted.
TrackAccountNumberoptional
Encrypted track details read from the card for the account being transacted.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsRefund voided
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the Transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID. It identifies the network which authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/EncryptedPaymentAdministration/VoidRefund
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/VoidRefund" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Amount": 2500,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 2500,
    "OriginalAuthorizationCode": "REF789",
    "OriginalAuditId": 345678,
    "OriginalDateTimeUTC": "2026-07-10T12:00:00.0000000Z",
    "OriginalHostResponseCode": "00",
    "OriginalRetrievalReferenceNumber": "345678901234"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AuthorizationCode": "REF789",
            "AuditId": 345679,
            "BusinessTransactionDate": "2026-07-10T12:06:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "StoreNumber": 1
          }
Request
encVoidRefund.js
async function encVoidRefund(originalReferenceId, amount, originalData) {
  const body = {
    Amount: amount,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    OriginalReferenceId: originalReferenceId,
    OriginalAmount: originalData.amount,
    OriginalAuthorizationCode: originalData.authorizationCode,
    OriginalAuditId: originalData.auditId,
    OriginalDateTimeUTC: originalData.dateTimeUTC,
    OriginalHostResponseCode: originalData.hostResponseCode,
    OriginalRetrievalReferenceNumber: originalData.retrievalReferenceNumber
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/VoidRefund`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, CardType, ... }
Request
enc_void_refund.py
def enc_void_refund(original_ref: str, amount: int, original_data: dict) -> dict:
    body = {
        "Amount": amount,
        "RequestExpirationUTC": utc_plus(5),
        "OriginalReferenceId": original_ref,
        "OriginalAmount": original_data["amount"],
        "OriginalAuthorizationCode": original_data["authorization_code"],
        "OriginalAuditId": original_data["audit_id"],
        "OriginalDateTimeUTC": original_data["date_time_utc"],
        "OriginalHostResponseCode": original_data["host_response_code"],
        "OriginalRetrievalReferenceNumber": original_data["retrieval_ref"]
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/VoidRefund",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None", ...}
Request
EncVoidRefund.cs
var body = new {
    Amount = amount,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o"),
    OriginalReferenceId = originalReferenceId,
    OriginalAmount = originalAmount,
    OriginalAuthorizationCode = originalAuthorizationCode,
    OriginalAuditId = originalAuditId,
    OriginalDateTimeUTC = originalDateTimeUTC,
    OriginalHostResponseCode = originalHostResponseCode,
    OriginalRetrievalReferenceNumber = originalRetrievalRef
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/VoidRefund", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, VerificationMethod, AuthorizationCode, ... }
Request
EncVoidRefund.java
ObjectNode body = mapper.createObjectNode();
body.put("Amount", amount)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString())
    .put("OriginalReferenceId", originalReferenceId)
    .put("OriginalAmount", originalAmount)
    .put("OriginalAuthorizationCode", originalAuthorizationCode)
    .put("OriginalAuditId", originalAuditId)
    .put("OriginalDateTimeUTC", originalDateTimeUTC)
    .put("OriginalHostResponseCode", originalHostResponseCode)
    .put("OriginalRetrievalReferenceNumber", originalRetrievalRef);
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/VoidRefund", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"REF789",...}

Preauthorize (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/Preauthorize

Places a hold on funds using an encrypted card number. Follow with CompleteAuthorization to capture, or VoidPreauthorization to release.

Request body
AmountNullable<Decimal>required
Total amount to be captured from the provided account. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
EntryModeStringconditional
The type of entry mode used to capture the account number provided. Required when using MobileDevice or MobileApplication authentication mode. Default value is ComputerOrder when using Server authentication mode. See EntryMode for definitions.
ExpirationDateStringconditional
The month and year of card expiration in MMYY or MMYYYY format. Required when submitting a transaction to a financial Host.
FeeTypeStringconditional
Specify if the client intends to choose the Fee Type. Needs to be set if using NPP Host, optional for other hosts. Values: Convenience, Surcharge, Service.
AccountNumberAccountNumberoptional
Encrypted account number for the account being transacted.
AccountSecurityCodeEncryptionInfooptional
Encrypted security code for the supplied account.
AllowPartialAuthorizationNullable<Boolean>optional
Whether or not partial authorization is allowed for less-than originally requested Amount. Dependent on host configuration. Default: false.
CardProcIdStringoptional
The Card Processing Id.
CredentialOnFileStringoptional
Specify if the client intends to save the card data or token returned for future payments. Values: Initial, Subsequent.
CurrencyCurrencyCodeoptional
The Currency. Default is ISO 4217 "USD".
CustomerAccountCustomerAccountoptional
The customer account address.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FsaAmountsFsaAmountsoptional
FSA (Flexible Spending Account) / HSA (Health Saving Account) transactions amount.
PINEncryptionInfooptional
Encrypted PIN for the supplied account.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypeStringoptional
The type of tender that is represented by the account number provided. Default value: Credit. See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
TokenCardTokenoptional
A Token for the account being transacted.
TokenRetrievalRequiredBooleanoptional
Whether or not a Token is required for downstream operations. Setting to true will fail the operation if a Token cannot be retrieved. Default: false.
TrackAccountNumberoptional
Encrypted track details read from the card for the account being transacted.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
ValidateAccountAddressBooleanoptional
Whether or not the customer account address information should be validated. Default: false.
ValidateAccountSecurityCodeBooleanoptional
Whether or not the security code for the account should be validated. Default: false.
Response fieldsPre-auth placed
HostResponseCodeStringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodeStringrequired
Response code returned by WebEPS.
ResponseMessageStringrequired
Response message returned by WebEPS.
VerificationMethodStringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AccountBillingAddressVerificationResultStringoptional
The account address validation result if validation was performed.
AccountNumberFirstSixStringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourStringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
AccountSecurityCodeValidationResultStringoptional
The account security code validation result if validation was performed.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodeStringoptional
Transaction authorization code.
AvailableBalanceDetailsICollection<AvailableBalanceInfo>optional
Collection of available balance information for the account.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdStringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the Transaction.
CreditToDebitConversionTypeStringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
ExpirationDateStringoptional
The card expiration date.
HostRetrievalNumberStringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodeStringoptional
Merchant Category Code (MCC).
MerchantIDStringoptional
Merchant ID.
NetworkIDStringoptional
Authorizer Network ID. It identifies the network which authorized the transaction.
PaymentAccountReferenceStringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberStringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedPaymentAdministration/Preauthorize
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/Preauthorize" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Amount": 10000,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240",
    "AccountNumber": {
      "EncryptionType": "SessionKey",
      "EncryptionKeyId": "YOUR_KEY_ID",
      "EncryptionAlgorithm": "AES128",
      "EncryptionInitializationVector": "BASE64_IV==",
      "EncryptedValue": "BASE64_ENCRYPTED_PAN=="
    },
    "TenderType": "Credit"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "ApprovedAmount": 10000,
            "AuthorizationCode": "AUTH001",
            "AuditId": 456789,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Visa",
            "AccountNumberFirstSix": "411111",
            "AccountNumberLastFour": "1111",
            "HostRetrievalNumber": "456789012345",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "456789012345",
            "StoreNumber": 1,
            "Tokens": []
          }
Request
encPreauthorize.js
async function encPreauthorize(encPan, keyId, amount, expiry) {
  const body = {
    Amount: amount,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    EntryMode: 'ComputerOrder',
    ExpirationDate: expiry,
    AccountNumber: { EncryptionType: 'SessionKey', EncryptionKeyId: keyId,
      EncryptionAlgorithm: 'AES128',
      EncryptionInitializationVector: encPan.iv, EncryptedValue: encPan.data },
    TenderType: 'Credit'
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/Preauthorize`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, ApprovedAmount, Tokens, ... }
Request
enc_preauthorize.py
def enc_preauthorize(enc_pan, key_id: str, amount: int, expiry: str) -> dict:
    body = {
        "Amount": amount,
        "RequestExpirationUTC": utc_plus(5),
        "EntryMode": "ComputerOrder",
        "ExpirationDate": expiry,
        "AccountNumber": enc_obj(enc_pan["data"], enc_pan["iv"], key_id),
        "TenderType": "Credit"
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/Preauthorize",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None",
#            "AuthorizationCode": "AUTH001", "ApprovedAmount": 10000, ...}
Request
EncPreauthorize.cs
var body = new {
    Amount = amount,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o"),
    EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    AccountNumber = EncObj(encPan, panIv, keyId),
    TenderType = "Credit"
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/Preauthorize", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, VerificationMethod, AuthorizationCode, ApprovedAmount, Tokens, ... }
Request
EncPreauthorize.java
ObjectNode body = mapper.createObjectNode();
body.put("Amount", amount)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString())
    .put("EntryMode", "ComputerOrder")
    .put("ExpirationDate", expiry)
    .put("TenderType", "Credit");
body.set("AccountNumber", encryptedField(encPan, panIv, keyId));
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/Preauthorize", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"AUTH001",...}

VoidPreauthorization (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/VoidPreauthorization

Releases a fund hold placed by an encrypted Preauthorize call.

Request body
AmountNullable<Decimal>required
The total amount to be captured against or returned to the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
EntryModeStringconditional
The type of entry mode used to capture the account number provided. Required when using MobileDevice or MobileApplication authentication mode. Default value is ComputerOrder when using Server authentication mode. See EntryMode for definitions.
ExpirationDateStringconditional
The month and year of card expiration in MMYY or MMYYYY format. Required when submitting a transaction to a financial Host.
FeeTypeStringconditional
Specify if the client intends to choose the Fee Type. Needs to be set if using NPP Host, optional for other hosts. Values: Convenience, Surcharge, Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount requested on the original, not approved amount in the case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) that was generated during authorization.
OriginalAuthorizationCodeStringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdStringconditional
The original ReferenceId of the authorization request.
AccountNumberAccountNumberoptional
Encrypted account number for the account being transacted.
AccountSecurityCodeEncryptionInfooptional
Encrypted security code for the supplied account.
CardProcIdStringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The CurrencyCode. Default is ISO 4217 "USD".
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FsaAmountsFsaAmountsoptional
FSA (Flexible Spending Account) / HSA (Health Saving Account) transactions amount.
PINEncryptionInfooptional
Encrypted PIN for the supplied account.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypeStringoptional
The type of tender that is represented by the account number provided. Default value: Credit. See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
TokenCardTokenoptional
A Token for the account being transacted.
TrackAccountNumberoptional
Encrypted track details read from the card for the account being transacted.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsPre-auth voided
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the Transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID. It identifies the network which authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/EncryptedPaymentAdministration/VoidPreauthorization
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/VoidPreauthorization" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Amount": 10000,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 10000,
    "OriginalAuthorizationCode": "AUTH001",
    "OriginalAuditId": 456789,
    "OriginalDateTimeUTC": "2026-07-10T12:00:00.0000000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AuthorizationCode": "AUTH001",
            "AuditId": 456790,
            "BusinessTransactionDate": "2026-07-10T12:06:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "StoreNumber": 1
          }
Request
encVoidPreauth.js
async function encVoidPreauthorization(originalReferenceId, amount, originalData) {
  const body = {
    Amount: amount,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    OriginalReferenceId: originalReferenceId,
    OriginalAmount: originalData.amount,
    OriginalAuthorizationCode: originalData.authorizationCode,
    OriginalAuditId: originalData.auditId,
    OriginalDateTimeUTC: originalData.dateTimeUTC
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/VoidPreauthorization`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, CardType, ... }
Request
enc_void_preauth.py
def enc_void_preauthorization(original_ref: str, amount: int, original_data: dict) -> dict:
    body = {
        "Amount": amount,
        "RequestExpirationUTC": utc_plus(5),
        "OriginalReferenceId": original_ref,
        "OriginalAmount": original_data["amount"],
        "OriginalAuthorizationCode": original_data["authorization_code"],
        "OriginalAuditId": original_data["audit_id"],
        "OriginalDateTimeUTC": original_data["date_time_utc"]
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/VoidPreauthorization",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None", ...}
Request
EncVoidPreauth.cs
var body = new {
    Amount = amount,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o"),
    OriginalReferenceId = originalReferenceId,
    OriginalAmount = originalAmount,
    OriginalAuthorizationCode = originalAuthorizationCode,
    OriginalAuditId = originalAuditId,
    OriginalDateTimeUTC = originalDateTimeUTC
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/VoidPreauthorization", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, VerificationMethod, AuthorizationCode, ... }
Request
EncVoidPreauth.java
ObjectNode body = mapper.createObjectNode();
body.put("Amount", amount)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString())
    .put("OriginalReferenceId", originalReferenceId)
    .put("OriginalAmount", originalAmount)
    .put("OriginalAuthorizationCode", originalAuthorizationCode)
    .put("OriginalAuditId", originalAuditId)
    .put("OriginalDateTimeUTC", originalDateTimeUTC);
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/VoidPreauthorization", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"AUTH001",...}

CompleteAuthorization (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/CompleteAuthorization

Captures an encrypted pre-authorised transaction. The capture amount can equal or be less than the original pre-auth amount.

Request body
AmountNullable<Decimal>required
The total amount to be captured against the provided authorization. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
EntryModeStringconditional
The type of entry mode used to capture the account number provided. Required when using MobileDevice or MobileApplication authentication mode. Default value is ComputerOrder when using Server authentication mode. See EntryMode for definitions.
ExpirationDateStringconditional
The month and year of card expiration in MMYY or MMYYYY format. Required when submitting a transaction to a financial Host.
FeeTypeStringconditional
Specify if the client intends to choose the Fee Type. Needs to be set if using NPP Host, optional for other hosts. Values: Convenience, Surcharge, Service.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative. Should match the full amount requested on the original, not approved amount in the case of partial authorization.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) that was generated during authorization.
OriginalAuthorizationCodeStringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdStringconditional
The original ReferenceId of the authorization request.
AccountNumberAccountNumberoptional
Encrypted account number for the account being transacted.
AccountSecurityCodeEncryptionInfooptional
Encrypted security code for the supplied account.
CardProcIdStringoptional
The Card Processing Id.
ClientDispositionClientDispositionoptional
Specified when the client has already reached a final disposition for the request.
CredentialOnFileStringoptional
Specify if the client intends to save the card data or token returned for future payments. Values: Initial, Subsequent.
CurrencyCurrencyCodeoptional
The CurrencyCode. Default is ISO 4217 "USD".
CustomerAccountCustomerAccountoptional
The customer account address.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
FeeAmountNullable<Decimal>optional
The fee sub-amount added to the requested total.
FsaAmountsFsaAmountsoptional
FSA (Flexible Spending Account) / HSA (Health Saving Account) transactions amount.
FulfillmentDetailsOrderFulfillmentoptional
Details about the order fulfillment for Ecommerce transactions.
PINEncryptionInfooptional
Encrypted PIN for the supplied account.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypeStringoptional
The type of tender that is represented by the account number provided. Default value: Credit. See TenderType for definitions.
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
TokenCardTokenoptional
A Token for the account being transacted.
TokenRetrievalRequiredBooleanoptional
Whether or not a Token is required for downstream operations. Setting to true will fail the operation if a Token cannot be retrieved. Default: false.
TrackAccountNumberoptional
Encrypted track details read from the card for the account being transacted.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
ValidateAccountAddressBooleanoptional
Whether or not the customer account address information should be validated. Default: false.
ValidateAccountSecurityCodeBooleanoptional
Whether or not the security code for the account should be validated. Default: false.
Response fieldsAuthorization completed
HostResponseCodeStringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodeStringrequired
Response code returned by WebEPS.
ResponseMessageStringrequired
Response message returned by WebEPS.
VerificationMethodStringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AccountBillingAddressVerificationResultStringoptional
The account address validation result if validation was performed.
AccountNumberFirstSixStringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourStringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
AccountSecurityCodeValidationResultStringoptional
The account security code validation result if validation was performed.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodeStringoptional
Transaction authorization code.
AvailableBalanceDetailsICollection<AvailableBalanceInfo>optional
Collection of available balance information for the account.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdStringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the Transaction.
CreditToDebitConversionTypeStringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
ExpirationDateStringoptional
The card expiration date.
HostRetrievalNumberStringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodeStringoptional
Merchant Category Code (MCC).
MerchantIDStringoptional
Merchant ID.
NetworkIDStringoptional
Authorizer Network ID. It identifies the network which authorized the transaction.
PaymentAccountReferenceStringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberStringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedPaymentAdministration/CompleteAuthorization
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/CompleteAuthorization" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Amount": 9500,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 10000,
    "OriginalAuthorizationCode": "AUTH001",
    "OriginalAuditId": 456789,
    "OriginalDateTimeUTC": "2026-07-10T12:00:00.0000000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "ApprovedAmount": 9500,
            "AuthorizationCode": "CAP002",
            "AuditId": 567890,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Visa",
            "HostRetrievalNumber": "567890123456",
            "MerchantID": "MERCH001",
            "NetworkID": "NET01",
            "RetrievalReferenceNumber": "567890123456",
            "StoreNumber": 1,
            "Tokens": []
          }
Request
encCompleteAuth.js
async function encCompleteAuthorization(originalReferenceId, amount, originalData) {
  const body = {
    Amount: amount,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    OriginalReferenceId: originalReferenceId,
    OriginalAmount: originalData.amount,
    OriginalAuthorizationCode: originalData.authorizationCode,
    OriginalAuditId: originalData.auditId,
    OriginalDateTimeUTC: originalData.dateTimeUTC
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/CompleteAuthorization`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, ApprovedAmount, Tokens, ... }
Request
enc_complete_auth.py
def enc_complete_authorization(original_ref: str, amount: int, original_data: dict) -> dict:
    body = {
        "Amount": amount,
        "RequestExpirationUTC": utc_plus(5),
        "OriginalReferenceId": original_ref,
        "OriginalAmount": original_data["amount"],
        "OriginalAuthorizationCode": original_data["authorization_code"],
        "OriginalAuditId": original_data["audit_id"],
        "OriginalDateTimeUTC": original_data["date_time_utc"]
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/CompleteAuthorization",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None", "ApprovedAmount": 9500, ...}
Request
EncCompleteAuth.cs
var body = new {
    Amount = amount,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o"),
    OriginalReferenceId = originalReferenceId,
    OriginalAmount = originalAmount,
    OriginalAuthorizationCode = originalAuthorizationCode,
    OriginalAuditId = originalAuditId,
    OriginalDateTimeUTC = originalDateTimeUTC
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/CompleteAuthorization", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, VerificationMethod, AuthorizationCode, ApprovedAmount, Tokens, ... }
Request
EncCompleteAuth.java
ObjectNode body = mapper.createObjectNode();
body.put("Amount", amount)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString())
    .put("OriginalReferenceId", originalReferenceId)
    .put("OriginalAmount", originalAmount)
    .put("OriginalAuthorizationCode", originalAuthorizationCode)
    .put("OriginalAuditId", originalAuditId)
    .put("OriginalDateTimeUTC", originalDateTimeUTC);
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/CompleteAuthorization", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"CAP002",...}

VoidCompleteAuthorization (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization

Voids a captured encrypted authorization before settlement. Provide the reference ID from CompleteAuthorization.

Request body
AmountNullable<Decimal>required
The total amount to be voided. Non-zero, non-negative.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
EntryModestringconditional
The type of entry mode used to capture the account number provided. Required when using MobileDevice or MobileApplication authentication mode. Default value is ComputerOrder when using Server authentication mode.
OriginalAmountNullable<Decimal>conditional
The original amount of the referenced authorization request. Non-zero, non-negative.
OriginalAuditIdNullable<Int32>conditional
The original System Trace Audit Number (STAN) that was generated during authorization.
OriginalAuthorizationCodestringconditional
The original authorization code generated for the specified authorization.
OriginalDateTimeUTCNullable<DateTime>conditional
The original DateTime in UTC for the specified authorization. Format: yyyy-MM-ddTHH:mm:ss.fffffffZ.
OriginalReferenceIdstringconditional
The original ReferenceId of the authorization request.
CardProcIdstringoptional
The Card Processing Id.
CurrencyCurrencyCodeoptional
The CurrencyCode. Default is ISO 4217 "USD".
TenderTypestringoptional
The type of tender that is represented by the account number provided. Default value: Credit.
TipAmountNullable<Decimal>optional
The tip sub-amount of the original transaction.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsCapture voided
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the Transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID. It identifies the network which authorized the transaction.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
POST /v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \  -H "X-Signature: $SIGNATURE" \
  -d '{
    "Amount": 9500,
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "OriginalReferenceId": "c7b716bb-1234-5678-abcd-ef0123456789",
    "OriginalAmount": 9500,
    "OriginalAuthorizationCode": "CAP002",
    "OriginalAuditId": 567890,
    "OriginalDateTimeUTC": "2026-07-10T12:05:00.0000000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AuthorizationCode": "CAP002",
            "AuditId": 567891,
            "BusinessTransactionDate": "2026-07-10T12:06:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "StoreNumber": 1
          }
Request
encVoidCompleteAuth.js
async function encVoidCompleteAuthorization(originalReferenceId, amount, originalData) {
  const body = {
    Amount: amount,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString(),
    OriginalReferenceId: originalReferenceId,
    OriginalAmount: originalData.amount,
    OriginalAuthorizationCode: originalData.authorizationCode,
    OriginalAuditId: originalData.auditId,
    OriginalDateTimeUTC: originalData.dateTimeUTC
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, CardType, ... }
Request
enc_void_complete_auth.py
def enc_void_complete_authorization(original_ref: str, amount: int, original_data: dict) -> dict:
    body = {
        "Amount": amount,
        "RequestExpirationUTC": utc_plus(5),
        "OriginalReferenceId": original_ref,
        "OriginalAmount": original_data["amount"],
        "OriginalAuthorizationCode": original_data["authorization_code"],
        "OriginalAuditId": original_data["audit_id"],
        "OriginalDateTimeUTC": original_data["date_time_utc"]
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None", ...}
Request
EncVoidCompleteAuth.cs
var body = new {
    Amount = amount,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o"),
    OriginalReferenceId = originalReferenceId,
    OriginalAmount = originalAmount,
    OriginalAuthorizationCode = originalAuthorizationCode,
    OriginalAuditId = originalAuditId,
    OriginalDateTimeUTC = originalDateTimeUTC
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, VerificationMethod, AuthorizationCode, ... }
Request
EncVoidCompleteAuth.java
ObjectNode body = mapper.createObjectNode();
body.put("Amount", amount)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString())
    .put("OriginalReferenceId", originalReferenceId)
    .put("OriginalAmount", originalAmount)
    .put("OriginalAuthorizationCode", originalAuthorizationCode)
    .put("OriginalAuditId", originalAuditId)
    .put("OriginalDateTimeUTC", originalDateTimeUTC);
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/VoidCompleteAuthorization", mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"CAP002",...}

BalanceInquiry (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/BalanceInquiry

Queries the available balance for an encrypted card (e.g. prepaid or gift cards). The card PAN and security code must be encrypted using the session key.

Request body
AccountNumberEncryptionInforequired
Encrypted PAN object containing EncryptionType, EncryptionKeyId, EncryptionAlgorithm, EncryptionInitializationVector, and EncryptedValue.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected.
AccountSecurityCodeEncryptionInfoconditional
Encrypted CVV/security code. Required when ValidateAccountSecurityCode is true.
CardProcIdstringoptional
The Card Processing Id.
EntryModestringconditional
The type of entry mode used. Default: "ComputerOrder".
ExpirationDatestringoptional
Card expiry in MMYY or MMYYYY format.
TenderTypestringoptional
The type of tender: "Credit", "Debit", or "Gift". Default: "Credit".
ValidateAccountSecurityCodeBooleanoptional
Whether the account security code should be validated. Default: false.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsBalance returned
IsApprovedBooleanrequired
A flag indicating whether or not the inquiry was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AvailableBalanceNullable<Decimal>optional
Available balance in the smallest currency unit.
AccountNumberFirstSixstringoptional
The first six digits of the account number.
AccountNumberLastFourstringoptional
The last four digits of the account number.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number.
AccountSecurityCodeValidationResultstringoptional
The account security code validation result.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code.
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
ExpirationDatestringoptional
The card expiration date.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
AvailableBalanceDetailsICollection<AvailableBalanceInfo>optional
Collection of available balance information for the account.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedPaymentAdministration/BalanceInquiry
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/BalanceInquiry" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "AccountNumber": {
      "EncryptionType": "SessionKey",
      "EncryptionKeyId": "YOUR_KEY_ID",
      "EncryptionAlgorithm": "AES128",
      "EncryptionInitializationVector": "BASE64_IV==",
      "EncryptedValue": "BASE64_ENCRYPTED_PAN=="
    },
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "TenderType": "Gift",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",  "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AvailableBalance": 5000,
            "AuditId": 678901,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Gift",
            "MerchantID": "MERCH001",
            "StoreNumber": 1,
            "AccountNumberFirstSix": "603144",
            "AccountNumberLastFour": "5678"
          }
Request
encBalanceInquiry.js
async function encBalanceInquiry(encPan, keyId, tenderType, expiry) {
  const body = {
    AccountNumber: { EncryptionType: 'SessionKey', EncryptionKeyId: keyId,
      EncryptionAlgorithm: 'AES128',
      EncryptionInitializationVector: encPan.iv, EncryptedValue: encPan.data },
    TenderType: tenderType, EntryMode: 'ComputerOrder', ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/BalanceInquiry`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             AvailableBalance, CardType, ... }
Request
enc_balance_inquiry.py
def enc_balance_inquiry(enc_pan, key_id: str, tender_type: str, expiry: str) -> dict:
    body = {
        "AccountNumber": enc_obj(enc_pan["data"], enc_pan["iv"], key_id),
        "TenderType": tender_type, "EntryMode": "ComputerOrder",
        "ExpirationDate": expiry, "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/BalanceInquiry",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "AvailableBalance": 5000, ...}
Request
EncBalanceInquiry.cs
var body = new {
    AccountNumber = EncObj(encPan, panIv, keyId),
    TenderType = tenderType, EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/BalanceInquiry", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, AvailableBalance, ... }
Request
EncBalanceInquiry.java
ObjectNode body = mapper.createObjectNode();
body.set("AccountNumber", encryptedField(encPan, panIv, keyId));
body.put("TenderType", tenderType).put("EntryMode", "ComputerOrder")
    .put("ExpirationDate", expiry)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString());
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/BalanceInquiry",
    mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","AvailableBalance":5000,...}

VoiceAuthorize (Encrypted)

POST /v1.4/EncryptedPaymentAdministration/VoiceAuthorize

Submits a voice-authorized transaction for settlement. Used when a merchant has obtained a verbal approval code via phone and needs to record it for batch processing. The card PAN is encrypted.

Request body
AccountNumberEncryptionInforequired
Encrypted PAN object containing EncryptionType, EncryptionKeyId, EncryptionAlgorithm, EncryptionInitializationVector, and EncryptedValue.
AmountNullable<Decimal>required
Transaction amount. Non-zero, non-negative.
ApprovalCodestringrequired
Verbal approval code obtained from the issuer via phone.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected.
CardProcIdstringoptional
The Card Processing Id.
EntryModestringconditional
The type of entry mode used. Default: "ComputerOrder".
ExpirationDatestringoptional
Card expiry in MMYY or MMYYYY format.
IndustrySpecificInfostringoptional
Used to pass TAA information.
TaxAmountNullable<Decimal>optional
The tax sub-amount added to the requested total.
TenderTypestringoptional
The type of tender. Default: "Credit".
TipAmountNullable<Decimal>optional
The tip sub-amount added to the requested total.
Track1EncryptionInfooptional
Encrypted track1 details read from the card for the account being transacted.
Track2EncryptionInfooptional
Encrypted track2 details read from the card for the account being transacted.
Track3EncryptionInfooptional
Encrypted track3 details read from the card for the account being transacted.
Response fieldsVoice authorization recorded
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodestringrequired
Response code returned by WebEPS.
ResponseMessagestringrequired
Response message returned by WebEPS.
HostResponseCodestringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
VerificationMethodstringrequired
The type of verification required for the account used in the transaction. See AccountVerificationMethodType for definitions.
AccountNumberFirstSixstringoptional
The first six digits of the account number.
AccountNumberLastFourstringoptional
The last four digits of the account number.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number.
ApprovedAmountNullable<Decimal>optional
Total amount approved.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodestringoptional
Transaction authorization code (the original voice approval code).
BusinessTransactionDateNullable<DateTime>optional
Business Transaction Date.
CardProcIdstringoptional
The Card Processing Id.
CardTypeCardTypeoptional
The card type used for the transaction.
CreditToDebitConversionTypestringoptional
The type of Credit-to-Debit conversion performed, if any.
ExpirationDatestringoptional
The card expiration date.
HostRetrievalNumberstringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
MerchantCategoryCodestringoptional
Merchant Category Code (MCC).
MerchantIDstringoptional
Merchant ID.
NetworkIDstringoptional
Authorizer Network ID.
PaymentAccountReferencestringoptional
Payment Account Reference (PARNumber), if any.
RetrievalReferenceNumberstringoptional
Retrieval reference number returned by host.
StoreNumberNullable<Int32>optional
Store Number of the Company.
AvailableBalanceDetailsICollection<AvailableBalanceInfo>optional
Collection of available balance information for the account.
DataElementsICollection<TransactionDataElement>optional
Data elements associated with the account. Typically EMV tags.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedPaymentAdministration/VoiceAuthorize
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedPaymentAdministration/VoiceAuthorize" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "AccountNumber": {
      "EncryptionType": "SessionKey",
      "EncryptionKeyId": "YOUR_KEY_ID",
      "EncryptionAlgorithm": "AES128",
      "EncryptionInitializationVector": "BASE64_IV==",
      "EncryptedValue": "BASE64_ENCRYPTED_PAN=="
    },
    "Amount": 3000,
    "ApprovalCode": "VOICE123",
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z",
    "TenderType": "Credit",
    "EntryMode": "ComputerOrder",
    "ExpirationDate": "1240"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "VerificationMethod": "None",
            "AuthorizationCode": "VOICE123",
            "AuditId": 789012,
            "BusinessTransactionDate": "2026-07-10T12:05:00.000Z",
            "CardType": "Visa",
            "MerchantID": "MERCH001",
            "StoreNumber": 1,
            "ApprovedAmount": 3000,
            "AccountNumberFirstSix": "411111",
            "AccountNumberLastFour": "1111"
          }
Request
encVoiceAuthorize.js
async function encVoiceAuthorize(encPan, keyId, amount, expiry, approvalCode) {
  const body = {
    AccountNumber: { EncryptionType: 'SessionKey', EncryptionKeyId: keyId,
      EncryptionAlgorithm: 'AES128',
      EncryptionInitializationVector: encPan.iv, EncryptedValue: encPan.data },
    Amount: amount, ApprovalCode: approvalCode,
    TenderType: 'Credit', EntryMode: 'ComputerOrder', ExpirationDate: expiry,
    RequestExpirationUTC: new Date(Date.now() + 5*60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedPaymentAdministration/VoiceAuthorize`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             VerificationMethod, AuthorizationCode, AuditId, ApprovedAmount, ... }
Request
enc_voice_authorize.py
def enc_voice_authorize(enc_pan, key_id: str, amount: int,
                        expiry: str, approval_code: str) -> dict:
    body = {
        "AccountNumber": enc_obj(enc_pan["data"], enc_pan["iv"], key_id),
        "Amount": amount, "ApprovalCode": approval_code,
        "TenderType": "Credit", "EntryMode": "ComputerOrder",
        "ExpirationDate": expiry, "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedPaymentAdministration/VoiceAuthorize",
        headers=signed_headers(body), json=body)
    r.raise_for_status(); return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "VerificationMethod": "None", "AuthorizationCode": "VOICE123", ...}
Request
EncVoiceAuthorize.cs
var body = new {
    AccountNumber = EncObj(encPan, panIv, keyId),
    Amount = amount, ApprovalCode = approvalCode,
    TenderType = "Credit", EntryMode = "ComputerOrder",
    ExpirationDate = expiry,
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedPaymentAdministration/VoiceAuthorize", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, VerificationMethod, AuthorizationCode, ApprovedAmount, ... }
Request
EncVoiceAuthorize.java
ObjectNode body = mapper.createObjectNode();
body.set("AccountNumber", encryptedField(encPan, panIv, keyId));
body.put("Amount", amount).put("ApprovalCode", approvalCode)
    .put("TenderType", "Credit").put("EntryMode", "ComputerOrder")
    .put("ExpirationDate", expiry)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString());
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedPaymentAdministration/VoiceAuthorize",
    mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","VerificationMethod":"None","AuthorizationCode":"VOICE123",...}

GetTokensForAuthenticatedPaymentData (EncryptedToken)

POST /v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData

Exchanges an authenticated digital-wallet payment blob (Google Pay, Apple Pay) for a network payment token. The resulting token can be used in subsequent PaymentAdministration calls in place of a raw card number.

Request body
ApplicationSourceApplicationSourceoptional
Identifies the calling application source.
AuthenticatedPaymentDetailsAuthenticatedPaymentInfooptional
The authenticated payment data to be tokenized in encrypted format. All encrypted data is to be Base64 ASCII encoded.
RequestExpirationUTCNullable<DateTime>required
A UTC timestamp after which the message will be considered invalid and rejected. To prevent replay attack.
Response fieldsToken returned
HostResponseCodeStringrequired
Response code returned by host.
HostTypeNullable<Int32>required
The type of host that generated the response.
IsApprovedBooleanrequired
A flag indicating whether or not the transaction was approved.
ResponseCodeStringrequired
Response code returned by WebEPS.
ResponseMessageStringrequired
Response message returned by WebEPS.
AccountNumberFirstSixStringoptional
The first six digits of the account number that was validated.
AccountNumberLastFourStringoptional
The last four digits of the account number that was validated.
AccountNumberLengthNullable<Byte>optional
The total number of digits in the account number that was validated.
AuditIdNullable<Int32>optional
System Trace Audit Number (STAN).
AuthorizationCodeStringoptional
Transaction authorization code.
CardTypeCardTypeoptional
The card type used for the Transaction.
ExpirationDateStringconditional
The month and year of card expiration in MMYY or MMYYYY format. Required when submitting a transaction to a financial host.
HostRetrievalNumberStringoptional
Host retrieval number returned by host.
HostValuesDataMapoptional
Host-specific data map.
RetrievalReferenceNumberStringoptional
Retrieval reference number returned by host.
TokensICollection<Token>optional
Collection of generated token objects.
POST /v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData
Request
cURL
curl -X POST "$HPP_BASE/v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData" \
  -H "Content-Type: application/json" \
  -H "X-CompanyNumber: YOUR_COMPANY" \
  -H "X-StoreNumber: YOUR_STORE" \
  -H "X-ReferenceId: A1B2C3D4E5F6789012345678901234AB" \
  -H "X-Signature: $SIGNATURE" \
  -d '{
    "ApplicationSource": 1,
    "AuthenticatedPaymentDetails": {
      "AuthenticatedPaymentType": "GOOGLEPAY",
      "AuthenticatedPaymentBlob": "{\"signature\":\"...\",\"protocolVersion\":\"ECv2\",\"signedMessage\":\"...\"}"
    },
    "RequestExpirationUTC": "2026-07-10T12:05:00.000Z"
  }'
Response 200
JSON
{
            "IsApproved": true,
            "ResponseCode": "000",
            "ResponseMessage": "APPROVAL",
            "HostResponseCode": "00",
            "HostType": 1,
            "Tokens": [
              { "TokenType": "201", "TokenValue": "4111110123456789" }
            ],
            "AccountNumberFirstSix": "411111",
            "AccountNumberLastFour": "6789",
            "AccountNumberLength": 16,
            "AuditId": 678901,
            "AuthorizationCode": "TOK001",
            "CardType": "Visa",
            "ExpirationDate": "1228",
            "RetrievalReferenceNumber": "678901234567"
          }
Request
getTokens.js
async function getTokensForWallet(paymentType, paymentBlob) {
  const body = {
    ApplicationSource: 1,
    AuthenticatedPaymentDetails: {
      AuthenticatedPaymentType: paymentType, // 'GOOGLEPAY' | 'APPLEPAY'
      AuthenticatedPaymentBlob: JSON.stringify(paymentBlob)
    },
    RequestExpirationUTC: new Date(Date.now() + 5 * 60000).toISOString()
  };
  const res = await fetch(
    `${process.env.HPP_BASE}/v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData`,
    { method: 'POST', headers: signedHeaders(body), body: JSON.stringify(body) });
  return res.json();
}
// Response: { IsApproved, ResponseCode, ResponseMessage, HostResponseCode, HostType,
//             Tokens, AccountNumberLastFour, ExpirationDate, CardType, AuditId, ... }
Request
get_tokens.py
import json

def get_tokens_for_wallet(payment_type: str, payment_blob: dict) -> dict:
    body = {
        "ApplicationSource": 1,
        "AuthenticatedPaymentDetails": {
            "AuthenticatedPaymentType": payment_type,  # "GOOGLEPAY" | "APPLEPAY"
            "AuthenticatedPaymentBlob": json.dumps(payment_blob)
        },
        "RequestExpirationUTC": utc_plus(5)
    }
    r = requests.post(
        f"{os.environ['HPP_BASE']}/v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData",
        headers=signed_headers(body), json=body)
    r.raise_for_status()
    return r.json()
# Response: {"IsApproved": True, "ResponseCode": "000", "Tokens": [...], "CardType": "Visa", "AuditId": 678901, ...}
Request
GetTokens.cs
var body = new {
    ApplicationSource = 1,
    AuthenticatedPaymentDetails = new {
        AuthenticatedPaymentType = paymentType, // "GOOGLEPAY" | "APPLEPAY"
        AuthenticatedPaymentBlob = JsonSerializer.Serialize(paymentBlob)
    },
    RequestExpirationUTC = DateTime.UtcNow.AddMinutes(5).ToString("o")
};
var req  = BuildRequest(HttpMethod.Post,
    "/v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData", body);
var resp = await _http.SendAsync(req);
resp.EnsureSuccessStatusCode();
// Response: { IsApproved, ResponseCode, ResponseMessage, Tokens, CardType, AuditId, ExpirationDate, ... }
Request
GetTokens.java
ObjectNode details = mapper.createObjectNode()
    .put("AuthenticatedPaymentType", paymentType)
    .put("AuthenticatedPaymentBlob", mapper.writeValueAsString(paymentBlob));
ObjectNode body = mapper.createObjectNode()
    .put("ApplicationSource", 1)
    .put("RequestExpirationUTC", Instant.now().plusSeconds(300).toString());
body.set("AuthenticatedPaymentDetails", details);
HttpRequest req = buildSignedRequest(
    "/v1.4/EncryptedTokenAdministration/GetTokensForAuthenticatedPaymentData",
    mapper.writeValueAsString(body));
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
// Response: {"IsApproved":true,"ResponseCode":"000","Tokens":[...],"CardType":"Visa","AuditId":678901,...}

Payment status codes

Status codes are delivered via the PAYMENT_RETURN postMessage event as event.data.statusCode after the HPP iframe redirects to your ReturnURL. Only code 100 indicates a successful authorisation. For all other codes, do not call CompleteSession.

⚠️
Only call CompleteSession for statusCode 100For any code other than 100, the payment was not authorised. Calling CompleteSession with a non-100 code results in a 4xx error or unexpected behaviour.
CodeLabelDescriptionRecommended action
100 ✅ Success Payment authorised by card issuer. Ready to finalize. Call CompleteSession exactly once using stored SessionId. Navigate to order confirmation on success.
201 ⚠️ Cancelled Customer voluntarily cancelled payment. Show a cancellation message with a retry option. Do not call CompleteSession.
202 ❌ Network Error Connectivity failure occurred during the transaction. Payment state is uncertain. Ask user to check connection and retry. Consider calling ReverseTransaction("timeout") as a precaution.
203 ❌ Server Reject Transaction rejected by NCR server or card issuer declined. Log with X-ReferenceId. Show a generic decline message. Offer retry or alternative payment method.
204 ❌ Technical Error Internal technical error during processing. Log the error. Suggest retry. Contact NCR support if persistent.
205 ⚠️ Session Expired Session expired — more than 5 minutes (or configured TimeoutInMinutes) elapsed without completion. Re-call InitializeSession for a fresh session. Do not call CompleteSession.
206 ❌ External Error Error in an external dependency (card network or acquiring bank temporarily unavailable). Suggest retry in a few minutes. Log for support.
207 ❌ Invalid Request Payment request was malformed or contained invalid field values. Review your InitializeSession request body. Check required fields, types, and enum values.
208 ❌ Auth Failed 3DS authentication failed or customer could not complete card verification. Ask customer to try a different card. Do not call CompleteSession.
209 ⚠️ Timeout Payment request timed out waiting for authorisation response from the card network. Offer customer a retry. Consider calling ReverseTransaction("timeout") if there is a risk of duplicate authorisation.
EVENT PAYMENT_RETURN postMessage handler
postMessage listener
Browser — payment-return listener
window.addEventListener('message', (event) => {
  // Always verify origin before acting
  if (
    !event.origin.includes('ncrvoyix.com') &&
    event.origin !== window.location.origin
  ) return;

  const { messageType, height, statusCode } = event.data ?? {};

  if (messageType === 'PAGE_LOAD_COMPLETE') {
    setIframeLoaded(true);

  } else if (messageType === 'IFRAME_RESIZE') {
    if (height > 0) setIframeHeight(height);

  } else if (messageType === 'PAYMENT_RETURN') {
    handlePaymentReturn(statusCode);
  }
});

async function handlePaymentReturn(statusCode) {
  switch (statusCode) {
    case 100:
      // ✅ SUCCESS — call CompleteSession on your server
      await fetch('/api/payments/complete', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ sessionId })
      });
      navigate('/order-confirm');
      break;

    case 201:
      showMessage('Payment cancelled. You can try again.');
      break;

    case 205:
      showMessage('Session expired. Restarting payment…');
      await reinitializeSession();
      break;

    case 208:
      showMessage('Card authentication failed. Try another card.');
      break;

    default:
      showMessage(`Payment failed (code ${statusCode}). Contact support.`);
  }
}
ReturnURL page
Browser — /pay/return
// /pay/return — NCR redirects iframe here with ?statusCode=NNN
const params     = new URLSearchParams(window.location.search);
const statusCode = parseInt(params.get('statusCode') ?? '0', 10);

// Forward result to parent (CheckoutPage)
window.parent.postMessage(
  { messageType: 'PAYMENT_RETURN', statusCode },
  window.location.origin
);