View as Markdown

Errors

Errors use conventional HTTP statuses and always return the same object:

{
  "error": {
    "type": "invalid_request_error",
    "code": "parameter_missing",
    "message": "Missing required parameter: price.",
    "param": "price",
    "doc_url": "https://api.kibanda.africa/docs/errors#parameter_missing"
  }
}

Branch on type and code (stable); show message to people (it may change). param names the offending field when there is one.

Types

Type Status Retry?
invalid_request_error 400 No — fix the request.
authentication_error 401 No — check the key.
permission_error 403 No.
not_found_error 404 No.
conflict_error 409 No — the object's state doesn't allow it.
idempotency_error 400 / 409 409: yes, shortly. 400: no — use a new key.
rate_limit_error 429 Yes, with backoff.
api_error 500 Yes, with the same Idempotency-Key.

Codes

parameter_missing

A required field wasn't sent. param names it.

parameter_invalid_string

parameter_invalid_integer

parameter_invalid_boolean

parameter_invalid_number

parameter_invalid_array

parameter_invalid_object

A field has the wrong type or is out of range. Money is an integer in cents: send 25000, not 250.00 or "250".

parameter_invalid_metadata

metadata must be an object of up to 50 keys (≤ 40 characters) with string values (≤ 500 characters).

parameter_invalid_cursor

starting_after must be the id of an object from the previous page.

parameter_unknown

The field can't be set here. Order status, for example, changes through actions such as POST /v1/orders/{id}/cancel.

invalid_json

The body isn't a JSON object.

phone_invalid

Phones may be +254712345678, 254712345678 or 0712 345 678; other countries in E.164 (+256…).

email_invalid

url_invalid

Webhook URLs must be https://.

currency_unsupported

Only KES for now.

event_type_unknown

See the event types.

limit_reached

Too many API keys (20) or webhook endpoints (16).

resource_missing

No object with that id in this shop (or it belongs to another shop).

external_id_taken

Another object already has that external_id. To sync a catalog, use POST /v1/products/batch, which upserts by external_id.

customer_exists

A customer with that phone exists; the message includes their id. Pass "upsert": true to update them instead.

order_not_cancellable

The order is paid, completed, already cancelled, or a payment is in progress.

idempotency_key_reused

The key was used with a different request. Each distinct request needs its own key.

idempotency_key_invalid

Keys can be at most 255 characters.

idempotency_request_in_progress

The first request with this key hasn't finished. Retry in a moment.

unauthenticated

api_key_invalid

api_key_wrong_environment

session_required

See Authentication.

route_not_found

No such endpoint. Paths start with /v1/.

internal_error

Our fault, and it's been reported. Retrying with the same Idempotency-Key is safe.