External REST API for invoices, MoR EIMS register/cancel/receipts, and Debo Pay collection.
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.
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>
| Scope | Allows |
|---|---|
invoices:read | GET invoices |
invoices:write | POST invoices (create) |
integrations | Register, cancel, verify, sales receipt, withholding |
payments:write | Debo Pay checkout + record payments |
customers:* / products:* / sales:* | Partner catalog sync |
| Method | Path | Scope | Required |
|---|---|---|---|
| GET | /invoices | invoices:read | Optional ?status=&limit=1..100 |
| GET | /invoices/{id} | invoices:read | Numeric invoice id |
| POST | /invoices | invoices:write | lines[] with description, quantity, unit_price. Optional customer_id, dates, currency, tax_rate |
| GET | /ping | Any key | None |
| GET | /api/v1 | Public | None |
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.
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.
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"}
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.
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
}]
}'
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}
}'
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"}'
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"
| Status | Meaning |
|---|---|
200 / 201 | success: true |
401 | Missing or invalid key/secret |
403 | Missing scope or subscription |
404 | Not in this company |
422 | Invalid body (missing lines, ids, amount) |
429 | Quota exceeded |
502 / 503 | EIMS or Debo Pay not configured / rejected |
Lists cap at 100 rows. Do not retry POST /invoices unless the previous call failed.
Office: Bole Sub-City · info@dallolerp.com · +2519 05 667799 · dalloltech.com