The following is a list of current error domains libmongoc can return:
MONGOC_ERROR_CLIENT, 1
MONGOC_ERROR_STREAM, 2
MONGOC_ERROR_PROTOCOL, 3
MONGOC_ERROR_CURSOR, 4
MONGOC_ERROR_QUERY, 5
MONGOC_ERROR_INSERT, 6
MONGOC_ERROR_SASL, 7
MONGOC_ERROR_BSON, 8
MONGOC_ERROR_MATCHER, 9
MONGOC_ERROR_NAMESPACE, 10
MONGOC_ERROR_COMMAND, 11
MONGOC_ERROR_COLLECTION, 12
MONGOC_ERROR_GRIDFS, 13
MONGOC_ERROR_SCRAM, 14
MONGOC_ERROR_SERVER_SELECTION, 15
MONGOC_ERROR_WRITE_CONCERN, 16
MONGOC_ERROR_SERVER, 17
MONGOC_ERROR_TRANSACTION, 18
MONGOC_ERROR_CLIENT_SIDE_ENCRYPTION, 19
BSON_ERROR_JSON, 1
BSON_ERROR_READER, 2
BSON_ERROR_INVALID, 3
There are three overlapping domains:
BSON_ERROR_JSON = MONGOC_ERROR_CLIENT
BSON_ERROR_READER = MONGOC_ERROR_STREAM
BSON_ERROR_INVALID = MONGOC_ERROR_PROTOCOL
The following is a list of documented error codes. (This is not a list of all possible errors that could be returned, since server errors, or errors originating from libmongocrypt, have their own codes)
MONGOC_ERROR_STREAM_INVALID_TYPE, 1
MONGOC_ERROR_STREAM_INVALID_STATE, 2
MONGOC_ERROR_STREAM_NAME_RESOLUTION, 3
MONGOC_ERROR_STREAM_SOCKET, 4
MONGOC_ERROR_STREAM_CONNECT, 5
MONGOC_ERROR_STREAM_NOT_ESTABLISHED, 6
MONGOC_ERROR_CLIENT_NOT_READY, 7
MONGOC_ERROR_CLIENT_TOO_BIG, 8
MONGOC_ERROR_CLIENT_TOO_SMALL, 9
MONGOC_ERROR_CLIENT_GETNONCE, 10
MONGOC_ERROR_CLIENT_AUTHENTICATE, 11
MONGOC_ERROR_CLIENT_NO_ACCEPTABLE_PEER, 12
MONGOC_ERROR_CLIENT_IN_EXHAUST, 13
MONGOC_ERROR_PROTOCOL_INVALID_REPLY, 14
MONGOC_ERROR_PROTOCOL_BAD_WIRE_VERSION, 15
MONGOC_ERROR_CURSOR_INVALID_CURSOR, 16
MONGOC_ERROR_QUERY_FAILURE, 17
MONGOC_ERROR_BSON_INVALID, 18
MONGOC_ERROR_MATCHER_INVALID, 19
MONGOC_ERROR_NAMESPACE_INVALID, 20
MONGOC_ERROR_NAMESPACE_INVALID_FILTER_TYPE, 21
MONGOC_ERROR_COMMAND_INVALID_ARG, 22
MONGOC_ERROR_COLLECTION_INSERT_FAILED, 23
MONGOC_ERROR_COLLECTION_UPDATE_FAILED, 24
MONGOC_ERROR_COLLECTION_DELETE_FAILED, 25
MONGOC_ERROR_COLLECTION_DOES_NOT_EXIST, 26
MONGOC_ERROR_GRIDFS_INVALID_FILENAME, 27
MONGOC_ERROR_SCRAM_NOT_DONE, 28
MONGOC_ERROR_SCRAM_PROTOCOL_ERROR, 29
MONGOC_ERROR_QUERY_COMMAND_NOT_FOUND, 59
MONGOC_ERROR_QUERY_NOT_TAILABLE, 13051
NGOC_ERROR_SERVER_SELECTION_BAD_WIRE_VERSION, 13052
MONGOC_ERROR_SERVER_SELECTION_FAILURE, 13053
MONGOC_ERROR_SERVER_SELECTION_INVALID_ID, 13054
MONGOC_ERROR_GRIDFS_CHUNK_MISSING, 13055
MONGOC_ERROR_GRIDFS_PROTOCOL_ERROR, 13056
MONGOC_ERROR_PROTOCOL_ERROR, 17
MONGOC_ERROR_WRITE_CONCERN_ERROR, 64
MONGOC_ERROR_DUPLICATE_KEY, 11000
MONGOC_ERROR_MAX_TIME_MS_EXPIRED, 50
MONGOC_ERROR_CHANGE_STREAM_NO_RESUME_TOKEN, 51
MONGOC_ERROR_CLIENT_SESSION_FAILURE, 52
MONGOC_ERROR_TRANSACTION_INVALID_STATE, 53
MONGOC_ERROR_GRIDFS_CORRUPT, 54
MONGOC_ERROR_GRIDFS_BUCKET_FILE_NOT_FOUND, 55
MONGOC_ERROR_GRIDFS_BUCKET_STREAM, 56
MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_STATE, 57
MONGOC_ERROR_CLIENT_INVALID_ENCRYPTION_ARG, 58
BSON_JSON_ERROR_READ_CORRUPT_JS, 1
BSON_JSON_ERROR_READ_INVALID_PARAM, 2
BSON_JSON_ERROR_READ_CB_FAILURE, 3
BSON_ERROR_READER_BADFD, 1
BSON_VALIDATE_NONE, 0
BSON_VALIDATE_UTF8, 1
BSON_VALIDATE_DOLLAR_KEYS, 2
BSON_VALIDATE_DOT_KEYS, 4
BSON_VALIDATE_UTF8_ALLOW_NULL, 8
BSON_VALIDATE_EMPTY_KEYS, 16
Some overlapping domains have overlapping codes.
For example, the domains BSON_ERROR_READER = MONGOC_ERROR_STREAM share the code BSON_ERROR_READER_BADFD = MONGOC_ERROR_STREAM_INVALID_TYPE.
I am not sure if there if there are functions that could return overlapping errors (assuming error API V2 is used), but this certainly makes error handling more difficult for users.