I have found the culprit where I didn't expect it: idnumber should not have the PARAM_TYPE: PARAM_INT because it does not have a value and thus is no integer. The correct return-structure (with a slightly different output structure) looks like this:
public static function get_user_information_returns() {
return
new external_multiple_structure (new external_single_structure (array (
'user_information' => new external_single_structure ( array (
'id' => new external_value (PARAM_INT, 'id of the user'),
'username' => new external_value (PARAM_TEXT, 'username of the user'),
'firstname' => new external_value (PARAM_TEXT, 'firstname of the user'),
'lastname' => new external_value (PARAM_TEXT, 'lastname of the user'),
'email' => new external_value (PARAM_TEXT, 'email of the user'),
'timecreated' => new external_value (PARAM_INT, 'timecreated of the user'),
'timemodified' => new external_value (PARAM_INT, 'timemodified of the user'),
'lang' => new external_value (PARAM_TEXT, 'lang of the user'),
'auth' => new external_value (PARAM_TEXT, 'auth of the user'),
)),
'users_courses' => new external_multiple_structure (new external_single_structure (array (
'id' => new external_value (PARAM_INT, 'id of course'),
'category' => new external_value (PARAM_INT, 'category id of the course'),
'shortname' => new external_value (PARAM_TEXT, 'short name of the course'),
'fullname' => new external_value (PARAM_TEXT, 'long name of the course'),
'startdate' => new external_value (PARAM_INT, 'starting date of the course'),
'visible' => new external_value (PARAM_BOOL, 'visible of course'),
)))
)));
}
Cheers