Access Point Provider and System Integrator APIs for FIRS e-Invoice compliance

  • About
    • API Version: v1.3
    • Help Document Version: v1.2.4
    • Last Updated: 09 December, 2025
  • How to setup environment
    • The client-server communication will be via a REST API on HTTPS. Just use any standards based client library e.g. cURL to connect to the server.
  • Test Portal Base URLs
    • Base API URL: https://demo.smartvat.net/firs/api/core
POST /sign
Sign API
The Sign API request will be combination of multiple actions. It will be processing Sign Request for generating IRN, QR Code, Signing Receipt and Reporting VAT etc. The receipt gets validated at server, i.e. server calculates total tax net/value, subtotal, grandtotal considering each item's price/tax type and verifies whether the calculated values match the respective values received in sign request.
   {
      *"vendor_tin": "68452114-4234",                  --String, Merchant TIN.
      *"receipt_number": "INV1231",                    --String, The identifier generated by the taxpayer’s accounting system. Only digits and capital alphabets are allowed.
      *"receipt_type": "1",                            --Integer, Type of receipt: 1 - Invoice, 2 - Credit Note, 3 - Debit Note 
      *"currency": "NGN"                               --String, Receipt Currency
      *"date": "2025-07-22",                           --String, The date, assigned by the sender, on which this document was issued. Must be in YYYY-MM-DD format				
      *"time": "13:00:00",                             --String, Document Time, Must be in HOURS (24HRS FORMAT)-MINUTES-SECONDS
      
      *"accounting_customer_party": {                  **Customer details are only required in B2B Transactions.
        *"party_name": "Vada Wilkinson"                --String, The registered name of the buyer (taxpayer) receiving the invoice.
        *"tin": "68452114-4234"                        --String, The Taxpayer Identification Number (TIN) assigned to the buyer for tax compliance.
        *"email":"customer@example.com"                --String, The buyer’s official email address used for communication regarding invoices and tax compliance.
        *"telephone": "+1234567890"                    --String, The buyer's contact number with the country code prefix (+234 for Nigeria).
        *"business_description": "Retail"              --String, A brief description of the business's line of business.
        "postal_zone": "12345"                         --String, The postal code of the buyer’s business location.
        *"country": "NG"                               --String, The country code representing the buyer's registered country. String (ISO 3166-1 Alpha-2)
      },                                               -- If Customer(s) exist on SmartVat Protal, Only Customer TIN would be enough. All other required data will be fetched and utilized from server.
  
      "reference_details": [                           --Links the invoice to previous billing documents (e.g., credit notes, debit notes, or prior invoices). Array of objects with IRN and date
        {
           "irn": "INV1011-7A0819F4-20250506"          --String, System Integrater generated IRN associated to refered Document
           "issue_date": "2025-05-06"                  --String, Issue Date of Document.  Must be in YYYY-MM-DD format
        }
        ...
        ...
      ]
	  
      *"items": [                                    --List of items
          {
            *"hsn_code": "8502.40",                    --String, HSN Code Provided by FIRS
            *"product_category": "Electronics",        --String, Electronics, Food and Beverages etc.
            *"invoiced_quantity": 10,                  --Float, Invoiced Quantity
            *"item_name" : "Wireless Mouse",           --String, Sold Item
            *"item_desc" : "Ergonomic wireless mouse", --String, Item Description
            *"item_identification": "SKU-001",         --String, Item Identification. The seller’s internal SKU (Stock Keeping Unit).
            *"item_price": 100.00,                     --Float, Item Price (Before taxes)
            "discount_rate": 0.00,                     --Float, Item Discount
            "discount_price": 0.00,                    --Float, Discounted Price
            "fee_rate": 0.00,                          --Float, Applicable fee percentage
            "fee_amount": 0.00,                        --Float, Fee Amount
            *"tax_code": "STANDARD_VAT",               --String, Tax Code Applicable on Item,
            *"tax_percent": 7.5,                       --Float, Applicatbe Tax Percentage
            *"item_amount_total": 1000.00,             --Float, item_price * invoiced_quantity
          },
          {
            "hsn_code": "8419.5000",                   
            "product_category": "Educational Books",   
            "invoiced_quantity": 10,                   
            "item_name" : "Class 10 World History",    
            "item_desc" : "World history book",        
            "item_identification": "SKU-003",          
            "item_price": 100.00,                      
            "discount_rate": 0.00,                     
            "discount_price": 0.00,                    
            "fee_rate": 0.00,                         
            "fee_amount": 0.00,                        
            "tax_code": "ZERO_VAT",                    
            "tax_percent": 0.0,                        
            "item_amount_total": 1000.00,              
          },
          ...
          ...
        ],
		
      *"taxes": [                                      --List of all taxes used in Document and its details
          {
            *"tax_code": "STANDARD_VAT",               --String, HSN Code Provided by FIRS
            *"tax_percent": 7.5,                       --Float, Applicable Tax Percetage
            *"tax_net": 2000.00,                       --Float, Totals of all item lines, falling under same Tax
            *"tax_value" : 150.00,                     --Float, Total calculated tax on given Tax
          },
          {
            "tax_code": "ZERO_VAT",           
            "tax_percent": 0.00,                   
            "tax_net": 1000.00,                   
            "tax_value" : 0.00,               
          },
          ...
          ...
        ],
     *"subtotal": 3000.00,                             --Float, Total before Taxes
      "subtotal_discount": 0.0,                        --Float, Subtotal Discount before Taxes
     *"total": 3150.00,                                --Float, Document Total/Amount Payable
   }
      
                                                                
The Sign API response structure is given as Following.
{
    "errorCode": 0,                                    --Integer, Error Code,  0 means success, otherwise will have some error code
    "errorMsg":""                                      --String, Error Message,if error code is not 0
    "exceptionMsg":""                                  --String, Exception Message if Any
    "responseData": {
      "irn": "INV1071-7A0819F4-20250818",              --String, Unique IRN for Document
      "qr_code": "YP2nnG/imEpjQmIox/..............",   --String, QR Code To be printed on Document, can be scanned using MBS 360 mbole app.
      "warning_code": 0,                               --String, 0 means success, otherwise will have some warning Code/
      "warning": "",                                   --String, Warning Message.
      "receipt_status": 4                              --Integer, 1 -Initaited,  2- Sign Success,  3- Vat Reported Success,  4- Transmit Success
      "is_duplicate": false, 
    },
  
}                                                                
Request Parameters
Name Location Description Required
- Request Stream Request stream containing json comprising of request data. Yes
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
 
GET /hsn
Description
This API is HTTP GET request and is used to get HSN Codes from FIRS Server.
Fetch HSN API
This API requires `client-id`, `access-key` and `model-type` header parameters for the request is shown below.
{
    "errorCode":0,                                                     --Integer, Error Code,  0 means success, otherwise will have some error code
    "responseData": [
        {
            "hscode": "0101.21",                                       --String, HSN Code
            "description": "Horses; live, pure-bred breeding animals"  --String, HSN Description
        },
        {
            "hscode": "0101.29",                                       
            "description": "Horses; live, other than pure-bred breeding animals"
        },
		......
		......
		......
    ]
    "errorMsg":""                                                      --String, Error Message,if error code is not 0, Empty otherwise
    "exceptionMsg":""                                                  --String, Exception Message if Any, Empty otherwise
}                                                                
Request Parameters
Name Location Description Required
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
 
GET /hsn-vatexempt
Description
This API is HTTP GET request and is used to get HSN Codes which are VAT-Exempt.
Fetch Vat-Exempt HSN API
This API requires `client-id`, `access-key` and `model-type` header parameters for the request is shown below.
{
    "errorCode":0,                                                     --Integer, Error Code,  0 means success, otherwise will have some error code
    "responseData": [
        {
            "heading_no": "29.15",
            "harmonized_system_code": "2915.3100",                     --String, HSN Code
            "tariff_category": "MEDICAL, VENTIRINARY AND PHARMACEUTICAL RAW MATERIALS AND PRODUCTS",  
            "tariff": "Ethyl acetate",
            "description": "Saturated acyclic monocarboxylic acids     --String, HSN Description
			    and their derivatives."
        },
        {
            "heading_no": "29.16",
            "harmonized_system_code": "2916.3900",
            "tariff_category": "MEDICAL, VENTIRINARY AND PHARMACEUTICAL RAW MATERIALS AND PRODUCTS",
            "tariff": "Others",
            "description": "unsaturated Acyclic monocarboxylic acids"
        },
		......
		......
		......
    ]
    "errorMsg":""                                                      --String, Error Message,if error code is not 0, Empty otherwise
    "exceptionMsg":""                                                  --String, Exception Message if Any, Empty otherwise
}                                                                
Request Parameters
Name Location Description Required
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
 
GET /servicecodes
Description
This API is HTTP GET request and is used to get all aplicable Service Codes with details.
Fetch Service Codes API
This API requires `client-id`, `access-key` and `model-type` header parameters for the request is shown below.
{
    "errorCode":0,                                                     --Integer, Error Code,  0 means success, otherwise will have some error code
    "responseData": [
        
        {
            "code": "0112",                                            --String Service Codes
            "description": "Growing of rice"                           --String Description of Service
        },
        {
            "code": "0114",
            "description": "Growing of sugar cane"
        },
        {
            "code": "0115",
            "description": "Growing of tobacco"
        },
        {
            "code": "0116",
            "description": "Growing of fibre crops"
        },
		......
		......
		......
    ]
    "errorMsg":""                                                      --String, Error Message,if error code is not 0, Empty otherwise
    "exceptionMsg":""                                                  --String, Exception Message if Any, Empty otherwise
}                                                                
Request Parameters
Name Location Description Required
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
GET /taxes
Description
This API is HTTP GET request and is used to get all aplicable taxes with details.
Fetch Taxes API
This API requires `client-id`, `access-key` and `model-type` header parameters for the request is shown below.
{
    "errorCode":0,                                                     --Integer, Error Code,  0 means success, otherwise will have some error code
    "responseData": [
		{
            "code": "STANDARD_VAT",                                    --String, Tax Code
            "value": "Standard Value-Added Tax",                       --String, Description
            "percent": "7.5"                                           --String, Percentage
        },
        {
            "code": "REDUCED_VAT",
            "value": "Reduced Value-Added Tax",
            "percent": "7.5"
        },
        {
            "code": "ZERO_VAT",
            "value": "Zero Value-Added Tax",
            "percent": "0.0"
        },
		......
		......
		......
    ]
    "errorMsg":""                                                      --String, Error Message,if error code is not 0, Empty otherwise
    "exceptionMsg":""                                                  --String, Exception Message if Any, Empty otherwise
}                                                                
Request Parameters
Name Location Description Required
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
 
GET /currencies
Description
This API is HTTP GET request and is used to get Currency Details.
Fetch Currencies API
This API requires `client-id`, `access-key` and `model-type` header parameters for the request is shown below.
{
    "errorCode":0,                                                    --Integer, Error Code,  0 means success, otherwise will have some error code
    "responseData": [
        {
            "symbol": "$", 
            "name": "US Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "USD",                                            --String, Currency Code
            "name_plural": "US dollars"
        },
        {
            "symbol": "CA$",
            "name": "Canadian Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "CAD",
            "name_plural": "Canadian dollars"
        },
        {
            "symbol": "€",
            "name": "Euro",
            "symbol_native": "€",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "EUR",
            "name_plural": "euros"
        },
		......
		......
		......
    ]
    "errorMsg":""                                                      --String, Error Message,if error code is not 0, Empty otherwise
    "exceptionMsg":""                                                  --String, Exception Message if Any, Empty otherwise
}                                                                
Request Parameters
Name Location Description Required
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
 
GET /getcountries
Description
This API is HTTP GET request and is used to get Country List.
Fetch Countries API
This API requires `client-id`, `access-key` and `model-type` header parameters for the request is shown below.
{
    "errorCode":0,                                                     --Integer, Error Code,  0 means success, otherwise will have some error code
    "responseData": [
		{
            "name": "Afghanistan",
            "alpha_2": "AF",
            "alpha_3": "AFG",
            "country_code": "004",
            "iso_3166_2": "ISO 3166-2:AF",
            "region": "Asia",
            "sub_region": "Southern Asia",
            "intermediate_region": "",
            "region_code": "142",
            "sub_region_code": "034",
            "intermediate_region_code": ""
        },
        {
            "name": "Åland Islands",
            "alpha_2": "AX",
            "alpha_3": "ALA",
            "country_code": "248",
            "iso_3166_2": "ISO 3166-2:AX",
            "region": "Europe",
            "sub_region": "Northern Europe",
            "intermediate_region": "",
            "region_code": "150",
            "sub_region_code": "154",
            "intermediate_region_code": ""
        },
        
		......
		......
		......
    ]
    "errorMsg":""                                                      --String, Error Message,if error code is not 0, Empty otherwise
    "exceptionMsg":""                                                  --String, Exception Message if Any, Empty otherwise
}                                                                
Request Parameters
Name Location Description Required
acess-key Request Header To be provided to Merchant after successfully onbarding. Yes
client-id Request Header To be provided to Merchant after successfully onbarding. Yes
model-type Request Header To be provided to Merchant after successfully onbarding. Yes
Response Code
Code Description
200 Success HTTP response code
Any other HTTP error code Other HTTP codes have their usual meanings+
Response Parameters
Name Location Description  
- Response Stream The stream contents will be a json byte stream.
 
Error Code List
Code Description    
-1000 System Error occurred. If error persist, please contact support
-1001 Failed to parse request bytes to object. Please contact support
-1002 Invalid Document type
-1004 Failed to make request object for Invoice.
-1005 Failed to make Request for IRN.
-1006 Failed to generate response bytes for Sign result.
-1007 Failed to read request body.
-1008 Request object is null.
-1009 Failed to parse response JSON for IRN
-1010 Failed to parse IRN Response.
-1011 Failed to generate response bytes for IRN
-1012 Invalid action type
-1013 Required headers are missing
-1014 Failed to save Transaction
-1015 Failed to check duplicacy of Receipt
-1016 Failed to make request object bytes for VAT Report request
-1017 Failed to report VAT for receipt
-1018 Failed to update status of receipt
-1019 Failed to find receipt with associated IRN
-1020 Failed to generate response bytes for verification result
-1021 Error occurred while verifying receipt
-1022 Failed to parse verification response
-1023 Failed to parse sign response
-1024 Failed to update invoice status to Signed
-1025 Error occurred while signing receipt
-1026 Failed to parse response json for receipt
-1027 Unknown action for parsing response
-1028 Failed to update invoice status to VAT REPORTED
-1030 Failed to get receipt data
 
HTTP Status Code List
Code Description    
400 Bad request i.e. the request received from the client is incomplete or not in prescribed format
401 Unauthorized i.e. the request received contains wrong or expired credentials
403 Forbidden i.e. the request received is trying to access a resource belonging to other user
500 Internal server error i.e. the server experienced some unexpected error while processing the request
* denotes mandatory field