Payment (query/quote/pay) and operational (register/list students) endpoints.
Send your key in X-Api-Key or Authorization: Bearer ....
Keys are created in the Admin Panel as either:
query, quote, pay (school optional)register, list (must be bound to one school)
POST /api/v1/students — requires operational key with register
firstName, lastName, grade, section, parentName, parentPhonegrade / section must match school ParamsparentPhone: 9-digit local number (after +251)sendSms: optional boolean (default true)
POST /api/v1/students/bulk — requires operational key with register
students array (1–50) with the same fields as single registersendSms: optional boolean (default true) for the whole batchstudentId in data.students
GET /api/v1/students — requires operational key with list
q: optional searchpage: default 1perPage: default 20, max 100
GET /api/v1/students/{studentId}/query — requires payment key with query
include: comma-separated fields (default: summary + charges as returned by service).chargeFilter: all, open, payable, paid, optionalsourceTypes: fee_plan, fee_assignment, penalty, adhoc (comma-separated)syncPenalties: true/false (default true)paymentLimit: limit payment history rows (default 20)
POST /api/v1/quote — requires payment key with quote
Quote is short-lived (default 30 minutes, configurable by ttlMinutes).
You can select billing “periods” in flexible ways using selection.mode.
studentId (required)ttlMinutes (optional, default 30)amount (optional): expected total; server verifies sum matches within toleranceselection.chargeIds as an array of studentChargeId.
selection.installmentIds selects tuition installments by feePlanInstallmentId.
Optional: selection.includePenalties (default true).
selection.amount (server allocates in allocation order).
selection.startDate and selection.endDate (inclusive, format YYYY-MM-DD).
Optional: selection.includePenalties (default true).
POST /api/v1/pay — requires payment key with pay
To be safe against retries, use reference as an idempotency key.
If the same key is sent again, the server returns the existing payment.
Send studentId and either:
(a) allocations (chargeId -> amount), or
(b) selection + amount.