Error messages in Agatabo are returned in JSON format in the response body. If you are using the UI, the message is displayed in a red alert banner. If you are calling the API directly, check the
message field in the response JSON.You don't have permission to perform this action
You don't have permission to perform this action
Error message:
"You don't have permission to perform this action"HTTP status: 403 ForbiddenWhat causes it:
Your account does not have the permission required for the operation you are attempting. Every action in Agatabo maps to a specific resource:action permission (e.g., loans:write, savings:write, periods:close). If none of your assigned roles includes that permission, the request is rejected.A variation of this error — “You can only access your own data” — means you have the correct permission but only at SELF scope, and you are trying to access another member’s data.How to fix it:- Identify the specific operation that failed and look up the required permission in the Permissions Matrix.
- Contact your organization’s Administrator and ask them to add the required permission to one of your existing roles, or assign you a role that already includes it.
- Confirm you are logged in with the correct account. If you have multiple accounts (e.g., a personal member account and an operator account), make sure you are using the one with the right permissions.
- After the Administrator updates your roles, log out and log back in to ensure your session reflects the new permissions.
Transaction date is in a closed period
Transaction date is in a closed period
Error message:
"Transaction date is in a closed period"HTTP status: 400 Bad RequestWhat causes it:
You are trying to record, edit, or delete a transaction with a date that falls within an accounting period that has already been closed. Once a period is closed, all transactions in that interval are locked and cannot be changed.Common scenarios:- Entering a deposit dated last month after the monthly close was already run
- Correcting a loan payment with the original transaction date
- Recording a late-reported expense from a previous period
periods:close permission can undo the most recent close using POST /period-closing/undo. After the correction is made, re-run the period close checklist and close the period again.Note that you can only undo the most recent close — you cannot reopen an arbitrary historical period.Prevention: Complete all transaction recording before running the period close checklist. If you regularly discover late transactions after closing, consider building a 2–3 day buffer between the period end date and the close execution date.Insufficient balance
Insufficient balance
Error message:
"Insufficient balance"HTTP status: 400 Bad RequestWhat causes it:
The transaction you are attempting would result in a negative balance in an account that is not permitted to go negative. This error can occur in three common contexts:- Savings withdrawal — the withdrawal amount exceeds the member’s current savings balance
- Expense payment — the organization’s bank account does not have enough funds to cover the expense
- Loan disbursement from savings — a fee or advance interest deduction would bring the member’s savings balance below zero
- Double-check the transaction amount — data entry errors (extra zeros, decimal misplacement) are the most common cause.
- For a savings withdrawal: View the member’s current savings balance via their account page or
GET /organization-users/{id}. If the balance is genuinely insufficient, either reduce the withdrawal amount or wait until the member makes additional deposits. - For an expense payment: Check the organization’s bank account balance in Agatabo. If the balance is correct, verify that sufficient funds exist in the bank before recording the expense.
- If you need to override the balance check for a loan disbursement in a specific exceptional circumstance, include
"skipNegativeBalanceCheck": truein thePOST /loansrequest body — but use this flag sparingly and document the reason.
Member not found or savings cannot be recorded
Member not found or savings cannot be recorded
Error message:
"Savings can only be recorded for organization users with member role" or "Member not found"HTTP status: 404 Not Found or 400 Bad RequestWhat causes it:
You are trying to record a deposit, withdrawal, or loan for an organization user who does not have the “member” role assigned. In Agatabo, an organization user is not a financial participant until the member role is explicitly granted — no role means no savings ledger account, and without a savings ledger account, no financial operations are possible.This error most commonly occurs immediately after creating a new organization user if the role assignment step was skipped.How to fix it:- Confirm that the organization user exists:
GET /organization-users/{id}. - Check their current role assignments:
GET /organization-users/{id}/role-assignments. - If the member role is missing, assign it:
POST /organization-users/{id}/role-assignmentswith the correctroleDefinitionIdfor your organization’s member role. - Verify that the savings ledger account was created:
GET /organization-users/{id}and check thatsavingsLedgerAccountIdis non-null. - Retry the original operation.
Member not eligible for loan
Member not eligible for loan
Error message:
How to fix it:For an existing active loan: Wait until the current loan is fully repaid (status =
"Organization user already has an active or defaulted loan" or "Principal exceeds max allowed" or "Insufficient security coverage"HTTP status: 409 Conflict or 400 Bad RequestWhat causes it:
One or more of Agatabo’s loan eligibility rules has not been met. The specific message tells you exactly which rule failed:| Message | Rule Violated |
|---|---|
"Organization user already has an active or defaulted loan" | Member already has a loan in ACTIVE or DEFAULTED status |
"Principal exceeds max allowed from max loan percentage rule" | Loan amount > (member savings × max_loan_percentage) |
"Loan period cannot exceed X month(s)" | Period exceeds the organization’s max_period setting |
"Insufficient security coverage" | Total security value < principal amount |
COMPLETED). If the loan is uncollectible, process a formal default via POST /loans/{id}/default before issuing a new one.For max loan percentage: Either reduce the principal amount, or ask the member to increase their savings balance before reapplying. An Administrator can also update the max_loan_percentage setting in Organization Settings if your policies allow for a higher ratio.For insufficient securities: Add additional guarantors, increase collateral coverage, require a higher savings lien, or reduce the principal to match the available security value.For max period: Reduce the loan term, or request an Administrator update the max_period setting if your policies permit longer terms.Prevention: Complete Stage 1 (Pre-Loan Preparation) of the Loan Disbursement Workflow before creating any loan. Running through the eligibility checklist offline takes five minutes and prevents 100% of eligibility-related errors.Idempotency key already used
Idempotency key already used
Error message:
"x-idempotency-key header is required" or "Duplicate transaction detected"HTTP status: 400 Bad Request or 409 ConflictWhat causes it:- Missing key: The
x-idempotency-keyheader was not included in a mutation request. All financial write operations require this header. - Duplicate key: The same idempotency key has already been used successfully in your organization. Agatabo enforces uniqueness per organization — once a key is used, it can never be reused for a different transaction.
x-idempotency-key header to the request with a unique value. Use crypto.randomUUID() or another UUID v4 generator.For a duplicate key error:- First, check whether the original transaction was recorded successfully by looking at the relevant transaction list (e.g., the member’s deposit history or the loan portfolio).
- If the original did succeed: Do not retry. The transaction exists — display a success message to the user.
- If the original did not succeed (e.g., it failed with a validation error before being saved): You may safely retry with the same idempotency key after fixing the validation issue.
- If you want to record a new, separate transaction: Generate a fresh idempotency key.
Network error or no response received
Network error or no response received
Error message:
"Network error", request timeout, or no response receivedWhat causes it:
A network error means the HTTP request did not complete successfully. The root cause could be:- Your internet connection dropped or became unstable
- The Agatabo server took longer than your client’s timeout threshold to respond
- A proxy, firewall, or VPN interrupted the request
- A temporary server-side issue (rare)
- Check your connection: Confirm you can load other websites or the Agatabo dashboard.
- For read requests (GET): Simply retry — GET requests are safe to repeat.
- For write requests (POST/PUT/DELETE):
- Do NOT immediately resubmit with a new idempotency key. First, check whether the transaction was already recorded.
- Navigate to the relevant section (member’s transaction history, loan list, etc.) and look for the transaction you were trying to create.
- If the transaction is there: It succeeded. Do not resubmit.
- If the transaction is not there: Retry with the same idempotency key. Because the original request either failed before being saved or was rejected, using the same key is safe and will not create a duplicate.
- Wait 60 seconds before retrying to allow any transient server load to resolve.
- If the problem persists for more than 10 minutes, contact Agatabo support with the timestamp and the operation you were attempting.
Permissions Matrix
Look up which permission is required for any operation
Monthly Closing Checklist
Resolve closed-period errors with the correct undo procedure
Idempotency
Prevent and handle duplicate transaction errors
New Member Onboarding
Avoid “member not found” errors with the complete onboarding flow