api.ckonto.de  |  cKonto.de

Error format

All errors are returned as a JSON object with the key error. In most cases, the response body has the following structure:

{
  "error": {
    "http_status": 401,
    "code": "invalid_key",
    "message": "The API key is not valid",
    "field": "..."        // optional – only for input errors
  }
}

Individual error codes can be linked to directly, e.g. /api/docs/errors#invalid_key.

Authentication errors

invalid_key HTTP 401 #invalid_key

Invalid API key

The bearer token provided is not valid or is missing entirely. Check the Authorization header.

{
  "error": {
    "http_status": 401,
    "code": "invalid_key",
    "message": "The API key is not valid"
  }
}

Input errors

invalid_iban HTTP 400 #invalid_iban

Invalid IBAN

The IBAN provided is too short, does not start with two letters, or contains invalid characters. Spaces are removed automatically and lowercase letters are normalized - all other special characters are not allowed.

Affected field: iban

{
  "error": {
    "http_status": 400,
    "code": "invalid_iban",
    "message": "The IBAN is invalid or has an incorrect format",
    "field": "iban"
  }
}
invalid_bic HTTP 400 #invalid_bic

Invalid BIC

The BIC provided does not match the ISO 9362 format: 8 or 11 characters, the first six being letters (bank and country code), followed by letters or digits (location code, optionally a three-character branch code). Whitespace is removed and lowercase letters are normalised. A formally valid BIC that does not match the IBAN is not a request error; it returns HTTP 200 with status: 2.

Affected field: bic

{
  "error": {
    "http_status": 400,
    "code": "invalid_bic",
    "message": "The BIC is invalid or has an incorrect format",
    "field": "bic"
  }
}
invalid_kontonummer HTTP 400 #invalid_kontonummer

Invalid account number

The account number was not provided, is zero, or contains non-numeric characters.

Affected field: kontonummer

{
  "error": {
    "http_status": 400,
    "code": "invalid_kontonummer",
    "message": "Account number is missing or contains invalid characters",
    "field": "kontonummer"
  }
}
invalid_blz HTTP 400 #invalid_blz

Invalid bank code (BLZ)

The bank code was not provided or contains non-numeric characters. A valid German bank code (BLZ) is 8 digits and purely numeric.

Affected field: bankleitzahl

{
  "error": {
    "http_status": 400,
    "code": "invalid_blz",
    "message": "Bank code (BLZ) is missing or contains invalid characters",
    "field": "bankleitzahl"
  }
}
batch_size_invalid HTTP 400 #batch_size_invalid

Invalid batch size

The ibans array in the POST body is empty or contains more than 500 entries. 1 to 500 IBANs are allowed per request.

{
  "error": {
    "http_status": 400,
    "code": "batch_size_invalid",
    "message": "Batch must contain 1 to 500 IBANs"
  }
}
invalid_batch_ibans HTTP 400 #invalid_batch_ibans

Invalid batch format

The ibans field is present in the POST body but is not an array (e.g. a single string instead of a list). Use the iban field instead for a single check, or ibans as an array with 1 to 500 entries for a batch check.

Affected field: ibans

{
  "error": {
    "http_status": 400,
    "code": "invalid_batch_ibans",
    "message": "The 'ibans' field must be an array of IBANs",
    "field": "ibans"
  }
}
conflicting_iban_fields HTTP 400 #conflicting_iban_fields

Conflicting IBAN fields

The POST body to /v1/iban contains both iban (single check) and ibans (batch check) at the same time. Use only one of the two fields per request.

{
  "error": {
    "http_status": 400,
    "code": "conflicting_iban_fields",
    "message": "iban and ibans must not be sent at the same time"
  }
}
invalid_content_type HTTP 400 #invalid_content_type

Wrong content type

POST requests to /v1/kto, /v1/iban, or /v1/search without path parameters require Content-Type: application/json. Other content types (e.g. application/x-www-form-urlencoded) are not supported.

{
  "error": {
    "http_status": 400,
    "code": "invalid_content_type",
    "message": "POST requests to this endpoint require Content-Type: application/json"
  }
}
payload_too_large HTTP 413 #payload_too_large

Request body too large

The request body exceeds the limit of 128 KB.

{
  "error": {
    "http_status": 413,
    "code": "payload_too_large",
    "message": "The request body is too large (max. 128 KB)"
  }
}
invalid_zip HTTP 400 #invalid_zip

Invalid postal code (bank search)

The zip parameter of the bank search (/v1/search) contains non-numeric characters.

Affected field: zip

{
  "error": {
    "http_status": 400,
    "code": "invalid_zip",
    "message": "Postal code must contain digits only for search",
    "field": "zip"
  }
}
invalid_json HTTP 400 #invalid_json

Invalid JSON request body

The request body is valid JSON but not an object (e.g. an array) instead of {...}. Syntactically broken JSON instead returns invalid_request. An empty body does not trigger this error, but instead leads to the matching field error (e.g. invalid_kontonummer).

{
  "error": {
    "http_status": 400,
    "code": "invalid_json",
    "message": "The request body is not a valid JSON object"
  }
}
missing_search_criteria HTTP 400 #missing_search_criteria

No search criterion provided

The bank search (/v1/search) was called without any search field. At least one of the fields name, location, zip, or bankleitzahl must be set.

{
  "error": {
    "http_status": 400,
    "code": "missing_search_criteria",
    "message": "At least one of the fields name, location, zip or bankleitzahl must be provided"
  }
}
invalid_max HTTP 400 #invalid_max

Invalid max parameter

The max parameter of the bank search is set but is not purely numeric or is outside the allowed range of 1-50. If max is missing or empty, the default of 10 applies instead - that is not an error.

Affected field: max

{
  "error": {
    "http_status": 400,
    "code": "invalid_max",
    "message": "The max parameter must be between 1 and 50",
    "field": "max"
  }
}
invalid_sepa HTTP 400 #invalid_sepa

Invalid sepa parameter

The sepa parameter is set but is neither 0 nor 1. If sepa is missing, the default 0 applies instead - that is not an error.

Affected field: sepa

{
  "error": {
    "http_status": 400,
    "code": "invalid_sepa",
    "message": "The sepa parameter must be 0 or 1",
    "field": "sepa"
  }
}
invalid_request HTTP 400 #invalid_request

Invalid request

Generic error code for two cases with an identical response format but different message text:

1. Path does not match any known endpoint pattern - e.g. /v1/kto/… or /v1/iban/… with extra or missing segments. Only used when no more specific code (e.g. invalid_kontonummer, invalid_iban) applies.

{
  "error": {
    "http_status": 400,
    "code": "invalid_request",
    "message": "Invalid request"
  }
}

2. Request body is not valid JSON (syntactically broken or truncated). Not to be confused with invalid_json, which only applies to syntactically valid JSON that is not an object.

{
  "error": {
    "http_status": 400,
    "code": "invalid_request",
    "message": "The request could not be processed. Most common cause: the request body is not valid JSON."
  }
}

Method errors

method_not_allowed HTTP 405 #method_not_allowed

Method not allowed

The HTTP method used is not allowed for this endpoint. Use the method given in the Allow response header.

Affects: all endpoints - e.g. POST to a GET-only endpoint such as GET /v1/kto/{kontonummer}/{bankleitzahl}.

{
  "error": {
    "http_status": 405,
    "code": "method_not_allowed",
    "message": "Method not allowed. Allowed: GET"
  }
}

Other HTTP errors

These codes come from the web server level, not from the application logic. The response format is the same as for all other errors.

forbidden HTTP 403 #forbidden

Access denied

Access to this resource is not allowed.

{
  "error": {
    "http_status": 403,
    "code": "forbidden",
    "message": "Access to this resource is not allowed."
  }
}
not_found HTTP 404 #not_found

Not found

The requested resource does not exist.

{
  "error": {
    "http_status": 404,
    "code": "not_found",
    "message": "The requested resource was not found."
  }
}
internal_error HTTP 500 #internal_error

Unexpected server error

An unexpected server error, e.g. from an incompletely transmitted request body. The request can usually be retried unchanged. If the error persists, please contact support.

{
  "error": {
    "http_status": 500,
    "code": "internal_error",
    "message": "An unexpected server error occurred."
  }
}

System errors

ckonto_failed HTTP 500 #ckonto_failed

Internal processing error

The check could not be performed server-side. The request was syntactically correct - please retry the request. If the error persists, please contact support.

{
  "error": {
    "http_status": 500,
    "code": "ckonto_failed",
    "message": "cKonto could not be executed"
  }
}
server_busy HTTP 503 #server_busy

Server busy

All processing slots for checks are currently in use (limit of concurrent checks reached). The request was neither processed nor counted. Resend it unchanged after the number of seconds given in the Retry-After response header.

Retry-After: 2

{
  "error": {
    "http_status": 503,
    "code": "server_busy",
    "message": "Server busy, please retry"
  }
}
configuration_error HTTP 500 #configuration_error

Server configuration incomplete

The API could not load its server configuration. This is not caused by your request; retrying the request will not change anything. Please contact support if this error persists.

{
  "error": {
    "http_status": 500,
    "code": "configuration_error",
    "message": "Server configuration incomplete"
  }
}