Overview
Level 2 and Level 3 Data are crucial for enhancing transaction transparency, improving tax and compliance reporting, and qualifying for reduced interchange fees in B2B and government procurement. By providing detailed information on each purchase, these data levels enable accurate tracking, itemization, and processing, making them essential for both operational efficiency and cost savings in complex transactions.
Note
This data is optional for the PayConex™ transaction processing and is used according to an ISV's needs.
Bluefin PayConex™ only integrates with Worldpay's Express so in order to use Level 3 data, an ISV is required to process with Worldpay's Express. For more, please check out Worldpay Level II and Level III Data.
Level 2 Data
If you support purchasing cards and Level 2 transactions, you will need to capture and transmit additional data fields to comply with the requirements set by the major card brands. Without these extra fields, your transactions do not qualify as Level 2 transactions.
To support Level 2 processing, this extra data should be provided in a transaction request such as SALE and AUTHORIZATION.
These additional fields are as follows:
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
merchantReference | string | false | A merchant-defined reference. | "MEM001" |
orderId | string | false | A merchant-defined order identifier. | "ORD001" |
tax | string | false | For Visa cards, the value must be expressed as greater than 0.00. For Mastercard, the value may be expressed as 0.00 if desired. | "0.20" |
zip | string | false | Typically the same value as the customer's zip code parameter. This value is not validated like the zip, so any alphanumeric value up to 10 digits is valid. | "12345" |
Request
POST /api/v4/accounts/{accountId}/payments/sale
{
"bfTokenReference": "PAYCONEX_TOKEN",
"level2": {
"merchantReference": "MEM001",
"orderId": "ORD001",
"tax": "0.20",
"zip": "12345"
},
"posProfile": "ECOMMERCE",
"amounts": {
"total": "5",
"currency": "USD"
}
}
*Required Scopes: pcx:payments:*, pcx:payments:card_not_present:*, pcx:payments:card_not_present:sale
Response
In response, Level 2 data is populated and is included as transaction metadata.
{
"transactionId": "000000048786",
"status": "CAPTURED",
"timestamp": "2025-04-10T20:22:09.000000Z",
"customer": {
"name": "Alice",
"billingAddress": {
"address1": "address1",
"address2": "address2",
"city": "My City",
"state": "MO",
"zip": "90210",
"country": "USA",
"company": "Acme Inc."
}
},
"shippingAddress": {
"address1": "address1",
"address2": "address2",
"city": "My City",
"state": "MO",
"zip": "90210",
"country": "USA",
"company": "Acme Inc.",
"recipient": "Alice Smith"
},
"level2": {
"merchantReference": "MEM001",
"orderId": "ORD001",
"tax": "0.20",
"zip": "12345"
},
"trace": {
"history": [
{
"action": "transaction",
"requestId": "8ae6a3e3-8c8c-45ed-b884-523f045a873d",
"correlationId": "35110db5-be81-45aa-8142-9085c94f65ce",
"timestamp": "2025-04-10T15:22:06-05:00"
}
],
"networkTransactionId": "015100470089038G996"
},
"amounts": {
"currency": "USD",
"approved": "5.00",
"requested": "5.00",
"balance": "5.00"
},
"auth": {
"code": "OK0287",
"processorMessage": "APPROVED",
"message": "APPROVED",
"networkName": "VISA",
"avsResponseCode": "Y"
},
"card": {
"name": "Alice",
"last4": "1111",
"expiry": "1225",
"brand": "VISA"
},
"binData": {
"program": "UNKNOWN"
},
"transactionType": "SALE",
"entryMode": "KEYED",
"refundObject": {
"refundBalance": "5.00"
}
}
Level 3 Data
When submitting level 3 data, level 2 data must also be included. Level 3 data provides a detailed breakdown of each individual line item in the transaction, allowing the Payment Processor to authorize level 3 data and trigger the level 3 adjustment. This level of detail enhances transaction validation, tracking, and reporting.
Multiple line items are supported for selling two or more services at a time as different items may have unique tax rates, discounts, or VAT amounts. This avoids issues with generalized tax or discount application that might not reflect each item's true cost.
Level 3 Data can serve a range of purposes including legal services, retail, and manufacturing.
Dynamic Level 3 Data
One of the two variants is to provide Level 3 data dynamically in a transaction request.
POST /api/v4/accounts/{accountId}/payments/sale
{
"level2": {
"merchantReference": "121231",
"orderId": "ORD001",
"tax": "10.00",
"zip": "90210"
},
"level3": {
"summaryCommodityCode": "8012",
"shipFromZip": "12345",
"transactionSaleTaxRate": "1042",
"merchantVatRegistrationNumber": "12-3456789",
"customerVatRegistrationNumber": "123-45-6789",
"discountAmount": "30.00",
"freightAmount": "30.00",
"dutyAmount": "30.00",
"destinationZip": "90210",
"destinationCountryCode": "840",
"vatInvoiceRefNumber": "ABC-12345667",
"orderDate": "20230728",
"vatAmount": "30.00",
"vatRate": "1042",
"alternateTaxAmount": "30.00",
"nationalTaxAmount": "30.00"
},
"items": [
{
"alternateTaxId": "987654321054321",
"commodityCode": "09.02.10",
"debitCreditCode": "2",
"description": "Acme Electronics unit",
"discountAmount": "0.00",
"discountCode": "2",
"discountRate": "0",
"extendedItemAmount": "500.00",
"lineItemTotal": "500.00",
"netGrossCode": "2",
"productCode": "ABC123",
"quantity": "1.00",
"unitCost": "500.00",
"unitOfMeasure": "EA",
"vatAmount": "50.00",
"vatRate": "1000",
"vatType": "1234"
},
{
"alternateTaxId": "123456789012345",
"commodityCode": "12.03.45",
"debitCreditCode": "2",
"description": "Gadget Pro 3000",
"discountAmount": "5.00",
"discountCode": "1",
"discountRate": "500",
"extendedItemAmount": "950.00",
"lineItemTotal": "1000.00",
"netGrossCode": "1",
"productCode": "GAD3000",
"quantity": "1.00",
"unitCost": "950.00",
"unitOfMeasure": "EA",
"vatAmount": "50.00",
"vatRate": "500",
"vatType": "5678"
}
],
"bfTokenReference": "PAYCONEX_TOKEN",
"posProfile": "ECOMMERCE",
"amounts": {
"total": "5",
"currency": "USD"
}
}
Note
With no level 3 data, the line items remain only as transaction metadata, meaning none interact with the Payment Processor at all.
*Required Scopes: pcx:payments:*, pcx:payments:card_not_present:*, pcx:payments:card_not_present:sale
Body Parameters
level3
level3As mentioned before, this data can be dynamically provided in a request using the parameters below or can be provided in a static form of Level 3 Profile. Level 3 data is also set with the Items.
| Parameter | Type | Description | Example |
|---|---|---|---|
summaryCommodityCode | string | International description code of overall goods or services. | "8012" |
shipFromZip | string | Postal or zip code of the address from where the purchased goods are being shipped. | "12345" |
transactionSaleTaxRate | string | Tax rate used to calculate the Transaction Sale Tax Amount. Submitted as a percentage. Two-digit implied decimal. For example, if 10.42%, submit 1042. | "1042" |
merchantVatRegistrationNumber | string | Government-assigned tax identification number of merchant. | "12-3456789" |
customerVatRegistrationNumber | string | Tax registration number supplied by cardholder. | "123-45-6789" |
discountAmount | string | Discount amount applied to the line item. This field should be 0.00 if the unit cost reflects a discount price or if no line item discount applies. | "30.00" |
freightAmount | string | Freight or shipping portion of the total transaction amount. | "30.00" |
dutyAmount | string | Amount charged for duties. Fee amount associated with the import of the goods. | "30.00" |
destinationZip | string | ZIP code to which the goods are being shipped. | "90210" |
destinationCountryCode | string | Country code to which goods are being shipped. U.S. is 840. | "840" |
vatInvoiceRefNumber | string | Invoice number associated with VAT invoice. Not applicable for US merchants. | "ABC-12345667" |
orderDate | string | Purchase order date. Format: YYYYMMDD. | "20230728" |
vatAmount | string | Amount of any sales or value added taxes associated with the purchased item. | "30.00" |
vatRate | string | Tax rate used to calculate VAT amount. Submitted as a percentage. Two-digit implied decimal. For example, if 10.42%, submit 1042. | "1042" |
alternateTaxAmount | string | Second tax amount (used in countries where more than one tax can be applied). Not applicable for US merchants. | "30.00" |
nationalTaxAmount | string | Same as the previous. | "30.00" |
items
itemsAlso known as Line Item Detail, this particular property is used to provide detailed information about each individual item/purchase or service included in a Level 3 transaction. It helps in breaking down the transaction into its constituent parts, offering clarity and specificity for the Payment Processor. An item is set with Level 3 data so that each item is processed with the Level 3 data adjusted accordingly in the back end.
| Parameter | Type | Description |
|---|---|---|
commodityCode | string | International description code of the individual good or service being supplied. Recommend using national or international list of standardized codes. |
description | string | Item description. |
productCode | string | Merchant-defined description code of the item. |
quantity | string | Quantity of the item (up to four decimal places). |
unitOfMeasure | string | Code for units of measurement used in international trade. |
unitCost | string | Unit cost of the item. |
vatAmount | string | Amount of any sales or value added taxes associated with the item. |
vatRate | string | Submitted tax rate used to calculate VAT as a percentage. Two-digit implied decimal. For example, if 10.42%, submit 1042. |
discountAmount | string | Discount amount applied to the line item. This field should be 0.00 if the unit cost reflects a discount price or if no line item discount applies. |
lineItemTotal | string | Total full amount associated with the line item (including tax). |
alternateTaxId | string | Tax identification number of the merchant reporting the alternate tax amount. Not applicable for US merchants (tag must be present, but can be empty). |
vatType | string | Tax identification number of the merchant reporting the alternate tax amount. Not applicable for US merchants (tag must be present, but can be empty). |
discountCode | string | Indicates whether discount was applied to the purchase price of the item. 0 = Not supported, 1 = Amount is discounted, 2 = Amount is not discounted. |
netGrossCode | string | Indicates whether extended item amount included the tax. 0 = Not supported, 1 = Item Amount includes tax amount, 2 = Item Amount does not include tax amount. |
extendedItemAmount | string | Amount of the item (price multiplied by quantity). |
debitCreditCode | string | Indicates whether extendedItemAmount is a credit (taking away from the total amount of the sale) or debit (adding to the total amount of the sale). 0 = Not supported, 1 = Extended item amount is credit, 2 = Extended item amount is debit. |
discountRate | string | Discount rate for the line item. Submitted as a percentage. Two-digit implied decimal. For example, if 10.42%, submit 1042. |
Response
As it can be seen below, dynamically set Level 3 fields are also re-populated in response and as transaction metadata for tracking and reporting purposes.
{
"transactionId": "000000048826",
"status": "CAPTURED",
"timestamp": "2025-04-10T20:25:24.000000Z",
"customer": {
"name": "Alice",
"billingAddress": {
"address1": "address1",
"address2": "address2",
"city": "My City",
"state": "MO",
"zip": "90210",
"country": "USA",
"company": "Acme Inc."
}
},
"shippingAddress": {
"address1": "address1",
"address2": "address2",
"city": "My City",
"state": "MO",
"zip": "90210",
"country": "USA",
"company": "Acme Inc.",
"recipient": "Alice Smith"
},
"level2": {
"merchantReference": "121231",
"orderId": "ORD001",
"tax": "10.00",
"zip": "90210"
},
"level3": {
"status": "PENDING",
"transactionSaleTaxRate": "1042",
"merchantVatRegistrationNumber": "12-3456789",
"customerVatRegistrationNumber": "123-45-6789",
"summaryCommodityCode": "8012",
"discountAmount": "30.00",
"freightAmount": "30.00",
"dutyAmount": "30.00",
"destinationZip": "90210",
"shipFromZip": "12345",
"destinationCountryCode": "840",
"vatInvoiceRefNumber": "ABC-12345667",
"orderDate": "20230728",
"vatAmount": "30.00",
"vatRate": "1042",
"alternateTaxAmount": "30.00",
"nationalTaxAmount": "30.00"
},
"items": [
{
"quantity": "1.00",
"commodityCode": "09.02.10",
"description": "Acme Electronics unit",
"productCode": "ABC123",
"unitOfMeasure": "EA",
"unitCost": "500.00",
"vatAmount": "50.00",
"vatRate": "1000",
"vatType": "1234",
"discountCode": "2",
"netGrossCode": "2",
"extendedItemAmount": "500.00",
"debitCreditCode": "2",
"discountRate": "0",
"discountAmount": "0.00"
},
{
"quantity": "1.00",
"commodityCode": "12.03.45",
"description": "Gadget Pro 3000",
"productCode": "GAD3000",
"unitOfMeasure": "EA",
"unitCost": "950.00",
"vatAmount": "50.00",
"vatRate": "500",
"vatType": "5678",
"discountCode": "1",
"netGrossCode": "1",
"extendedItemAmount": "950.00",
"debitCreditCode": "2",
"discountRate": "500",
"discountAmount": "5.00"
}
],
"trace": {
"history": [
{
"action": "transaction",
"requestId": "00aa987f-8653-44b7-a5d6-46fe5c471b29",
"correlationId": "495e0b3b-ce3b-4bc9-9710-c831c9a546c6",
"timestamp": "2025-04-10T15:25:22-05:00"
}
],
"networkTransactionId": "015100772643694G058"
},
"amounts": {
"currency": "USD",
"approved": "5.00",
"requested": "5.00",
"balance": "5.00"
},
"auth": {
"code": "OK1657",
"processorMessage": "APPROVED",
"message": "APPROVED",
"networkName": "VISA",
"avsResponseCode": "Y"
},
"card": {
"name": "Alice",
"last4": "1111",
"expiry": "1225",
"brand": "VISA"
},
"binData": {
"program": "UNKNOWN"
},
"transactionType": "SALE",
"entryMode": "KEYED",
"refundObject": {
"refundBalance": "5.00"
}
}
Level 3 Profile
Level 3 Profiles is a separate PayConex™ service that allows you to have predefined level 3 data. In case you are repeatedly sending the same set of data in a level 3 transaction, the Level3Profile functions similarly to dynamically specifying all of the level 3 data and items, but it is static as it retrieves predefined level 3 data stored under a profile name in your PayConex™ account, applying consistent level 3 attributes and line items associated with that profile. This is helpful for transactions with standardized tax, shipping, and duty requirements.
For example, we can create a Level 3 Profile with the data we have used thus far.
POST /api/v4/accounts/{accountId}/level3-profile
{
"name": "TESTPROFILE6",
"data": {
"transactionSaleTaxRate": "1042",
"merchantVatRegistrationNumber": "12-3456789",
"customerVatRegistrationNumber": "123-45-6789",
"summaryCommodityCode": "8012",
"discountAmount": "30.00",
"freightAmount": "30.00",
"dutyAmount": "30.00",
"destinationZip": "90210",
"shipFromZip": "12345",
"destinationCountryCode": "840",
"vatInvoiceRefNumber": "ABC-12345667",
"orderDate": "20230728",
"vatAmount": "30.00",
"vatRate": "1042",
"alternateTaxAmount": "30.00",
"nationalTaxAmount": "30.00",
"lineItemDetail": [
{
"quantity": "1.00",
"commodityCode": "09.02.10",
"description": "Acme Electronics unit",
"productCode": "ABC123",
"unitOfMeasure": "EA",
"unitCost": "500.00",
"vatAmount": "50.00",
"vatRate": "1000",
"vatType": "1234",
"discountCode": "2",
"netGrossCode": "2",
"extendedItemAmount": "500.00",
"debitCreditCode": "2",
"discountRate": "0",
"discountAmount": "0.00"
},
{
"quantity": "1.00",
"commodityCode": "12.03.45",
"description": "Gadget Pro 3000",
"productCode": "GAD3000",
"unitOfMeasure": "EA",
"unitCost": "950.00",
"vatAmount": "50.00",
"vatRate": "500",
"vatType": "5678",
"discountCode": "1",
"netGrossCode": "1",
"extendedItemAmount": "950.00",
"debitCreditCode": "2",
"discountRate": "500",
"discountAmount": "5.00"
}
]
}
}
Level 3 Profiles API
For more API examples, see Level 3 Profiles API.
Now, we can use that Level 3 Profile in a transaction request.
{
"level2": {
"merchantReference": "121231",
"orderId": "ORD001",
"tax": "10.00",
"zip": "90210"
},
"level3ProfileName": "TESTPROFILE6",
"bfTokenReference": "PAYCONEX_TOKEN",
"posProfile": "ECOMMERCE",
"amounts": {
"total": "5",
"currency": "USD"
}
}
*Required Scopes: pcx:payments:*, pcx:payments:card_not_present:*, pcx:payments:card_not_present:sale
Note
If you manually add
itemsand still use theLevel3Profilethat already defines them, the items in the request will overwrite the ones within the Level 3 Profile.
In this case, level 3 data and items are not populated either in response or transaction metadata but the Profile name used is stored, which means that the merchant gets to see what data was exactly used. See Getting a Level 3 Profile.
