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

# Get frequently bought together

> Retrieve frequently bought together items for a set of object IDs.

export const Legacy = ({title, href}) => {
  return <Note>

    This page documents an earlier version of the API client.
    For the latest version, see <a href={href}>{title}</a>.

    </Note>;
};

<Legacy title="Retrieve recommendations" href="/doc/libraries/sdk/methods/recommend/get-recommendations" />

**Required ACL:** `search`

If there isn't enough data for Frequently Bought Together, it's better to show a different type of
recommendation, for example, [related products](/doc/libraries/sdk/v1/methods/get-related-products).

## Examples

<CodeGroup>
  ```cs C# theme={"system"}
  public class Product
  {
      public string ObjectID { get; set; }
      public string Name { get; set; }
      public string Category { get; set; }
      public float Price { get; set; }
  }

  public class RecommendedProduct : Product, Algolia.Search.Models.Recommend.IRecommendHit
  {
      public float Score { get; set; }
  }

  var requests = new List<Algolia.Search.Models.Recommend.BoughtTogetherRequest> {
    new Algolia.Search.Models.Recommend.BoughtTogetherRequest {
        IndexName = "INDEX_NAME",
        ObjectID = "your_object_id",
    }
  }

  var recommendations =
    recommendClient.GetFrequentlyBoughtTogether<RecommendedProduct>(requests);

  // Asynchronous
  var recommendations =
    await recommendClient.GetFrequentlyBoughtTogetherAsync<RecommendedProduct>(requests);
  ```

  ```go Go theme={"system"}
   options := recommend.NewBoughtTogetherOptions("IndexName", "B018APC4LE", 0, nil, nil)
   res, err = recommendClient.GetFrequentlyBoughtTogether([]recommend.FrequentlyBoughtTogetherOptions{options})
  ```

  ```java Java theme={"system"}
   class Product implements RecommendHit {
     String objectID;
     String name;
     Float score;

     @Nonnull
     @Override
     public Float getScore() { return score;}
     public void setScore(Float score) { this.score = score;}

     public String getObjectID() { return objectID; }
     public void setObjectID(String objectID) { this.objectID = objectID; }

     public String getName() { return name; }
     public void setName(String name) { this.name = name; }
   }

   FrequentlyBoughtTogetherQuery query = new FrequentlyBoughtTogetherQuery("yourIndexName", "yourObjectID");
   
   // Synchronous
   List<RecommendationsResult<Product>> recommendations = recommendClient.getFrequentlyBoughtTogether(Arrays.asList(query), Product.class);
   
   // Asynchronous
   CompletableFuture<List<RecommendationsResult<Product>>> recommendations = recommendClient.getFrequentlyBoughtTogetherAsync(Arrays.asList(query), Product.class); 
  ```

  ```js JavaScript theme={"system"}
  recommendClient
    .getFrequentlyBoughtTogether([
      {
        indexName: "INDEX_NAME",
        objectID: "your_object_id",
      },
    ])
    .then(({ results }) => {
      console.log(results);
    })
    .catch((err) => {
      console.log(err);
    });
  ```

  ```kotlin Kotlin theme={"system"}
  val request = FrequentlyBoughtTogetherQuery(
      indexName = IndexName("yourIndexName"),
      objectID = ObjectID("yourObjectID"),
  )

  recommendClient.getFrequentlyBoughtTogether(requests = listOf(request))
  ```

  ```php PHP theme={"system"}
  $recommendations = $recommend_client->getFrequentlyBoughtTogether([
    [
      'indexName' => 'INDEX_NAME',
      'objectID' => 'your_object_id',
    ],
  ]);
  ```

  ```python Python theme={"system"}
  recommendations = recommend_client.get_frequently_bought_together(
      [
          {
              "indexName": "INDEX_NAME",
              "objectID": "your_object_id",
          },
      ]
  )
  ```

  ```ruby Ruby theme={"system"}
  recommendations = recommend_client.get_frequently_bought_together(
    [
      {
        indexName: "INDEX_NAME",
        objectID: "your_object_id"
      }
    ]
  )
  ```

  ```scala Scala theme={"system"}
   recommendClient.execute {
     val query = FrequentlyBoughtTogetherQuery(
       indexName = "yourIndexName",
       objectID = "yourObjectID"
     )
     get frequentlyBoughtTogether List(query)
   }
  ```

  ```swift Swift theme={"system"}
  let options = RecommendationsOptions(indexName: "IndexName", objectID: "B018APC4LE")
  recommendClient.getFrequentlyBoughtTogether(options: [options]) { result in
    if case .success(let response) = result {
      print("Response: \(response)")
    }
  }
  ```
</CodeGroup>

## Parameters

<ParamField body="requests" type="object[]" required>
  <Expandable>
    <ParamField body="indexName" type="string" required>
      The name of the target index.
    </ParamField>

    <ParamField body="objectID" type="string" required>
      The object ID of the item for which to get recommendations.
    </ParamField>

    <ParamField body="threshold" type="number" required>
      Threshold for the recommendations confidence score (between 0 and 100).
      Only recommendations with a greater score are returned.
    </ParamField>

    <ParamField body="maxRecommendations" type="integer">
      The maximum number of recommendations to retrieve.
      Depending on the available recommendations and the other request parameters,
      the actual number of hits might be lower.
      If `maxRecommendations` isn't provided or set to 0,
      all matching recommendations are returned,
      and no fallback request is performed.
    </ParamField>

    <ParamField body="queryParameters" type="object">
      List of [search parameters](/doc/api-reference/search-api-parameters),
      except: `page`, `hitsPerPage`, `offset`, and `length`.
    </ParamField>
  </Expandable>
</ParamField>

## Response

<ResponseField name="results" type="object[]">
  List of results in the order they were submitted, one per query.

  **Example:**

  ```jsonc JSON icon=braces theme={"system"}
  {
    "results": [
      {
        "hits": [
          {
            // ...,
            "_score": 32.72
          }
        ]
      }
    ]
  }
  ```

  <Expandable>
    <ResponseField name="_score" type="number">
      The confidence score of the recommended item, the closer it is to 100, the more relevant it is.
    </ResponseField>
  </Expandable>
</ResponseField>

### Response as JSON

This section shows the JSON response returned by the API.
Each API client wraps this response in language-specific objects, so the structure may vary.
To view the response, use the `getLogs` method.
Don't rely on the order of properties—JSON objects don't preserve key order.

```jsonc JSON icon=braces theme={"system"}
{
  "results": [
    {
      "hits": [
        {
          "_highlightResult": {
            "category": {
              "matchLevel": "none",
              "matchedWords": [],
              "value": "Men - T-Shirts"
            },
            "image_link": {
              "matchLevel": "none",
              "matchedWords": [],
              "value": "https://example.org/image/D05927-8161-111-F01.jpg"
            },
            "name": {
              "matchLevel": "none",
              "matchedWords": [],
              "value": "Jirgi Half-Zip T-Shirt"
            }
          },
          "_score": 32.72,
          "category": "Men - T-Shirts",
          "image_link": "https://example.org/image/D05927-8161-111-F01.jpg",
          "name": "Jirgi Half-Zip T-Shirt",
          "objectID": "D05927-8161-111",
          "position": 105,
          "url": "men/t-shirts/d05927-8161-111"
        }
      ],
      "processingTimeMS": 1
    }
  ]
}
```
