Rondo Docs

API errors

Handle failures by their error code.

A failed request answers with an HTTP status and a JSON body: a stable code, and a message to show the person using the app.

Example
{
  "code": "pro_required",
  "message": "Letting others edit needs Pro."
}

Match code, not the wording of message.

CodeMeans
unauthorizedSign in first, or again: the session is missing or expired.
forbiddenYou can't do that to this deck.
read_onlyThe deck's author removed it, or the note keeps Anki's format.
not_foundIt doesn't exist, or not any more.
owner_mismatchA row's owner doesn't match the deck it's in.
cycleThe move would put a deck inside itself.
invalidSomething in the request isn't valid.
template_in_useNotes still use the note type.
quota_exceededMedia storage is full.
too_largeThe file is too large.
clock_aheadThe device's clock is ahead; set the time automatically.
client_outdatedThe app is too old for the server (426): update it.
pro_requiredThat needs Pro.
name_requiredOlder servers: set a display name first.
profile_requiredSet up a profile first (sharing and publishing).
reauthenticateSign in again, recently, to do that (deleting the account, changing security).
conflictIt changed meanwhile; try again.
unavailableThat isn't available right now.
internalSomething went wrong on the server.
second_factor_requiredEnter the code from the authenticator app: the session needs its second step.
restrictedThe account is restricted; the message says until when. See Community rules.
network_restrictedSharing isn't available from this network right now.
username_takenSomeone has that username, or had it in the last 30 days.
username_invalidThe username breaks a rule; the message says which.
too_soonUsernames change once every 30 days; the message says when next.
rate_limitedToo many tries for now; try again later.
code_invalidThe code is wrong, used, or expired.
already_proA subscription renews already, so a code can't be added.
passkey_requiredStaff tools: sign in, or confirm, with a passkey.
frozenStaff tools: frozen after too many actions in an hour.

Pushing rows is different: the request succeeds, and each row the server refused is listed in rejected with its code.