Skip to main content

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.

StatusMeaningTypical causes
200Success
204Success, no contentA list endpoint had nothing to return.
400Bad requestValidation 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.
401UnauthorizedMissing, 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.
403ForbiddenYour plan does not include the feature, or you reached a plan limit (for example the monthly transaction limit).
404Not foundThe record does not exist in your business.
409ConflictDeleting a record that is in use (for example a contact, item, tax or account that already has transactions, or a system account).
429Too many requestsRate limit exceeded.
500Server errorUnexpected 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.