Skip to main content


Connect-Kotlin uses a set of 16 error codes. These are similar to the "404 Not Found" and "500 Internal Server Error" HTTP status codes that are more familiar.

In the Connect protocol, an error is always represented as JSON on the wire. For example:

HTTP/1.1 400 Bad Request
Content-Type: application/json

"code": "invalid_argument",
"message": "sentence cannot be empty"

Connect-Kotlin provides a common ConnectException type that represents errors consistently across all supported protocols.

ResponseMessage failure values returned by unary API calls expose a cause and streaming APIs throw a ConnectException if an error occurs while reading from the responseChannel:

val request = SayRequest(sentence = sentence)
val response = elizaClient.say(request)
response.failure {
print(it.cause.code) // Code.INVALID_ARGUMENT
print(it.cause.message) // "sentence cannot be empty"
print(it.cause.metadata) // Dictionary of additional server-provided headers/trailers

Error details

Additional strongly typed errors may be specified by the server in responses. These are wrapped with the google.protobuf.Any type, and can be unpacked using the ConnectException.unpackedDetails() function by specifying the expected error message class type:

val request = SayRequest(sentence = sentence)
val response = elizaClient.say(request)
response.failure {
val errorDetails = it.cause.unpackedDetails(ErrorDetail::class)
// Work with ErrorDetail.


Generated methods have the suspend keyword on the method signature which will cancel the underlying request when the Kotlin coroutine context is canceled.

With the callback unary signature, the result is a canceling handler to give control to the user to manually cancel a request:

val request = sayRequest { sentence = sentence }
val cancel = elizaServiceClient.say(request) { response ->
print(response.code) // Code.CANCELED.