> ## Documentation Index
> Fetch the complete documentation index at: https://primer.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Forter

Forter is a company that specializes in providing fraud prevention and detection solutions for online businesses.
It offers an integrated platform that uses advanced machine learning and behavioral analytics to help businesses identify and prevent fraud in real time.

Primer supports Forter’s Validation API.
The Validation API is used to receive Forter’s real-time fraud decision of whether to approve or decline an order when the customer transacts on your site.
The request should be sent either prior to calling your payment gateway for authorization of funds **(Pre-Authorization)** or immediately after receiving the authorization response from your payment gateway, but prior to capturing the funds **(Post-Authorization).**

<Note>
  See our [Fraud Overview](/payment-services/fraud-checks/overview/) for more general information about how we support fraud prevention.
</Note>

## What is supported?

### Actions

* Pre-authorization
* Post-authorization

### Resulting decisions

* `Pass`
* `Reject`
* `Fail`
* `3DS`
* `3DS Exemptions` <br /> If your workflow is configured to follow Forter's recommendation, please note that all 3DS exemptions recommended by Forter are processed as Transaction Risk Analysis (TRA) before the payment is sent to the processor. Learn more in our [3DS Exemptions page](/payment-services/3d-secure/exemptions).

### Payment methods

* Card
* Apple Pay
* Google Pay
* PayPal
* Klarna
* Alipay+
* WeChat
* Clearpay/Afterpay
* Blik
* Twint
* MobilePay
* Venmo
* Pix

## Instructions

### Pre-requisites

* To be able to receive 3DS decisions via the Forter Validation API, ask your account manager to enable the 3DS decision for your account
* In order to collect additional device data, Forter JS needs to be installed by you, the merchant, in your checkout application. During the flow, Forter’s JS will generate a token that you have to pass to Primer in the client session under **the field name `metadata.fraud_context.device_details.cookie_token`**

### Set-up Instructions

* Go to your [Primer Dashboard](https://dashboard.primer.io/).
* Navigate to the "Integrations" section, select "Add Integration" at the top of the page and search for **Forter**.
* Find your credentials in the Forter Dashboard by following the below steps:
  * Log into the Forter dashboard
  * Go to the Settings gear icon
  * Copy Secret Key and Site ID
* Follow the rest of the steps to set up [Primer Workflows for fraud checks](/payment-services/fraud-checks/overview).

### Test Instructions

You can simulate a specific outcome from Forter by setting a test customer email address:

| Scenario       | Email Address                                                                                       |
| -------------- | --------------------------------------------------------------------------------------------------- |
| Pass           | [approve@forter.com](mailto:approve@forter.com)                                                     |
| Reject         | [decline@forter.com](mailto:decline@forter.com)                                                     |
| 3DS            | [force\_3ds\_risk\_recommendation@forter.com](mailto:force_3ds_risk_recommendation@forter.com)      |
| 3DS exemptions | [force\_exemption\_tra@forter.com](mailto:force_exemption_tra@forter.com)                           |
| 3DS exemptions | [force\_exemption\_low\_value@forter.com](mailto:force_exemption_low_value@forter.com)              |
| 3DS exemptions | [force\_exemption\_tra\_emvco@forter.com](mailto:force_exemption_tra_emvco@forter.com)              |
| 3DS exemptions | [force\_exemption\_low\_value\_emvco@forter.com](mailto:force_exemption_low_value_emvco@forter.com) |
| Fail           | [notreview@forter.com](mailto:notreview@forter.com)                                                 |

Head over to [Forter's Test Cases page](https://docs.forter.com/test-cases) for more details. Although Forter's documentation mentions passing a card number, only the email address is needed to test the flow end-to-end.

### Required fields

#### For card payments

For card payments, the following fields have to be passed for Forter to accept the request.

| Field                                              | Type    |
| -------------------------------------------------- | ------- |
| `customer.billingAddress.firstName`                | string  |
| `customer.billingAddress.lastName`                 | string  |
| `customer.billingAddress.addressLine1`             | string  |
| `customer.billingAddress.countryCode`              | string  |
| `customer.billingAddress.city`                     | string  |
| `order.shipping.amount`                            | integer |
| `order.shipping.methodName`                        | string  |
| `order.lineItems[].name`                           | string  |
| `order.lineItems[].amount`                         | integer |
| `order.lineItems[].productType`                    | string  |
| `metadata.fraud_context.device_details.user_agent` | string  |
| `metadata.fraud_context.device_details.browser_ip` | string  |

#### For PayPal payments

For PayPal, pass the same fields as for card payments.

#### For Alipay+ payments

For Alipay+, pass the same fields as for card payments.

#### For WeChat payments

For WeChat, pass the same fields as for card payments.

#### For Klarna payments

For Klarna, pass the following fields.

| Field                                              | Type    |
| -------------------------------------------------- | ------- |
| `customer.billingAddress.firstName`                | string  |
| `customer.billingAddress.lastName`                 | string  |
| `customer.billingAddress.addressLine1`             | string  |
| `customer.billingAddress.countryCode`              | string  |
| `customer.billingAddress.city`                     | string  |
| `order.shipping.methodName`                        | string  |
| `order.lineItems[].name`                           | string  |
| `order.lineItems[].amount`                         | integer |
| `order.lineItems[].productType`                    | string  |
| `metadata.fraud_context.device_details.user_agent` | string  |
| `metadata.fraud_context.device_details.browser_ip` | string  |

Notes:

* Primer's integration with Klarna currently does not support
  passing `order.shipping.amount`.
* Passing a `customer.billingAddress` on your Client Session request that is different from
  the shopper address that is stored by Klarna, results in a failed payment attempt.

## Mapping

### Base mapping

| Forter                                                                    | Primer                                                                                       |
| ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `orderId`                                                                 | `payment.orderId`                                                                            |
| `orderType`                                                               | Derived from `payment.metadata.fraud_context.device_details.source`                          |
| `authorizationStep`                                                       | `PRE_AUTHORIZATION` or `POST_AUTHORIZATION`                                                  |
| `timeSentToForter`                                                        | Current time                                                                                 |
| `checkoutTime`                                                            | Current time                                                                                 |
| `connectionInformation.customerIP`                                        | `payment.metadata.fraud_context.device_details.browser_ip`                                   |
| `connectionInformation.userAgent`                                         | `payment.metadata.fraud_context.device_details.user_agent`                                   |
| `connectionInformation.merchantDeviceIdentifier`                          | `payment.metadata.fraud_context.device_details.device_id`                                    |
| `connectionInformation.forterTokenCookie`                                 | `payment.metadata.fraud_context.device_details.cookie_token`                                 |
| `totalAmount.currency`                                                    | `payment.currencyCode`                                                                       |
| `totalAmount.amountUSD` or `amountLocalCurrency`                          | `payment.amount`                                                                             |
| `cartItems[].basicItemData.name`                                          | `payment.order.lineItems[].name`                                                             |
| `cartItems[].basicItemData.quantity`                                      | `payment.order.lineItems[].quantity`                                                         |
| `cartItems[].basicItemData.type`                                          | `payment.order.lineItems[].productType`                                                      |
| `cartItems[].basicItemData.price.currency`                                | `payment.currencyCode`                                                                       |
| `cartItems[].basicItemData.price.amountUSD` or `amountLocalCurrency`      | `payment.order.lineItems[].amount`                                                           |
| `cartItems[].basicItemData.productId`                                     | `payment.order.lineItems[].name`                                                             |
| `cartItems[].itemSpecificData.physicalGoods.color`                        | `payment.order.lineItems[].productData.color` <br /> Only if the product type is `PHYSICAL`  |
| `cartItems[].itemSpecificData.physicalGoods.weight`                       | `payment.order.lineItems[].productData.weight` <br /> Only if the product type is `PHYSICAL` |
| `primaryDeliveryDetails.deliveryMethod`                                   | `payment.order.shipping.methodName`                                                          |
| `primaryDeliveryDetails.deliveryPrice.currency`                           | `payment.currencyCode`                                                                       |
| `primaryDeliveryDetails.deliveryPrice.amountUSD` or `amountLocalCurrency` | `payment.order.shipping.amount`                                                              |
| `primaryDeliveryDetails.deliveryType`                                     | `PHYSICAL`, `DIGITAL`, or `HYBRID` depending on the product types                            |
| `primaryDeliveryDetails.deliveryType`                                     | `PHYSICAL`, `DIGITAL`, or `HYBRID` depending on the product types                            |
| `primaryRecipient.personalDetails.firstName`                              | `payment.customer.shippingAddress.firstName`                                                 |
| `primaryRecipient.personalDetails.lastName`                               | `payment.customer.shippingAddress.lastName`                                                  |
| `primaryRecipient.personalDetails.email`                                  | `payment.customer.emailAddress`                                                              |
| `primaryRecipient.address.address1`                                       | `payment.customer.shippingAddress.addressLine1`                                              |
| `primaryRecipient.address.address2`                                       | `payment.customer.shippingAddress.addressLine2`                                              |
| `primaryRecipient.address.zip`                                            | `payment.customer.shippingAddress.postalCode`                                                |
| `primaryRecipient.address.city`                                           | `payment.customer.shippingAddress.city`                                                      |
| `primaryRecipient.address.region`                                         | `payment.customer.shippingAddress.state`                                                     |
| `primaryRecipient.address.country`                                        | `payment.customer.shippingAddress.countryCode`                                               |
| `accountOwner.email`                                                      | `payment.customer.emailAddress`                                                              |
| `accountOwner.accountId`                                                  | `payment.customerId`                                                                         |
| `accountOwner.firstName`                                                  | `payment.customer.firstName` (or taken from the billing/shipping address if unavailable)     |
| `accountOwner.lastName`                                                   | `payment.customer.lastName` (or taken from the billing/shipping address if unavailable)      |
| `additionalIdentifiers.merchant`                                          | `payment.metadata.fraud_context.merchant_details.merchant_provider_id`                       |
| `additionalIdentifiers.merchant`                                          | `payment.metadata.fraud_context.merchant_details.merchant_name`                              |
| `payment[0].amount.currency`                                              | `payment.currencyCode`                                                                       |
| `payment[0].amount.amountUSD` or `amountLocalCurrency`                    | Calculated from the order items                                                              |
| `payment[0].billingDetails.personalDetails.firstName`                     | `payment.customer.billingAddress.firstName`                                                  |
| `payment[0].billingDetails.personalDetails.lastName`                      | `payment.customer.billingAddress.lastName`                                                   |
| `payment[0].billingDetails.personalDetails.email`                         | `payment.customer.emailAddress`                                                              |
| `payment[0].billingDetails.address.address1`                              | `payment.customer.billingAddress.addressLine1`                                               |
| `payment[0].billingDetails.address.address2`                              | `payment.customer.billingAddress.addressLine2`                                               |
| `payment[0].billingDetails.address.zip`                                   | `payment.customer.billingAddress.postalCode`                                                 |
| `payment[0].billingDetails.address.city`                                  | `payment.customer.billingAddress.city`                                                       |
| `payment[0].billingDetails.address.region`                                | `payment.customer.billingAddress.state`                                                      |
| `payment[0].billingDetails.address.country`                               | `payment.customer.billingAddress.countryCode`                                                |

### Card

| Forter                                  | Primer                |
| --------------------------------------- | --------------------- |
| `payment[0].creditCard.lastFourDigits`  | Card last four digits |
| `payment[0].creditCard.expirationMonth` | Card expiry month     |
| `payment[0].creditCard.expirationYear`  | Card expiry year      |
| `payment[0].creditCard.nameOnCard`      | Cardholder name       |
| `payment[0].creditCard.bin`             | Card first six digits |

### Apple Pay

| Forter                                  | Primer                |
| --------------------------------------- | --------------------- |
| `payment[0].applePay.lastFourDigits`    | Card last four digits |
| `payment[0].applePay.expirationMonth`   | Card expiry month     |
| `payment[0].applePay.expirationYear`    | Card expiry year      |
| `payment[0].applePay.nameOnCard`        | Cardholder name       |
| `payment[0].applePay.bin`               | Card first six digits |
| `payment[0].applePay.token`             | Token                 |
| `payment[0].applePay.cardBrand`         | Card network          |
| `payment[0].applePay.countryOfIssuance` | Issuer country code   |

### Google Pay

| Forter                                   | Primer                |
| ---------------------------------------- | --------------------- |
| `payment[0].googlePay.lastFourDigits`    | Card last four digits |
| `payment[0].googlePay.expirationMonth`   | Card expiry month     |
| `payment[0].googlePay.expirationYear`    | Card expiry year      |
| `payment[0].googlePay.nameOnCard`        | Cardholder name       |
| `payment[0].googlePay.bin`               | Card first six digits |
| `payment[0].googlePay.token`             | Token                 |
| `payment[0].googlePay.cardBrand`         | Card network          |
| `payment[0].googlePay.countryOfIssuance` | Issuer country code   |

### PayPal

| Forter                              | Primer                      |
| ----------------------------------- | --------------------------- |
| `payment[0].paypal.payerID`         | External Payer ID           |
| `payment[0].paypal.payerEmail`      | PayPal email address        |
| `payment[0].paypal.paymentMethod`   | `Instant Transfer`          |
| `payment[0].paypal.paymentId`       | PayPal Order ID             |
| `payment[0].paypal.authorizationId` | PayPal Billing Agreement ID |
| `payment[0].paypal.paymentStatus`   | PayPal Payment Status       |

### Digital Wallets

<Note>
  This applies to Klarna, WeChat, Alipay+, Clearpay/Afterpay, Vipps, iDeal, Blik, Twint, MobilePay, Venmo, and Pix.
</Note>

| Forter                                                                         | Primer                                                       |
| ------------------------------------------------------------------------------ | ------------------------------------------------------------ |
| `payment[0].digitalWallet.digitalWalletName`                                   | Name of the payment method or `OTHER`                        |
| `payment[0].digitalWallet.freeTextDigitalWalletName`                           | Name of the payment method if `digitalWalletName` is `OTHER` |
| `payment[0].digitalWallet.underlyingPaymentMethod.underlyingPaymentMethodType` | `UNKNOWN`                                                    |
| `payment[0].installmentService.serviceName`                                    | Only for Clearpay/Afterpay                                   |

### Custom field mapping

You can use [Advanced Metadata Mapper](/payment-services/advanced-metadata-mapper) with Forter to map any metadata field to Forter's requests.
