Overview
The Jabuntu Public API lets a business read its invoices, drafts, customers, products, NRS submissions and financial reports, and create drafts and customers. Invoices are prepared, validated and signed through the NRS MBS inside the application; the API gives integrators read access to the results and the ability to prepare drafts. Nothing in the API submits directly to NRS — drafts are reviewed and submitted in the app.
Base URL
https://erp.jabuntu.com/api/public/v1Authentication
Every request carries a Bearer credential: Authorization: Bearer <credential>
- API key — created by the business owner under Developer; prefix
jbt_pk_… - OAuth access token — issued via the OAuth flow; prefix
jbt_at_…
Each credential carries a set of scopes, a per-minute rate limit, and optionally an IP allowlist.
Scopes
invoices:read— read invoicesdrafts:read/drafts:write— read and create invoice draftscustomers:read/customers:write— read and create customersproducts:read— read products and stock on handsubmissions:read— read NRS submission statusreports:read— read financial reports
Rate limiting and idempotency
Exceeding the per-minute limit returns HTTP 429 with a Retry-After header. POST requests require an Idempotency-Key header (8–80 characters: letters, digits, - or _). Repeating the same key returns the first result; reusing a key with a different request body returns HTTP 422.
Endpoints
| Endpoint | Purpose |
|---|---|
GET /me | The business, the credential’s scopes and whether the business is a developer sandbox |
GET /invoices | NRS-cleared and other invoices (scope invoices:read) |
GET /invoices/{number} | One invoice (scope invoices:read) |
GET /drafts | Invoice drafts (scope drafts:read) |
POST /drafts | Create an invoice draft (scope drafts:write); it is not submitted to NRS |
GET /drafts/{id} | One draft (scope drafts:read) |
GET /customers | Customers (scope customers:read) |
POST /customers | Create a customer (scope customers:write) |
GET /products | Products with stock on hand (scope products:read) |
GET /submissions | Where each invoice is on its way to NRS (scope submissions:read) |
GET /reports/trial-balance | Trial balance (scope reports:read) |
GET /reports/profit-and-loss | Profit and loss (scope reports:read) |
Errors
- 401 — missing or invalid credential.
- 403 — the credential lacks the required scope (or IP not allowlisted).
- 404 — the resource does not exist for this business.
- 422 — validation failed, or an idempotency key was reused with a different body.
- 429 — rate limit exceeded; honour
Retry-After.
E-invoicing (NRS MBS) flow
Invoices are prepared, validated and signed against the NRS Merchant Buyer System (MBS) inside the application. The application endpoints below drive the flow; signing (the IRN and QR code) is performed by NRS.
| Step | Endpoint |
|---|---|
| Create / edit a draft | POST /api/erp/drafts, PUT /api/erp/drafts/{id} |
| Local validation | POST /api/erp/drafts/{id}/validate-local |
| Prepare the MBS payload | POST /api/erp/drafts/{id}/prepare-mbs-local |
| Submit for NRS validation & signing | POST /api/erp/drafts/{id}/submit |
| Check status (NRS confirmation, QR) | GET /api/erp/mbs/journey, POST /api/erp/mbs/journey/{requestId}/check |
Example invoice payload (MBS)
The payload prepared for the NRS MBS. Mandatory fields: irn, issue_date/issue_time, invoice_type_code, invoice_kind (B2B, B2G or B2C), document_currency_code, accounting_supplier_party (with tin), accounting_customer_party for B2B/B2G, invoice_line (goods carry an hsn_code, services an isic_code), tax_total and legal_monetary_total. Values below are synthetic test data.
{
"business_id": "11111111-1111-4111-8111-111111111111",
"irn": "LOCALTEST001-TEST0001-20260907",
"issue_date": "2026-09-07",
"issue_time": "10:00:00",
"due_date": "2026-09-21",
"invoice_type_code": "380",
"invoice_kind": "B2B",
"document_currency_code": "NGN",
"tax_currency_code": "NGN",
"accounting_supplier_party": {
"party_name": "Synthetic Supplier - NOT A REAL TAXPAYER",
"tin": "00000000-0001",
"email": "supplier@example.invalid",
"postal_address": {
"street_name": "1 Synthetic Test Street",
"city_name": "Synthetic Test City",
"postal_zone": "000000",
"lga": "NG-LA-IKE",
"state": "NG-LA",
"country": "NG"
}
},
"accounting_customer_party": {
"party_name": "Synthetic Buyer - NOT A REAL TAXPAYER",
"tin": "00000000-0002",
"email": "buyer@example.invalid",
"postal_address": {
"street_name": "1 Synthetic Test Street",
"city_name": "Synthetic Test City",
"postal_zone": "000000",
"lga": "NG-LA-IKE",
"state": "NG-LA",
"country": "NG"
}
},
"invoice_line": [
{
"hsn_code": "8471.30",
"product_category": "Portable computers",
"invoiced_quantity": 2.0,
"line_extension_amount": 200000.0,
"item": {
"name": "Synthetic portable computer",
"description": "Synthetic portable computer"
},
"price": {
"price_amount": 100000.0,
"base_quantity": 1,
"price_unit": "EA"
}
},
{
"isic_code": "6201",
"service_category": "Computer programming",
"invoiced_quantity": 1.0,
"line_extension_amount": 50000.0,
"item": {
"name": "Synthetic software service",
"description": "Synthetic software service"
},
"price": {
"price_amount": 50000.0,
"base_quantity": 1,
"price_unit": "EA"
}
}
],
"tax_total": [
{
"tax_amount": 18750.0,
"tax_subtotal": [
{
"taxable_amount": 250000.0,
"tax_amount": 18750.0,
"tax_category": {
"id": "STANDARD_VAT",
"percent": 7.5
}
}
]
}
],
"legal_monetary_total": {
"line_extension_amount": 250000.0,
"tax_exclusive_amount": 250000.0,
"tax_inclusive_amount": 268750.0,
"payable_amount": 268750.0
}
}The irn shown is a placeholder: the authoritative Invoice Reference Number, the cryptographic stamp (CSID) and the QR code are issued by NRS when the invoice is validated and signed.
Specification
A full OpenAPI 3 specification is published with the service and is the authoritative reference for request and response schemas.