Guides
Errors
Every failed response has the same body, with a code that says what happened and who has to act. Branch on the code, never on the wording.
The error body
A sandbox connection made as user_expires_at_sync stops at its first sync, and every sync after that answers this:
409 Conflict
{
"detail": "Unattended sign-in for this connection was stopped at 2026-10-21 01:01 UTC after a sign-in did not complete (session_expired). Nothing further will be attempted against the institution; the user must reconnect.",
"error": {
"code": "session_expired",
"message": "Unattended sign-in for this connection was stopped at 2026-10-21 01:01 UTC after a sign-in did not complete (session_expired). Nothing further will be attempted against the institution; the user must reconnect.",
"retryable": false,
"request_id": "req_1b53be0b41aa8d3237e6b6c3",
"type": "connection_error",
"user_action": "reconnect",
"display_message": "Your AlkiraiLink Sandbox Bank sign-in has expired. Reconnect to keep your accounts up to date.",
"retry_after": null,
"stopped_at": "2026-10-21T01:01:17Z"
}
}
error.codeis what to branch on. The full list is below.error.user_actionis what the person has to do:reconnect,contact_institution,sign_inornone.error.display_messageis a sentence you can show the person, when there is one. Never show themmessageordetail, which are for you.error.retryablesays whether the same request can succeed later with nobody doing anything. When it is false, asking again only repeats the answer.error.request_idis also in theX-Request-Idheader. Quote it when you write to us.
detail repeats message, except on a 422 for the request's shape, where it lists each field that didn't match.
Retrying
- Retry only when
retryableis true, and no sooner thanretry_afterseconds when it is set. - Back off between tries. A read can spend a sign-in, and an institution's budget is small: see Syncing and budgets.
- Never retry
invalid_credentials. Repeated wrong passwords lock accounts, and AlkiraiLink stops the connection so that nothing does. - More than 120 requests a minute from one address is refused with a
429before it reaches the API. That one has no JSON body: wait a minute.
Statuses
| Status | When |
|---|---|
400 | The request can't be carried out as sent; error.message says why. |
401 | The API key is missing, unknown, expired or revoked. |
404 | Nothing by that id that this key may see. Another key's connection is also 404. |
409 | The connection is stopped, or its institution needs the person there to sign in. Nothing was sent to the institution. error.code and error.user_action say what unblocks it. |
413 | The body is over this route's limit, given as x-body-limit. |
422 | The body didn't match the expected shape, or a statement couldn't be read. For a shape error, detail lists each field. |
429 | Refused for now: the connection's sign-in budget is spent, another sign-in is running on it, or this address sent more than 120 requests in a minute. Wait for Retry-After when it is sent. The per-address limit is answered before the API and has no JSON body. |
500 | Something failed on our side. Try again; if it keeps happening, write to hello@alkirai.com with the request ID. |
502 | Signed in, and then the read failed. Nothing was stopped; error.code says why. |
503 | AlkiraiLink can't take the request right now. Try again shortly. |
Codes
Each code's type and the person's action never change, so you can map them once. Retry says whether asking again later can help.
| Code | Person's action | Retry | What it means |
|---|---|---|---|
invalid_credentials | reconnect | No | The institution didn't accept the saved sign-in details, usually because the password changed. The connection is stopped and the person reconnects. Never retry it: repeated wrong passwords lock accounts. |
challenge_failed | none | Later | The one-time code or answer wasn't accepted. The person can try again. |
session_expired | reconnect | No | The institution no longer accepts the connection's sign-in. The connection is stopped and the person reconnects. |
account_locked | contact_institution | No | The institution has locked the person's online banking. The connection is stopped. They contact the institution first and then reconnect, because reconnecting into a locked account fails again. |
mfa_required | sign_in | No | This institution needs the person there to sign in. Nothing is broken: refresh it with them, through Connect or a sign-in sync. |
institution_down | none | Later | The institution isn't responding. The connection isn't stopped; try again later. |
connector_broken | none | Later | AlkiraiLink couldn't read what the institution sent back, usually because its site changed. It is ours to fix, and nothing is needed from the person. A connection stopped this way restarts once it is fixed, so keep your usual schedule. |
rate_limited | none | Later | Too many requests for now. Wait for retry_after when it is set. |
unsupported | none | No | The institution can't do what was asked. |
internal | none | Later | Something failed on our side. Try again; if it keeps happening, write to us with the request ID. |
sign_in_incomplete | reconnect | No | A sign-in failed partway, so what the institution now makes of the account is unknown. The connection is stopped to protect it, and the person reconnects. |
consent_required | reconnect | No | The person didn't agree to share these details when they connected. They connect again, through a Connect session that asks for them. |
different_login | none | No | While signing in again to a connection you sent as connection_id, the person used a different login from the one the connection was made with. Nothing was saved and the connection is unchanged. Connect asks them to sign in with their original login. |
invalid_request | none | No | The request was wrong: a missing field, a value that isn't allowed, or a file that can't be read. message says which. |
unauthorized | none | No | The API key is missing, unknown, expired or revoked. |
forbidden | none | No | This key isn't allowed to do that. |
not_found | none | No | Nothing by that id that this key may see. |
expired | none | No | A Connect session or token has expired. Start again. |
service_unavailable | none | Later | AlkiraiLink can't take the request right now. Try again shortly. |