# 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.

| Program | Card brand | Enhanced data |
| --- | --- | --- |
| Level 2 | Mastercard and American Express | Tax amount and purchase order (PO) number. American Express also requires some line-item details. |
| Level 3 | Mastercard | Details about each item, shipping information, duty amount, tax amount, and PO number. |
| Commercial Enhanced Data Program (CEDP) | Visa | Details 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.

<a id="things-to-consider"></a>
## 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.

<a id="level-2"></a>
## 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](/api/payment) request to qualify for Level 2:

| Information | API parameters |
| --- | --- |
| PO number | `customer.referenceNumber` |
| Tax | `order.breakdown.taxes[].name` `order.breakdown.taxes[].amount` `order.breakdown.taxes[].taxRate` |
| Subtotal | `order.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` |

<a id="example-request"></a>
### 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"
    }
  }
}
```

<a id="level-3"></a>
## 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](/api/payment) request to qualify for Level 3:

| Information | API parameters |
| --- | --- |
| PO number | `customer.referenceNumber` |
| Tax | `order.breakdown.taxes[].name` `order.breakdown.taxes[].amount` `order.breakdown.taxes[].taxRate` |
| Subtotal | `order.breakdown.subtotal` |
| Shipping information | `customer.shippingAddress.recipientName` `customer.shippingAddress.address` `order.breakdown.freightAmount` |
| Line-item details | `order.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 amount | `order.breakdown.dutyAmount` |

<a id="example-request-1"></a>
### 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"
    }
  }
}
```

<a id="cedp"></a>
## 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](#data-quality-best-practices).

The following table shows the API parameters you need to send in the [Create Payment](/api/payment) request to qualify for CEDP:

| Information | API parameters |
| --- | --- |
| PO number | `customer.referenceNumber` |
| Tax | `order.breakdown.taxes[].name` `order.breakdown.taxes[].amount` `order.breakdown.taxes[].taxRate` |
| Subtotal | `order.breakdown.subtotal` |
| Shipping information | `customer.shippingAddress.recipientName` `customer.shippingAddress.address` `order.breakdown.freightAmount` |
| Line-item details | `order.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 amount | `order.breakdown.dutyAmount` |

<a id="example-request-2"></a>
### 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"
    }
  }
}
```

<a id="data-quality-best-practices"></a>
## Data quality best practices

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

| Field | Do | Don't |
| --- | --- | --- |
| `order.breakdown.items[].description` | Use specific product names, especially for subscriptions. | Use generic names, blanks, repeated business names, or single characters. |
| `order.breakdown.items[].productCode` | Use actual stock keeping units (SKU) or meaningful descriptors. | Submit tax codes, card products, or random data. |
| `order.breakdown.items[].taxes[].amount` | Provide 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[].amount` | Provide 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. |


---
