Single API call exposed via shortcode with params

The issue here is variable scoping. You’re trying to access a global variable locally.

// Global scope.
$api_response = null;

function get_user_info( $type ) {
    // Local scope.    

    if ( $api_response === null ) {
        // make api reqest.
        // $api_response = api request data;
        return $api_response[ $type ];
    } else {
        return $api_response[ $type ];
    }
}
add_shortcode( 'user_link', 'get_user_info' );

Add global $api_response to the top of your function would solve your issue, however using global variables is generally frowned upon and you should consider another solution like transients (as mentioned in the comments).

An example of how to add transients to your function would be:

function get_user_info( $type ) {
    $user_id      = get_current_user_id();
    $api_response = get_transient( "prefix_api_response_$user_id" );

    if ( ! $api_response ) {
        // make api request.
        $api_response = api_request_data();

        // Save response for 1 day.
        set_transient( "prefix_api_response_$user_id", $api_response, DAY_IN_SECONDS );
    }

    return $api_response[ $type ];
}