# GraphQL Schema

```graphql
schema {
  query: Query
}

type Query {
  """
  Retrieves a single custom set by its id.
  """
  customSet(id: ID!): CustomSet

  """
  References a product by id, which exposes fields for cluster sets,
  custom sets and similar products. `id` can be a SKU or main SKU.
  """
  product(id: ID!): ProductReference

  """
  @deprecated
  Fetch 8.SET Compose product sets for a given trigger product.
  """
  setCompose(
    "An optional number of product sets to fetch."
    first: Int
    "Specifies the trigger product for which to fetch product sets."
    input: SetComposeQueryInput!
  ): SetComposeConnection
    @deprecated(
      reason: "Please use `matchingProductClusters` field on `product` query instead."
    )
}

type CustomSetConnection {
  "The list of custom sets in the current page."
  edges: [CustomSetEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

type CustomSetEdge {
  "The custom set this edge refers to."
  node: CustomSet!
}

type CustomSet {
  "An optional description."
  description: String

  "The id of this specific product set."
  id: ID!

  "The list of images of the set. May be empty."
  images(first: Int): ImageConnection!

  "List of products in order of definition."
  products: [CustomSetProduct!]!

  "The list of tags of the set. May be empty."
  tags: [String!]!

  "An optional title."
  title: String
}

type ImageConnection {
  "The list of custom sets in the current page."
  edges: [ImageEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

type ImageEdge {
  "The custom set this edge refers to."
  node: Image!
}

type Image {
  "The url of the image"
  url: String!
}

type ProductReference {
  customSets(
    "An optional number of sets to fetch (default: 1)."
    first: Int
  ): CustomSetConnection

  matchingProductClusters(
    "An optional number of product clusters to fetch (default: 5)."
    first: Int
  ): ProductClusterConnection

  productSets(
    "An optional number of product sets to fetch (default: 10, maximum: 10)."
    first: Int
  ): ProductSetConnection

  similarProducts(
    "An optional number of products to fetch (default: 12)."
    first: Int
  ): ProductConnection
}

type ProductClusterConnection {
  "The list of clusters in the current page."
  edges: [ProductClusterEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

type ProductClusterEdge {
  "The cluster this edge refers to."
  node: ProductCluster!
}

type ProductCluster {
  "The id of this specific cluster."
  id: ID!

  """
  List of products contained in this cluster. Products are sorted by their
  likelihood of conversion.
  """
  products(
    "An optional number of products to fetch (default: 12)."
    first: Int
  ): ProductConnection!
}

interface IProduct {
  "The brand of this product."
  brand: String

  "The id of this product."
  id: ID!

  "The list of images of the product. May be empty."
  images: ImageConnection!

  "The model this product is based upon."
  modelId: String

  "The name of this product."
  name: String!

  "A list of tags attached to this product."
  tags: [String!]!

  "The online store URL of this product."
  url: String!

  "The list of variants for this product."
  variants(first: Int): ProductVariantConnection!
}

type ProductConnection {
  "The list of custom sets in the current page."
  edges: [ProductEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

type ProductEdge {
  "The custom set this edge refers to."
  node: Product!
}

type Product implements IProduct {
  "The brand of this product."
  brand: String

  "The id of this product."
  id: ID!

  "The list of images of the product. May be empty."
  images: ImageConnection!

  "The model this product is based upon."
  modelId: String

  "The name of this product."
  name: String!

  "A list of tags attached to this product."
  tags: [String!]!

  "The online store URL of this product."
  url: String!

  "The list of variants for this product."
  variants(first: Int): ProductVariantConnection!
}

type CustomSetProduct implements IProduct {
  "The brand of this product."
  brand: String

  "The id of this product."
  id: ID!

  "The list of images of the product. May be empty."
  images: ImageConnection!

  "The model this product is based upon."
  modelId: String

  "The name of this product."
  name: String!

  similarProducts(
    "An optional number of products to fetch (default: 12)."
    first: Int
  ): ProductConnection

  "A list of tags attached to this product."
  tags: [String!]!

  "The online store URL of this product."
  url: String!

  "The list of variants for this product."
  variants(first: Int): ProductVariantConnection!
}

"""
A "page" of product variants containing a given number of items.
"""
type ProductVariantConnection {
  "The list of product variants in the current page."
  edges: [ProductVariantEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

"""
An edge referring to a single product variant.
"""
type ProductVariantEdge {
  "The product variant this edge refers to."
  node: ProductVariant!
}

"""
The specific variant of a product.
"""
type ProductVariant {
  "The id referring to this specific product variant."
  id: ID!

  "The manufacturer's suggested retail price."
  manufacturerSuggestedRetailPrice: Price

  "The price of this product variant."
  price: Price!

  variantId: String
}

enum CurrencyCode {
  "Euro (EUR)"
  EUR

  "Polish Zlotych (PLN)"
  PLN

  "United States Dollars (USD)"
  USD
}

type Price {
  """
  The decimal amount of the price, e.g "19.99".
  """
  amount: String!

  "The currency of the price."
  currencyCode: CurrencyCode!
}

"""
The pagination information of the current page.
"""
type PageInfo {
  "The cursor identifying the end of the current page."
  endCursor: String

  "Indicates whether more data is available"
  hasNextPage: Boolean!
}

"""
@deprecated
The set of query types supported by `setCompose`.
"""
enum SetComposeQueryType {
  "The stock keeping unit identifier for a set of different product variants."
  MAIN_SKU
  "The identifier specifying a set of different products of the same model."
  MODEL_ID
  "The stock keeping unit identifier for a specific product."
  SKU
}

"""
@deprecated
The trigger product for which to query product sets.
"""
input SetComposeQueryInput {
  "The type of identifier by which to specify the trigger product."
  queryType: SetComposeQueryType!
  "The actual identifier to which the `queryType` refers."
  value: String!
}

"""
@deprecated
A "page" of product sets containg a given number of items.
"""
type SetComposeConnection {
  "The list of product sets in the current page."
  edges: [SetComposeEdge!]!
  "The pagination information of the current page."
  pageInfo: PageInfo
}

"""
@deprecated
An edge referring to a single product set.
"""
type SetComposeEdge {
  "The product set this edge refers to."
  node: SetCompose!
}

"""
@deprecated
A product set based on a given trigger product.
"""
type SetCompose {
  "An optional description of the product set."
  description: String
  "The id of this specific product set."
  id: String!
  "List of cross-selling products that combine well with the trigger product."
  setProducts: [SetComposeProduct!]!
  "The id of the snapshot for the specific product set used in this API request."
  snapshotId: String
  "An optional title of the product set."
  title: String
  """
  The trigger product this product set is based upon.
  _Note: If this product is currently unavailable the closest alternative will
  be used._
  """
  triggerProduct: SetComposeProduct!
}

"""
@deprecated
A specific product.
"""
type SetComposeProduct {
  """
  The list of similar products to potentially substitute this product with in
  a product set. Products are sorted by their likelihood of conversion.
  """
  alternatives(first: Int): SetComposeProductAlternativeConnection!
  "The model this product is based upon."
  model: ProductModel
  "The stock keeping unit of this product."
  sku: String!
  "The list of variants for this product."
  variants: SetComposeProductVariantConnection!
}

"""
@deprecated
A "page" of alternative products containing a given number of items.
"""
type SetComposeProductAlternativeConnection {
  "The list of similar products in the current page."
  edges: [SetComposeProductAlternativeEdge!]!
  "The pagination information of the current page."
  pageInfo: PageInfo
}

"""
@deprecated
An edge referring to a single alternative product.
"""
type SetComposeProductAlternativeEdge {
  "The alternative product this edge refers to."
  node: SetComposeProductAlternative!
}

"""
@deprecated
A specific alternative product.
"""
type SetComposeProductAlternative {
  "The model this product is based upon."
  model: ProductModel
  "The stock keeping unit of this product."
  sku: String!
  "The list of variants for this product."
  variants: SetComposeProductVariantConnection!
}

"""
@deprecated
A model uniting several products.
"""
type ProductModel {
  id: String!
}

"""
@deprecated
A "page" of product variants containing a given number of items.
"""
type SetComposeProductVariantConnection {
  "The list of product variants in the current page."
  edges: [SetComposeProductVariantEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

"""
@deprecated
An edge referring to a single product variant.
"""
type SetComposeProductVariantEdge {
  "The product variant this edge refers to."
  node: SetComposeProductVariant!
}

"""
@deprecated
The specific variant of a product.
"""
type SetComposeProductVariant {
  "The stock keeping unit referring to this specific product variant."
  sku: String!
}

type ProductSetConnection {
  "The list of product sets in the current page."
  edges: [ProductSetEdge!]!

  "The pagination information of the current page."
  pageInfo: PageInfo
}

type ProductSetEdge {
  "The product set this edge refers to."
  node: ProductSet!
}

type ProductSet {
  "The id of this specific product set."
  id: ID!

  "The image of the product set. May be null."
  imageLink: String

  "List of products in order of definition."
  products: [ProductSetProduct!]!

  "The list of tags of the product set. May be empty."
  tags: [String!]!
}

type ProductSetProduct {
  "The brand of this product."
  brand: String!

  "The id of this product."
  id: ID!

  "The image URL of the product."
  imageLink: String!

  "The online store URL of this product."
  link: String!

  """
  The decimal amount of the price including currency in ISO 4217, e.g "19.99 EUR".
  """
  price: String!

  """
  The decimal amount of sale the price including currency in ISO 4217, e.g "15.99 EUR".
  Discounted price if applicable, otherwise null. Same format as `price`.
  """
  salePrice: String

  "A list of tags attached to this product. May be empty."
  tags: [String!]!

  "The name of this product."
  title: String!
}

```

## Introspection Query

Through its introspection capabilities, GraphQL also allows to get information about the underlying schema using [**regular API queries**](https://docs.8select.io/api/general/introduction#how-to-query-graphql). The following example allows to fetch information about all top-level queries, their retrievable fields as well as parameters that can be passed to them:

```graphql
query {
  __schema {
    queryType {
      kind
      name
      fields {
        name
        args {
          name
          type {
            kind
            name
          }
        }
        type {
          fields {
            name
            type {
              kind
              name
            }
          }
        }
      }
    }
  }
}

```

Using appropriate tooling though, it will not be necessary to query this information most of the time. Instead almost every modern development environment has built-in functionalities to provide the information automatically.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.8select.io/api/general/graphql-schema.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
