Example: Find Products With Semantic Search

It's 2026 - why are shoppers filtering and sorting when they can just ask for what they want?

How FEVER Helps

  • Your media content will have a fingerprint associated after FEVER runs.
  • FEVER automates rapid search of those fingerprints, exposing them on the Search API.
  • FEVER will accept a text or image query, and return the list of matching media.
  • Typical sorting and filtering options are supported with the underlying database system.

Implementation Guide

  • If you have not already installed FEVER, follow the Quick Start Guide.
  • 1. Use the provided snippets to wire the Search API into your backend service, or call it directly from your client application at will.
  • 2. Pass your shopper's customer_id and tune k / min_score to taste.

Code Starters

import asyncio

import fever_client

async def main():
    config = fever_client.Configuration(
        host="https://your-appliance",
        access_token="YOUR_API_KEY",
    )
    async with fever_client.ApiClient(config) as client:
        search = fever_client.SearchApi(client)
        hits = await search.search(
            fever_client.SearchRequest(
                text="plaid handbag", k=10, customer_id="shop-42"
            )
        )
        for hit in hits:
            print(hit.blob_id, round(hit.score, 3), hit.media_ref)

asyncio.run(main())
import { Configuration, SearchApi } from "fever-client";

const search = new SearchApi(
  new Configuration({
    basePath: "https://your-appliance",
    accessToken: "YOUR_API_KEY",
  })
);

const hits = await search.search({
  searchRequest: { text: "plaid handbag", k: 10, customerId: "shop-42" },
});
for (const hit of hits) {
  console.log(hit.blobId, hit.score?.toFixed(3), hit.mediaRef);
}
package main

import (
	"context"
	"fmt"

	fever "github.com/Lowdown-Labs/fever-clients/clients/go"
)

func main() {
	cfg := fever.NewConfiguration()
	cfg.Servers = fever.ServerConfigurations{{URL: "https://your-appliance"}}
	ctx := context.WithValue(context.Background(), fever.ContextAccessToken, "YOUR_API_KEY")
	client := fever.NewAPIClient(cfg)

	req := fever.NewSearchRequest()
	req.SetText("plaid handbag")
	req.SetK(10)
	req.SetCustomerId("shop-42")
	hits, _, err := client.SearchAPI.Search(ctx).SearchRequest(*req).Execute()
	if err != nil {
		panic(err)
	}
	for _, hit := range hits {
		fmt.Println(hit.BlobId, hit.Score, hit.GetMediaRef())
	}
}
require "fever_client"

FeverClient.configure do |config|
  config.scheme = "https"
  config.host = "your-appliance"
  config.access_token = "YOUR_API_KEY"
end

request = FeverClient::SearchRequest.new(text: "plaid handbag", k: 10, customer_id: "shop-42")
hits = FeverClient::SearchApi.new.search(request)
hits.each { |hit| puts "#{hit.blob_id} #{hit.score.round(3)} #{hit.media_ref}" }
import com.lowdownlabs.fever.ApiClient;
import com.lowdownlabs.fever.Configuration;
import com.lowdownlabs.fever.api.SearchApi;
import com.lowdownlabs.fever.model.SearchHit;
import com.lowdownlabs.fever.model.SearchRequest;

public class StorefrontSearch {
    public static void main(String[] args) throws Exception {
        ApiClient client = Configuration.getDefaultApiClient();
        client.setBasePath("https://your-appliance");
        client.setRequestInterceptor(builder ->
            builder.header("Authorization", "Bearer YOUR_API_KEY"));
        SearchApi api = new SearchApi(client);

        SearchRequest request = new SearchRequest()
            .text("plaid handbag")
            .k(10)
            .customerId("shop-42");
        for (SearchHit hit : api.search(request)) {
            System.out.println(hit.getBlobId() + " " + hit.getScore() + " " + hit.getMediaRef());
        }
    }
}
use fever_client::apis::{configuration::Configuration, search_api};
use fever_client::models::SearchRequest;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = Configuration {
        base_path: "https://your-appliance".to_owned(),
        bearer_access_token: Some("YOUR_API_KEY".to_owned()),
        ..Default::default()
    };
    let mut request = SearchRequest::new();
    request.text = Some("plaid handbag".to_owned());
    request.k = Some(10);
    request.customer_id = Some("shop-42".to_owned());
    let hits = search_api::search(&config, request).await?;
    for hit in hits {
        println!("{:?} {:?} {:?}", hit.blob_id, hit.score, hit.media_ref);
    }
    Ok(())
}
<?php
require_once __DIR__ . '/vendor/autoload.php';

use LowdownLabs\Fever\Api\SearchApi;
use LowdownLabs\Fever\Configuration;
use LowdownLabs\Fever\Model\SearchRequest;

$config = (new Configuration())
    ->setHost('https://your-appliance')
    ->setAccessToken('YOUR_API_KEY');
$api = new SearchApi(null, $config);

$request = new SearchRequest(['text' => 'plaid handbag', 'k' => 10, 'customer_id' => 'shop-42']);
foreach ($api->search($request) as $hit) {
    echo $hit->getBlobId() . ' ' . $hit->getScore() . ' ' . $hit->getMediaRef() . PHP_EOL;
}
using LowdownLabs.Fever.Api;
using LowdownLabs.Fever.Client;
using LowdownLabs.Fever.Model;

var config = new Configuration
{
    BasePath = "https://your-appliance",
    AccessToken = "YOUR_API_KEY"
};
var api = new SearchApi(config);
var hits = await api.SearchAsync(
    new SearchRequest(text: "plaid handbag", k: 10, customerId: "shop-42"));
foreach (var hit in hits)
{
    Console.WriteLine($"{hit.BlobId} {hit.Score} {hit.MediaRef}");
}