> ## Documentation Index
> Fetch the complete documentation index at: https://algolia.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update and insert (upsert) a composition

> Update and insert a composition in the current Algolia application.

**Required ACL:** `editSettings`


## OpenAPI

````yaml specs/composition.yml put /1/compositions/{compositionID}
openapi: 3.1.0
info:
  title: Composition API
  summary: >-
    The Algolia Composition API lets you run composed search requests on your
    Compositions
  description: >
    ## Client libraries


    Use Algolia's API clients and libraries to reliably integrate Algolia's APIs
    with your apps.


    For more information, see [Algolia's
    ecosystem](https://www.algolia.com/doc/libraries).


    ## Base URLs


    Base URLs for the Composition API:


    - `https://{APPLICATION_ID}.algolia.net`

    - `https://{APPLICATION_ID}-dsn.algolia.net`.
      If your subscription includes a [Distributed Search Network](https://dashboard.algolia.com/infra),
      this ensures that requests are sent to servers closest to users.

    Both URLs provide high availability by distributing requests with load
    balancing.


    **All requests must use HTTPS.**


    ## Retry strategy


    To guarantee high availability, implement a retry strategy for all API
    requests using the URLs of your servers as fallbacks:


    - `https://{APPLICATION_ID}-1.algolianet.com`

    - `https://{APPLICATION_ID}-2.algolianet.com`

    - `https://{APPLICATION_ID}-3.algolianet.com`


    These URLs use a different DNS provider than the primary URLs.

    Randomize this list to ensure an even load across the three servers.


    All Algolia API clients implement this retry strategy.


    ## Authentication


    Add these headers to authenticate requests:


    - `x-algolia-application-id`. Your Algolia application ID.

    - `x-algolia-api-key`. An API key with the necessary permissions to make the
    request.
      The required access control list (ACL) to make a request is listed in each endpoint's reference.

    You can find your application ID and API key in the [Algolia
    dashboard](https://dashboard.algolia.com/account/api-keys).


    ## Request format


    Depending on the endpoint, request bodies are either JSON objects or arrays
    of JSON objects.


    ## Parameters


    Parameters are passed in the request body for POST and PUT requests.


    ## Response status and errors


    The Composition API returns JSON responses.

    Since JSON doesn't guarantee any specific ordering, don't rely on the order
    of attributes in the API response.


    Successful responses return `2xx` statuses. Client errors return `4xx`
    statuses. Server errors return `5xx` statuses.

    Error responses have a `message` property with more information.


    ## Version


    The current version of the Composition API is version 1, indicated by the
    `/1/` in each endpoint's URL.
  version: 1.0.0
servers:
  - url: https://{appId}.algolia.net
    variables:
      appId:
        default: ALGOLIA_APPLICATION_ID
  - url: https://{appId}-1.algolianet.com
    variables:
      appId:
        default: ALGOLIA_APPLICATION_ID
  - url: https://{appId}-2.algolianet.com
    variables:
      appId:
        default: ALGOLIA_APPLICATION_ID
  - url: https://{appId}-3.algolianet.com
    variables:
      appId:
        default: ALGOLIA_APPLICATION_ID
  - url: https://{appId}-dsn.algolia.net
    variables:
      appId:
        default: ALGOLIA_APPLICATION_ID
security:
  - appId: []
    apiKey: []
tags:
  - name: Advanced
    description: Advanced endpoints to manage tasks.
  - name: Composition Rules
    description: Manage your compositions rules.
  - name: Compositions
    description: Manage your compositions and composition settings.
  - name: Search
    description: Search one or more indices for matching records or facet values.
paths:
  /1/compositions/{compositionID}:
    put:
      tags:
        - Compositions
      summary: Update and insert (upsert) a composition
      description: |
        Update and insert a composition in the current Algolia application.
      operationId: putComposition
      parameters:
        - $ref: '#/components/parameters/compositionID'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/composition'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                title: taskIDResponse
                type: object
                additionalProperties: false
                properties:
                  taskID:
                    $ref: '#/components/schemas/taskID'
                required:
                  - taskID
        '400':
          $ref: '#/components/responses/BadRequest'
        '402':
          $ref: '#/components/responses/FeatureNotEnabled'
        '403':
          $ref: '#/components/responses/MethodNotAllowed'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
      x-codeSamples:
        - lang: csharp
          label: C#
          source: |-
            // Initialize the client
            var client = new CompositionClient(
              new CompositionConfig("ALGOLIA_APPLICATION_ID", "ALGOLIA_API_KEY")
            );

            // Call the API
            var response = await client.PutCompositionAsync(
              "my-compo",
              new Composition
              {
                ObjectID = "my-compo",
                Name = "my composition",
                Behavior = new CompositionBehavior(
                  new CompositionMultifeedBehavior
                  {
                    Multifeed = new Multifeed
                    {
                      Feeds = new Dictionary<string, FeedInjection>
                      {
                        {
                          "products",
                          new FeedInjection
                          {
                            Injection = new Injection
                            {
                              Main = new InjectionMain
                              {
                                Source = new InjectionMainSource(
                                  new InjectionMainSearchSource
                                  {
                                    Search = new MainSearch
                                    {
                                      Index = "products",
                                      Params = new MainInjectionQueryParameters { HitsPerPage = 12 },
                                    },
                                  }
                                ),
                              },
                              InjectedItems = new List<InjectionInjectedItem>
                              {
                                new InjectionInjectedItem
                                {
                                  Key = "featured-products",
                                  Source = new InjectedItemSource(
                                    new InjectedItemSearchSource
                                    {
                                      Search = new InjectedItemSearch
                                      {
                                        Index = "products",
                                        Params = new BaseInjectionQueryParameters
                                        {
                                          Filters = "featured:true",
                                        },
                                      },
                                    }
                                  ),
                                  Position = 0,
                                  Length = 2,
                                },
                              },
                            },
                          }
                        },
                        {
                          "articles",
                          new FeedInjection
                          {
                            Injection = new Injection
                            {
                              Main = new InjectionMain
                              {
                                Source = new InjectionMainSource(
                                  new InjectionMainSearchSource
                                  {
                                    Search = new MainSearch
                                    {
                                      Index = "articles",
                                      Params = new MainInjectionQueryParameters
                                      {
                                        HitsPerPage = 5,
                                        AttributesToRetrieve = new List<string>
                                        {
                                          "title",
                                          "excerpt",
                                          "publishedAt",
                                        },
                                      },
                                    },
                                  }
                                ),
                              },
                              InjectedItems = new List<InjectionInjectedItem>
                              {
                                new InjectionInjectedItem
                                {
                                  Key = "editorial-picks",
                                  Source = new InjectedItemSource(
                                    new InjectedItemSearchSource
                                    {
                                      Search = new InjectedItemSearch
                                      {
                                        Index = "articles",
                                        Params = new BaseInjectionQueryParameters
                                        {
                                          Filters = "editorial_pick:true",
                                        },
                                      },
                                    }
                                  ),
                                  Position = 0,
                                  Length = 1,
                                },
                              },
                            },
                          }
                        },
                        {
                          "videos",
                          new FeedInjection
                          {
                            Injection = new Injection
                            {
                              Main = new InjectionMain
                              {
                                Source = new InjectionMainSource(
                                  new InjectionMainSearchSource
                                  {
                                    Search = new MainSearch
                                    {
                                      Index = "videos",
                                      Params = new MainInjectionQueryParameters
                                      {
                                        HitsPerPage = 3,
                                        AttributesToRetrieve = new List<string>
                                        {
                                          "title",
                                          "thumbnail",
                                          "duration",
                                        },
                                      },
                                    },
                                  }
                                ),
                              },
                            },
                          }
                        },
                      },
                      FeedsOrder = new List<string> { "products", "articles", "videos" },
                    },
                  }
                ),
              }
            );

            // print the response
            Console.WriteLine(response);
        - lang: dart
          label: Dart
          source: |-
            // Initialize the client
            final client = CompositionClient(
                appId: 'ALGOLIA_APPLICATION_ID', apiKey: 'ALGOLIA_API_KEY');

            // Call the API
            final response = await client.putComposition(
              compositionID: "my-compo",
              composition: Composition(
                objectID: "my-compo",
                name: "my composition",
                behavior: CompositionMultifeedBehavior(
                  multifeed: Multifeed(
                    feeds: {
                      'products': FeedInjection(
                        injection: Injection(
                          main: InjectionMain(
                            source: InjectionMainSearchSource(
                              search: MainSearch(
                                index: "products",
                                params: MainInjectionQueryParameters(
                                  hitsPerPage: 12,
                                ),
                              ),
                            ),
                          ),
                          injectedItems: [
                            InjectionInjectedItem(
                              key: "featured-products",
                              source: InjectedItemSearchSource(
                                search: InjectedItemSearch(
                                  index: "products",
                                  params: BaseInjectionQueryParameters(
                                    filters: "featured:true",
                                  ),
                                ),
                              ),
                              position: 0,
                              length: 2,
                            ),
                          ],
                        ),
                      ),
                      'articles': FeedInjection(
                        injection: Injection(
                          main: InjectionMain(
                            source: InjectionMainSearchSource(
                              search: MainSearch(
                                index: "articles",
                                params: MainInjectionQueryParameters(
                                  hitsPerPage: 5,
                                  attributesToRetrieve: [
                                    "title",
                                    "excerpt",
                                    "publishedAt",
                                  ],
                                ),
                              ),
                            ),
                          ),
                          injectedItems: [
                            InjectionInjectedItem(
                              key: "editorial-picks",
                              source: InjectedItemSearchSource(
                                search: InjectedItemSearch(
                                  index: "articles",
                                  params: BaseInjectionQueryParameters(
                                    filters: "editorial_pick:true",
                                  ),
                                ),
                              ),
                              position: 0,
                              length: 1,
                            ),
                          ],
                        ),
                      ),
                      'videos': FeedInjection(
                        injection: Injection(
                          main: InjectionMain(
                            source: InjectionMainSearchSource(
                              search: MainSearch(
                                index: "videos",
                                params: MainInjectionQueryParameters(
                                  hitsPerPage: 3,
                                  attributesToRetrieve: [
                                    "title",
                                    "thumbnail",
                                    "duration",
                                  ],
                                ),
                              ),
                            ),
                          ),
                        ),
                      ),
                    },
                    feedsOrder: [
                      "products",
                      "articles",
                      "videos",
                    ],
                  ),
                ),
              ),
            );

            // print the response
            print(response);
        - lang: go
          label: Go
          source: >-
            // Initialize the client

            client, err := composition.NewClient("ALGOLIA_APPLICATION_ID",
            "ALGOLIA_API_KEY")

            if err != nil {
              // The client can fail to initialize if you pass an invalid parameter.
              panic(err)
            }


            // Call the API

            response, err :=
            client.PutComposition(client.NewApiPutCompositionRequest(
              "my-compo",
              composition.NewEmptyComposition().
                SetObjectID("my-compo").
                SetName("my composition").
                SetBehavior(composition.CompositionMultifeedBehaviorAsCompositionBehavior(
                  composition.NewEmptyCompositionMultifeedBehavior().SetMultifeed(
                    composition.NewEmptyMultifeed().
                      SetFeeds(map[string]composition.FeedInjection{"products": *composition.NewEmptyFeedInjection().SetInjection(
                        composition.NewEmptyInjection().SetMain(
                          composition.NewEmptyInjectionMain().SetSource(composition.InjectionMainSearchSourceAsInjectionMainSource(
                            composition.NewEmptyInjectionMainSearchSource().SetSearch(
                              composition.NewEmptyMainSearch().SetIndex("products").SetParams(
                                composition.NewEmptyMainInjectionQueryParameters().SetHitsPerPage(12)))))).SetInjectedItems(
                          []composition.InjectionInjectedItem{*composition.NewEmptyInjectionInjectedItem().SetKey("featured-products").SetSource(composition.InjectedItemSearchSourceAsInjectedItemSource(
                            composition.NewEmptyInjectedItemSearchSource().SetSearch(
                              composition.NewEmptyInjectedItemSearch().SetIndex("products").SetParams(
                                composition.NewEmptyBaseInjectionQueryParameters().SetFilters("featured:true"))))).SetPosition(0).SetLength(2)})), "articles": *composition.NewEmptyFeedInjection().SetInjection(
                        composition.NewEmptyInjection().SetMain(
                          composition.NewEmptyInjectionMain().SetSource(composition.InjectionMainSearchSourceAsInjectionMainSource(
                            composition.NewEmptyInjectionMainSearchSource().SetSearch(
                              composition.NewEmptyMainSearch().SetIndex("articles").SetParams(
                                composition.NewEmptyMainInjectionQueryParameters().SetHitsPerPage(5).SetAttributesToRetrieve(
                                  []string{"title", "excerpt", "publishedAt"})))))).SetInjectedItems(
                          []composition.InjectionInjectedItem{*composition.NewEmptyInjectionInjectedItem().SetKey("editorial-picks").SetSource(composition.InjectedItemSearchSourceAsInjectedItemSource(
                            composition.NewEmptyInjectedItemSearchSource().SetSearch(
                              composition.NewEmptyInjectedItemSearch().SetIndex("articles").SetParams(
                                composition.NewEmptyBaseInjectionQueryParameters().SetFilters("editorial_pick:true"))))).SetPosition(0).SetLength(1)})), "videos": *composition.NewEmptyFeedInjection().SetInjection(
                        composition.NewEmptyInjection().SetMain(
                          composition.NewEmptyInjectionMain().SetSource(composition.InjectionMainSearchSourceAsInjectionMainSource(
                            composition.NewEmptyInjectionMainSearchSource().SetSearch(
                              composition.NewEmptyMainSearch().SetIndex("videos").SetParams(
                                composition.NewEmptyMainInjectionQueryParameters().SetHitsPerPage(3).SetAttributesToRetrieve(
                                  []string{"title", "thumbnail", "duration"})))))))}).
                      SetFeedsOrder(
                        []string{"products", "articles", "videos"}),
                  ),
                )),
            ))

            if err != nil {
              // handle the eventual error
              panic(err)
            }



            // print the response

            print(response)
        - lang: java
          label: Java
          source: >-
            // Initialize the client

            CompositionClient client = new
            CompositionClient("ALGOLIA_APPLICATION_ID", "ALGOLIA_API_KEY");


            // Call the API

            TaskIDResponse response = client.putComposition(
              "my-compo",
              new Composition()
                .setObjectID("my-compo")
                .setName("my composition")
                .setBehavior(
                  new CompositionMultifeedBehavior().setMultifeed(
                    new Multifeed()
                      .setFeeds(
                        new HashMap() {
                          {
                            put(
                              "products",
                              new FeedInjection().setInjection(
                                new Injection()
                                  .setMain(
                                    new InjectionMain().setSource(
                                      new InjectionMainSearchSource().setSearch(
                                        new MainSearch().setIndex("products").setParams(new MainInjectionQueryParameters().setHitsPerPage(12))
                                      )
                                    )
                                  )
                                  .setInjectedItems(
                                    Arrays.asList(
                                      new InjectionInjectedItem()
                                        .setKey("featured-products")
                                        .setSource(
                                          new InjectedItemSearchSource().setSearch(
                                            new InjectedItemSearch()
                                              .setIndex("products")
                                              .setParams(new BaseInjectionQueryParameters().setFilters("featured:true"))
                                          )
                                        )
                                        .setPosition(0)
                                        .setLength(2)
                                    )
                                  )
                              )
                            );
                            put(
                              "articles",
                              new FeedInjection().setInjection(
                                new Injection()
                                  .setMain(
                                    new InjectionMain().setSource(
                                      new InjectionMainSearchSource().setSearch(
                                        new MainSearch()
                                          .setIndex("articles")
                                          .setParams(
                                            new MainInjectionQueryParameters()
                                              .setHitsPerPage(5)
                                              .setAttributesToRetrieve(Arrays.asList("title", "excerpt", "publishedAt"))
                                          )
                                      )
                                    )
                                  )
                                  .setInjectedItems(
                                    Arrays.asList(
                                      new InjectionInjectedItem()
                                        .setKey("editorial-picks")
                                        .setSource(
                                          new InjectedItemSearchSource().setSearch(
                                            new InjectedItemSearch()
                                              .setIndex("articles")
                                              .setParams(new BaseInjectionQueryParameters().setFilters("editorial_pick:true"))
                                          )
                                        )
                                        .setPosition(0)
                                        .setLength(1)
                                    )
                                  )
                              )
                            );
                            put(
                              "videos",
                              new FeedInjection().setInjection(
                                new Injection().setMain(
                                  new InjectionMain().setSource(
                                    new InjectionMainSearchSource().setSearch(
                                      new MainSearch()
                                        .setIndex("videos")
                                        .setParams(
                                          new MainInjectionQueryParameters()
                                            .setHitsPerPage(3)
                                            .setAttributesToRetrieve(Arrays.asList("title", "thumbnail", "duration"))
                                        )
                                    )
                                  )
                                )
                              )
                            );
                          }
                        }
                      )
                      .setFeedsOrder(Arrays.asList("products", "articles", "videos"))
                  )
                )
            );


            // print the response

            System.out.println(response);
        - lang: javascript
          label: JavaScript
          source: >-
            // Initialize the client

            const client = compositionClient('ALGOLIA_APPLICATION_ID',
            'ALGOLIA_API_KEY');


            // Call the API

            const response = await client.putComposition({
              compositionID: 'my-compo',
              composition: {
                objectID: 'my-compo',
                name: 'my composition',
                behavior: {
                  multifeed: {
                    feeds: {
                      products: {
                        injection: {
                          main: { source: { search: { index: 'products', params: { hitsPerPage: 12 } } } },
                          injectedItems: [
                            {
                              key: 'featured-products',
                              source: { search: { index: 'products', params: { filters: 'featured:true' } } },
                              position: 0,
                              length: 2,
                            },
                          ],
                        },
                      },
                      articles: {
                        injection: {
                          main: {
                            source: {
                              search: {
                                index: 'articles',
                                params: { hitsPerPage: 5, attributesToRetrieve: ['title', 'excerpt', 'publishedAt'] },
                              },
                            },
                          },
                          injectedItems: [
                            {
                              key: 'editorial-picks',
                              source: { search: { index: 'articles', params: { filters: 'editorial_pick:true' } } },
                              position: 0,
                              length: 1,
                            },
                          ],
                        },
                      },
                      videos: {
                        injection: {
                          main: {
                            source: {
                              search: {
                                index: 'videos',
                                params: { hitsPerPage: 3, attributesToRetrieve: ['title', 'thumbnail', 'duration'] },
                              },
                            },
                          },
                        },
                      },
                    },
                    feedsOrder: ['products', 'articles', 'videos'],
                  },
                },
              },
            });



            // print the response

            console.log(response);
        - lang: kotlin
          label: Kotlin
          source: >-
            // Initialize the client

            val client = CompositionClient(appId = "ALGOLIA_APPLICATION_ID",
            apiKey = "ALGOLIA_API_KEY")


            // Call the API

            var response =
              client.putComposition(
                compositionID = "my-compo",
                composition =
                  Composition(
                    objectID = "my-compo",
                    name = "my composition",
                    behavior =
                      CompositionMultifeedBehavior(
                        multifeed =
                          Multifeed(
                            feeds =
                              mapOf(
                                "products" to
                                  FeedInjection(
                                    injection =
                                      Injection(
                                        main =
                                          InjectionMain(
                                            source =
                                              InjectionMainSearchSource(
                                                search =
                                                  MainSearch(
                                                    index = "products",
                                                    params = MainInjectionQueryParameters(hitsPerPage = 12),
                                                  )
                                              )
                                          ),
                                        injectedItems =
                                          listOf(
                                            InjectionInjectedItem(
                                              key = "featured-products",
                                              source =
                                                InjectedItemSearchSource(
                                                  search =
                                                    InjectedItemSearch(
                                                      index = "products",
                                                      params =
                                                        BaseInjectionQueryParameters(
                                                          filters = "featured:true"
                                                        ),
                                                    )
                                                ),
                                              position = 0,
                                              length = 2,
                                            )
                                          ),
                                      )
                                  ),
                                "articles" to
                                  FeedInjection(
                                    injection =
                                      Injection(
                                        main =
                                          InjectionMain(
                                            source =
                                              InjectionMainSearchSource(
                                                search =
                                                  MainSearch(
                                                    index = "articles",
                                                    params =
                                                      MainInjectionQueryParameters(
                                                        hitsPerPage = 5,
                                                        attributesToRetrieve =
                                                          listOf("title", "excerpt", "publishedAt"),
                                                      ),
                                                  )
                                              )
                                          ),
                                        injectedItems =
                                          listOf(
                                            InjectionInjectedItem(
                                              key = "editorial-picks",
                                              source =
                                                InjectedItemSearchSource(
                                                  search =
                                                    InjectedItemSearch(
                                                      index = "articles",
                                                      params =
                                                        BaseInjectionQueryParameters(
                                                          filters = "editorial_pick:true"
                                                        ),
                                                    )
                                                ),
                                              position = 0,
                                              length = 1,
                                            )
                                          ),
                                      )
                                  ),
                                "videos" to
                                  FeedInjection(
                                    injection =
                                      Injection(
                                        main =
                                          InjectionMain(
                                            source =
                                              InjectionMainSearchSource(
                                                search =
                                                  MainSearch(
                                                    index = "videos",
                                                    params =
                                                      MainInjectionQueryParameters(
                                                        hitsPerPage = 3,
                                                        attributesToRetrieve =
                                                          listOf("title", "thumbnail", "duration"),
                                                      ),
                                                  )
                                              )
                                          )
                                      )
                                  ),
                              ),
                            feedsOrder = listOf("products", "articles", "videos"),
                          )
                      ),
                  ),
              )


            // print the response

            println(response)
        - lang: php
          label: PHP
          source: >-
            // Initialize the client

            $client = CompositionClient::create('ALGOLIA_APPLICATION_ID',
            'ALGOLIA_API_KEY');


            // Call the API

            $response = $client->putComposition(
                'my-compo',
                ['objectID' => 'my-compo',
                    'name' => 'my composition',
                    'behavior' => ['multifeed' => ['feeds' => ['products' => ['injection' => ['main' => ['source' => ['search' => ['index' => 'products',
                        'params' => ['hitsPerPage' => 12,
                        ],
                    ],
                    ],
                    ],
                        'injectedItems' => [
                            ['key' => 'featured-products',
                                'source' => ['search' => ['index' => 'products',
                                    'params' => ['filters' => 'featured:true',
                                    ],
                                ],
                                ],
                                'position' => 0,
                                'length' => 2,
                            ],
                        ],
                    ],
                    ],
                        'articles' => ['injection' => ['main' => ['source' => ['search' => ['index' => 'articles',
                            'params' => ['hitsPerPage' => 5,
                                'attributesToRetrieve' => [
                                    'title',

                                    'excerpt',

                                    'publishedAt',
                                ],
                            ],
                        ],
                        ],
                        ],
                            'injectedItems' => [
                                ['key' => 'editorial-picks',
                                    'source' => ['search' => ['index' => 'articles',
                                        'params' => ['filters' => 'editorial_pick:true',
                                        ],
                                    ],
                                    ],
                                    'position' => 0,
                                    'length' => 1,
                                ],
                            ],
                        ],
                        ],
                        'videos' => ['injection' => ['main' => ['source' => ['search' => ['index' => 'videos',
                            'params' => ['hitsPerPage' => 3,
                                'attributesToRetrieve' => [
                                    'title',

                                    'thumbnail',

                                    'duration',
                                ],
                            ],
                        ],
                        ],
                        ],
                        ],
                        ],
                    ],
                        'feedsOrder' => [
                            'products',

                            'articles',

                            'videos',
                        ],
                    ],
                    ],
                ],
            );



            // print the response

            var_dump($response);
        - lang: python
          label: Python
          source: >-
            # Initialize the client

            # In an asynchronous context, you can use CompositionClient instead,
            which exposes the exact same methods.

            client = CompositionClientSync("ALGOLIA_APPLICATION_ID",
            "ALGOLIA_API_KEY")


            # Call the API

            response = client.put_composition(
                composition_id="my-compo",
                composition={
                    "objectID": "my-compo",
                    "name": "my composition",
                    "behavior": {
                        "multifeed": {
                            "feeds": {
                                "products": {
                                    "injection": {
                                        "main": {
                                            "source": {
                                                "search": {
                                                    "index": "products",
                                                    "params": {
                                                        "hitsPerPage": 12,
                                                    },
                                                },
                                            },
                                        },
                                        "injectedItems": [
                                            {
                                                "key": "featured-products",
                                                "source": {
                                                    "search": {
                                                        "index": "products",
                                                        "params": {
                                                            "filters": "featured:true",
                                                        },
                                                    },
                                                },
                                                "position": 0,
                                                "length": 2,
                                            },
                                        ],
                                    },
                                },
                                "articles": {
                                    "injection": {
                                        "main": {
                                            "source": {
                                                "search": {
                                                    "index": "articles",
                                                    "params": {
                                                        "hitsPerPage": 5,
                                                        "attributesToRetrieve": [
                                                            "title",
                                                            "excerpt",
                                                            "publishedAt",
                                                        ],
                                                    },
                                                },
                                            },
                                        },
                                        "injectedItems": [
                                            {
                                                "key": "editorial-picks",
                                                "source": {
                                                    "search": {
                                                        "index": "articles",
                                                        "params": {
                                                            "filters": "editorial_pick:true",
                                                        },
                                                    },
                                                },
                                                "position": 0,
                                                "length": 1,
                                            },
                                        ],
                                    },
                                },
                                "videos": {
                                    "injection": {
                                        "main": {
                                            "source": {
                                                "search": {
                                                    "index": "videos",
                                                    "params": {
                                                        "hitsPerPage": 3,
                                                        "attributesToRetrieve": [
                                                            "title",
                                                            "thumbnail",
                                                            "duration",
                                                        ],
                                                    },
                                                },
                                            },
                                        },
                                    },
                                },
                            },
                            "feedsOrder": [
                                "products",
                                "articles",
                                "videos",
                            ],
                        },
                    },
                },
            )



            # print the response

            print(response)
        - lang: ruby
          label: Ruby
          source: >-
            # Initialize the client

            client = Algolia::CompositionClient.create("ALGOLIA_APPLICATION_ID",
            "ALGOLIA_API_KEY")


            # Call the API

            response = client.put_composition(
              "my-compo",
              Algolia::Composition::Composition.new(
                algolia_object_id: "my-compo",
                name: "my composition",
                behavior: Algolia::Composition::CompositionMultifeedBehavior.new(
                  multifeed: Algolia::Composition::Multifeed.new(
                    feeds: {
                      products: Algolia::Composition::FeedInjection.new(
                        injection: Algolia::Composition::Injection.new(
                          main: Algolia::Composition::InjectionMain.new(
                            source: Algolia::Composition::InjectionMainSearchSource.new(
                              search: Algolia::Composition::MainSearch.new(
                                index: "products",
                                params: Algolia::Composition::MainInjectionQueryParameters.new(hits_per_page: 12)
                              )
                            )
                          ),
                          injected_items: [
                            Algolia::Composition::InjectionInjectedItem.new(
                              key: "featured-products",
                              source: Algolia::Composition::InjectedItemSearchSource.new(
                                search: Algolia::Composition::InjectedItemSearch.new(
                                  index: "products",
                                  params: Algolia::Composition::BaseInjectionQueryParameters.new(filters: "featured:true")
                                )
                              ),
                              position: 0,
                              length: 2
                            )
                          ]
                        )
                      ),
                      articles: Algolia::Composition::FeedInjection.new(
                        injection: Algolia::Composition::Injection.new(
                          main: Algolia::Composition::InjectionMain.new(
                            source: Algolia::Composition::InjectionMainSearchSource.new(
                              search: Algolia::Composition::MainSearch.new(
                                index: "articles",
                                params: Algolia::Composition::MainInjectionQueryParameters.new(
                                  hits_per_page: 5,
                                  attributes_to_retrieve: ["title", "excerpt", "publishedAt"]
                                )
                              )
                            )
                          ),
                          injected_items: [
                            Algolia::Composition::InjectionInjectedItem.new(
                              key: "editorial-picks",
                              source: Algolia::Composition::InjectedItemSearchSource.new(
                                search: Algolia::Composition::InjectedItemSearch.new(
                                  index: "articles",
                                  params: Algolia::Composition::BaseInjectionQueryParameters.new(filters: "editorial_pick:true")
                                )
                              ),
                              position: 0,
                              length: 1
                            )
                          ]
                        )
                      ),
                      videos: Algolia::Composition::FeedInjection.new(
                        injection: Algolia::Composition::Injection.new(
                          main: Algolia::Composition::InjectionMain.new(
                            source: Algolia::Composition::InjectionMainSearchSource.new(
                              search: Algolia::Composition::MainSearch.new(
                                index: "videos",
                                params: Algolia::Composition::MainInjectionQueryParameters.new(
                                  hits_per_page: 3,
                                  attributes_to_retrieve: ["title", "thumbnail", "duration"]
                                )
                              )
                            )
                          )
                        )
                      )
                    },
                    feeds_order: ["products", "articles", "videos"]
                  )
                )
              )
            )



            # print the response

            puts(response)
        - lang: scala
          label: Scala
          source: >-
            // Initialize the client

            val client = CompositionClient(appId = "ALGOLIA_APPLICATION_ID",
            apiKey = "ALGOLIA_API_KEY")


            // Call the API

            val response = Await.result(
              client.putComposition(
                compositionID = "my-compo",
                composition = Composition(
                  objectID = "my-compo",
                  name = "my composition",
                  behavior = CompositionMultifeedBehavior(
                    multifeed = Multifeed(
                      feeds = Map(
                        "products" -> FeedInjection(
                          injection = Injection(
                            main = InjectionMain(
                              source = Some(
                                InjectionMainSearchSource(
                                  search = MainSearch(
                                    index = "products",
                                    params = Some(
                                      MainInjectionQueryParameters(
                                        hitsPerPage = Some(12)
                                      )
                                    )
                                  )
                                )
                              )
                            ),
                            injectedItems = Some(
                              Seq(
                                InjectionInjectedItem(
                                  key = "featured-products",
                                  source = InjectedItemSearchSource(
                                    search = InjectedItemSearch(
                                      index = "products",
                                      params = Some(
                                        BaseInjectionQueryParameters(
                                          filters = Some("featured:true")
                                        )
                                      )
                                    )
                                  ),
                                  position = 0,
                                  length = 2
                                )
                              )
                            )
                          )
                        ),
                        "articles" -> FeedInjection(
                          injection = Injection(
                            main = InjectionMain(
                              source = Some(
                                InjectionMainSearchSource(
                                  search = MainSearch(
                                    index = "articles",
                                    params = Some(
                                      MainInjectionQueryParameters(
                                        hitsPerPage = Some(5),
                                        attributesToRetrieve = Some(Seq("title", "excerpt", "publishedAt"))
                                      )
                                    )
                                  )
                                )
                              )
                            ),
                            injectedItems = Some(
                              Seq(
                                InjectionInjectedItem(
                                  key = "editorial-picks",
                                  source = InjectedItemSearchSource(
                                    search = InjectedItemSearch(
                                      index = "articles",
                                      params = Some(
                                        BaseInjectionQueryParameters(
                                          filters = Some("editorial_pick:true")
                                        )
                                      )
                                    )
                                  ),
                                  position = 0,
                                  length = 1
                                )
                              )
                            )
                          )
                        ),
                        "videos" -> FeedInjection(
                          injection = Injection(
                            main = InjectionMain(
                              source = Some(
                                InjectionMainSearchSource(
                                  search = MainSearch(
                                    index = "videos",
                                    params = Some(
                                      MainInjectionQueryParameters(
                                        hitsPerPage = Some(3),
                                        attributesToRetrieve = Some(Seq("title", "thumbnail", "duration"))
                                      )
                                    )
                                  )
                                )
                              )
                            )
                          )
                        )
                      ),
                      feedsOrder = Some(Seq("products", "articles", "videos"))
                    )
                  )
                )
              ),
              Duration(100, "sec")
            )


            // print the response

            println(response)
        - lang: swift
          label: Swift
          source: >-
            // Initialize the client

            let client = try CompositionClient(appID: "ALGOLIA_APPLICATION_ID",
            apiKey: "ALGOLIA_API_KEY")


            // Call the API

            let response = try await client.putComposition(
                compositionID: "my-compo",
                composition: Composition(
                    objectID: "my-compo",
                    name: "my composition",
                    behavior: CompositionBehavior
                        .compositionMultifeedBehavior(CompositionMultifeedBehavior(multifeed: Multifeed(
                            feeds: [
                                "products": FeedInjection(injection: Injection(
                                    main: InjectionMain(source: InjectionMainSource
                                        .injectionMainSearchSource(InjectionMainSearchSource(search: MainSearch(
                                            index: "products",
                                            params: MainInjectionQueryParameters(hitsPerPage: 12)
                                        )))),
                                    injectedItems: [InjectionInjectedItem(
                                        key: "featured-products",
                                        source: InjectedItemSource
                                            .injectedItemSearchSource(InjectedItemSearchSource(search: InjectedItemSearch(
                                                index: "products",
                                                params: BaseInjectionQueryParameters(filters: "featured:true")
                                            ))),
                                        position: 0,
                                        length: 2
                                    )]
                                )),
                                "articles": FeedInjection(injection: Injection(
                                    main: InjectionMain(source: InjectionMainSource
                                        .injectionMainSearchSource(InjectionMainSearchSource(search: MainSearch(
                                            index: "articles",
                                            params: MainInjectionQueryParameters(
                                                attributesToRetrieve: ["title", "excerpt", "publishedAt"],
                                                hitsPerPage: 5
                                            )
                                        )))),
                                    injectedItems: [InjectionInjectedItem(
                                        key: "editorial-picks",
                                        source: InjectedItemSource
                                            .injectedItemSearchSource(InjectedItemSearchSource(search: InjectedItemSearch(
                                                index: "articles",
                                                params: BaseInjectionQueryParameters(filters: "editorial_pick:true")
                                            ))),
                                        position: 0,
                                        length: 1
                                    )]
                                )),
                                "videos": FeedInjection(injection: Injection(main: InjectionMain(source: InjectionMainSource
                                        .injectionMainSearchSource(InjectionMainSearchSource(search: MainSearch(
                                            index: "videos",
                                            params: MainInjectionQueryParameters(
                                                attributesToRetrieve: ["title", "thumbnail", "duration"],
                                                hitsPerPage: 3
                                            )
                                        )))))),
                            ],
                            feedsOrder: ["products", "articles", "videos"]
                        )))
                )
            )


            // print the response

            print(response)
        - lang: cURL
          label: curl
          source: |-
            curl --request PUT \
              --url https://algolia_application_id.algolia.net/1/compositions/my_composition_object_id \
              --header 'accept: application/json' \
              --header 'content-type: application/json' \
              --header 'x-algolia-api-key: ALGOLIA_API_KEY' \
              --header 'x-algolia-application-id: ALGOLIA_APPLICATION_ID' \
              --data '
            {
              "objectID": "my_composition_object_id",
              "name": "my lovely crafted composition",
              "description": "my lovely crafted composition that is used for X purpose",
              "behavior": {
                "injection": {
                  "main": {
                    "source": {
                      "search": {
                        "index": "Products",
                        "params": {
                          "advancedSyntax": false,
                          "advancedSyntaxFeatures": [
                            "exactPhrase",
                            "excludeWords"
                          ],
                          "allowTyposOnNumericTokens": true,
                          "alternativesAsExact": [
                            "ignorePlurals",
                            "singleWordSynonym"
                          ],
                          "attributeCriteriaComputedByMinProximity": false,
                          "attributesToHighlight": [
                            "author",
                            "title",
                            "conten",
                            "content"
                          ],
                          "attributesToRetrieve": [
                            "author",
                            "title",
                            "content"
                          ],
                          "attributesToSnippet": [
                            "content:80",
                            "description"
                          ],
                          "clickAnalytics": false,
                          "disableExactOnAttributes": [
                            "description"
                          ],
                          "disableTypoToleranceOnAttributes": [
                            "sku"
                          ],
                          "distinct": 1,
                          "enableABTest": true,
                          "enablePersonalization": false,
                          "enableReRanking": true,
                          "enableRules": true,
                          "exactOnSingleWordQuery": "attribute",
                          "facetFilters": [
                            [
                              "category:Book",
                              "category:-Movie"
                            ],
                            "author:John Doe"
                          ],
                          "filters": "(category:Book OR category:Ebook) AND _tags:published",
                          "getRankingInfo": false,
                          "highlightPostTag": "</em>",
                          "highlightPreTag": "<em>",
                          "ignorePlurals": [
                            "ca",
                            "es"
                          ],
                          "minProximity": 1,
                          "minWordSizefor1Typo": 4,
                          "minWordSizefor2Typos": 8,
                          "naturalLanguages": [],
                          "numericFilters": [
                            [
                              "inStock = 1",
                              "deliveryDate < 1441755506"
                            ],
                            "price < 1000"
                          ],
                          "optionalFilters": [
                            "category:Book",
                            "author:John Doe"
                          ],
                          "optionalWords": "lorem",
                          "percentileComputation": true,
                          "personalizationImpact": 100,
                          "queryLanguages": [
                            "es"
                          ],
                          "queryType": "prefixLast",
                          "removeStopWords": [
                            "ca",
                            "es"
                          ],
                          "removeWordsIfNoResults": "firstWords",
                          "replaceSynonymsInHighlight": false,
                          "responseFields": [
                            "*"
                          ],
                          "restrictHighlightAndSnippetArrays": false,
                          "restrictSearchableAttributes": [
                            "title",
                            "author"
                          ],
                          "ruleContexts": [
                            "mobile"
                          ],
                          "snippetEllipsisText": "…",
                          "synonyms": true,
                          "typoTolerance": true,
                          "facetingAfterDistinct": false,
                          "facets": [
                            "category",
                            "disjunctive(brand)",
                            "price"
                          ],
                          "hitsPerPage": 20,
                          "maxValuesPerFacet": 100,
                          "renderingContent": {
                            "facetOrdering": {
                              "facets": {
                                "order": [
                                  "lorem"
                                ]
                              },
                              "values": {
                                "property1": {
                                  "order": [
                                    "lorem"
                                  ],
                                  "sortRemainingBy": "count",
                                  "hide": [
                                    "lorem"
                                  ]
                                },
                                "property2": {
                                  "order": [
                                    "lorem"
                                  ],
                                  "sortRemainingBy": "count",
                                  "hide": [
                                    "lorem"
                                  ]
                                }
                              }
                            },
                            "redirect": {
                              "url": "lorem"
                            },
                            "widgets": {
                              "banners": [
                                {
                                  "image": {
                                    "urls": [
                                      {
                                        "url": "lorem"
                                      }
                                    ],
                                    "title": "lorem"
                                  },
                                  "link": {
                                    "url": "lorem"
                                  }
                                }
                              ]
                            }
                          },
                          "sortFacetValuesBy": "count",
                          "sumOrFiltersScores": false
                        }
                      }
                    }
                  },
                  "injectedItems": [
                    {
                      "key": "lorem",
                      "source": {
                        "search": {
                          "index": "Products",
                          "params": {
                            "advancedSyntax": false,
                            "advancedSyntaxFeatures": [
                              "exactPhrase",
                              "excludeWords"
                            ],
                            "allowTyposOnNumericTokens": true,
                            "alternativesAsExact": [
                              "ignorePlurals",
                              "singleWordSynonym"
                            ],
                            "attributeCriteriaComputedByMinProximity": false,
                            "attributesToHighlight": [
                              "author",
                              "title",
                              "conten",
                              "content"
                            ],
                            "attributesToRetrieve": [
                              "author",
                              "title",
                              "content"
                            ],
                            "attributesToSnippet": [
                              "content:80",
                              "description"
                            ],
                            "clickAnalytics": false,
                            "disableExactOnAttributes": [
                              "description"
                            ],
                            "disableTypoToleranceOnAttributes": [
                              "sku"
                            ],
                            "distinct": 1,
                            "enableABTest": true,
                            "enablePersonalization": false,
                            "enableReRanking": true,
                            "enableRules": true,
                            "exactOnSingleWordQuery": "attribute",
                            "facetFilters": [
                              [
                                "category:Book",
                                "category:-Movie"
                              ],
                              "author:John Doe"
                            ],
                            "filters": "(category:Book OR category:Ebook) AND _tags:published",
                            "getRankingInfo": false,
                            "highlightPostTag": "</em>",
                            "highlightPreTag": "<em>",
                            "ignorePlurals": [
                              "ca",
                              "es"
                            ],
                            "minProximity": 1,
                            "minWordSizefor1Typo": 4,
                            "minWordSizefor2Typos": 8,
                            "naturalLanguages": [],
                            "numericFilters": [
                              [
                                "inStock = 1",
                                "deliveryDate < 1441755506"
                              ],
                              "price < 1000"
                            ],
                            "optionalFilters": [
                              "category:Book",
                              "author:John Doe"
                            ],
                            "optionalWords": "lorem",
                            "percentileComputation": true,
                            "personalizationImpact": 100,
                            "queryLanguages": [
                              "es"
                            ],
                            "queryType": "prefixLast",
                            "removeStopWords": [
                              "ca",
                              "es"
                            ],
                            "removeWordsIfNoResults": "firstWords",
                            "replaceSynonymsInHighlight": false,
                            "responseFields": [
                              "*"
                            ],
                            "restrictHighlightAndSnippetArrays": false,
                            "restrictSearchableAttributes": [
                              "title",
                              "author"
                            ],
                            "ruleContexts": [
                              "mobile"
                            ],
                            "snippetEllipsisText": "…",
                            "synonyms": true,
                            "typoTolerance": true
                          }
                        }
                      },
                      "position": 0,
                      "length": 0,
                      "metadata": {
                        "hits": {
                          "addItemKey": true,
                          "extra": {}
                        }
                      }
                    }
                  ],
                  "deduplication": {
                    "positioning": "highest"
                  }
                }
              },
              "sortingStrategy": {
                "Price (asc)": "products-low-to-high",
                "Price (desc)": "products-high-to-low"
              }
            }
            '
components:
  parameters:
    compositionID:
      in: path
      name: compositionID
      description: Unique Composition ObjectID.
      required: true
      schema:
        $ref: '#/components/schemas/compositionObjectID'
  schemas:
    composition:
      type: object
      additionalProperties: false
      properties:
        behavior:
          $ref: '#/components/schemas/compositionBehavior'
        name:
          type: string
          description: Composition name.
          example: my lovely crafted composition
        objectID:
          $ref: '#/components/schemas/compositionObjectID'
        description:
          type: string
          description: Composition description.
          example: my lovely crafted composition that is used for X purpose
        sortingStrategy:
          $ref: '#/components/schemas/sortingStrategy'
      required:
        - objectID
        - behavior
        - name
    taskID:
      type: integer
      format: int64
      example: 1514562690001
      description: >
        Unique identifier of a task.


        A successful API response means that a task was added to a queue.

        It might not run immediately.

        You can check the task's progress with the [`task`
        operation](https://www.algolia.com/doc/rest-api/search/get-task) and
        this task ID.
    compositionObjectID:
      type: string
      example: my_composition_object_id
      description: Composition unique identifier.
    compositionBehavior:
      type: object
      additionalProperties: false
      description: >-
        An object containing either an `injection` or `multifeed` behavior
        schema, but not both.
      oneOf:
        - $ref: '#/components/schemas/compositionInjectionBehavior'
        - $ref: '#/components/schemas/compositionMultifeedBehavior'
    sortingStrategy:
      type: object
      description: >
        A mapping of sorting labels to the indices (or replicas) that implement
        those sorting rules. The sorting indices MUST be related to the
        associated main targeted index in the composition.

        Each key is the label your frontend sends at runtime (for example,
        "Price (asc)"), and each value is the name of the index that should be
        queried when that label is selected.


        When a request includes a "sortBy" parameter, the platform looks up the
        corresponding index in this mapping and uses it to execute the query.
        The main targeted index is replaced

        with the sorting strategy index it is mapped to.


        Up to 20 sorting strategies can be defined.
      additionalProperties:
        type: string
      example:
        Price (asc): products-low-to-high
        Price (desc): products-high-to-low
    ErrorBase:
      description: Error.
      type: object
      x-keep-model: true
      additionalProperties: true
      properties:
        message:
          type: string
          example: Invalid Application-Id or API-Key
    compositionInjectionBehavior:
      type: object
      additionalProperties: false
      description: An object containing an `injection` behavior.
      properties:
        injection:
          $ref: '#/components/schemas/injection'
      required:
        - injection
    compositionMultifeedBehavior:
      type: object
      additionalProperties: false
      description: An object containing a `multifeed` behavior.
      properties:
        multifeed:
          $ref: '#/components/schemas/multifeed'
      required:
        - multifeed
    injection:
      title: injection
      type: object
      additionalProperties: false
      properties:
        main:
          $ref: '#/components/schemas/injectionMain'
        deduplication:
          title: deduplication
          type: object
          additionalProperties: false
          description: >-
            Deduplication configures the methods used to resolve duplicate items
            between main search results and injected group results.
          properties:
            positioning:
              $ref: '#/components/schemas/dedupPositioning'
          required:
            - positioning
        injectedItems:
          type: array
          description: list of injected items of the current Composition.
          minItems: 0
          maxItems: 3
          items:
            $ref: '#/components/schemas/injectionInjectedItem'
      required:
        - main
    multifeed:
      title: multifeed
      type: object
      additionalProperties: false
      properties:
        feeds:
          type: object
          description: >-
            A key-value store of Feed ID to Feed. Currently, the only supported
            Feed type is an Injection.
          additionalProperties:
            $ref: '#/components/schemas/Behaviour_feedID'
        feedsOrder:
          type: array
          description: >-
            A list of Feed IDs that specifies the order in which to order the
            results in the response. The IDs should be a subset of those in the
            Feeds object, and only those specified will be processed. When this
            field is not set, all Feeds are processed and returned with a
            default ordering.
          items:
            type: string
      required:
        - feeds
      example:
        feeds:
          products-feed:
            injection:
              main:
                source:
                  search:
                    index: products
              injectedItems:
                - key: sponsored
                  position: 0
                  length: 4
                  source:
                    search:
                      index: products
                      params:
                        filters: sponsored:true
          articles-feed:
            injection:
              main:
                source:
                  search:
                    index: articles
        feedsOrder:
          - products-feed
          - articles-feed
    injectionMain:
      type: object
      additionalProperties: false
      description: Main defines the organic result set of the injection.
      properties:
        source:
          $ref: '#/components/schemas/injectionMainSource'
    dedupPositioning:
      type: string
      enum:
        - highest
        - highestInjected
      description: >
        Deduplication positioning configures how a duplicate result should be
        resolved between an injected item and main search results.

        Current configuration supports:

        - 'highest': always select the item in the highest position, and remove
        duplicates that appear lower in the results.

        - 'highestInjected': duplicate result will be moved to its highest
        possible injected position, but not higher. 
          If a duplicate appears higher in main search results, it will be removed to stay it's intended group position (which could be lower than main).
      example: highest
      default: highestInjected
    injectionInjectedItem:
      type: object
      additionalProperties: false
      properties:
        key:
          type: string
          description: injected Item unique identifier.
        length:
          type: integer
          minimum: 0
          maximum: 50
        position:
          type: integer
          minimum: 0
          maximum: 99
        source:
          $ref: '#/components/schemas/injectedItemSource'
          description: Source to be used to inject items into result set.
        metadata:
          title: injectedItemMetadata
          type: object
          description: Used to add metadata to the results of the injectedItem.
          properties:
            hits:
              title: injectedItemHitsMetadata
              type: object
              description: >-
                Adds the provided metadata to each injected hit via an `_extra`
                attribute.
              properties:
                addItemKey:
                  type: boolean
                  description: >-
                    When true, the `_injectedItemKey` field is set in the
                    `_extra` object of each affected hit.
                extra:
                  type: object
                  additionalProperties: true
                  description: >-
                    The user-defined key-value pairs that will be placed in the
                    `_extra` field of each affected hit.
      required:
        - key
        - source
        - position
        - length
    Behaviour_feedID:
      type: object
      oneOf:
        - $ref: '#/components/schemas/feedInjection'
    injectionMainSource:
      description: Source to be used to retrieve organic result set.
      oneOf:
        - $ref: '#/components/schemas/injectionMainSearchSource'
        - $ref: '#/components/schemas/injectionMainRecommendSource'
    injectedItemSource:
      oneOf:
        - $ref: '#/components/schemas/injectedItemSearchSource'
        - $ref: '#/components/schemas/injectedItemExternalSource'
        - $ref: '#/components/schemas/injectedItemRecommendSource'
    feedInjection:
      type: object
      description: Feed formatted as an injection.
      additionalProperties: false
      properties:
        injection:
          $ref: '#/components/schemas/injection'
      required:
        - injection
    injectionMainSearchSource:
      description: >-
        Organic result set will originate from a search request performed on the
        specified index.
      x-discriminator-fields:
        - search
      type: object
      additionalProperties: false
      properties:
        search:
          title: mainSearch
          type: object
          additionalProperties: false
          properties:
            index:
              type: string
              description: Index to retrieve search results from.
              example: Products
            params:
              $ref: '#/components/schemas/mainInjectionQueryParameters'
          required:
            - index
      required:
        - search
    injectionMainRecommendSource:
      description: Organic result set will originate from a recommend request.
      x-discriminator-fields:
        - recommend
      type: object
      additionalProperties: false
      properties:
        recommend:
          title: mainRecommend
          type: object
          additionalProperties: false
          properties:
            indexName:
              type: string
              description: Index to retrieve recommendations from.
              example: Products
            model:
              $ref: '#/components/schemas/model'
            threshold:
              type: integer
              minimum: 0
              maximum: 100
              description: Minimum score a recommendation must have to be included.
            fallbackParameters:
              $ref: '#/components/schemas/mainInjectionQueryParameters'
            queryParameters:
              $ref: '#/components/schemas/mainInjectionQueryParameters'
          required:
            - indexName
            - model
            - threshold
      required:
        - recommend
    injectedItemSearchSource:
      description: >-
        Injected items will originate from a search request performed on the
        specified index.
      x-discriminator-fields:
        - search
      type: object
      additionalProperties: false
      properties:
        search:
          title: injectedItemSearch
          type: object
          additionalProperties: false
          properties:
            index:
              type: string
              description: Composition Index name.
              example: Products
            params:
              $ref: '#/components/schemas/baseInjectionQueryParameters'
          required:
            - index
      required:
        - search
    injectedItemExternalSource:
      description: >-
        Injected items will originate from externally provided objectIDs (that
        must exist in the index) given at runtime in the run request payload.
      x-discriminator-fields:
        - external
      type: object
      additionalProperties: false
      properties:
        external:
          title: injectedItemExternal
          type: object
          additionalProperties: false
          properties:
            index:
              type: string
              description: Composition Index name.
              example: Products
            ordering:
              $ref: '#/components/schemas/externalOrdering'
            params:
              $ref: '#/components/schemas/baseInjectionQueryParameters'
          required:
            - index
      required:
        - external
    injectedItemRecommendSource:
      description: >-
        Injected items will originate from a recommendation request performed on
        the specified index.
      x-discriminator-fields:
        - recommend
      type: object
      additionalProperties: false
      properties:
        recommend:
          title: recommend
          type: object
          additionalProperties: false
          properties:
            indexName:
              type: string
              description: Index to retrieve recommendations from.
              example: Products
            model:
              $ref: '#/components/schemas/model'
            threshold:
              type: integer
              minimum: 0
              maximum: 100
              description: Minimum score a recommendation must have to be included.
            fallbackParameters:
              $ref: '#/components/schemas/baseInjectionQueryParameters'
            queryParameters:
              $ref: '#/components/schemas/baseInjectionQueryParameters'
          required:
            - indexName
            - model
            - threshold
      required:
        - recommend
    mainInjectionQueryParameters:
      title: Composition Main Injection Query parameters as object
      type: object
      additionalProperties: false
      allOf:
        - $ref: '#/components/schemas/baseInjectionQueryParameters'
        - type: object
          additionalProperties: false
          properties:
            facetingAfterDistinct:
              $ref: '#/components/schemas/facetingAfterDistinct'
            facets:
              $ref: '#/components/schemas/facets'
            hitsPerPage:
              $ref: '#/components/schemas/hitsPerPage'
            maxValuesPerFacet:
              $ref: '#/components/schemas/maxValuesPerFacet'
            renderingContent:
              $ref: '#/components/schemas/renderingContent'
            sortFacetValuesBy:
              $ref: '#/components/schemas/sortFacetValuesBy'
            sumOrFiltersScores:
              $ref: '#/components/schemas/sumOrFiltersScores'
    model:
      type: string
      enum:
        - trending-items
      description: Recommendation model to use for retrieving recommendations.
      example: trending-items
    baseInjectionQueryParameters:
      title: >-
        Composition common query parameters between main and injected items as
        object
      type: object
      additionalProperties: false
      properties:
        advancedSyntax:
          $ref: '#/components/schemas/advancedSyntax'
        advancedSyntaxFeatures:
          $ref: '#/components/schemas/IndexSettings_advancedSyntaxFeatures'
        allowTyposOnNumericTokens:
          $ref: '#/components/schemas/allowTyposOnNumericTokens'
        alternativesAsExact:
          $ref: '#/components/schemas/IndexSettings_alternativesAsExact'
        attributeCriteriaComputedByMinProximity:
          $ref: '#/components/schemas/attributeCriteriaComputedByMinProximity'
        attributesToHighlight:
          $ref: '#/components/schemas/attributesToHighlight'
        attributesToRetrieve:
          $ref: '#/components/schemas/attributesToRetrieve'
        attributesToSnippet:
          $ref: '#/components/schemas/attributesToSnippet'
        clickAnalytics:
          $ref: '#/components/schemas/clickAnalytics'
        disableExactOnAttributes:
          $ref: '#/components/schemas/disableExactOnAttributes'
        disableTypoToleranceOnAttributes:
          $ref: '#/components/schemas/disableTypoToleranceOnAttributes'
        distinct:
          $ref: '#/components/schemas/distinct'
        enableABTest:
          $ref: '#/components/schemas/SearchParams_enableABTest'
        enablePersonalization:
          $ref: '#/components/schemas/enablePersonalization'
        enableReRanking:
          $ref: '#/components/schemas/enableReRanking'
        enableRules:
          $ref: '#/components/schemas/IndexSettings_enableRules'
        exactOnSingleWordQuery:
          $ref: '#/components/schemas/exactOnSingleWordQuery'
        facetFilters:
          $ref: '#/components/schemas/facetFilters'
        filters:
          $ref: '#/components/schemas/filters'
        getRankingInfo:
          $ref: '#/components/schemas/SearchParams_getRankingInfo'
        highlightPostTag:
          $ref: '#/components/schemas/highlightPostTag'
        highlightPreTag:
          $ref: '#/components/schemas/highlightPreTag'
        ignorePlurals:
          $ref: '#/components/schemas/ignorePlurals'
        minProximity:
          $ref: '#/components/schemas/minProximity'
        minWordSizefor1Typo:
          $ref: '#/components/schemas/minWordSizefor1Typo'
        minWordSizefor2Typos:
          $ref: '#/components/schemas/minWordSizefor2Typos'
        naturalLanguages:
          $ref: '#/components/schemas/naturalLanguages'
        numericFilters:
          $ref: '#/components/schemas/numericFilters'
        optionalFilters:
          $ref: '#/components/schemas/optionalFilters'
        optionalWords:
          $ref: '#/components/schemas/optionalWords'
        percentileComputation:
          $ref: '#/components/schemas/percentileComputation'
        personalizationImpact:
          $ref: '#/components/schemas/personalizationImpact'
        queryLanguages:
          $ref: '#/components/schemas/queryLanguages'
        queryType:
          $ref: '#/components/schemas/queryType'
        removeStopWords:
          $ref: '#/components/schemas/removeStopWords'
        removeWordsIfNoResults:
          $ref: '#/components/schemas/removeWordsIfNoResults'
        replaceSynonymsInHighlight:
          $ref: '#/components/schemas/replaceSynonymsInHighlight'
        responseFields:
          $ref: '#/components/schemas/responseFields'
        restrictHighlightAndSnippetArrays:
          $ref: '#/components/schemas/restrictHighlightAndSnippetArrays'
        restrictSearchableAttributes:
          $ref: '#/components/schemas/restrictSearchableAttributes'
        ruleContexts:
          $ref: '#/components/schemas/SearchParams_ruleContexts'
        snippetEllipsisText:
          $ref: '#/components/schemas/snippetEllipsisText'
        synonyms:
          $ref: '#/components/schemas/synonyms'
        typoTolerance:
          $ref: '#/components/schemas/typoTolerance'
    externalOrdering:
      description: >-
        Ordering to apply on the injected items coming from the external source.
        'default' means the items will be ordered as they are in the index
        (natural relevance) in the smart group. 'userDefined' means the order in
        which the objectIDs are provided in the run request payload will be
        preserved in the smart group.
      enum:
        - default
        - userDefined
      default: default
    facetingAfterDistinct:
      type: boolean
      description: >
        Whether faceting should be applied after deduplication with `distinct`

        This leads to accurate facet counts when using faceting in combination
        with `distinct`.

        It's usually better to use `afterDistinct` modifiers in the
        `attributesForFaceting` setting,

        as `facetingAfterDistinct` only computes correct facet counts if all
        records have the same facet values for the `attributeForDistinct`.
      default: false
      x-categories:
        - Faceting
    facets:
      type: array
      items:
        type: string
      description: >
        Facets for which to retrieve facet values that match the search criteria
        and the number of matching facet values

        To retrieve all facets, use the wildcard character `*`.

        To retrieve disjunctive facets lists, annotate any facets with the
        `disjunctive` modifier.

        For more information, see
        [facets](https://www.algolia.com/doc/guides/managing-results/refine-results/faceting/#contextual-facet-values-and-counts)
        and [disjunctive faceting for Smart
        Groups](https://www.algolia.com/doc/guides/managing-results/compositions/search-based-groups#facets-including-disjunctive-faceting).
      default: []
      example:
        - category
        - disjunctive(brand)
        - price
      examples:
        - - category
          - disjunctive(brand)
          - price
        - - '*'
        - - '*'
          - disjunctive(brand)
      x-categories:
        - Faceting
    hitsPerPage:
      type: integer
      description: Number of hits per page.
      default: 20
      minimum: 1
      maximum: 1000
      x-categories:
        - Pagination
    maxValuesPerFacet:
      type: integer
      description: Maximum number of facet values to return for each facet.
      default: 100
      maximum: 1000
      x-categories:
        - Faceting
    renderingContent:
      description: >
        Extra data that can be used in the search UI.


        You can use this to control aspects of your search UI, such as the order
        of facet names and values

        without changing your frontend code.
      type: object
      additionalProperties: false
      properties:
        facetOrdering:
          $ref: '#/components/schemas/facetOrdering'
        redirect:
          $ref: '#/components/schemas/redirectURL'
        widgets:
          $ref: '#/components/schemas/widgets'
      x-categories:
        - Advanced
    sortFacetValuesBy:
      type: string
      description: >
        Order in which to retrieve facet values

        - `count`.
          Facet values are retrieved by decreasing count.
          The count is the number of matching records containing this facet value
        - `alpha`.
          Retrieve facet values alphabetically
        This setting doesn't influence how facet values are displayed in your UI
        (see `renderingContent`).

        For more information, see [facet value
        display](https://www.algolia.com/doc/guides/building-search-ui/ui-and-ux-patterns/facet-display/js).
      default: count
      x-categories:
        - Faceting
    sumOrFiltersScores:
      type: boolean
      description: >
        Whether to sum all filter scores

        If true, all filter scores are summed.

        Otherwise, the maximum filter score is kept.

        For more information, see [filter
        scores](https://www.algolia.com/doc/guides/managing-results/refine-results/filtering/in-depth/filter-scoring/#accumulating-scores-with-sumorfiltersscores).
      default: false
      x-categories:
        - Filtering
    advancedSyntax:
      type: boolean
      description: >
        Whether to support phrase matching and excluding words from search
        queries

        Use the `advancedSyntaxFeatures` parameter to control which feature is
        supported.
      default: false
      x-categories:
        - Query strategy
    IndexSettings_advancedSyntaxFeatures:
      type: array
      items:
        $ref: '#/components/schemas/advancedSyntaxFeatures'
      description: |
        Advanced search syntax features you want to support
        - `exactPhrase`.
          Phrases in quotes must match exactly.
          For example, `sparkly blue "iPhone case"` only returns records with the exact string "iPhone case"
        - `excludeWords`.
          Query words prefixed with a `-` must not occur in a record.
          For example, `search -engine` matches records that contain "search" but not "engine"
        This setting only has an effect if `advancedSyntax` is true.
      default:
        - exactPhrase
        - excludeWords
      x-categories:
        - Query strategy
    allowTyposOnNumericTokens:
      type: boolean
      description: |
        Whether to allow typos on numbers in the search query
        Turn off this setting to reduce the number of irrelevant matches
        when searching in large sets of similar numbers.
      default: true
      x-categories:
        - Typos
    IndexSettings_alternativesAsExact:
      type: array
      items:
        $ref: '#/components/schemas/alternativesAsExact'
      description: >
        Determine which plurals and synonyms should be considered an exact
        matches

        By default, Algolia treats singular and plural forms of a word, and
        single-word synonyms, as
        [exact](https://www.algolia.com/doc/guides/managing-results/relevance-overview/in-depth/ranking-criteria/#exact)
        matches when searching.

        For example

        - "swimsuit" and "swimsuits" are treated the same

        - "swimsuit" and "swimwear" are treated the same (if they are
        [synonyms](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/adding-synonyms/#regular-synonyms))

        - `ignorePlurals`.
          Plurals and similar declensions added by the `ignorePlurals` setting are considered exact matches
        - `singleWordSynonym`.
          Single-word synonyms, such as "NY" = "NYC", are considered exact matches
        - `multiWordsSynonym`.
          Multi-word synonyms, such as "NY" = "New York", are considered exact matches.
      default:
        - ignorePlurals
        - singleWordSynonym
      x-categories:
        - Query strategy
    attributeCriteriaComputedByMinProximity:
      type: boolean
      description: >
        Whether the best matching attribute should be determined by minimum
        proximity

        This setting only affects ranking if the Attribute ranking criterion
        comes before Proximity in the `ranking` setting.

        If true, the best matching attribute is selected based on the minimum
        proximity of multiple matches.

        Otherwise, the best matching attribute is determined by the order in the
        `searchableAttributes` setting.
      default: false
      x-categories:
        - Advanced
    attributesToHighlight:
      type: array
      items:
        type: string
      example:
        - author
        - title
        - conten
        - content
      description: >
        Attributes to highlight

        By default, all searchable attributes are highlighted.

        Use `*` to highlight all attributes or use an empty array `[]` to turn
        off highlighting.

        Attribute names are case-sensitive

        With highlighting, strings that match the search query are surrounded by
        HTML tags defined by `highlightPreTag` and `highlightPostTag`.

        You can use this to visually highlight matching parts of a search query
        in your UI

        For more information, see [Highlighting and
        snippeting](https://www.algolia.com/doc/guides/building-search-ui/ui-and-ux-patterns/highlighting-snippeting/js).
      x-categories:
        - Highlighting and Snippeting
    attributesToRetrieve:
      type: array
      items:
        type: string
      example:
        - author
        - title
        - content
      description: >
        Attributes to include in the API response

        To reduce the size of your response, you can retrieve only some of the
        attributes.

        Attribute names are case-sensitive

        - `*` retrieves all attributes, except attributes included in the
        `customRanking` and `unretrievableAttributes` settings.

        - To retrieve all attributes except a specific one, prefix the attribute
        with a dash and combine it with the `*`: `["*", "-ATTRIBUTE"]`.

        - The `objectID` attribute is always included.
      default:
        - '*'
      x-categories:
        - Attributes
    attributesToSnippet:
      type: array
      items:
        type: string
      example:
        - content:80
        - description
      description: >
        Attributes for which to enable snippets.

        Attribute names are case-sensitive

        Snippets provide additional context to matched words.

        If you enable snippets, they include 10 words, including the matched
        word.

        The matched word will also be wrapped by HTML tags for highlighting.

        You can adjust the number of words with the following notation:
        `ATTRIBUTE:NUMBER`,

        where `NUMBER` is the number of words to be extracted.
      default: []
      x-categories:
        - Highlighting and Snippeting
    clickAnalytics:
      type: boolean
      description: >
        Whether to include a `queryID` attribute in the response

        The query ID is a unique identifier for a search query and is required
        for tracking [click and conversion
        events](https://www.algolia.com/doc/guides/sending-events/getting-started).
      default: false
      x-categories:
        - Analytics
    disableExactOnAttributes:
      type: array
      items:
        type: string
      example:
        - description
      description: >
        Searchable attributes for which you want to [turn off the Exact ranking
        criterion](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/override-search-engine-defaults/in-depth/adjust-exact-settings/#turn-off-exact-for-some-attributes).

        Attribute names are case-sensitive

        This can be useful for attributes with long values, where the likelihood
        of an exact match is high,

        such as product descriptions.

        Turning off the Exact ranking criterion for these attributes favors
        exact matching on other attributes.

        This reduces the impact of individual attributes with a lot of content
        on ranking.
      default: []
      x-categories:
        - Query strategy
    disableTypoToleranceOnAttributes:
      type: array
      items:
        type: string
      example:
        - sku
      description: >
        Attributes for which you want to turn off [typo
        tolerance](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/typo-tolerance).

        Attribute names are case-sensitive

        Returning only exact matches can help when

        - [Searching in hyphenated
        attributes](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/typo-tolerance/how-to/how-to-search-in-hyphenated-attributes).

        - Reducing the number of matches when you have too many.
          This can happen with attributes that are long blocks of text, such as product descriptions
        Consider alternatives such as `disableTypoToleranceOnWords` or adding
        synonyms if your attributes have intentional unusual spellings that
        might look like typos.
      default: []
      x-categories:
        - Typos
    distinct:
      description: >
        Determines how many records of a group are included in the search
        results.


        Records with the same value for the `attributeForDistinct` attribute are
        considered a group.

        The `distinct` setting controls how many members of the group are
        returned.

        This is useful for [deduplication and
        grouping](https://www.algolia.com/doc/guides/managing-results/refine-results/grouping/#introducing-algolias-distinct-feature).


        The `distinct` setting is ignored if `attributeForDistinct` is not set.
      example: 1
      oneOf:
        - type: boolean
          description: >-
            Whether deduplication is turned on. If true, only one member of a
            group is shown in the search results.
        - type: integer
          description: >
            Number of members of a group of records to include in the search
            results.


            - Don't use `distinct > 1` for records that might be [promoted by
            rules](https://www.algolia.com/doc/guides/managing-results/rules/merchandising-and-promoting/how-to/promote-hits).
              The number of hits won't be correct and faceting won't work as expected.
            - With `distinct > 1`, the `hitsPerPage` parameter controls the
            number of returned groups.
              For example, with `hitsPerPage: 10` and `distinct: 2`, up to 20 records are returned.
              Likewise, the `nbHits` response attribute contains the number of returned groups.
          minimum: 0
          maximum: 4
          default: 0
      x-categories:
        - Advanced
    SearchParams_enableABTest:
      type: boolean
      description: Whether to enable A/B testing for this search.
      default: true
      x-categories:
        - Advanced
    enablePersonalization:
      type: boolean
      description: Whether to enable Personalization.
      default: false
      x-categories:
        - Personalization
    enableReRanking:
      type: boolean
      description: >
        Whether this search will use [Dynamic
        Re-Ranking](https://www.algolia.com/doc/guides/algolia-ai/re-ranking)

        This setting only has an effect if you activated Dynamic Re-Ranking for
        this index in the Algolia dashboard.
      default: true
      x-categories:
        - Filtering
    IndexSettings_enableRules:
      type: boolean
      description: Whether to enable rules.
      default: true
      x-categories:
        - Rules
    exactOnSingleWordQuery:
      type: string
      enum:
        - attribute
        - none
        - word
      description: >
        Determines how the [Exact ranking
        criterion](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/override-search-engine-defaults/in-depth/adjust-exact-settings/#turn-off-exact-for-some-attributes)
        is computed when the search query has only one word.


        - `attribute`.
          The Exact ranking criterion is 1 if the query word and attribute value are the same.
          For example, a search for "road" will match the value "road", but not "road trip".

        - `none`.
          The Exact ranking criterion is ignored on single-word searches.

        - `word`.
          The Exact ranking criterion is 1 if the query word is found in the attribute value.
          The query word must have at least 3 characters and must not be a stop word.
          Only exact matches will be highlighted,
          partial and prefix matches won't.
      default: attribute
      x-categories:
        - Query strategy
    facetFilters:
      description: >
        Filter the search by facet values, so that only records with the same
        facet values are retrieved.


        **Prefer using the `filters` parameter, which supports all filter types
        and combinations with boolean operators.**


        - `[filter1, filter2]` is interpreted as `filter1 AND filter2`.

        - `[[filter1, filter2], filter3]` is interpreted as `filter1 OR filter2
        AND filter3`.

        - `facet:-value` is interpreted as `NOT facet:value`.


        While it's best to avoid attributes that start with a `-`, you can still
        filter them by escaping with a backslash:

        `facet:\-value`.
      example:
        - - category:Book
          - category:-Movie
        - author:John Doe
      oneOf:
        - type: array
          items:
            $ref: '#/components/schemas/facetFilters'
        - type: string
      x-categories:
        - Filtering
    filters:
      type: string
      description: >
        Filter expression to only include items that match the filter criteria
        in the response.


        You can use these filter expressions:


        - **Numeric filters.** `<facet> <op> <number>`, where `<op>` is one of
        `<`, `<=`, `=`, `!=`, `>`, `>=`.

        - **Ranges.** `<facet>:<lower> TO <upper>`, where `<lower>` and
        `<upper>` are the lower and upper limits of the range (inclusive).

        - **Facet filters.** `<facet>:<value>`, where `<facet>` is a facet
        attribute (case-sensitive) and `<value>` a facet value.

        - **Tag filters.** `_tags:<value>` or just `<value>` (case-sensitive).

        - **Boolean filters.** `<facet>: true | false`.


        You can combine filters with `AND`, `OR`, and `NOT` operators with the
        following restrictions:


        - You can only combine filters of the same type with `OR`.
          **Not supported:** `facet:value OR num > 3`.
        - You can't use `NOT` with combinations of filters.
          **Not supported:** `NOT(facet:value OR facet:value)`
        - You can't combine conjunctions (`AND`) with `OR`.
          **Not supported:** `facet:value OR (facet:value AND facet:value)`

        Use quotes if the facet attribute name or facet value contains spaces,
        keywords (`OR`, `AND`, `NOT`), or quotes.

        If a facet attribute is an array, the filter matches if it matches at
        least one element of the array.


        For more information, see
        [Filters](https://www.algolia.com/doc/guides/managing-results/refine-results/filtering).
      example: (category:Book OR category:Ebook) AND _tags:published
      x-categories:
        - Filtering
    SearchParams_getRankingInfo:
      type: boolean
      description: Whether the search response should include detailed ranking information.
      default: false
      x-categories:
        - Advanced
    highlightPostTag:
      type: string
      description: >-
        HTML tag to insert after the highlighted parts in all highlighted
        results and snippets.
      default: </em>
      x-categories:
        - Highlighting and Snippeting
    highlightPreTag:
      type: string
      description: >-
        HTML tag to insert before the highlighted parts in all highlighted
        results and snippets.
      default: <em>
      x-categories:
        - Highlighting and Snippeting
    ignorePlurals:
      description: |
        Treat singular, plurals, and other forms of declensions as equivalent.
        Only use this feature for the languages used in your index.
      example:
        - ca
        - es
      oneOf:
        - type: array
          description: |
            ISO code for languages for which this feature should be active.
            This overrides languages you set with `queryLanguages`.
          items:
            $ref: '#/components/schemas/supportedLanguage'
        - $ref: '#/components/schemas/booleanString'
        - type: boolean
          description: >
            If true, `ignorePlurals` is active for all languages included in
            `queryLanguages`, or for all supported languages, if `queryLanguges`
            is empty.

            If false, singulars, plurals, and other declensions won't be
            considered equivalent.
          default: false
      x-categories:
        - Languages
    minProximity:
      type: integer
      minimum: 1
      maximum: 7
      description: >
        Minimum proximity score for two matching words

        This adjusts the [Proximity ranking
        criterion](https://www.algolia.com/doc/guides/managing-results/relevance-overview/in-depth/ranking-criteria/#proximity)

        by equally scoring matches that are farther apart

        For example, if `minProximity` is 2, neighboring matches and matches
        with one word between them would have the same score.
      default: 1
      x-categories:
        - Advanced
    minWordSizefor1Typo:
      type: integer
      description: >-
        Minimum number of characters a word in the search query must contain to
        accept matches with [one
        typo](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/typo-tolerance/in-depth/configuring-typo-tolerance/#configuring-word-length-for-typos).
      default: 4
      x-categories:
        - Typos
    minWordSizefor2Typos:
      type: integer
      description: >-
        Minimum number of characters a word in the search query must contain to
        accept matches with [two
        typos](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/typo-tolerance/in-depth/configuring-typo-tolerance/#configuring-word-length-for-typos).
      default: 8
      x-categories:
        - Typos
    naturalLanguages:
      type: array
      items:
        $ref: '#/components/schemas/supportedLanguage'
      description: >
        ISO language codes that adjust settings that are useful for processing
        natural language queries (as opposed to keyword searches)

        - Sets `removeStopWords` and `ignorePlurals` to the list of provided
        languages.

        - Sets `removeWordsIfNoResults` to `allOptional`.

        - Adds a `natural_language` attribute to `ruleContexts` and
        `analyticsTags`.
      default: []
      x-categories:
        - Languages
    numericFilters:
      description: >
        Filter by numeric facets.


        **Prefer using the `filters` parameter, which supports all filter types
        and combinations with boolean operators.**


        You can use numeric comparison operators: `<`, `<=`, `=`, `!=`, `>`,
        `>=`.

        Comparisons are precise up to 3 decimals.

        You can also provide ranges: `facet:<lower> TO <upper>`. The range
        includes the lower and upper boundaries.

        The same combination rules apply as for `facetFilters`.
      example:
        - - inStock = 1
          - deliveryDate < 1441755506
        - price < 1000
      oneOf:
        - type: array
          items:
            $ref: '#/components/schemas/numericFilters'
        - type: string
      x-categories:
        - Filtering
    optionalFilters:
      description: >
        Filters to promote or demote records in the search results.


        Optional filters work like facet filters, but they don't exclude records
        from the search results.

        Records that match the optional filter rank before records that don't
        match.

        If you're using a negative filter `facet:-value`, matching records rank
        after records that don't match.


        - Optional filters are applied _after_ sort-by attributes.

        - Optional filters are applied _before_ custom ranking attributes (in
        the default
        [ranking](https://www.algolia.com/doc/guides/managing-results/relevance-overview/in-depth/ranking-criteria)).

        - Optional filters don't work with numeric attributes.

        - On virtual replicas, optional filters are applied _after_ the
        replica's [relevant
        sort](https://www.algolia.com/doc/guides/managing-results/refine-results/sorting/in-depth/relevant-sort).
      example:
        - category:Book
        - author:John Doe
      oneOf:
        - type: array
          items:
            $ref: '#/components/schemas/optionalFilters'
        - type: string
      x-categories:
        - Filtering
    optionalWords:
      description: >
        Words that should be considered optional when found in the query.


        By default, records must match all words in the search query to be
        included in the search results.

        Adding optional words can increase the number of search results by
        running an additional search query that doesn't include the optional
        words.

        For example, if the search query is "action video" and "video" is
        optional,

        the search engine runs two queries: one for "action video" and one for
        "action".

        Records that match all words are ranked higher.


        For a search query with 4 or more words **and** all its words are
        optional,

        the number of matched words required for a record to be included in the
        search results increases for every 1,000 records:


        - If `optionalWords` has fewer than 10 words, the required number of
        matched words increases by 1:
          results 1 to 1,000 require 1 matched word; results 1,001 to 2,000 need 2 matched words.
        - If `optionalWords` has 10 or more words, the required number of
        matched words increases by the number of optional words divided by 5
        (rounded down).
          Example: with 18 optional words, results 1 to 1,000 require 1 matched word; results 1,001 to 2,000 need 4 matched words.

        For more information, see [Optional
        words](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/empty-or-insufficient-results/#creating-a-list-of-optional-words).
      oneOf:
        - type: string
        - type: 'null'
        - $ref: '#/components/schemas/optionalWordsArray'
    percentileComputation:
      type: boolean
      description: >-
        Whether to include this search when calculating processing-time
        percentiles.
      default: true
      x-categories:
        - Advanced
    personalizationImpact:
      type: integer
      description: >
        Impact that Personalization should have on this search

        The higher this value is, the more Personalization determines the
        ranking compared to other factors.

        For more information, see [Understanding Personalization
        impact](https://www.algolia.com/doc/guides/personalization/personalizing-results/in-depth/configuring-personalization/#understanding-personalization-impact).
      default: 100
      minimum: 0
      maximum: 100
      x-categories:
        - Personalization
    queryLanguages:
      type: array
      items:
        $ref: '#/components/schemas/supportedLanguage'
      example:
        - es
      description: >
        Languages for language-specific query processing steps such as plurals,
        stop-word removal, and word-detection dictionaries.

        This setting sets a default list of languages used by the
        `removeStopWords` and `ignorePlurals` settings.

        This setting also sets a dictionary for word detection in the
        logogram-based
        [CJK](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/handling-natural-languages-nlp/in-depth/normalization/#normalization-for-logogram-based-languages-cjk)
        languages.

        To support this, place the CJK language **first**.

        **Always specify a query language.**

        If you don't specify an indexing language, the search engine uses all
        [supported
        languages](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/handling-natural-languages-nlp/in-depth/supported-languages),

        or the languages you specified with the `ignorePlurals` or
        `removeStopWords` parameters.

        This can lead to unexpected search results.

        For more information, see [Language-specific
        configuration](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/handling-natural-languages-nlp/in-depth/language-specific-configurations).
      default: []
      x-categories:
        - Languages
    queryType:
      type: string
      enum:
        - prefixLast
        - prefixAll
        - prefixNone
      description: >
        Determines if and how query words are interpreted as prefixes.


        By default, only the last query word is treated as a prefix
        (`prefixLast`).

        To turn off prefix search, use `prefixNone`.

        Avoid `prefixAll`, which treats all query words as prefixes.

        This might lead to counterintuitive results and makes your search
        slower.


        For more information, see [Prefix
        searching](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/override-search-engine-defaults/in-depth/prefix-searching).
      default: prefixLast
      x-categories:
        - Query strategy
    removeStopWords:
      description: >
        Removes stop words from the search query.


        Stop words are common words like articles, conjunctions, prepositions,
        or pronouns that have little or no meaning on their own.

        In English, "the", "a", or "and" are stop words.


        Only use this feature for the languages used in your index.
      example:
        - ca
        - es
      oneOf:
        - type: array
          description: >-
            ISO code for languages for which stop words should be removed. This
            overrides languages you set in `queryLanguges`.
          items:
            $ref: '#/components/schemas/supportedLanguage'
        - type: boolean
          default: false
          description: >
            If true, stop words are removed for all languages you included in
            `queryLanguages`, or for all supported languages, if
            `queryLanguages` is empty.

            If false, stop words are not removed.
      x-categories:
        - Languages
    removeWordsIfNoResults:
      type: string
      enum:
        - none
        - lastWords
        - firstWords
        - allOptional
      example: firstWords
      description: >
        Strategy for removing words from the query when it doesn't return any
        results.

        This helps to avoid returning empty search results.


        - `none`.
          No words are removed when a query doesn't return results.

        - `lastWords`.
          Treat the last (then second to last, then third to last) word as optional,
          until there are results or at most 5 words have been removed.

        - `firstWords`.
          Treat the first (then second, then third) word as optional,
          until there are results or at most 5 words have been removed.

        - `allOptional`.
          Treat all words as optional.

        For more information, see [Remove words to improve
        results](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/empty-or-insufficient-results/in-depth/why-use-remove-words-if-no-results).
      default: none
      x-categories:
        - Query strategy
    replaceSynonymsInHighlight:
      type: boolean
      description: >
        Whether to replace a highlighted word with the matched synonym

        By default, the original words are highlighted even if a synonym
        matches.

        For example, with `home` as a synonym for `house` and a search for
        `home`,

        records matching either "home" or "house" are included in the search
        results,

        and either "home" or "house" are highlighted

        With `replaceSynonymsInHighlight` set to `true`, a search for `home`
        still matches the same records,

        but all occurrences of "house" are replaced by "home" in the highlighted
        response.
      default: false
      x-categories:
        - Highlighting and Snippeting
    responseFields:
      type: array
      items:
        type: string
      description: >
        Properties to include in the API response of search and browse requests

        By default, all response properties are included.

        To reduce the response size, you can select which properties should be
        included

        An empty list may lead to an empty API response (except properties you
        can't exclude)

        You can't exclude these properties:

        `message`, `warning`, `cursor`, `abTestVariantID`,

        or any property added by setting `getRankingInfo` to true

        Your search depends on the `hits` field. If you omit this field,
        searches won't return any results.

        Your UI might also depend on other properties, for example, for
        pagination.

        Before restricting the response size, check the impact on your search
        experience.
      default:
        - '*'
      x-categories:
        - Advanced
    restrictHighlightAndSnippetArrays:
      type: boolean
      description: >
        Whether to restrict highlighting and snippeting to items that at least
        partially matched the search query.

        By default, all items are highlighted and snippeted.
      default: false
      x-categories:
        - Highlighting and Snippeting
    restrictSearchableAttributes:
      type: array
      items:
        type: string
      example:
        - title
        - author
      description: |
        Restricts a search to a subset of your searchable attributes.
        Attribute names are case-sensitive.
      default: []
      x-categories:
        - Filtering
    SearchParams_ruleContexts:
      type: array
      items:
        type: string
      description: >
        Assigns a rule context to the search query

        [Rule
        contexts](https://www.algolia.com/doc/guides/managing-results/rules/rules-overview/how-to/customize-search-results-by-platform/#whats-a-context)
        are strings that you can use to trigger matching rules.
      default: []
      example:
        - mobile
      x-categories:
        - Rules
    snippetEllipsisText:
      type: string
      description: String used as an ellipsis indicator when a snippet is truncated.
      default: …
      x-categories:
        - Highlighting and Snippeting
    synonyms:
      type: boolean
      description: Whether to take into account an index's synonyms for this search.
      default: true
      x-categories:
        - Advanced
    typoTolerance:
      description: >
        Whether [typo
        tolerance](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/typo-tolerance)
        is enabled and how it is applied.


        If typo tolerance is true, `min`, or `strict`, [word splitting and
        concatenation](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/handling-natural-languages-nlp/in-depth/splitting-and-concatenation)
        are also active.
      oneOf:
        - type: boolean
          default: true
          description: >-
            Whether typo tolerance is active. If true, matches with typos are
            included in the search results and rank after exact matches.
        - $ref: '#/components/schemas/typoToleranceEnum'
      x-categories:
        - Typos
    facetOrdering:
      description: Order of facet names and facet values in your UI.
      type: object
      additionalProperties: false
      properties:
        facets:
          $ref: '#/components/schemas/IndexSettings_facets'
        values:
          $ref: '#/components/schemas/values'
    redirectURL:
      description: The redirect rule container.
      type: object
      additionalProperties: false
      properties:
        url:
          type: string
    widgets:
      description: Widgets returned from any rules that are applied to the current search.
      type: object
      additionalProperties: false
      properties:
        banners:
          $ref: '#/components/schemas/banners'
    advancedSyntaxFeatures:
      type: string
      enum:
        - exactPhrase
        - excludeWords
      x-categories:
        - Query strategy
    alternativesAsExact:
      type: string
      enum:
        - ignorePlurals
        - singleWordSynonym
        - multiWordsSynonym
        - ignoreConjugations
      x-categories:
        - Query strategy
    supportedLanguage:
      type: string
      description: ISO code for a supported language.
      enum:
        - af
        - ar
        - az
        - bg
        - bn
        - ca
        - cs
        - cy
        - da
        - de
        - el
        - en
        - eo
        - es
        - et
        - eu
        - fa
        - fi
        - fo
        - fr
        - ga
        - gl
        - he
        - hi
        - hu
        - hy
        - id
        - is
        - it
        - ja
        - ka
        - kk
        - ko
        - ku
        - ky
        - lt
        - lv
        - mi
        - mn
        - mr
        - ms
        - mt
        - nb
        - nl
        - 'no'
        - ns
        - pl
        - ps
        - pt
        - pt-br
        - qu
        - ro
        - ru
        - sk
        - sq
        - sv
        - sw
        - ta
        - te
        - th
        - tl
        - tn
        - tr
        - tt
        - uk
        - ur
        - uz
        - zh
    booleanString:
      type: string
      enum:
        - 'true'
        - 'false'
    optionalWordsArray:
      type: array
      items:
        type: string
      example:
        - blue
        - iphone case
      description: >-
        List of [optional
        words](https://www.algolia.com/doc/guides/managing-results/optimize-search-results/empty-or-insufficient-results/#creating-a-list-of-optional-words).
      default: []
      x-categories:
        - Query strategy
    typoToleranceEnum:
      type: string
      title: typo tolerance
      description: |
        - `min`. Return matches with the lowest number of typos.
          For example, if you have matches without typos, only include those.
          But if there are no matches without typos (with 1 typo), include matches with 1 typo (2 typos).
        - `strict`. Return matches with the two lowest numbers of typos.
          With `strict`, the Typo ranking criterion is applied first in the `ranking` setting.
      enum:
        - min
        - strict
        - 'true'
        - 'false'
    IndexSettings_facets:
      description: Order of facet names.
      type: object
      additionalProperties: false
      properties:
        order:
          $ref: '#/components/schemas/order'
    values:
      description: Order of facet values. One object for each facet.
      type: object
      additionalProperties:
        $ref: '#/components/schemas/value'
        x-additionalPropertiesName: facet
    banners:
      description: Banners defined in the Merchandising Studio for a given search.
      type: array
      items:
        $ref: '#/components/schemas/banner'
    order:
      description: >
        Explicit order of facets or facet values.


        This setting lets you always show specific facets or facet values at the
        top of the list.
      type: array
      items:
        type: string
    value:
      type: object
      additionalProperties: false
      properties:
        hide:
          $ref: '#/components/schemas/hide'
        order:
          $ref: '#/components/schemas/order'
        sortRemainingBy:
          $ref: '#/components/schemas/sortRemainingBy'
    banner:
      description: Banner with image and link to redirect users.
      type: object
      additionalProperties: false
      properties:
        image:
          $ref: '#/components/schemas/bannerImage'
        link:
          $ref: '#/components/schemas/bannerLink'
    hide:
      description: Hide facet values.
      type: array
      items:
        type: string
    sortRemainingBy:
      description: >
        Order of facet values that aren't explicitly positioned with the `order`
        setting.


        - `count`.
          Order remaining facet values by decreasing count.
          The count is the number of matching records containing this facet value.

        - `alpha`.
          Sort facet values alphabetically.

        - `hidden`.
          Don't show facet values that aren't explicitly positioned.
      type: string
      enum:
        - count
        - alpha
        - hidden
    bannerImage:
      description: Image to show inside a banner.
      type: object
      additionalProperties: false
      properties:
        title:
          type: string
        urls:
          type: array
          items:
            $ref: '#/components/schemas/bannerImageUrl'
    bannerLink:
      description: Link for a banner defined in the Merchandising Studio.
      type: object
      additionalProperties: false
      properties:
        url:
          type: string
    bannerImageUrl:
      description: URL for an image to show inside a banner.
      type: object
      additionalProperties: false
      properties:
        url:
          type: string
  responses:
    BadRequest:
      description: Bad request or request arguments.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBase'
    FeatureNotEnabled:
      description: This feature is not enabled on your Algolia account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBase'
    MethodNotAllowed:
      description: Method not allowed with this API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBase'
    UnprocessableEntity:
      description: Unprocessable Entity.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBase'
  securitySchemes:
    appId:
      type: apiKey
      in: header
      name: x-algolia-application-id
      description: Your Algolia application ID.
    apiKey:
      type: apiKey
      in: header
      name: x-algolia-api-key
      description: >
        Your Algolia API key with the necessary permissions to make the request.

        Permissions are controlled through access control lists (ACL) and access
        restrictions.

        The required ACL to make a request is listed in each endpoint's
        reference.

````