Level 2 and 3 Processing

Required Fields

Level 2 dataAnchorIcon

To qualify for Level 2 processing on a given transaction, include the following fields in the Transaction: Sale call:

Interchange rates for Level 2 dataAnchorIcon

The values you pass in the required Level 2 fields determine whether you qualify for lower interchange rates or not. US merchants must pass a TaxAmount between 0.1% and 22% for Visa transactions, and between 0.1% and 30% for Mastercard transactions.

TaxExempt transactions may not qualify for reduced L2 rates, but they could still be eligible for L3 rates.

Creating a transactionAnchorIcon

Here's a full example with the required fields for Level 2:
  1. C#
TransactionRequest request = new TransactionRequest {
    Amount = 100.00M,
    PaymentMethodNonce = nonceFromTheClient,
    PurchaseOrderNumber = "12345",
    TaxAmount = 5.00M
};

gateway.Transaction.Sale(request);

Level 3 dataAnchorIcon

To qualify for Level 3 processing on a given transaction, you must pass Level 2 data, along with specific additional Level 3 data and line items. Line items are similar to the details you would find on an itemized invoice.

When you create a transaction, include the following fields in the Transaction: Sale call:

Supported charactersAnchorIcon

To ensure all line items appear as expected on the cardholder's statement, use only a-z, A-Z, 0-9, ', ., -, and spaces in the following fields:

Line items that contain other characters may still qualify for Level 3 processing, but unsupported characters will be converted to a space on the cardholder's statement.

Amount validationAnchorIcon

Each processor verifies that the total of the line item amounts matches the root transaction amount. If there's a discrepancy, the transaction may be declined. To ensure these amounts match, it's advisable to sum the per-item tax, subtotal amounts, shipping tax, and shipping amount to calculate the total transaction amount. In the EU and UK regions, transactions with a non-zero shipping amount may be rejected if the shipping tax amount is zero. Below is an example for validating the amounts in Ruby.

Creating a transactionAnchorIcon

Below is a full example using the minimum required fields for Level 3:
  1. C#
TransactionRequest request = new TransactionRequest {
    Amount = 100.00M,
    PaymentMethodNonce = nonceFromTheClient,
    PurchaseOrderNumber = "12345",
    TaxAmount = 5.00M,
    TaxExempt = false,
    ShippingAmount = 1.00M,
    ShippingTaxAmount = 0.1M,
    DiscountAmount = 0.00M,
    ShipsFromPostalCode = "60654",
    ShippingAddress = new AddressRequest {
        FirstName = "Clinton",
        LastName = "Ecker",
        StreetAddress = "1234 Main Street",
        ExtendedAddress = "Unit 222",
        Locality = "Chicago",
        Region = "IL",
        PostalCode = "60654",
        CountryCodeAlpha3 = "USA"
    },
    LineItems = new TransactionLineItemRequest[] {
        new TransactionLineItemRequest {
            Name = "Product",
            LineItemKind = TransactionLineItemKind.DEBIT,
            Quantity = 10.0000M,
            UnitAmount = 9.5000M,
            UnitOfMeasure = "unit",
            TotalAmount = 95.00M,
            TaxAmount = 5.00M,
            DiscountAmount = 0.00M,
            ProductCode = "54321",
            CommodityCode = "98765"
        }
    }
};

gateway.Transaction.Sale(request);

Specifying level 2 and 3 data when submitting for settlementAnchorIcon

Availability
Level 2 and 3 processing via submit for settlement requires internal approval. Please contact us if you’re interested in this functionality.
In some cases, transaction amounts, and by extension Level 2 and 3 parameters, are not finalized until the transaction is ready to be submitted for settlement. This functionality allows you to apply Level 2 and 3 parameters when submitting a transaction for settlement instead of specifying them in the transaction sale call.
Note
Level 2 and 3 data provided via submit for settlement will override all Level 2 and 3 data previously provided in a sale request. If you wish to pass Level 2 and 3 data, we recommend utilizing either transaction.sale or transaction.submit_for_settlement, but not both at the same time.
  1. C#
TransactionRequest submitForSettlementRequest = new TransactionRequest {
    PurchaseOrderNumber = "12345",
    TaxAmount = 5.00M,
    TaxExempt = false,
    ShippingAmount = 1.00M,
    ShippingTaxAmount = 0.1M,
    DiscountAmount = 0.00M,
    ShipsFromPostalCode = "60654",
    LineItems = new TransactionLineItemRequest[] {
        new TransactionLineItemRequest {
            Name = "Product",
            LineItemKind = TransactionLineItemKind.DEBIT,
            Quantity = 10.0000M,
            UnitAmount = 9.5000M,
            UnitOfMeasure = "unit",
            TotalAmount = 95.00M,
            TaxAmount = 5.00M,
            DiscountAmount = 0.00M,
            ProductCode = "54321",
            CommodityCode = "98765"
        }
    }
};

Result<transaction> result = gateway.Transaction.SubmitForSettlement(
    "the_transaction_id",
    submitForSettlementRequest
);

if (result.IsSuccess()) {
    var transaction = result.Target;
} else {
    System.Console.WriteLine(result.Message);
}

Validation errorsAnchorIcon

A transaction result may contain validation errors specifically for Level 3 fields or transaction line items, but only if the format or length of the value is outside expected bounds. This is to ensure the additional fields minimally interfere with the successful submission of transactions.

For a list of errors, see the Validation Errors reference page.

If you accept cookies, we’ll use them to improve and customize your experience and enable our partners to show you personalized PayPal ads when you visit other sites. Manage cookies and learn more