Multifeed compositions let you return several independently ranked result feeds from a single API request.
They’re the foundation for federated search, displaying results from different product categories, brands, content types, or geographies in a unified result set.
This guide walks through assembling a multifeed composition for a football-themed product listing page (PLP), starting from a single index and then extending to multiple indices and Smart Groups.
For the underlying concept, see Multifeed compositions.
Before you begin, review the Composition API requirements.
Use case: “I want to build a PLP that surfaces new arrivals in carousels by product tier: Tier A for top clubs, Tier B for mid-tier, and Tier C for the rest. This replaces static manual processes site-wide.”
This example builds a federated PLP with carousels for brands, latest items, and trending items.
Entry points
This composition supports two entry points: a search query for football on the browse PLP, and the category page route /football.
Category page
Browse query
{
"params": {
"query": "",
"filters": "categoryPageId:football"
}
}
{
"params": {
"query": "football"
}
}
Create the composition with the Update and insert composition endpoint, then apply the behavior defined below.
To scope the behavior to a specific search query, category, or context, send the same behavior inside a composition rule’s consequence.behavior with the Update and insert composition rule endpoint.
Single index
Multiple indices
Add the brand feed
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "products",
"params": {
"filters": "category:football"
}
}
}
}
}
}
}
}
}
}
Add the trending feed
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "products",
"params": {
"filters": "category:football"
}
}
}
}
}
},
"football-trending": {
"injection": {
"main": {
"source": {
"recommend": {
"indexName": "products",
"model": "trending-items",
"threshold": 3,
"queryParameters": {
"filters": "category:football"
}
}
}
}
}
}
},
"feedsOrder": [
"football-brands",
"football-trending"
]
}
}
}
Add the latest-in-football feed
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "products",
"params": {
"filters": "category:football"
}
}
}
}
}
},
"football-latest": {
"injection": {
"main": {
"source": {
"search": {
"index": "products",
"params": {
"filters": "category:football AND new:true"
}
}
}
}
}
},
"football-trending": {
"injection": {
"main": {
"source": {
"recommend": {
"indexName": "products",
"model": "trending-items",
"threshold": 3,
"queryParameters": {
"filters": "category:football"
}
}
}
}
}
}
},
"feedsOrder": [
"football-brands",
"football-latest",
"football-trending"
]
}
}
}
Add the brand feed on the products index
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "product-brands",
"params": {
"filters": "category:football"
}
}
}
}
}
}
}
}
}
}
Add the popular feed from the UK product index
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "product-brands",
"params": {
"filters": "category:football"
}
}
}
}
}
},
"football-popular-uk": {
"injection": {
"main": {
"source": {
"search": {
"index": "uk-products",
"params": {
"filters": "category:football"
}
}
}
}
}
}
},
"feedsOrder": [
"football-brands",
"football-popular-uk"
]
}
}
}
Add the popular feed from the French product index
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "product-brands",
"params": {
"filters": "category:football"
}
}
}
}
}
},
"football-popular-uk": {
"injection": {
"main": {
"source": {
"search": {
"index": "uk-products",
"params": {
"filters": "category:football"
}
}
}
}
}
},
"football-popular-fr": {
"injection": {
"main": {
"source": {
"search": {
"index": "fr-products",
"params": {
"filters": "category:football"
}
}
}
}
}
}
},
"feedsOrder": [
"football-brands",
"football-popular-uk",
"football-popular-fr"
]
}
}
}
Enhance your feeds
Add a feed for trending items
Add a Recommend to power a trending-items carousel.
This example pulls trending items from the uk-products index, filtered to the football category.
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "product-brands",
"params": {
"filters": "category:football"
}
}
}
}
}
},
"football-trending-uk": {
"injection": {
"main": {
"source": {
"recommend": {
"indexName": "uk-products",
"model": "trending-items",
"threshold": 3,
"queryParameters": {
"filters": "category:football"
}
}
}
}
}
}
},
"feedsOrder": [
"football-brands",
"football-trending-uk"
]
}
}
}
Inject an external source Smart Group
Inject an external source Smart Group into one of your feeds to surface sponsored items selected at query time by your retail-media platform or bidding system.
The object IDs are passed in the request body when querying the composition (see External source groups).
{
"behavior": {
"multifeed": {
"feeds": {
"football-brands": {
"injection": {
"main": {
"source": {
"search": {
"index": "product-brands",
"params": {
"filters": "category:football"
}
}
}
},
"injectedItems": [
{
"key": "sponsored-football",
"source": {
"external": {
"index": "products",
"ordering": "userDefined"
}
},
"position": 0,
"length": 3
}
]
}
}
},
"feedsOrder": [
"football-brands"
]
}
}
}
Hide feeds
You can hide or reorder feeds with the feedsOrder field.
Set it on the composition itself, on a composition rule, or pass it at query time.
Omitting a feed from feedsOrder hides it for that scope. Reordering changes the order of feeds in the response.
In the composition
In a composition rule
At query time
Update feedsOrder on the composition to change the default order or hide a feed across all queries (here, football-popular-uk is omitted to hide it).{
"behavior": {
"multifeed": {
"feedsOrder": [
"football-brands",
"football-trending"
]
}
}
}
Set feedsOrder inside the rule’s consequence.behavior.multifeed so it applies only when the rule’s conditions match.{
"consequence": {
"behavior": {
"multifeed": {
"feedsOrder": [
"football-brands",
"football-trending"
]
}
}
}
}
Pass feedsOrder in the search request body to override the composition’s default for that query only.{
"params": {
"query": "football"
},
"feedsOrder": [
"football-brands",
"football-trending"
]
}
See also