Skip to content
payrocdevelopers

Enhanced data

Explains how to add enhanced data to card payments and qualify for lower interchange rates.

To qualify for lower interchange rates in a business-to-business (B2B) or a business-to-government (B2G) card payment, merchants can add enhanced data to their payments.

Enhanced data is additional information about a transaction beyond the amount and card details. Mastercard, Visa, and American Express offer programs that give merchants lower interchange rates based on the amount of enhanced data the merchant provides.

ProgramCard brandEnhanced data
Level 2Mastercard and American ExpressTax amount and purchase order (PO) number. American Express also requires some line-item details.
Level 3MastercardDetails about each item, shipping information, duty amount, tax amount, and PO number.
Commercial Enhanced Data Program (CEDP)VisaDetails about each item, shipping information, duty amount, tax amount, and PO number.

Note: Card brands can update their requirements at any time. Even if you send all the required information, Payroc can't guarantee that the transaction qualifies for a program.

Things to consider

  • Your processing terminal must support enhanced data.
  • Enhanced data applies only to commercial credit cards, for example, business cards and purchasing cards.
  • Enhanced data isn't available for all merchant category codes (MCCs).
  • Merchants must apply to American Express before they can qualify for Level 2.
  • American Express supports up to 4 line-items for each transaction.
  • Mastercard and Visa support up to 50 line-items for each transaction.
  • TSYS and FDRC terminals support tax-exempt transactions.

Level 2

To qualify for Level 2, you need to add the following information to your payment request:

  • PO number
  • Tax amount
  • Subtotal

Note: American Express also requires some line-item details, for example, a description and a price for each unit.

The following table shows the API parameters you need to send in the Create Payment request to qualify for Level 2:

InformationAPI parameters
PO numbercustomer.referenceNumber
Taxorder.breakdown.taxes[].name order.breakdown.taxes[].amount order.breakdown.taxes[].taxRate
Subtotalorder.breakdown.subtotal
Line-item details (American Express only)order.breakdown.items[].productCode order.breakdown.items[].description order.breakdown.items[].unitOfMeasure order.breakdown.items[].unitPrice order.breakdown.items[].quantity

Example request

Mastercard

JSON
{
  "channel": "moto",
  "processingTerminalId": "1234001",
  "operator": "Jane",
  "autoCapture": true,
  "customer": {
    "referenceNumber": "CustomerCode234567"
  },
  "order": {
    "orderId": "OrderRef6543",
    "amount": 4564,
    "currency": "USD",
    "breakdown": {
      "subtotal": 4347,
      "taxes": [
        {
          "type": "amount",
          "name": "Sales Tax",
          "amount": 217
        }
      ]
    }
  },
  "paymentMethod": {
    "type": "card",
    "cardDetails": {
      "entryMethod": "keyed",
      "keyedData": {
        "dataFormat": "plainText",
        "cardNumber": "5001650000000000",
        "expiryDate": "1230",
        "cvv": "234"
      },
      "cardholderName": "Sarah Hazel Hopper"
    }
  }
}

American Express

JSON
{
  "channel": "moto",
  "processingTerminalId": "1234001",
  "operator": "Jane",
  "autoCapture": true,
  "customer": {
    "referenceNumber": "CustomerCode234567"
  },
  "order": {
    "orderId": "OrderRef6543",
    "amount": 2899,
    "currency": "USD",
    "breakdown": {
      "subtotal": 2709,
      "taxes": [
        {
          "type": "amount",
          "name": "Sales Tax",
          "amount": 190
        }
      ],
      "items": [
        {
          "productCode": "PZA-001-LG",
          "description": "Large Pepperoni Pizza",
          "unitOfMeasure": "EA",
          "unitPrice": 2709,
          "quantity": 1
        }
      ]
    }
  },
  "paymentMethod": {
    "type": "card",
    "cardDetails": {
      "entryMethod": "keyed",
      "keyedData": {
        "dataFormat": "plainText",
        "cardNumber": "378282246310005",
        "expiryDate": "1230",
        "cvv": "234"
      },
      "cardholderName": "Sarah Hazel Hopper"
    }
  }
}

Level 3

To qualify for Level 3, you need to add all the information from Level 2 and the following information to your payment request:

  • Shipping information
  • Line-item details
  • Duty amount

The following table shows the API parameters you need to send in the Create Payment request to qualify for Level 3:

InformationAPI parameters
PO numbercustomer.referenceNumber
Taxorder.breakdown.taxes[].name order.breakdown.taxes[].amount order.breakdown.taxes[].taxRate
Subtotalorder.breakdown.subtotal
Shipping informationcustomer.shippingAddress.recipientName customer.shippingAddress.address order.breakdown.freightAmount
Line-item detailsorder.breakdown.items[].commodityCode order.breakdown.items[].productCode order.breakdown.items[].description order.breakdown.items[].unitOfMeasure order.breakdown.items[].unitPrice order.breakdown.items[].quantity order.breakdown.items[].discountRate order.breakdown.items[].taxes[].name order.breakdown.items[].taxes[].amount order.breakdown.items[].taxes[].taxRate
Duty amountorder.breakdown.dutyAmount

Example request

JSON
{
  "channel": "moto",
  "processingTerminalId": "1234001",
  "operator": "Jane",
  "autoCapture": true,
  "customer": {
    "referenceNumber": "CustomerCode234567",
    "shippingAddress": {
      "recipientName": "Sarah Hazel Hopper",
      "address": {
        "address1": "2 Example Ave.",
        "city": "Chicago",
        "state": "Illinois",
        "country": "US",
        "postalCode": "60056"
      }
    }
  },
  "order": {
    "orderId": "OrderRef6543",
    "amount": 4899,
    "currency": "USD",
    "breakdown": {
      "subtotal": 2709,
      "freightAmount": 1500,
      "dutyAmount": 500,
      "taxes": [
        {
          "type": "amount",
          "name": "Sales Tax",
          "amount": 190
        }
      ],
      "items": [
        {
          "commodityCode": "5812-0111",
          "productCode": "PZA-001-LG",
          "description": "Large Pepperoni Pizza",
          "unitOfMeasure": "EA",
          "unitPrice": 2709,
          "quantity": 1,
          "discountRate": 5.0,
          "taxes": [
            {
              "type": "amount",
              "name": "Sales Tax",
              "amount": 190
            }
          ]
        }
      ]
    }
  },
  "paymentMethod": {
    "type": "card",
    "cardDetails": {
      "entryMethod": "keyed",
      "keyedData": {
        "dataFormat": "plainText",
        "cardNumber": "5001650000000000",
        "expiryDate": "1230",
        "cvv": "234"
      },
      "cardholderName": "Sarah Hazel Hopper"
    }
  }
}

CEDP

Visa replaced its Level 2 and Level 3 programs with CEDP, which checks the quality of the enhanced data that you send.

To qualify for CEDP, you need to send the same information as Level 3. You also need to make sure that you don't send dummy data or placeholder data. For more information, see Data quality best practices.

The following table shows the API parameters you need to send in the Create Payment request to qualify for CEDP:

InformationAPI parameters
PO numbercustomer.referenceNumber
Taxorder.breakdown.taxes[].name order.breakdown.taxes[].amount order.breakdown.taxes[].taxRate
Subtotalorder.breakdown.subtotal
Shipping informationcustomer.shippingAddress.recipientName customer.shippingAddress.address order.breakdown.freightAmount
Line-item detailsorder.breakdown.items[].commodityCode order.breakdown.items[].productCode order.breakdown.items[].description order.breakdown.items[].unitOfMeasure order.breakdown.items[].unitPrice order.breakdown.items[].quantity order.breakdown.items[].discountRate order.breakdown.items[].taxes[].name order.breakdown.items[].taxes[].amount order.breakdown.items[].taxes[].taxRate
Duty amountorder.breakdown.dutyAmount

Example request

JSON
{
  "channel": "moto",
  "processingTerminalId": "1234001",
  "operator": "Jane",
  "autoCapture": true,
  "customer": {
    "referenceNumber": "CustomerCode234567",
    "shippingAddress": {
      "recipientName": "Sarah Hazel Hopper",
      "address": {
        "address1": "2 Example Ave.",
        "city": "Chicago",
        "state": "Illinois",
        "country": "US",
        "postalCode": "60056"
      }
    }
  },
  "order": {
    "orderId": "OrderRef6543",
    "amount": 4899,
    "currency": "USD",
    "breakdown": {
      "subtotal": 2709,
      "freightAmount": 1500,
      "dutyAmount": 500,
      "taxes": [
        {
          "type": "amount",
          "name": "Sales Tax",
          "amount": 190
        }
      ],
      "items": [
        {
          "commodityCode": "5812-0111",
          "productCode": "PZA-001-LG",
          "description": "Large Pepperoni Pizza",
          "unitOfMeasure": "EA",
          "unitPrice": 2709,
          "quantity": 1,
          "discountRate": 5.0,
          "taxes": [
            {
              "type": "amount",
              "name": "Sales Tax",
              "amount": 190
            }
          ]
        }
      ]
    }
  },
  "paymentMethod": {
    "type": "card",
    "cardDetails": {
      "entryMethod": "keyed",
      "keyedData": {
        "dataFormat": "plainText",
        "cardNumber": "4539858876047062",
        "expiryDate": "1230",
        "cvv": "234"
      },
      "cardholderName": "Sarah Hazel Hopper"
    }
  }
}

Data quality best practices

To help merchants avoid common data quality issues, Visa provides the following guidelines:

FieldDoDon't
order.breakdown.items[].descriptionUse specific product names, especially for subscriptions.Use generic names, blanks, repeated business names, or single characters.
order.breakdown.items[].productCodeUse actual stock keeping units (SKU) or meaningful descriptors.Submit tax codes, card products, or random data.
order.breakdown.items[].taxes[].amountProvide the correct tax amount, or if the transaction is tax-exempt, send a value of 0.Provide incorrect or uniform tax values that don't match jurisdiction rules.
order.breakdown.taxes[].amountProvide the correct tax amount, or if the transaction is tax-exempt, send a value of 0.Provide incorrect or uniform tax values that don't match jurisdiction rules.

Browse knowledge

Search documentation

API reference169
Guides118
Knowledge38
legal1
Solutions32
Workflows74
↑↓highlight↵openView all search results

Menu

Theme

Sign out

Your saved plans remain in your organization. This browser’s private draft and account view will be cleared.

Talk to an engineer