Dallol ERP

API docs

External REST API for invoices, MoR EIMS register/cancel/receipts, and Debo Pay collection.

Introduction

Base URL: https://dallolerp.com/api/v1. All bodies and responses are JSON. Each API key is locked to one company. Enable EIMS under EIMS settings before register/cancel/receipts. HTTPS is required in production.

GET https://dallolerp.com/api/v1 (no key) returns this catalog. OpenAPI: https://dallolerp.com/docs/openapi.yaml.

Authentication

Create a key under Settings › API keys. Send it on every protected request:

Authorization: Bearer <key>:<secret>
# or
X-API-Key: <key>
X-API-Secret: <secret>
Never put secrets in browser JavaScript, mobile source, URLs, screenshots, or Git.

Scopes

ScopeAllows
invoices:readGET invoices
invoices:writePOST invoices (create)
integrationsRegister, cancel, verify, sales receipt, withholding
payments:writeDebo Pay checkout + record payments
customers:* / products:* / sales:*Partner catalog sync

Invoices (five calls)

MethodPathScopeRequired
GET/invoicesinvoices:readOptional ?status=&limit=1..100
GET/invoices/{id}invoices:readNumeric invoice id
POST/invoicesinvoices:writelines[] with description, quantity, unit_price. Optional customer_id, dates, currency, tax_rate
GET/pingAny keyNone
GET/api/v1PublicNone
curl https://dallolerp.com/api/v1/invoices?limit=20 \
 -H "Authorization: Bearer KEY:SECRET"

curl -X POST https://dallolerp.com/api/v1/invoices \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{
   "customer_id": 1,
   "invoice_date": "2026-09-11",
   "currency": "ETB",
   "lines": [{"description":"Single Room","quantity":1,"unit_price":519.80,"tax_rate":15}]
 }'

Create returns 201 with data.invoice_id. Validate in the ERP UI (or register, which auto-validates drafts) before MoR will accept the invoice.

Register (single and bulk)

Scope integrations. Success returns data.irn. IRNs starting with test- are local EIMS test identifiers — not on portal.mor.gov.et until production signing is on.

# single
curl -X POST https://dallolerp.com/api/v1/invoices/7/register \
 -H "Authorization: Bearer KEY:SECRET"

# bulk (max 50)
curl -X POST https://dallolerp.com/api/v1/invoices/register-bulk \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{"ids":[7,8,9]}'

Bulk response: data[] with invoice_id, success, irn or error per row.

Cancel (single and bulk)

Required: a stored IRN. Body: reason_code (string, default 1), optional remark.

curl -X POST https://dallolerp.com/api/v1/invoices/7/cancel \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{"reason_code":"1","remark":"Customer cancelled"}'

curl -X POST https://dallolerp.com/api/v1/invoices/cancel-bulk \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{"ids":[7,8],"reason_code":"1"}'
# or {"irns":["IRN1","IRN2"],"reason_code":"1"}

Verify

curl -X POST https://dallolerp.com/api/v1/invoices/7/verify \
 -H "Authorization: Bearer KEY:SECRET"

Returns stored irn, status, MoR verify URL, and any upstream verify payload.

Sales receipt

After an invoice is registered and paid. sellerTIN / source system fields default from the company if omitted.

curl -X POST https://dallolerp.com/api/v1/receipts/sales \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{
   "receiptNumber": "RCP-1",
   "receiptCounter": "1",
   "receiptDate": "11-09-2026T18:00:00",
   "receiptCurrency": "ETB",
   "collectedAmount": 597.77,
   "invoices": [{
     "invoiceIRN": "IRN",
     "paymentCoverage": "FULL",
     "invoicePaidAmount": 597.77,
     "totalAmount": 597.77
   }]
 }'

Withholding

curl -X POST https://dallolerp.com/api/v1/receipts/withholding \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{
   "ReceiptNumber": "WHT-1",
   "ReceiptCounter": "1",
   "InvoiceDetail": {"InvoiceIRN":"IRN","Currency":"ETB"},
   "WithholdDetail": {"Type":"INCOME","Rate":2,"PreTaxAmount":519.80,"WithholdingAmount":10.40}
 }'

Debo Pay

Required: positive amount. Optional: email, phone, purpose, label. Response: checkout_url + QR data URI. Record a cash/bank payment with POST /payments (invoice_id, amount).

curl -X POST https://dallolerp.com/api/v1/payments/link \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{"amount":597.77,"purpose":"invoice","label":"INV-1-2026-00001"}'

Customers, products, sales

curl https://dallolerp.com/api/v1/customers -H "Authorization: Bearer KEY:SECRET"
curl -X POST https://dallolerp.com/api/v1/customers \
 -H "Authorization: Bearer KEY:SECRET" \
 -H "Content-Type: application/json" \
 -d '{"name":"Walk-in","phone":"+251900000000"}'
curl https://dallolerp.com/api/v1/products -H "Authorization: Bearer KEY:SECRET"
curl https://dallolerp.com/api/v1/sales -H "Authorization: Bearer KEY:SECRET"

Errors

StatusMeaning
200 / 201success: true
401Missing or invalid key/secret
403Missing scope or subscription
404Not in this company
422Invalid body (missing lines, ids, amount)
429Quota exceeded
502 / 503EIMS or Debo Pay not configured / rejected

Lists cap at 100 rows. Do not retry POST /invoices unless the previous call failed.

DallolTech HQ — Bole, Addis Ababa

Office: Bole Sub-City · info@dallolerp.com · +2519 05 667799 · dalloltech.com

Directions from my location

HQ location