curl --request POST \
--url https://{tenant}.app.big-panda.ai/api/knowledge/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"sources": [
"knowledge",
"products"
],
"limit": 10,
"min_similarity": 0.5,
"language": "<string>",
"site_id": "<string>",
"knowledge": {
"type_filter": [
"<string>"
],
"tags_filter": [
"<string>"
]
}
}
'import requests
url = "https://{tenant}.app.big-panda.ai/api/knowledge/search"
payload = {
"query": "<string>",
"sources": ["knowledge", "products"],
"limit": 10,
"min_similarity": 0.5,
"language": "<string>",
"site_id": "<string>",
"knowledge": {
"type_filter": ["<string>"],
"tags_filter": ["<string>"]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
sources: ['knowledge', 'products'],
limit: 10,
min_similarity: 0.5,
language: '<string>',
site_id: '<string>',
knowledge: {type_filter: ['<string>'], tags_filter: ['<string>']}
})
};
fetch('https://{tenant}.app.big-panda.ai/api/knowledge/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{tenant}.app.big-panda.ai/api/knowledge/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'sources' => [
'knowledge',
'products'
],
'limit' => 10,
'min_similarity' => 0.5,
'language' => '<string>',
'site_id' => '<string>',
'knowledge' => [
'type_filter' => [
'<string>'
],
'tags_filter' => [
'<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{tenant}.app.big-panda.ai/api/knowledge/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"sources\": [\n \"knowledge\",\n \"products\"\n ],\n \"limit\": 10,\n \"min_similarity\": 0.5,\n \"language\": \"<string>\",\n \"site_id\": \"<string>\",\n \"knowledge\": {\n \"type_filter\": [\n \"<string>\"\n ],\n \"tags_filter\": [\n \"<string>\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{tenant}.app.big-panda.ai/api/knowledge/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"sources\": [\n \"knowledge\",\n \"products\"\n ],\n \"limit\": 10,\n \"min_similarity\": 0.5,\n \"language\": \"<string>\",\n \"site_id\": \"<string>\",\n \"knowledge\": {\n \"type_filter\": [\n \"<string>\"\n ],\n \"tags_filter\": [\n \"<string>\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{tenant}.app.big-panda.ai/api/knowledge/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"sources\": [\n \"knowledge\",\n \"products\"\n ],\n \"limit\": 10,\n \"min_similarity\": 0.5,\n \"language\": \"<string>\",\n \"site_id\": \"<string>\",\n \"knowledge\": {\n \"type_filter\": [\n \"<string>\"\n ],\n \"tags_filter\": [\n \"<string>\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"query": "<string>",
"sources_searched": [
"<string>"
],
"search_log_id": "<string>",
"treffer": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"ergebnisse": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"aehnliche": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"vielleicht": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"layer_results": {},
"latency_breakdown": {},
"latency_ms": 0,
"exact_matches": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"knowledge": [
{
"id": "<string>",
"title": "<string>",
"content": "<string>",
"summary": "<string>",
"category_id": "<string>",
"language": "<string>",
"visibility": "<string>",
"tags": [
"<string>"
],
"similarity": 123,
"score": 123,
"score_sources": {},
"section": "<string>"
}
],
"products": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Unified Search
Hybrid search across knowledge entries and/or products.
Product results come back in four sections (treffer / ergebnisse / aehnliche / vielleicht) plus the legacy flat lists for backward compatibility with consumers that haven’t migrated yet.
Pipeline (Block C strategy): Pre-Filter → parallel(Exact, BM25, Semantic) → RRF-Fusion → Cross-Encoder Reranker → Section Split → optional Auto-Similar (Centroid-KNN)
curl --request POST \
--url https://{tenant}.app.big-panda.ai/api/knowledge/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"sources": [
"knowledge",
"products"
],
"limit": 10,
"min_similarity": 0.5,
"language": "<string>",
"site_id": "<string>",
"knowledge": {
"type_filter": [
"<string>"
],
"tags_filter": [
"<string>"
]
}
}
'import requests
url = "https://{tenant}.app.big-panda.ai/api/knowledge/search"
payload = {
"query": "<string>",
"sources": ["knowledge", "products"],
"limit": 10,
"min_similarity": 0.5,
"language": "<string>",
"site_id": "<string>",
"knowledge": {
"type_filter": ["<string>"],
"tags_filter": ["<string>"]
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
sources: ['knowledge', 'products'],
limit: 10,
min_similarity: 0.5,
language: '<string>',
site_id: '<string>',
knowledge: {type_filter: ['<string>'], tags_filter: ['<string>']}
})
};
fetch('https://{tenant}.app.big-panda.ai/api/knowledge/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{tenant}.app.big-panda.ai/api/knowledge/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'sources' => [
'knowledge',
'products'
],
'limit' => 10,
'min_similarity' => 0.5,
'language' => '<string>',
'site_id' => '<string>',
'knowledge' => [
'type_filter' => [
'<string>'
],
'tags_filter' => [
'<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{tenant}.app.big-panda.ai/api/knowledge/search"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"sources\": [\n \"knowledge\",\n \"products\"\n ],\n \"limit\": 10,\n \"min_similarity\": 0.5,\n \"language\": \"<string>\",\n \"site_id\": \"<string>\",\n \"knowledge\": {\n \"type_filter\": [\n \"<string>\"\n ],\n \"tags_filter\": [\n \"<string>\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{tenant}.app.big-panda.ai/api/knowledge/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"sources\": [\n \"knowledge\",\n \"products\"\n ],\n \"limit\": 10,\n \"min_similarity\": 0.5,\n \"language\": \"<string>\",\n \"site_id\": \"<string>\",\n \"knowledge\": {\n \"type_filter\": [\n \"<string>\"\n ],\n \"tags_filter\": [\n \"<string>\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{tenant}.app.big-panda.ai/api/knowledge/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"sources\": [\n \"knowledge\",\n \"products\"\n ],\n \"limit\": 10,\n \"min_similarity\": 0.5,\n \"language\": \"<string>\",\n \"site_id\": \"<string>\",\n \"knowledge\": {\n \"type_filter\": [\n \"<string>\"\n ],\n \"tags_filter\": [\n \"<string>\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"query": "<string>",
"sources_searched": [
"<string>"
],
"search_log_id": "<string>",
"treffer": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"ergebnisse": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"aehnliche": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"vielleicht": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"layer_results": {},
"latency_breakdown": {},
"latency_ms": 0,
"exact_matches": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
],
"knowledge": [
{
"id": "<string>",
"title": "<string>",
"content": "<string>",
"summary": "<string>",
"category_id": "<string>",
"language": "<string>",
"visibility": "<string>",
"tags": [
"<string>"
],
"similarity": 123,
"score": 123,
"score_sources": {},
"section": "<string>"
}
],
"products": [
{
"id": "<string>",
"external_id": "<string>",
"title": "<string>",
"description": "<string>",
"short_description": "<string>",
"sku": "<string>",
"gtin": "<string>",
"brand": "<string>",
"category": "<string>",
"price_current": "<string>",
"price_msrp": "<string>",
"price_special": "<string>",
"price_on_request": true,
"currency": "<string>",
"image_url": "<string>",
"product_url": "<string>",
"availability": "<string>",
"rating_average": "<string>",
"rating_count": 123,
"language": "<string>",
"score": 123,
"score_sources": {}
}
]
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
API-Token aus dem Big-Panda-Admin-UI unter Einstellungen → API-Keys. Header: Authorization: Bearer <token>.
Headers
Space-separated scope set from the token (ADR-015)
Body
Unified search across knowledge entries and/or products.
The sources parameter controls which data pools are searched.
Per-source tuning lives in knowledge (and later products)
sub-objects so consumer-types can scope each pool separately.
1 - 2000Which sources to search: 'knowledge', 'products', or both
1 <= x <= 1000 <= x <= 1Filter by language
Filter products by site (UUID or slug)
Optional per-source configuration for knowledge entries.
Sprint 7.3 — caller can scope the knowledge results without changing the rest of the search request. Empty/None means "no constraint on this axis".
Show child attributes
Show child attributes
Response
Successful Response
Combined search results.
Two views on the same data:
- Sectioned view (Block C strategy): treffer/ergebnisse/ aehnliche/vielleicht — what the new widget renders.
- Legacy flat view: exact_matches + products + knowledge — kept filled for backward-compat with the RAG-Engine and the pre-refactor widget. Removed once all consumers migrated.
Plus search_log_id — the row-id of the persisted SearchLog,
so the widget can later POST click events tied to this search.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes