Skip to main content

Non-Payment Authentication (NPA)

Non-Payment Authentication (NPA) is a 3D Secure 2 authentication flow (3DS2) that allows merchants to verify the cardholder and save the data without charging the card.

Unlike a traditional payment, where 3DS authentication and the financial transaction occur simultaneously, with NPA the process is limited to the authentication phase alone.
The result is an authenticated card token that can be used for subsequent transactions (e.g., recurring payments or one-click payments).

Non-Payment Authentication

When to use NPA

NPA is recommended in the following scenarios:

  • Card tokenization during registration, prior to a purchase
  • Cardholder verification without requesting a payment
NPA does not charge any amounts

The NPA flow does not generate any financial transactions.
To make a payment, you must initiate a new transaction.


Backoffice Configuration

To receive 3DS authentication details at the end of the transaction, you must enable the ThreeDS field in the Gestpay backoffice.
Without this configuration, NPA transactions will function correctly but will not return 3DS information.

Configuration path: Payment Page → Fields & Parameters → ThreeDS

Available settings:

  • No Display → integrations that do not use the Fabrick payment page
  • Payment Page → integrations that use the Fabrick payment page

Non-Payment Authentication

For both configurations, you must enable the threeDS field in the Fields & Parameters section.

Non-Payment Authentication

Integration Flow

The NPA flow is supported by all integration types offered by Fabrick.

Supported Integrations

HPPO
Pay By Link
Lightbox
API Only

Initializing the NPA Request

To initiate an NPA flow, you must make a payment/create call on the server side, setting the following parameters:

  • amount to 0 to avoid charging any amount.
  • transDetails.type set to NPA to instruct the system to process the transaction as authentication only
  • paymentType set to [“CREDITCARD”] to instruct the system to display only the credit card form on the payment page.
  • requestToken set to MASKEDPAN.
payment page

The paymentType parameter is not required in API Only integrations, where the card form is managed directly by the merchant.

token

The requestToken parameter allows you to obtain a token for the authenticated card to be used for future transactions.
See Tokenizzazione.

Request

POST /api/v1/payment/create
Host (sandbox): sandbox.gestpay.net
Host (production): ecomms2s.sella.it
Authorization: apikey ****************
Content-Type: application/json
{
"shopLogin": "GESPAY12345",
"amount": "0", //no charge
"currency": "EUR",
"shopTransactionID": "FBK_OrderID",
"paymentType": ["CREDITCARD"], //display card information entry page
"requestToken": "MASKEDPAN", //card token request
"transDetails": {
"type": "NPA" //authentication-only transaction
}

Response

{
"error": {
"code": "0",
"description": "request correctly processed"
},
"payload": {
"paymentToken": "d3026f8c-88e3-4862-a962-c0fa29e0f266",
"paymentID": "2423879934511",
"userRedirect": null,
"qrCode": null
}
}

3DS Authentication Process

For all hosted integrations, the authentication phase is handled directly by Fabrick.

In API-only integrations, the merchant must manually handle the authentication phase by redirecting the buyer to the URL returned after the card data is submitted.

After the card data is submitted, the system returns error 8006 in the payload.transactionErrorCode field, indicating that buyer authentication must be completed.

The authentication URL is available in the payload.userRedirect.href field.

Transaction Details

At the end of the flow, Fabrick returns the authentication result and the card token.

For more details, see the section Transaction Details and Payment Notification of the integration specification used

To verify the complete authentication details, you can use the GET payment/detail endpoint, passing the paymentID.

Request

GET /api/v1/payment/detail/{paymentID}
Host (sandbox): sandbox.gestpay.net
Host (production): ecomms2s.sella.it
Authorization: apikey ****************
Content-Type: application/json

Response

{
"error": {
"code": "0",
"description": "request correctly processed"
},
"payload": {
"transactionType": "detail",
"transactionResult": "AUTHENTICATED",
"transactionState": "",
"transactionErrorCode": "",
"transactionErrorDescription": "",
"bankTransactionID": "1318",
"shopTransactionID": "",
"shopTransactionID_2": "",
"authorizationCode": "",
"paymentID": "",
"currency": "",
"country": "",
"company": "",
"tdLevel": "",
"threeDS": {
"authenticationResult": {
"authenticationLevel": "2C",
"authenticationStatus": "Y",
"authStatusReason": "",
"challengeResultTransStatus": "",
"XID": "87dc52d7-a059-4afa-8763-bf4a86e3ede9",
"AV": "MTIzNDU2Nzg5MDA5ODc2NTQzMjE=",
"ECI": "05",
"AVAlgorithm": "",
"threeDsVersion": "2.1.0"
},
"transDetails": {
"authData": "",
"authMethod": "02",
"authTimeStamp": "202504281041",
"acsID": "bc7007fe-45fc-471d-999e-d6111951999e"
}
},
"events": null,
"buyer": null,
"risk": null,
"customInfo": null,
"alertCode": "",
"alertDescription": "",
"cvvPresent": "",
"dcc": null,
"maskedPAN": "",
"paymentMethod": "",
"productType": "",
"token": "40G5KMXUQQ613101",
"tokenExpiryMonth": "05",
"tokenExpiryYear": "27",
"tokenDetails": {
"TokenValue": "40G5KMXUQQ613101",
"TokenExpiryMonth": "05",
"TokenExpiryYear": "27",
"TokenProvider": "AXERVE",
"CardDetails": {
"CardSuffix": "3101",
"CardExpiryMonth": "05",
"CardExpiryYear": "27",
"CardHolderName": null
},
"CardAssets": {
"CardArt": {
"Type": null,
"MediaContents": null,
"Height": null,
"Width": null
},
"BrandLogo": {
"Type": null,
"MediaContents": null,
"Height": null,
"Width": null
}
}
},
"fraudPrevention": null,
"automaticOperation": null
}
}

In the response, the fields relevant to an NPA flow are:

FieldDescription
transactionResultAuthentication result: AUTHENTICATED / DECLINED
threeDS.authenticationResult.authenticationLevel3DS authentication level
threeDS.authenticationResult.authenticationStatusAuthentication status
threeDS.authenticationResult.authStatusReasonResult reason code
threeDS.authenticationResult.ECIElectronic Commerce Indicator, populated only in case of a positive result
tokenDetails.TokenValueCard token
tokenDetails.TokenExpiryMonth / tokenDetails.TokenExpiryYearToken expiration
Handling negative results in NPA

NPA transactions with a negative result return transactionResult: “DECLINED” and provide the error details in the authenticationStatus and authStatusReason fields.


Authentication Details and Error Handling

authenticationLevel

The authenticationLevel field indicates the type of 3DS authentication flow applied to the transaction

ValueDescription
1H3DS 1.0 half — Partial 3DS 1.0 authentication.
1F3DS 1.0 full — Full 3DS 1.0 authentication.
2F3DS 2.0 frictionless — 3DS 2.0 authentication without buyer interaction.
2C3DS 2.0 challenge — 3DS 2.0 authentication with challenge completed by the buyer.
2E3DS 2.0 exemption — 3DS 2.0 authentication with exemption applied.
OLOne leg — Transaction processed as a one-leg transaction; authentication not required.
TRExternal TRA — Transaction processed as an external Transaction Risk Analysis (TRA).
NANo authentication — No authentication performed.

authenticationStatus

The authenticationStatus field indicates the outcome of the authentication.

ValueDescription
YFrictionlessthe issuer has successfully authenticated the buyer without requiring any explicit interaction. Authentication is considered successfully completed, and the transaction may proceed.
CChallengethe issuer requires verification of the buyer. The buyer must complete authentication via the challenge, using the URL provided in the payload.userRedirect.href field. The outcome of the transaction will depend on the result of the challenge.
NNot Authenticatedthe issuer decides not to grant buyer authentication based on its own risk assessments. In this scenario, the challenge phase is not initiated, as authentication is not authorized by the issuer. The transaction therefore ends with a negative outcome.
UAuthentication Could Not Be Performed — authentication cannot be performed due to a technical error at the Directory Server (DS) or Access Control Server (ACS). From the transactional flow perspective, the outcome is handled as N.
AAttempted to Authenticate — authentication was attempted but not completed (e.g., due to technical or channel limitations), while allowing the process to continue. The result is treated as Y for the purposes of the flow and liability.
RRejectedthe issuer explicitly rejects the authentication request. Authentication is not completed, and the result is handled as N, resulting in a failed transaction.

authStatusReason

The authStatusReason field specifies the reason for the result returned by the issuer or the ACS. If authenticationStatus: N or U, this field provides a numeric code that identifies the specific cause of the rejection or the inability to authenticate.

CodeDescription
01Card authentication failed
02Unknown Device
03Unsupported Device
04Exceeds authentication frequency limit
05Expired card
06Invalid card number
07Invalid transaction
08No Card record
09Security failure
10Stolen card
11Suspected fraud
12Transaction not permitted for cardholder
13Cardholder not enrolled in service
14Transaction timed out at the ACS
15Low confidence
16Medium confidence
17High confidence
18Very High confidence
19Exceeds ACS maximum challenges
20Non-Payment transaction not supported
213RI transaction not supported
22ACS technical issue
23Decoupled Authentication required by ACS but not requested by 3DS Requestor
243DS Requestor Decoupled Max Expiry Time exceeded
25Decoupled Authentication was provided insufficient time to authenticate cardholder
26Authentication attempted but not performed by the cardholder
27Preferred authentication method not supported
28–79Riservati per uso futuro EMVCo (valori non validi fino a definizione EMVCo)
80–99Riservati per uso del Directory Server (DS)

Below is an example of a payment/detail response with a negative result DECLINED, in which transactionErrorCode and transactionErrorDescription are empty and the cause of the error can be determined from authenticationStatus and authStatusReason:

Request

GET /api/v1/payment/detail/{paymentID}
Host (sandbox): sandbox.gestpay.net
Host (production): ecomms2s.sella.it
Authorization: apikey ****************
Content-Type: application/json

Response

{
"error": {
"code": "0",
"description": "request correctly processed"
},
"payload": {
"transactionType": "detail",
"transactionResult": "DECLINED",
"transactionState": "",
"transactionErrorCode": "",
"transactionErrorDescription": "",
"threeDS": {
"authenticationResult": {
"authenticationLevel": "2C",
"authenticationStatus": "N",
"authStatusReason": "19",
"XID": "29797f4c-52c7-404e-8ce5-6e17d946e38d",
"AV": "",
"ECI": null,
"threeDsVersion": "2.1.0"
},
"transDetails": {
"authMethod": "02",
"authTimeStamp": "202504281129",
"acsID": "96be2efb-3f2d-49c5-93f5-c8d7e9ec0107"
}
},
"token": "40G5KMXUQQ613101",
"tokenExpiryMonth": "05",
"tokenExpiryYear": "27"
}
}

In this example, authenticationLevel: “2C” indicates that the 3DS2 with challenge flow was requested for the transaction; this value describes the type of flow, not the outcome of the authentication.

authenticationStatus: “N” indicates that authentication was denied, while authStatusReason: ‘19’ specifies the cause “Exceeds ACS maximum challenges” — the maximum number of challenges allowed by the ACS has been exceeded.