Errors
Errors use standard HTTP status codes and a JSON body:
{
"statusCode": 400,
"message": "Txn No:INV-0042 Subtotal mismatch. Entry: 1000, but calculated: 900.",
"error": "Bad Request"
}
message is a human-readable string (occasionally an array of strings for validation errors). Do not parse it programmatically — branch on statusCode.
| Status | Meaning | Typical causes |
|---|---|---|
200 | Success | |
204 | Success, no content | A list endpoint had nothing to return. |
400 | Bad request | Validation failed, a required query parameter is missing, invalid JSON in a query parameter, totals do not add up, a duplicate name, or the date falls in a locked financial year. |
401 | Unauthorized | Missing, unknown or disabled key, or the key's role is not permitted to call this endpoint. The body is always "Invalid authorization!" — it does not say which. |
403 | Forbidden | Your plan does not include the feature, or you reached a plan limit (for example the monthly transaction limit). |
404 | Not found | The record does not exist in your business. |
409 | Conflict | Deleting a record that is in use (for example a contact, item, tax or account that already has transactions, or a system account). |
429 | Too many requests | Rate limit exceeded. |
500 | Server error | Unexpected failure. Retry; if it persists, contact support with the time and endpoint. |
Financial-year lock
If your business has locked a financial year (Settings), any create/update/delete of a transaction or payment dated on or before the lock date is rejected with 400. Unlock the year in the app to change those records.