No UBL Required
Send simple JSON, we generate LHDN-compliant UBL. No need to learn complex XML schemas or worry about format conversions.
Submit e-Invoices to LHDN with a Simple REST API. No digital certificates. No UBL formatting. No 50+ field headaches. Just JSON in, valid e-invoice out.
Tired of wrestling with LHDN's MyInvois system?
Submit an e-invoice to LHDN in just a few lines of code:
// Using native fetch
const API = 'https://invoisx.com/api/v1';
const headers = {
'Authorization': 'Bearer your-api-token',
'Content-Type': 'application/json'
};
// Create invoice
const res = await fetch(`${API}/invoices`, {
method: 'POST',
headers,
body: JSON.stringify({
buyerId: 'buyer-uuid',
autoCalculate: true,
invoiceLines: [{
productDescription: 'Consulting Services',
quantity: 10, unitPrice: 500.00,
invoiceLineTaxes: [{ taxType: '01', taxRate: 8 }]
}]
})
});
const invoice = await res.json();
// Validate and submit
await fetch(`${API}/documents/${invoice.data.id}/validate`, { method: 'POST', headers });
await fetch(`${API}/documents/${invoice.data.id}/submit`, { method: 'POST', headers });import requests
API = 'https://invoisx.com/api/v1'
headers = {'Authorization': 'Bearer your-api-token'}
# Create invoice
invoice = requests.post(f'{API}/invoices', headers=headers, json={
'buyerId': 'buyer-uuid',
'autoCalculate': True,
'invoiceLines': [{
'productDescription': 'Consulting Services',
'quantity': 10, 'unitPrice': 500.00,
'invoiceLineTaxes': [{'taxType': '01', 'taxRate': 8}]
}]
}).json()
# Validate and submit
requests.post(f"{API}/documents/{invoice['data']['id']}/validate", headers=headers)
requests.post(f"{API}/documents/{invoice['data']['id']}/submit", headers=headers)use Illuminate\Support\Facades\Http;
$api = Http::withToken('your-api-token')
->baseUrl('https://invoisx.com/api/v1');
// Create invoice
$invoice = $api->post('/invoices', [
'buyerId' => 'buyer-uuid',
'autoCalculate' => true,
'invoiceLines' => [[
'productDescription' => 'Consulting Services',
'quantity' => 10, 'unitPrice' => 500.00,
'invoiceLineTaxes' => [['taxType' => '01', 'taxRate' => 8]]
]]
])->json('data');
// Validate and submit
$api->post("/documents/{$invoice['id']}/validate");
$api->post("/documents/{$invoice['id']}/submit");use GuzzleHttp\Client;
$client = new Client([
'base_uri' => 'https://invoisx.com/api/v1/',
'headers' => ['Authorization' => 'Bearer your-api-token']
]);
// Create invoice
$res = $client->post('invoices', ['json' => [
'buyerId' => 'buyer-uuid',
'autoCalculate' => true,
'invoiceLines' => [[
'productDescription' => 'Consulting Services',
'quantity' => 10, 'unitPrice' => 500.00,
'invoiceLineTaxes' => [['taxType' => '01', 'taxRate' => 8]]
]]
]]);
$invoice = json_decode($res->getBody(), true)['data'];
// Validate and submit
$client->post("documents/{$invoice['id']}/validate");
$client->post("documents/{$invoice['id']}/submit");import java.net.http.*;
import java.net.URI;
var client = HttpClient.newHttpClient();
var API = "https://invoisx.com/api/v1";
// Create invoice
var createReq = HttpRequest.newBuilder()
.uri(URI.create(API + "/invoices"))
.header("Authorization", "Bearer your-api-token")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{"buyerId": "buyer-uuid", "autoCalculate": true,
"invoiceLines": [{"productDescription": "Consulting Services",
"quantity": 10, "unitPrice": 500.00,
"invoiceLineTaxes": [{"taxType": "01", "taxRate": 8}]}]}"""))
.build();
var res = client.send(createReq, HttpResponse.BodyHandlers.ofString());
var invoiceId = /* parse JSON response */;
// Validate and submit
client.send(HttpRequest.newBuilder()
.uri(URI.create(API + "/documents/" + invoiceId + "/validate"))
.header("Authorization", "Bearer your-api-token")
.POST(HttpRequest.BodyPublishers.noBody()).build(),
HttpResponse.BodyHandlers.ofString());using System.Net.Http;
using System.Text.Json;
var client = new HttpClient {
BaseAddress = new Uri("https://invoisx.com/api/v1")
};
client.DefaultRequestHeaders.Add("Authorization", "Bearer your-api-token");
// Create invoice
var invoice = new {
buyerId = "buyer-uuid", autoCalculate = true,
invoiceLines = new[] { new {
productDescription = "Consulting Services",
quantity = 10, unitPrice = 500.00,
invoiceLineTaxes = new[] { new { taxType = "01", taxRate = 8 } }
}}
};
var res = await client.PostAsJsonAsync("/invoices", invoice);
var data = await res.Content.ReadFromJsonAsync<JsonElement>();
var invoiceId = data.GetProperty("data").GetProperty("id").GetString();
// Validate and submit
await client.PostAsync($"/documents/{invoiceId}/validate", null);
await client.PostAsync($"/documents/{invoiceId}/submit", null);Generate a company-specific API token from your InvoisX dashboard in seconds.
Add your customer with their TIN, address, and contact details.
Build your invoice with line items. We auto-calculate all totals and taxes.
Check your invoice against LHDN requirements before submission.
Send your validated invoice to LHDN's MyInvois system.
Retrieve the LHDN verification QR code for your customers.
No. InvoisX handles digital signing with our certificate. You don't need to obtain or manage certificates from MCMC-listed Certificate Authorities.
No. Send simple JSON via our REST API, and we convert it to LHDN-compliant UBL format automatically. No XML knowledge required.
We auto-fill most fields with smart defaults. You only need to provide your line items with quantities and prices - we handle the rest.
We manage LHDN authentication internally. Your API token from InvoisX never expires unless you explicitly revoke it.
We update our backend to comply with new LHDN requirements. Your integration code stays the same - no changes needed on your end.
Any language that can make HTTP requests. We provide examples in PHP, Node.js, Python, Java, C#, and more. It's just a REST API.
Set autoCalculate to false and send every field yourself. We support all LHDN required and optional fields. Use auto-calculate for convenience, or disable it for precision - your choice.