curl -X 'POST' \
'https: //dev-eis-api.mra.mw//api/v1/api/v1/sales/submit-sales-transaction' \
-H 'accept: text/plain' \
-H 'Content-Type: application/json' \
-H 'Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiMjAxNjI5MzkiLCJodHRwczovL21yYS5tdy9EZXZpY2VJZCI6IjNhNmQzNzAzLTFjMzktNDFlOC05OGNlLWIzOGQ5NTc0NTQwZCIsImh0dHBzOi8vbXJhLm13L1NlY3JldEtleSI6ImY3NTQyODE2YTA4ODMzMTRhMTQ2YTZkMTI3NjM0OWQ5ZTczNmEwMCIsImh0dHBzOi8vbXJhLm13L0FQSUtleSI6ImY3NTQyODE2YTA4ODMzMTRhMTQ2YTZkMTI3NjM0OWQ5ZTczNmEwMCIsImh0dHBzOi8vbXJhLm13L1RJTiI6IjIwMTYyOTM5IiwiZXhwIjoxNzI4OTI2NzI2LCJpc3MiOiJNUkEiLCJhdWQiOiJFSVNUZXJtaW5hbHMifQ.pg-jKtsxKh6L0pEbu4RdJaj_bMijXmUGRmoH9k6Mh4g'\
-d '{
"invoiceHeader": {
"invoiceNumber": "string",
"invoiceDateTime": "2025-05-28T06:57:11.368Z",
"sellerTIN": "string",
"buyerTIN": "string",
"buyerName": "string",
"buyerAuthorizationCode": "string",
"siteId": "string",
"globalConfigVersion": 0,
"taxpayerConfigVersion": 0,
"terminalConfigVersion": 0,
"isReliefSupply": true,
"vat5CertificateDetails": {
"id": 0,
"projectNumber": "string",
"certificateNumber": "string",
"quantity": 0
},
"paymentMethod": "string"
},
"invoiceLineItems": [
{
"id": 0,
"productCode": "string",
"description": "string",
"unitPrice": 0,
"quantity": 0,
"discount": 0,
"total": 0,
"totalVAT": 0,
"taxRateId": "string",
"isProduct": true
}
],
"invoiceSummary": {
"taxBreakDown": [
{
"rateId": "string",
"taxableAmount": 0,
"taxAmount": 0
}
],
"levyBreakDown": [
{
"levyTypeId": "string",
"levyRate": 0,
"levyAmount": 0
}
],
"totalVAT": 0,
"offlineSignature": "string",
"invoiceTotal": 0
}
}'
|
The call to the submit sales transactions endpoint will be successful with the following parameters.
Field
|
Data Type
|
Mandatory
|
Comments
|
Authorization
|
string
|
-yes
|
|
invoiceHeader.invoiceNumber
|
string
|
-yes
|
|
invoiceHeader.invoiceDateTime
|
datetime
|
-yes
|
The date and time the invoice was issued
|
invoiceHeader.sellerTIN
|
string
|
-yes
|
The Taxpayer Identification Number of the seller
|
invoiceHeader.buyerTIN
|
string
|
-no
|
Needed if its a B2B transaction
|
invoiceHeader.buyerName
|
string
|
-no
|
|
invoiceHeader.buyerAuthorizationCode
|
string
|
-no
|
It is required when the TIN is protected. It is generated from the taxpayers portal
|
invoiceHeader.siteId
|
string
|
-yes
|
This is the site id where the terminal is operating
|
invoiceHeader.globalConfigVersion
|
integer
|
-yes
|
this is the configuration that will be received from the terminal activation response
|
invoiceHeader.taxpayerConfigVersion
|
integer
|
-yes
|
|
invoiceHeader.terminalConfigVersion
|
integer
|
-yes
|
|
invoiceHeader.isReliefSupply
|
boolean
|
-no
|
Marks whether the supply is relief exempt. It requires VAT 5 certificate using the Validate VAT 5 Certificate endpoint.
|
invoiceHeader.paymentMethod
|
string
|
-yes
|
The method of payment (e.g., Cash, Card, MobileMoney).
|
invoiceLineItems[].productCode
|
string
|
-yes
|
Unique product or service code.
|
invoiceLineItems[].description
|
string
|
-yes
|
description of the Product or service
|
invoiceLineItems[].unitPrice
|
decimal
|
-yes
|
Price per unit product or service.
|
invoiceLineItems[].quantity
|
decimal
|
-yes
|
Quantity of items sold
|
invoiceLineItems[].discount
|
decimal
|
-no
|
Any discount applied to the line item.
|
invoiceLineItems[].total
|
decimal
|
-yes
|
The net total (after discount, before VAT) for the line item.
|
invoiceLineItems[].totalVAT
|
decimal
|
-yes
|
VAT amount for this line item.
|
invoiceLineItems[].taxRateId
|
string
|
-yes
|
Identifier for the applied tax rate.
|
invoiceLineItems[].isProduct
|
boolean
|
-yes
|
True if item is a product, false if it is a service.
|
invoiceSummary.taxBreakDown[].rateId
|
string
|
-yes
|
Tax rate identifier (matches taxRateId in line items).
|
invoiceSummary.taxBreakDown[].taxableAmount
|
decimal
|
-yes
|
Sum of taxable amounts under this rate.
|
invoiceSummary.taxBreakDown[].taxAmount
|
decimal
|
-yes
|
Total tax calculated for this rate.
|
invoiceSummary.levyBreakDown.levyTypeId
|
string
|
-no
|
dentifier of the levy type (e.g., Environmental Levy, Tourism Levy). Required only if a levy applies.
|
invoiceSummary.levyBreakDown.levyRate
|
decimal
|
-no
|
Percentage rate (%) applied for this levy.
|
invoiceSummary.levyBreakDown.levyAmount
|
decimal
|
-no
|
Monetary value of the levy calculated from the levyRate.
|
invoiceSummary.totalVAT
|
decimal
|
-yes
|
Total VAT across all line items.
|
invoiceSummary.invoiceTotal
|
decimal
|
-yes
|
Final invoice total including VAT.
|
invoiceSummary.offlineSignature
|
string
|
-no
|
If the transaction was issued offline, the offline signature is included.
|
invoiceSummary.amountTendered
|
decimal
|
-yes
|
Amount paid by the customer before giving back any change.
|
Notes
If the isReliefSupply field in the invoiceHeader of the request is set to true, it means the transaction qualifies for VAT relief under Malawi’s regulations. In such cases:
-
The taxpayer is eligible to exclude VAT for certain goods or services based on the relief rules.
-
The terminal must correctly calculate the taxable amount and ensure VAT is excluded where applicable.
-
Relief supply transactions require the VAT 5 certificate details to be validated using the Validate VAT 5 Certificate endpoint.
Additionally, if a buyerTIN is provided, it indicates a business-to-business (B2B) transaction. On the taxpayer portal, the taxpayer can choose to protect their TIN:
-
If the TIN is protected, business-to-business transactions will require a valid purchase authorization code, which the buyer can generate via the MRA taxpayers portal before the transaction is processed.
-
If the TIN is not protected, no authorization code is required for B2B transactions.
|