SearchApiQuery - possible to remove a filter?
I found the solution, but be careful: it is very tricky! Ideally, it should be special method in the SearchApiQuery class itself, or method in class-wrapper, which will be used everywhere in code...

My solution based on ability to access private members of classes, passed to __constructor function:

class SearchApiQueryFilterAlter extends SearchApiQuery
{
    public $altered_query;
    function __construct(SearchApiIndex $index, array $options = array())
    {
        if (isset($options['original_query']) AND isset($options['filter_alter'])) {
            $options['original_query']-&gt;filter = $options['filter_alter'];
            $this-&gt;altered_query = $options['original_query'];
        } else {
            parent::__construct($index, $options);
        }
    }
}


Property $altered_query will contain original query with modified filters.

Usage example:

function product_list_search_api_ranges_minmax_alter($variables, $order)
{
    /** @var SearchApiQuery $query */
    $query = $variables['query'];
    $filters = $query-&gt;getFilter();
    $new_filters = $query-&gt;createFilter();
    foreach($filters-&gt;getFilters() as $filter){
       if(!$filter-&gt;hasTag('facet:field_product:commerce_price:amount_decimal')){
            $new_filters-&gt;filter($filter);
        }
    }
    $options = array(
        'original_query' =&gt; $query,
        'filter_alter' =&gt; $new_filters
    );
    $filter_alter = new \Drupal\product_list\SearchApiQueryFilterAlter(new SearchApiIndex(), $options);
    $variables['query'] = $filter_alter-&gt;altered_query;
}


In this example all filters has been copied to the $new_filters, except one with special tag. Then, we pass original query and new filters to class constructor through $variables. And empty SearchApiIndex, which is nesesary. Finally, in $filter_alter->altered_query we have the query with deleted filter condition.