# Technical documentation

The docs describing ways to integrate and extend Ergonode PIM

{% content-ref url="/spaces/6u2YBMGfHnxzhqWDtR1T" %}
[GraphQL API](https://docs.ergonode.com/graphql/)
{% endcontent-ref %}

Continuously integrate your data via GraphQL API and its powerful Stream queries design.

{% content-ref url="/spaces/10OfBWTAWvvFNi3URpy2" %}
[Ergonode transfer](https://docs.ergonode.com/ergonode-transfer/)
{% endcontent-ref %}

Export, import, and enrich your data using easy-to-manage CSV files.

{% content-ref url="/spaces/7s7tBPr3qZNN72Bd34a5" %}
[Apps](https://docs.ergonode.com/apps2/)
{% endcontent-ref %}

Extend Ergonode user interface and create data synchronization with ease by App.


# GraphQL API

This doc provides an overview of our GraphQL API which is designed specifically with data integration in mind.

{% hint style="info" %}
The API is available at `/api/graphql/` URL path of your instance.
{% endhint %}

GraphQL API allows two types of interactions with the PIM data

* [Queries](/graphql/overview/schema/queries) - allow fetching the current state of the data
* [Mutations](/graphql/overview/schema/mutations) - allow modifying the state of the data

Documentation of all data types available in the API can be found on the [Schema](/graphql/overview/schema) page.


# Query types

Overview of available query and field naming concepts representing how the data is provided.

### Single resource

Returns resource identified by the unique inedntifier

* `product(sku: "simple_product") {…}` - sku(Sku) for product
* `attribute(code: "attribute_code") {...}` - code(AttributeCode) for the attribute

### Streams

*\*Stream (paginable)*

Streams allow fetching the collection of resources.

Streams are designed specifically for integrations - once you create a new resource or edit existing ones, a resource is automatically transferred to the end of the stream - a given resource at a given moment is available in the stream only once.\
\
The stream gives you the power of importing resources in time without worrying about dealing with nitty-gritty details like edition date etc.\
\
As an example, we do have a product stream with the following SKUs `[1, 2, 3 {endCursor}]`. Once product 2 gets updated the stream will look like the following `[1, 3 {endCursorFromInitialState}, 2]`. Once you'd add product 4 again the stream would look like `[1, 3 {endCursorFromInitialState}, 2, 4]`. Thanks to using this powerful design of the cursor approach and our providing method you are sure you don't miss a resource once fetching continuously unlike it's risky on classic paginal collections.

{% hint style="info" %}
Note if you have an API key created with Segment products are also transferred to the end of the stream once are added to a Segment.
{% endhint %}

* `productStream(first: 1, after: “cursor”) {…}`

### Lists

*\*List (paginable)*

Lists allow fetching the collection(list) of the resources.

The list should always be fetched and updated entirely at once. The list represents finite resources not growing in time.

* `languageList(first: 1, after: "cursor") {…}`
* `Product.attributeList`

### Collections

Usually available from other resources levels i.e. bindings of the variable product

* `VariableProduct.bindings`

Every API resource is presented in the current state at the moment of fetching.

&#x20;

All paginable collections are based on the [Relay](https://relay.dev/graphql/connections.htm) standard. According to it every Edge of the graph next to the information of the resource(`node`) contains a `cursor` that allows fetching the next resource from the collection.

<br>


# Stream queries

List of factors resulting in resource cursor update

{% hint style="info" %}
Note that some updates though potentially could be interpreted as other resource updates as well, i.e. category name changes could result in updates of both product and category tree cursors, are limited to the specific resource to limit the overall amount of updates.

This is by design since a potentially small change could cause a snowball effect - one, simple category name change, could cause the need to reimport all products in the system, etc.
{% endhint %}

### productStream

* product created
* product property updated
  * attribute value
  * product added or removed from a category
  * template assignment
  * status changed
  * a variant has been added or removed
  * grouped product has been added or removed
* product added to a segment
* variable product variant added to a segment
* grouping product grouped product added to a segment
* product related in product relation attribute added to a segment

### attributeStream

* attribute created
* attribute property updated
  * name
  * metadata
  * option added, modified, or removed from an attribute
  * unit attribute unit
  * price attribute currency
  * textarea attribute richEdit property

### categoryStream

* category created
* category property updated
  * name
  * attribute value

### categoryTreeStream

* category tree created
* category tree property updated
  * name
  * category tree structure

### multimediaStream

* multimedia created
* multimedia property updated
  * name
  * folder assignment
  * attribute value


# Error codes

The list of possible error codes to occur in course of executing API mutations.

### General

* `128f9cb0-28bd-4843-a570-d2bd4671c495` The resource is referenced from other resources.
* `e78b3ed7-db49-4e81-9f29-ecc2985072f4` Currency is not supported.
* `79876042-fe47-4035-ba10-ce07706433fd` Template with given `TemplateCode` does not exist.
* `4b5f8783-1273-4ddb-8e05-e0ecf685d924` Unit with given `UnitName` does not exist.
* `9ff3fdc4-b214-49db-8718-39c315e33d45` Too short input value.
* `d94b19cc-114f-4f44-9cc4-4138e80a87b9` Too long input value.
* `c1051bb4-d103-4f74-8988-acbcafc7fdc3` The input value cannot be blank.
* `ea4e51d1-3342-48bd-87f1-9e672cd90cad` The numeric value is too low.
* `1a9da513-2640-4f84-9b6a-4d99dcddc628` Value is not a valid date format.
* `d6d40d78-bf28-4773-8c0d-4411be1e8fa6` The translation language is not active.
* `756b1212-697c-468d-a9ad-50dd783bb169` Too many elements in a collection.
* `491b2811-7e4d-49f7-adbe-a42622031f1c` Language has to be passed when setting a value for the local scope Attribute.
* `786446ad-32b8-40a9-9bb5-e5445196ffd5` Value is not unique for the given attribute.
* `a16b966e-e884-4075-9de7-4720cad1022a` Value does not match the regex.
* `aa82dbed-9098-4d4b-af22-3a0dde5d47bb` Multimedia extension is not acceptable.
* `e47e5afd-c7ef-4a5d-bb3e-0076269951d4` Value contains banned words.
* `25db6569-d15d-41a2-a32d-61b67308d285` Attribute code has to represent a unique attribute.
* `bb87ccb2-0433-40d9-976d-f4f388299840` A resource cannot reference itself.
* `67391185-a3df-49e2-b9ca-9e163dfa3921` Template with given `TemplateCode` exists already

### Attribute

* `4a9205b6-8f3c-4e85-960d-9835aaa1e9ab` Attribute with given `AttributeCode` does not exist.
* `62adb4f9-217d-4d9e-b117-0a30b4b33f3b` Attribute with given `AttributeCode` exists already.
* `25f77355-4443-4850-b8cd-7d3ec7ef5a7a` Attribute already has `Option` with given `OptionCode`.
* `bc1a2fc6-4910-4e47-a3aa-1fdbcd2d364b` Attribute does not contain `Option` with given `OptionCode`.
* `50084892-e811-4358-820e-f005917f769b` Attribute with given `AttributeCode` is not valid according to context.
* `72e93c59-575a-4062-914b-5e143f2810f0` Attribute metadata limit exceeded.
* `ea5e8ce4-8ab7-442d-87ca-db500cad7be2` Attribute metadata payload keys duplicates.
* `7cc10e50-3d49-43c6-a847-3b8363f9ed83` Invalid attribute scope.

### Category

* `6d2e1555-7d1b-47a7-8d2d-47ea2e33bfe6` Category with given `CategoryCode` does not exist.
* `ef49c353-7fec-4f5a-beb7-47d392606a15` Category with given `CategoryCode` exists already.
* `b2943d95-24e6-4b0c-9f09-f86ea635d8cb` Categories do not have Attribute enabled in configuration.
* `c18fa865-07a5-4fcb-a6af-8c44b5c643bd` Attribute is used in Category as value.

### Multimedia

* `d62579bf-6fde-4396-9f12-bc71d6394746` Multimedia exists already within `MultimediaPath`.
* `eabcf146-a4e7-425c-999f-9e04a6c8a988` Multimedia with given `MultimediaPath` does not exist.
* `9670b62d-5db8-4de8-81bd-7d6119625df0` Multimedia file should be an image.
* `df8637af-d466-48c6-a59d-e7126250a654` Multimedia file uploaded is too large.
* `dd4722d6-9371-42a2-9c35-87b2a03009e7` Multimedia file uploaded extension is not supported.
* `9465e18e-be76-46e8-ab9f-1db22426ab06` Multimedia file is corrupted and its extension does not match MIME type.
* `ef0dd12b-f075-4bbb-8535-4f299452cf30` Multimedia with the given extension in `MultimediaName` does not match the Multimedia file MIME type.
* `d64f83eb-32ae-48f6-a46d-ffa4fcba6ee3` MultimediaFolder with given `MultimediaFolderPath` does not exist.
* `54c25a35-59da-4215-aa61-997bb80d303f` MultimediaFolder with given `MultimediaFolderPath` exists already.

### Product

* `a339fa44-2bf8-48df-84a5-ad83a4ba74be` Product type is invalid.
* `01b70d39-8e58-4406-a1c8-f63d84f29af6` Product with given `Sku` does not exist.
* `c63cc7a9-1298-4520-a5ad-6c0a9c478a00` Product with given `Sku` exists already.
* `7e270f10-73b7-4b82-991f-80bda5bc70a3` VariableProduct needs to have bindings in order to add variants.
* `d3209a3d-23a5-4c53-bf6b-4b72cd42d376` Product cannot be added as a `VariableProduct` variant as do not have the required attributes.
* `18b2cb49-313d-4251-96bd-e031351a95b8` VariableProduct has variants already and its binding attributes cannot be changed.
* `3b96fc99-792e-4698-aee1-a3d95ad97b05` Product attribute value is a bond to VariableProduct and cannot be changed.
* `0786e099-07ce-4b4e-bf92-d04442c130e5` Another Product is bonded to VariableProduct with the same set of value of binding attributes.
* `bfff5187-1ac6-45f8-8516-7d59ab030c09` Cannot remove attribute value as it's a binding attribute.
* `72b36b5b-5c2f-44c6-85f3-ecadc04ea1b3` Product is already a Variant.
* `6406a966-10e9-4096-abfd-bf6764909fd2` Product does not have given child.
* `05007a9f-8a00-4e1d-803c-4bb7adea078a` Generating SKU automatically is disabled.


# Schema

The entire GraphQL schema is available to fetch from the API itself. It's called [introspection](https://graphql.org/learn/introspection/).

As with every other query, introspection of the Ergonode API requires [authentication](/graphql/guides/authentication).

The simplest way to discover the GraphQL API is to use supporting HTTP clients like [Insomnia](https://insomnia.rest/). On one hand, they do support scoping through documentation schema, and on the other provide autocomplete functionality which makes writing queries really straightforward.

Alternatively, in order to obtain the full types definition download the schema

{% file src="/files/4G2EMsWhRFYi7gmAlLIG" %}

or just query the API:

```graphql
{
  __schema {
    queryType {
      name
    }
    mutationType {
      name
    }
    subscriptionType {
      name
    }
    types {
      ...FullType 
    }
    directives {
      name
      description
      locations
      args {
        ...InputValue 
      }
    }
  }
}
fragment FullType on __Type {
  kind
  name
  description
  fields(includeDeprecated: true) {
    name
    description
    args {
      ...InputValue 
    } 
    type {
      ...TypeRef
    }
    isDeprecated
    deprecationReason
  }
  inputFields {
    ...InputValue
  }
  interfaces {
    ...TypeRef
  }
  enumValues(includeDeprecated: true) {
    name
    description
    isDeprecated
    deprecationReason
  }
  possibleTypes {
    ...TypeRef 
  }
}
fragment InputValue on __InputValue {
  name
  description
  type {
    ...TypeRef 
  }
  defaultValue
}
fragment TypeRef on __Type {
  kind
  name
  ofType {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType
        {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
              }
            }
          }
        }
      }
    }
  }
}
```

Types reference:

* [Queries](/graphql/overview/schema/queries)
* [Mutations](/graphql/overview/schema/mutations)
* [Objects](/graphql/overview/schema/objects)
* [Interfaces](/graphql/overview/schema/interfaces)
* [Scalars](/graphql/overview/schema/scalars)
* [Input objects](/graphql/overview/schema/input-objects)
* [Enums](/graphql/overview/schema/enums)
* [Unions](/graphql/overview/schema/unions)


# Queries

Queries allow retrieving data from the server.

### attribute

Finds an `Attribute`.

Returns: [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Arguments:

| code | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of a searched `Attribute`. |
| ---- | -------------------------------------------------------------------- | ----------------------------------- |

### attributeDeletedStream

Provides a [stream](/graphql/overview/query-types#streams) of deleted attribute codes.

Returns: [**AttributeDeletedConnection**](/graphql/overview/schema/objects#attributedeletedconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### attributeOptionList

Provides a list of attribute options.

Returns: [**OptionConnection**](/graphql/overview/schema/objects#optionconnection)

Arguments:

| code    | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                                        | The code of a searched `Attribute`.                                                                                              |
| ------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| filters | [**AttributeOptionListFilterInput**](/graphql/overview/schema/input-objects#attributeoptionlistfilterinput) | Filters for the query.                                                                                                           |
| after   | [**String**](/graphql/overview/schema/scalars#string)                                                       | Provides elements after the specified cursor.                                                                                    |
| first   | [**Int**](/graphql/overview/schema/scalars#int)                                                             | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### attributeStream

Provides a [stream](/graphql/overview/query-types#streams) of attributes.

Returns: [**AttributeConnection**](/graphql/overview/schema/objects#attributeconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### category

Finds a `Category`.

Returns: [**Category**](/graphql/overview/schema/objects#category)

Arguments:

| code | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode) | The code of a searched `Category`. |
| ---- | ------------------------------------------------------------------ | ---------------------------------- |

### categoryAttributeList

Provides a list of attributes allowed to be used in a category.

Returns: [**AttributeConnection**](/graphql/overview/schema/objects#attributeconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 500.<br>The default value is 50.</p> |

### categoryDeletedStream

Provides a [stream](/graphql/overview/query-types#streams) of deleted category codes.

Returns: [**CategoryDeletedConnection**](/graphql/overview/schema/objects#categorydeletedconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### categoryStream

Provides a [stream](/graphql/overview/query-types#streams) of categories.

Returns: [**CategoryConnection**](/graphql/overview/schema/objects#categoryconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### categoryTree

Finds a `CategoryTree`.

Returns: [**CategoryTree**](/graphql/overview/schema/objects#categorytree)

Arguments:

| code | [**CategoryTreeCode!**](/graphql/overview/schema/scalars#categorytreecode) | The code of a searched `CategoryTree`. |
| ---- | -------------------------------------------------------------------------- | -------------------------------------- |

### categoryTreeDeletedStream

Provides a [stream](/graphql/overview/query-types#streams) of deleted category tree codes.

Returns: [**CategoryTreeDeletedConnection**](/graphql/overview/schema/objects#categorytreedeletedconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### categoryTreeStream

Provides a [stream](/graphql/overview/query-types#streams) of category trees.

Returns: [**CategoryTreeConnection**](/graphql/overview/schema/objects#categorytreeconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### languageList

Provides a list of active languages.

Returns: [**LanguageConnection**](/graphql/overview/schema/objects#languageconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                     |
| ----- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 1000.<br>The default value is 50.</p> |

### multimedia

Finds a `Multimedia`.

Returns: [**Multimedia**](/graphql/overview/schema/objects#multimedia)

Arguments:

| path | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of a searched `Multimedia`. |
| ---- | ---------------------------------------------------------------------- | ------------------------------------ |

### multimediaAttributeList

Provides a list of attributes allowed to be used in a multimedia.

Returns: [**AttributeConnection**](/graphql/overview/schema/objects#attributeconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 500.<br>The default value is 50.</p> |

### multimediaFolder

Finds a `MultimediaFolder`.

Returns: [**MultimediaFolder**](/graphql/overview/schema/objects#multimediafolder)

Arguments:

| path | [**MultimediaFolderPath!**](/graphql/overview/schema/scalars#multimediafolderpath) | The path of a searched `MultimediaFolder`. |
| ---- | ---------------------------------------------------------------------------------- | ------------------------------------------ |

### multimediaFolderList

Provides a list of multimedia folders.

Returns: [**MultimediaFolderConnection**](/graphql/overview/schema/objects#multimediafolderconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 300.<br>The default value is 50.</p> |

### multimediaStream

Provides a [stream](/graphql/overview/query-types#streams) of multimedia.

Returns: [**MultimediaConnection**](/graphql/overview/schema/objects#multimediaconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### product

Finds a `Product`.

Returns: [**Product**](/graphql/overview/schema/interfaces#product)

Arguments:

| sku | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of a searched `Product`. |
| --- | ------------------------------------------------ | -------------------------------- |

### productByUniqueAttribute

Finds a `Product` by unique attribute value.

Returns: [**Product**](/graphql/overview/schema/interfaces#product)

Arguments:

| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of unique attribute `Product` is searched by.  |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| value         | [**String!**](/graphql/overview/schema/scalars#string)               | The value of unique attribute `Product` is searched by. |

### productDeletedStream

Provides a [stream](/graphql/overview/query-types#streams) of deleted product SKUs.

Returns: [**ProductDeletedConnection**](/graphql/overview/schema/objects#productdeletedconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### productStream

Provides a [stream](/graphql/overview/query-types#streams) of products.

Returns: [**ProductConnection**](/graphql/overview/schema/objects#productconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |

### productVariantParent

Finds a parent `VariableProduct` identified by variant Sku.

Returns: [**VariableProduct**](/graphql/overview/schema/objects#variableproduct)

Arguments:

| variantSku | [**Sku!**](/graphql/overview/schema/scalars#sku) | The Sku of variant to find a parent `VariableProduct`. |
| ---------- | ------------------------------------------------ | ------------------------------------------------------ |

### section

Finds a `Section`.

Returns: [**Section**](/graphql/overview/schema/objects#section)

Arguments:

| code | [**SectionCode!**](/graphql/overview/schema/scalars#sectioncode) | The code of a searched `Section`. |
| ---- | ---------------------------------------------------------------- | --------------------------------- |

### sectionList

Provides a list of sections.

Returns: [**SectionConnection**](/graphql/overview/schema/objects#sectionconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 100.<br>The default value is 50.</p> |

### template

Finds a `Template`.

Returns: [Template](/graphql/overview/schema/objects#template)

Arguments:

| code | [TemplateCode!](/graphql/overview/schema/scalars#templatecode) | The code of a searched `Template`. |
| ---- | -------------------------------------------------------------- | ---------------------------------- |

### templateList

Provides a list of templates.

Returns: [**TemplateConnection**](/graphql/overview/schema/objects#templateconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 100.<br>The default value is 50.</p> |

### unitList

Provides a list of units.

Returns: [**UnitConnection**](/graphql/overview/schema/objects#unitconnection)

Arguments:

| after | [**String**](/graphql/overview/schema/scalars#string) | Provides elements after the specified cursor.                                                                                    |
| ----- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| first | [**Int**](/graphql/overview/schema/scalars#int)       | <p>Provides up to first <code>n</code> results. Value cannot be less than 0 and higher than 200.<br>The default value is 50.</p> |


# Mutations

Mutations allow modifing data on the server.

### attributeAddMetadata

Adds `Attribute` metadata.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeaddmetadatainput"><strong>AttributeAddMetadataInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeAddMetadataPayload**](/graphql/overview/schema/objects#attributeaddmetadatapayload)

### attributeCreateDate

Creates `DateAttribute`

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatedateinput"><strong>AttributeCreateDateInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateDatePayload**](/graphql/overview/schema/objects#attributecreatedatepayload)

### attributeCreateFile

Creates `FileAttribute`

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatefileinput"><strong>AttributeCreateFileInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateFilePayload**](/graphql/overview/schema/objects#attributecreatefilepayload)

### attributeCreateGallery

Creates `GalleryAttribute`

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreategalleryinput"><strong>AttributeCreateGalleryInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateGalleryPayload**](/graphql/overview/schema/objects#attributecreategallerypayload)

### attributeCreateImage

Creates `ImageAttribute`

Input fields:

<table><thead><tr><th width="264"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreateimageinput"><strong>AttributeCreateImageInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateImagePayload**](/graphql/overview/schema/objects#attributecreateimagepayload)

### attributeCreateMultiSelect

Creates `MultiSelectAttribute`

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatemultiselectinput"><strong>AttributeCreateMultiSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateMultiSelectPayload**](/graphql/overview/schema/objects#attributecreatemultiselectpayload)

### attributeCreateNumeric

Creates `NumericAttribute`

Input fields:

<table><thead><tr><th width="264"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatenumericinput"><strong>AttributeCreateNumericInput</strong></a>!</td></tr></tbody></table>

Returns: [**AttributeCreateNumericPayload**](/graphql/overview/schema/objects#attributecreatenumericpayload)

### attributeCreatePrice

Creates `PriceAttribute`

Input fields:

<table><thead><tr><th width="265"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatepriceinput"><strong>AttributeCreatePriceInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreatePricePayload**](/graphql/overview/schema/objects#attributecreatepricepayload)

### attributeCreateProductRelation

Creates `ProductRelationAttribute`

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreateproductrelationinput"><strong>AttributeCreateProductRelationInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateProductRelationPayload**](/graphql/overview/schema/objects#attributecreateproductrelationpayload)

### attributeCreateSelect

Creates `SelectAttribute`

Input fields:

<table><thead><tr><th width="264"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreateselectinput"><strong>AttributeCreateSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateSelectPayload**](/graphql/overview/schema/objects#attributecreateselectpayload)

### attributeCreateTextarea

Creates `TextareaAttribute`

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatetextareainput"><strong>AttributeCreateTextareaInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateTextareaPayload**](/graphql/overview/schema/objects#attributecreatetextareapayload)

### attributeCreateText

Creates `TextAttribute`

Input fields:

<table><thead><tr><th width="265"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreatetextinput"><strong>AttributeCreateTextInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateTextPayload**](/graphql/overview/schema/objects#attributecreatetextpayload)

### attributeCreateUnit

Creates `UnitAttribute`

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributecreateunitinput"><strong>AttributeCreateUnitInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeCreateUnitPayload**](/graphql/overview/schema/objects#attributecreateunitpayload)

### attributeDateSetFormat

Sets a `DateAttribute` format.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributedatesetformatinput">AttributeDateSetFormatInput!</a></td></tr></tbody></table>

Returns: [**AttributeDateSetFormatPayload**](/graphql/overview/schema/objects#attributedatesetformatpayload)

### attributeDelete

Deletes `Attribute`.

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributedeleteinput"><strong>AttributeDeleteInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeDeletePayload**](/graphql/overview/schema/objects#attributedeletepayload)

### attributeDeleteMetadata

Deletes `Attribute` metadata.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributedeletemetadatainput"><strong>AttributeDeleteMetadataInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeDeleteMetadataPayload**](/graphql/overview/schema/objects#attributedeletemetadatapayload)

### attributeMultiSelectAddOption

Adds a `MultiSelectAttribute` option.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributemultiselectaddoptioninput"><strong>AttributeMultiSelectAddOptionInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeMultiSelectAddOptionPayload**](/graphql/overview/schema/objects#attributemultiselectaddoptionpayload)

### attributeMultiSelectDeleteOption

Deletes a `MultiSelectAttribute` option.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributemultiselectdeleteoptioninput"><strong>AttributeMultiSelectDeleteOptionInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeMultiSelectDeleteOptionPayload**](/graphql/overview/schema/input-objects#attributemultiselectdeleteoptioninput)

### attributeMultiSelectSetOptionName

Sets a `MultiSelectAttribute` option name.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributemultiselectsetoptionnameinput"><strong>AttributeMultiSelectSetOptionNameInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeMultiSelectSetOptionNamePayload**](/graphql/overview/schema/objects#attributemultiselectsetoptionnamepayload)

### attributeMultiSelectSetOptions

Sets a `MultiSelectAttribute` options.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributemultiselectsetoptionsinput"><strong>AttributeMultiSelectSetOptionsInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeMultiSelectSetOptionsPayload**](/graphql/overview/schema/objects#attributemultiselectsetoptionspayload)

### attributeOptionAddCustomFieldImage

Adds a custom field to `OptionAttribute`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddcustomfieldimageinput"><strong>AttributeOptionAddCustomFieldImageInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddCustomFieldImagePayload**](/graphql/overview/schema/objects#attributeoptionaddcustomfieldimagepayload)

### attributeOptionAddCustomFieldTextarea

Adds a custom field to `OptionAttribute`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddcustomfieldtextareainput"><strong>AttributeOptionAddCustomFieldTextareaInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddCustomFieldTextareaPayload**](/graphql/overview/schema/objects#attributeoptionaddcustomfieldtextareapayload)

### attributeOptionAddCustomFieldTextareaRTE

Adds a custom field to `OptionAttribute`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddcustomfieldtextarearteinput"><strong>AttributeOptionAddCustomFieldTextareaRTEInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddCustomFieldTextareaRTEPayload**](/graphql/overview/schema/objects#attributeoptionaddcustomfieldtextareartepayload)

### attributeOptionAddCustomFieldText

Adds a custom field to `OptionAttribute`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddcustomfieldtextinput"><strong>AttributeOptionAddCustomFieldTextInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddCustomFieldTextPayload**](/graphql/overview/schema/objects#attributeoptionaddcustomfieldtextpayload)

### attributeOptionAddOptionCustomFieldValueTranslationsImage

Adds custom field value translations to an `Option`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddoptioncustomfieldvaluetranslationsimageinput"><strong>AttributeOptionAddOptionCustomFieldValueTranslationsImageInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddOptionCustomFieldValueTranslationsImagePayload**](/graphql/overview/schema/objects#attributeoptionaddoptioncustomfieldvaluetranslationsimagepayload)

### attributeOptionAddOptionCustomFieldValueTranslationsTextarea

Adds custom field value translations to an `Option`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddoptioncustomfieldvaluetranslationstextareainput"><strong>AttributeOptionAddOptionCustomFieldValueTranslationsTextareaInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddOptionCustomFieldValueTranslationsTextareaPayload**](/graphql/overview/schema/objects#attributeoptionaddoptioncustomfieldvaluetranslationstextareapayload)

### attributeOptionAddOptionCustomFieldValueTranslationsTextareaRTE

Adds custom field value translations to an `Option`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddoptioncustomfieldvaluetranslationstextarearteinput"><strong>AttributeOptionAddOptionCustomFieldValueTranslationsTextareaRTEInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddOptionCustomFieldValueTranslationsTextareaRTEPayload**](/graphql/overview/schema/objects#attributeoptionaddoptioncustomfieldvaluetranslationstextareartepayload)

### attributeOptionAddOptionCustomFieldValueTranslationsText

Adds custom field value translations to an `Option`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptionaddoptioncustomfieldvaluetranslationstextinput"><strong>AttributeOptionAddOptionCustomFieldValueTranslationsTextInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionAddOptionCustomFieldValueTranslationsTextPayload**](/graphql/overview/schema/objects#attributeoptionaddoptioncustomfieldvaluetranslationstextpayload)

### attributeOptionDeleteCustomField

Deletes custom field from an `OptionAttribute`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptiondeletecustomfieldinput"><strong>AttributeOptionDeleteCustomFieldInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionDeleteCustomFieldPayload**](/graphql/overview/schema/objects#attributeoptiondeletecustomfieldpayload)

### attributeOptionDeleteOptionCustomFieldValueTranslations

Deletes custom field value translations from a `Option`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeoptiondeleteoptioncustomfieldvaluetranslationsinput"><strong>AttributeOptionDeleteOptionCustomFieldValueTranslationsInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeOptionDeleteOptionCustomFieldValueTranslationsPayload**](/graphql/overview/schema/objects#attributeoptiondeleteoptioncustomfieldvaluetranslationspayload)

### attributePriceSetCurrency

Sets a `PriceAttribute` currency.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributepricesetcurrencyinput"><strong>AttributePriceSetCurrencyInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributePriceSetCurrencyPayload**](/graphql/overview/schema/objects#attributepricesetcurrencypayload)

### attributeSelectAddOption

Adds a `SelectAttribute` option.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeselectaddoptioninput"><strong>AttributeSelectAddOptionInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeSelectAddOptionPayload**](/graphql/overview/schema/objects#attributeselectaddoptionpayload)

### attributeSelectDeleteOption

Deletes a `SelectAttribute` option.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeselectdeleteoptioninput"><strong>AttributeSelectDeleteOptionInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeSelectDeleteOptionPayload**](/graphql/overview/schema/objects#attributeselectdeleteoptionpayload)

### attributeSelectSetOptionName

Sets a `SelectAttribute` option name.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeselectsetoptionnameinput"><strong>AttributeSelectSetOptionNameInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeSelectSetOptionNamePayload**](/graphql/overview/schema/objects#attributeselectsetoptionnamepayload)

### attributeSelectSetOptions

Sets a `SelectAttribute` options.

Input fields:

<table><thead><tr><th width="304"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeselectsetoptionsinput"><strong>AttributeSelectSetOptionsInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeSelectSetOptionsPayload**](/graphql/overview/schema/objects#attributeselectsetoptionspayload)

### attributeSetName

Sets `Attribute` name.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributesetnameinput"><strong>AttributeSetNameInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeSetNamePayload**](/graphql/overview/schema/objects#attributesetnamepayload)

### attributeTextareaSetRichEdit

Sets a `TextareaAttribute` richEdit.

Input fields:

<table><thead><tr><th width="264"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributetextareasetricheditinput"><strong>AttributeTextareaSetRichEditInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeTextareaSetRichEditPayload**](/graphql/overview/schema/objects#attributetextareasetricheditpayload)

### attributeUnitSetUnit

Sets an `UnitAttribute` unit.

Input fields:

<table><thead><tr><th width="303"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#attributeunitsetunitinput"><strong>AttributeUnitSetUnitInput!</strong></a></td></tr></tbody></table>

Returns: [**AttributeUnitSetUnitPayload**](/graphql/overview/schema/objects#attributeunitsetunitpayload)

### categoryAddAttributeValueTranslationsDate

Adds a `DateAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsdateinput"><strong>CategoryAddAttributeValueTranslationsDateInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsDatePayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsdatepayload)

### categoryAddAttributeValueTranslationsFile

Adds a File`Attribute` value translations to a category.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsfileinput"><strong>CategoryAddAttributeValueTranslationsFileInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsFilePayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsfilepayload)

### categoryAddAttributeValueTranslationsGallery

Adds a `GalleryAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsgalleryinput"><strong>CategoryAddAttributeValueTranslationsGalleryInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsGalleryPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsgallerypayload)

### categoryAddAttributeValueTranslationsImage

Adds a `ImageAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsimageinput"><strong>CategoryAddAttributeValueTranslationsImageInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsImagePayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsimagepayload)

### categoryAddAttributeValueTranslationsMultiSelect

Adds a `MultiSelectAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsmultiselectinput"><strong>CategoryAddAttributeValueTranslationsMultiSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsMultiSelectPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsmultiselectpayload)

### categoryAddAttributeValueTranslationsNumeric

Adds a `NumericAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsnumericinput"><strong>CategoryAddAttributeValueTranslationsNumericInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsNumericPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsnumericpayload)

### categoryAddAttributeValueTranslationsPrice

Adds a `PriceAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="265"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationspriceinput"><strong>CategoryAddAttributeValueTranslationsPriceInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsPricePayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationspricepayload)

### categoryAddAttributeValueTranslationsProductRelation

Adds a `ProductRelationAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="228"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsproductrelationinput"><strong>CategoryAddAttributeValueTranslationsProductRelationInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsProductRelationPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsproductrelationpayload)

### categoryAddAttributeValueTranslationsSelect

Adds a `SelectAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsselectinput"><strong>CategoryAddAttributeValueTranslationsSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsSelectPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsselectpayload)

### categoryAddAttributeValueTranslationsTextarea

Adds a `TextareaAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationstextareainput"><strong>CategoryAddAttributeValueTranslationsTextareaInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsTextareaPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationstextareapayload)

### categoryAddAttributeValueTranslationsText

Adds a `TextAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationstextinput"><strong>CategoryAddAttributeValueTranslationsTextInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsTextPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationstextpayload)

### categoryAddAttributeValueTranslationsUnit

Adds a `UnitAttribute` value translations to a category.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryaddattributevaluetranslationsunitinput"><strong>CategoryAddAttributeValueTranslationsUnitInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAddAttributeValueTranslationsUnitPayload**](/graphql/overview/schema/objects#categoryaddattributevaluetranslationsunitpayload)

### categoryAttributeAddAttribute

Adds an `Attribute` as allowed to be used in `Category`.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryattributeaddattributeinput"><strong>CategoryAttributeAddAttributeInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAttributeAddAttributePayload**](/graphql/overview/schema/objects#categoryattributeaddattributepayload)

### categoryAttributeRemoveAttribute

Removes an `Attribute` as allowed to be used in `Category`.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categoryattributeremoveattributeinput"><strong>CategoryAttributeRemoveAttributeInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryAttributeRemoveAttributePayload**](/graphql/overview/schema/objects#categoryattributeremoveattributepayload)

###

### categoryCreate

Creates a `Category`.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categorycreateinput"><strong>CategoryCreateInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryCreatePayload**](/graphql/overview/schema/objects#categorycreatepayload)

### categoryDeleteAttributeValueTranslations

Deletes an attribute value translations from a `Category`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categorydeleteattributevaluetranslationsinput"><strong>CategoryDeleteAttributeValueTranslationsInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryDeleteAttributeValueTranslationsPayload**](/graphql/overview/schema/objects#categorydeleteattributevaluetranslationspayload)

### categoryDelete

Deletes a `Category`.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categorydeleteinput"><strong>CategoryDeleteInput!</strong></a></td></tr></tbody></table>

Returns: [**CategoryDeletePayload**](/graphql/overview/schema/objects#categorydeletepayload)

### categorySetName

Sets a `Category` name.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#categorysetnameinput"><strong>CategorySetNameInput!</strong></a></td></tr></tbody></table>

Returns: [**CategorySetNamePayload**](/graphql/overview/schema/objects#categorysetnamepayload)

### multimediaAddAttributeValueTranslationsDate

Adds a `DateAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsdateinput"><strong>MultimediaAddAttributeValueTranslationsDateInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsDatePayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsdatepayload)

### multimediaAddAttributeValueTranslationsFile

Adds a File`Attribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsfileinput"><strong>MultimediaAddAttributeValueTranslationsFileInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsFilePayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsfilepayload)

### multimediaAddAttributeValueTranslationsGallery

Adds a `GalleryAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsgalleryinput"><strong>MultimediaAddAttributeValueTranslationsGalleryInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsGalleryPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsgallerypayload)

### multimediaAddAttributeValueTranslationsImage

Adds a `ImageAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsimageinput"><strong>MultimediaAddAttributeValueTranslationsImageInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsImagePayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsimagepayload)

### multimediaAddAttributeValueTranslationsMultiSelect

Adds a `MultiSelectAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsmultiselectinput"><strong>MultimediaAddAttributeValueTranslationsMultiSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsMultiSelectPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsmultiselectpayload)

### multimediaAddAttributeValueTranslationsNumeric

Adds a `NumericAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsnumericinput"><strong>MultimediaAddAttributeValueTranslationsNumericInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsNumericPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsnumericpayload)

### multimediaAddAttributeValueTranslationsPrice

Adds a `PriceAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="265"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationspriceinput"><strong>MultimediaAddAttributeValueTranslationsPriceInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsPricePayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationspricepayload)

### multimediaAddAttributeValueTranslationsProductRelation

Adds a `ProductRelationAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="225.193359375"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsproductrelationinput"><strong>MultimediaAddAttributeValueTranslationsProductRelationInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsProductRelationPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsproductrelationpayload)

### multimediaAddAttributeValueTranslationsSelect

Adds a `SelectAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsselectinput"><strong>MultimediaAddAttributeValueTranslationsSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsSelectPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsselectpayload)

### multimediaAddAttributeValueTranslationsTextarea

Adds a `TextareaAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationstextareainput"><strong>MultimediaAddAttributeValueTranslationsTextareaInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsTextareaPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationstextareapayload)

### multimediaAddAttributeValueTranslationsText

Adds a `TextAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationstextinput"><strong>MultimediaAddAttributeValueTranslationsTextInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsTextPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationstextpayload)

### multimediaAddAttributeValueTranslationsUnit

Adds a `UnitAttribute` value translations to multimedia.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaaddattributevaluetranslationsunitinput"><strong>MultimediaAddAttributeValueTranslationsUnitInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAddAttributeValueTranslationsUnitPayload**](/graphql/overview/schema/objects#multimediaaddattributevaluetranslationsunitpayload)

### multimediaAttributeAddAttribute

Adds an `Attribute` as allowed to be used in `Multimedia`.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaattributeaddattributeinput"><strong>MultimediaAttributeAddAttributeInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAttributeAddAttributePayload**](/graphql/overview/schema/objects#multimediaattributeaddattributepayload)

### multimediaAttributeRemoveAttribute

Removes an `Attribute` as allowed to be used in `Multimedia`.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediaattributeremoveattributeinput"><strong>MultimediaAttributeRemoveAttributeInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaAttributeRemoveAttributePayload**](/graphql/overview/schema/objects#multimediaattributeremoveattributepayload)

### multimediaCreate

Creates a `Multimedia`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediacreateinput"><strong>MultimediaCreateInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaCreatePayload**](/graphql/overview/schema/objects#multimediacreatepayload)

### multimediaDelete

Deletes a `Multimedia`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediadeleteinput"><strong>MultimediaDeleteInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaDeletePayload**](/graphql/overview/schema/objects#multimediadeletepayload)

### multimediaFolderCreate

Creates a `MultimediaFolder`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediafoldercreateinput"><strong>MultimediaFolderCreateInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaFolderCreatePayload**](/graphql/overview/schema/objects#multimediafoldercreatepayload)

### multimediaFolderDelete

Deletes a `MultimediaFolder`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediafolderdeleteinput"><strong>MultimediaFolderDeleteInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaFolderDeletePayload**](/graphql/overview/schema/objects#multimediafolderdeletepayload)

### multimediaMove

Moves a `Multimedia` to `MultimediaFolder`. `Multimedia.path` identifier is changed as a result.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediamoveinput"><strong>MultimediaMoveInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaMovePayload**](/graphql/overview/schema/objects#multimediamovepayload)

### multimediaReplace

Replaces a `Multimedia` with given `MultimediaPath`. As a result new `Multimedia` is created, all relations to it are replaced with a new resource, and the existing one is deleted.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediareplaceinput"><strong>MultimediaReplaceInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaReplacePayload**](/graphql/overview/schema/objects#multimediareplacepayload)

### multimediaSetAlt

Sets a `Multimedia` alt.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediasetaltinput"><strong>MultimediaSetAltInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaSetAltPayload**](/graphql/overview/schema/objects#multimediasetaltpayload)

### multimediaSetName

Sets a `Multimedia` name.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediasetnameinput"><strong>MultimediaSetNameInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaSetNamePayload**](/graphql/overview/schema/objects#multimediasetnamepayload)

### multimediaSetTitle

Sets a `Multimedia` title.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#multimediasettitleinput"><strong>MultimediaSetTitleInput!</strong></a></td></tr></tbody></table>

Returns: [**MultimediaSetTitlePayload**](/graphql/overview/schema/objects#multimediasettitlepayload)

### productAddAttributeValueTranslationsDate

Adds a `DateAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsdateinput"><strong>ProductAddAttributeValueTranslationsDateInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsDatePayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsdatepayload)

### productAddAttributeValueTranslationsFile

Adds a `FileAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsfileinput"><strong>ProductAddAttributeValueTranslationsFileInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsFilePayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsfilepayload)

### productAddAttributeValueTranslationsGallery

Adds a `GalleryAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsgalleryinput"><strong>ProductAddAttributeValueTranslationsGalleryInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsGalleryPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsgallerypayload)

### productAddAttributeValueTranslationsImage

Adds a `ImageAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsimageinput"><strong>ProductAddAttributeValueTranslationsImageInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsImagePayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsimagepayload)

### productAddAttributeValueTranslationsMultiSelect

Adds a `MultiSelectAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsmultiselectinput"><strong>ProductAddAttributeValueTranslationsMultiSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsMultiSelectPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsmultiselectpayload)

### productAddAttributeValueTranslationsNumeric

Adds a `NumericAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="258"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsnumericinput"><strong>ProductAddAttributeValueTranslationsNumericInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsNumericPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsnumericpayload)

### productAddAttributeValueTranslationsPrice

Adds a `PriceAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationspriceinput"><strong>ProductAddAttributeValueTranslationsPriceInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsPricePayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationspricepayload)

### productAddAttributeValueTranslationsProductRelation

Adds a `ProductRelationAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="227"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsproductrelationinput"><strong>ProductAddAttributeValueTranslationsProductRelationInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsProductRelationPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsproductrelationpayload)

### productAddAttributeValueTranslationsSelect

Adds a `SelectAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsselectinput"><strong>ProductAddAttributeValueTranslationsSelectInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsSelectPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsselectpayload)

### productAddAttributeValueTranslationsTextarea

Adds a `TextareaAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="257"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationstextareainput"><strong>ProductAddAttributeValueTranslationsTextareaInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsTextareaPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationstextareapayload)

### productAddAttributeValueTranslationsText

Adds a `TextAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationstextinput"><strong>ProductAddAttributeValueTranslationsTextInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsTextPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationstextpayload)

### productAddAttributeValueTranslationsUnit

Adds a `UnitAttribute` value translations to a product.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddattributevaluetranslationsunitinput"><strong>ProductAddAttributeValueTranslationsUnitInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddAttributeValueTranslationsUnitPayload**](/graphql/overview/schema/objects#productaddattributevaluetranslationsunitpayload)

### productAddCategories

Adds a product to categories.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productaddcategoriesinput"><strong>ProductAddCategoriesInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductAddCategoriesPayload**](/graphql/overview/schema/objects#productaddcategoriespayload)

### productCreateGrouping

Creates a `GroupingProduct`.

Input fields:

<table><thead><tr><th width="260"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productcreategroupinginput"><strong>ProductCreateGroupingInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductCreateGroupingPayload**](/graphql/overview/schema/objects#productcreategroupingpayload)

### productCreateSimple

Creates a `SimpleProduct`.

Input fields:

<table><thead><tr><th width="255"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productcreatesimpleinput"><strong>ProductCreateSimpleInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductCreateSimplePayload**](/graphql/overview/schema/objects#productcreatesimplepayload)

### productCreateVariable

Creates a `VariableProduct`.

Input fields:

<table><thead><tr><th width="266"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productcreatevariableinput"><strong>ProductCreateVariableInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductCreateVariablePayload**](/graphql/overview/schema/objects#productcreatevariablepayload)

### productDeleteAttributeValueTranslations

Deletes an attribute value translations from a `Product`.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productdeleteattributevaluetranslationsinput"><strong>ProductDeleteAttributeValueTranslationsInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductDeleteAttributeValueTranslationsPayload**](/graphql/overview/schema/objects#productdeleteattributevaluetranslationspayload)

### productDelete

Deletes a product.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productdeleteinput"><strong>ProductDeleteInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductDeletePayload**](/graphql/overview/schema/objects#productdeletepayload)

### productGroupingAddChild

Adds a child product to a `GroupingProduct`.

Input fields:

<table><thead><tr><th width="267"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productgroupingaddchildinput"><strong>ProductGroupingAddChildInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductGroupingAddChildPayload**](/graphql/overview/schema/objects#productgroupingaddchildpayload)

### productGroupingRemoveChild

Removes a child product from a `GroupingProduct`.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productgroupingremovechildinput"><strong>ProductGroupingRemoveChildInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductGroupingRemoveChildPayload**](/graphql/overview/schema/objects#productgroupingremovechildpayload)

### productGroupingSetChildQuantity

Set a child product quantity of a `GroupingProduct`.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productgroupingsetchildquantityinput"><strong>ProductGroupingSetChildQuantityInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductGroupingSetChildQuantityPayload**](/graphql/overview/schema/objects#productgroupingsetchildquantitypayload)

### productRemoveCategories

Removes a product from categories.

Input fields:

<table><thead><tr><th width="262"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productremovecategoriesinput"><strong>ProductRemoveCategoriesInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductRemoveCategoriesPayload**](/graphql/overview/schema/objects#productremovecategoriespayload)

### productSetStatus

Sets a product status.

Input fields:

<table><thead><tr><th width="258"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productsetstatusinput"><strong>ProductSetStatusInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductSetStatusPayload**](/graphql/overview/schema/objects#productsetstatuspayload)

### productSetTemplate

Sets a product `Template`.

Input fields:

<table><thead><tr><th width="258"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productsettemplateinput"><strong>ProductSetTemplateInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductSetTemplatePayload**](/graphql/overview/schema/objects#productsettemplatepayload)

### productVariableAddVariant

Adds a variant product to a `VariableProduct`.

Input fields:

<table><thead><tr><th width="257"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productvariableaddvariantinput"><strong>ProductVariableAddVariantInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductVariableAddVariantPayload**](/graphql/overview/schema/objects#productvariableaddvariantpayload)

### productVariableRemoveVariant

Removes a variant product from a `VariableProduct`.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productvariableremovevariantinput"><strong>ProductVariableRemoveVariantInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductVariableRemoveVariantPayload**](/graphql/overview/schema/objects#productvariableremovevariantpayload)

### productVariableSetBindings

Sets binding attributes to `VariableProduct`.

Input fields:

<table><thead><tr><th width="259"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#productvariablesetbindingsinput"><strong>ProductVariableSetBindingsInput!</strong></a></td></tr></tbody></table>

Returns: [**ProductVariableSetBindingsPayload**](/graphql/overview/schema/objects#productvariablesetbindingspayload)

### templateCreate

Creates `Template`

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#templatecreateinput"><strong>TemplateCreateInput!</strong></a></td></tr></tbody></table>

Returns: [**TemplateCreatePayload**](/graphql/overview/schema/objects#templatecreatepayload)

### templateDelete

Deletes `Template`.

Input fields:

<table><thead><tr><th width="261"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#templatedeleteinput"><strong>TemplateDeleteInput!</strong></a></td></tr></tbody></table>

Returns: [**TemplateDeletePayload**](/graphql/overview/schema/objects#templatedeletepayload)

### templateSetName

Sets a `Template` name.

Input fields:

<table><thead><tr><th width="263"></th><th></th></tr></thead><tbody><tr><td>input</td><td><a href="/pages/dp7wCJb3LwnlKtLtg8gY#templatesetnameinput"><strong>TemplateSetNameInput!</strong></a></td></tr></tbody></table>

Returns: [**TemplateSetNamePayload**](/graphql/overview/schema/objects#templatesetnamepayload)


# Objects

Objects represent the resources you can access.

### AttributeAddMetadataPayload

A payload for a mutation.

Fields:

| attribute | [**Attribute!**](/graphql/overview/schema/interfaces#attribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------- | -------------------- |

### AttributeConnection

The connection for [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| edges      | [**\[AttributeEdge!\]**](#attributeedge)        | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### AttributeEdge

An edge in a connection.

Fields:

| node   | [**Attribute!**](/graphql/overview/schema/interfaces#attribute) | Node of the Edge. |
| ------ | --------------------------------------------------------------- | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)          | The Edge cursor.  |

### AttributeCreateDatePayload

A payload for a mutation.

Fields:

| attribute | [**DateAttribute!**](#dateattribute) | Created `Attribute`. |
| --------- | ------------------------------------ | -------------------- |

### AttributeCreateFilePayload

A payload for a mutation.

Fields:

| attribute | [**FileAttribute!**](#fileattribute) | Created `Attribute`. |
| --------- | ------------------------------------ | -------------------- |

### AttributeCreateGalleryPayload

A payload for a mutation.

Fields:

| attribute | [**GalleryAttribute!**](#galleryattribute) | Created `Attribute`. |
| --------- | ------------------------------------------ | -------------------- |

### AttributeCreateImagePayload

A payload for a mutation.

Fields:

| attribute | [**ImageAttribute!**](#imageattribute) | Created `Attribute`. |
| --------- | -------------------------------------- | -------------------- |

### AttributeCreateMultiSelectPayload

A payload for a mutation.

Fields:

| attribute | [**MultiSelectAttribute!**](#multiselectattribute) | Created `Attribute`. |
| --------- | -------------------------------------------------- | -------------------- |

### AttributeCreateNumericPayload

A payload for a mutation.

Fields:

| attribute | [**NumericAttribute!**](#numericattribute) | Created `Attribute`. |
| --------- | ------------------------------------------ | -------------------- |

### AttributeCreatePricePayload

A payload for a mutation.

Fields:

| attribute | [**PriceAttribute!**](#priceattribute) | Created `Attribute`. |
| --------- | -------------------------------------- | -------------------- |

### AttributeCreateProductRelationPayload

A payload for a mutation.

Fields:

| attribute | [**ProductRelationAttribute!**](#productrelationattribute) | Created `Attribute`. |
| --------- | ---------------------------------------------------------- | -------------------- |

### AttributeCreateSelectPayload

A payload for a mutation.

Fields:

| attribute | [**SelectAttribute!**](#selectattribute) | Created `Attribute`. |
| --------- | ---------------------------------------- | -------------------- |

### AttributeCreateTextareaPayload

A payload for a mutation.

Fields:

| attribute | [**TextareaAttribute!**](#textareaattribute) | Created `Attribute`. |
| --------- | -------------------------------------------- | -------------------- |

### AttributeCreateTextPayload

A payload for a mutation.

Fields:

| attribute | [**TextAttribute!**](#textattribute) | Created `Attribute`. |
| --------- | ------------------------------------ | -------------------- |

### AttributeCreateUnitPayload

A payload for a mutation.

Fields:

| attribute | [**UnitAttribute!**](#unitattribute) | Created `Attribute`. |
| --------- | ------------------------------------ | -------------------- |

### AttributeDateSetFormatPayload

A payload for a mutation.

Fields:

| attribute | [**DateAttribute!**](#dateattribute) | Changed `Attribute`. |
| --------- | ------------------------------------ | -------------------- |

### AttributeDeleteMetadataPayload

A payload for a mutation.

Fields:

| attribute | [**Attribute!**](/graphql/overview/schema/interfaces#attribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------- | -------------------- |

### AttributeDeletePayload

A payload for a mutation.

Fields:

| code | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Deleted  `AttributeCode`. |
| ---- | -------------------------------------------------------------------- | ------------------------- |

### AttributeDeletedConnection

The connection for [**AttributeCode**](/graphql/overview/schema/scalars#attributecode)

Fields:

<table data-header-hidden><thead><tr><th></th><th width="254.33333333333331"></th><th></th></tr></thead><tbody><tr><td>edges</td><td><a href="#attributedeletededge"><strong>[AttributeDeletedEdge!]</strong></a></td><td>Edges of the connection.</td></tr><tr><td>pageInfo</td><td><a href="#pageinfo"><strong>PageInfo</strong></a></td><td>Page info of the connection.</td></tr><tr><td>totalCount</td><td><a href="/pages/QXTGFWc9HCEhZfcVTV7R#int"><strong>Int</strong></a></td><td>Count of all edges in connection.</td></tr></tbody></table>

### AttributeDeletedEdge

An edge in a connection.

Fields:

| node   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Node of the Edge. |
| ------ | -------------------------------------------------------------------- | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)               | The Edge cursor.  |

### AttributeMultiSelectAddOptionPayload

A payload for a mutation.

Fields:

| attribute | [**MultiSelectAttribute!**](#multiselectattribute) | Changed `Attribute`. |
| --------- | -------------------------------------------------- | -------------------- |

### AttributeMultiSelectDeleteOptionPayload

A payload for a mutation.

Fields:

| attribute | [**MultiSelectAttribute!**](#multiselectattribute) | Changed `Attribute`. |
| --------- | -------------------------------------------------- | -------------------- |

### AttributeMultiSelectSetOptionNamePayload

A payload for a mutation.

Fields:

| attribute | [**MultiSelectAttribute!**](#multiselectattribute) | Changed `Attribute`. |
| --------- | -------------------------------------------------- | -------------------- |

### AttributeMultiSelectSetOptionsPayload

A payload for a mutation.

Fields:

| attribute | [**MultiSelectAttribute!**](#multiselectattribute) | Changed `Attribute`. |
| --------- | -------------------------------------------------- | -------------------- |

### AttributeOptionAddCustomFieldImagePayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddCustomFieldTextareaPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddCustomFieldTextareaRTEPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddCustomFieldTextPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddOptionCustomFieldValueTranslationsImagePayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddOptionCustomFieldValueTranslationsTextareaPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddOptionCustomFieldValueTranslationsTextareaRTEPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionAddOptionCustomFieldValueTranslationsTextPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionDeleteCustomFieldPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributeOptionDeleteOptionCustomFieldValueTranslationsPayload

A payload for a mutation.

Fields:

| attribute | [**OptionAttribute!**](/graphql/overview/schema/interfaces#optionattribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------------------- | -------------------- |

### AttributePriceSetCurrencyPayload

A payload for a mutation.

Fields:

| attribute | [**PriceAttribute!**](#priceattribute) | Changed `Attribute`. |
| --------- | -------------------------------------- | -------------------- |

### AttributeSelectAddOptionPayload

A payload for a mutation.

Fields:

| attribute | [**SelectAttribute!**](#selectattribute) | Changed `Attribute`. |
| --------- | ---------------------------------------- | -------------------- |

### AttributeSelectDeleteOptionPayload

A payload for a mutation.

Fields:

| attribute | [**SelectAttribute!**](#selectattribute) | Changed `Attribute`. |
| --------- | ---------------------------------------- | -------------------- |

### AttributeSelectSetOptionNamePayload

A payload for a mutation.

Fields:

| attribute | [**SelectAttribute!**](#selectattribute) | Changed `Attribute`. |
| --------- | ---------------------------------------- | -------------------- |

### AttributeSelectSetOptionsPayload

A payload for a mutation.

Fields:

| attribute | [**SelectAttribute!**](#selectattribute) | Changed `Attribute`. |
| --------- | ---------------------------------------- | -------------------- |

### AttributeSetNamePayload

A payload for a mutation.

Fields:

| attribute | [**Attribute!**](/graphql/overview/schema/interfaces#attribute) | Changed `Attribute`. |
| --------- | --------------------------------------------------------------- | -------------------- |

### AttributeTextareaSetRichEditPayload

A payload for a mutation.

Fields:

| attribute | [**TextareaAttribute!**](#textareaattribute) | Changed `Attribute`. |
| --------- | -------------------------------------------- | -------------------- |

### AttributeUnitSetUnitPayload

A payload for a mutation.

Fields:

| attribute | [**UnitAttribute!**](#unitattribute) | Changed `Attribute`. |
| --------- | ------------------------------------ | -------------------- |

### AttributeValueConnection

The connection for [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| edges      | [**\[AttributeValueEdge!\]**](#attributevalueedge) | Edges of the connection.          |
| ---------- | -------------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                          | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)    | Count of all edges in connection. |

### AttributeValueEdge

An edge in a connection.

Fields:

| node   | [**AttributeValue!**](/graphql/overview/schema/interfaces#attributevalue) | Node of the Edge. |
| ------ | ------------------------------------------------------------------------- | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)                    | The Edge cursor.  |

### Category

Represents a category.

Fields:

| code                                                                                                                                                                                                                  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)              | Readable id of `Category`.                                                                                             |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language))                                                                                                                                      | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Translatable name allowing to set different values in every active language.                                           |
| attributeList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int), codes: [**\[AttributeCode!\]**](/graphql/overview/schema/scalars#attributecode)) | [**AttributeValueConnection!**](#attributevalueconnection)                      | <p>A list of attribute values.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |

### CategoryAddAttributeValueTranslationsDatePayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsFilePayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsGalleryPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsImagePayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsMultiSelectPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsNumericPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsPricePayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsProductRelationPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsSelectPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsTextareaPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsTextPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAddAttributeValueTranslationsUnitPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryAttributeAddAttributePayload

A payload for a mutation.

Fields:

| categoryAttributeList | [**AttributeConnection!**](#attributeconnection) | Updated list of attributes. |
| --------------------- | ------------------------------------------------ | --------------------------- |

### CategoryAttributeRemoveAttributePayload

A payload for a mutation.

Fields:

| categoryAttributeList | [**AttributeConnection!**](#attributeconnection) | Updated list of attributes. |
| --------------------- | ------------------------------------------------ | --------------------------- |

### CategoryConnection

The connection for [**Category**](#category)

Fields:

| edges      | [**\[CategoryEdge!\]**](#categoryedge)          | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### CategoryEdge

An edge in a connection.

Fields:

| node   | [**Category!**](#category)                             | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### CategoryCreatePayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Created `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryDeleteAttributeValueTranslationsPayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryDeletePayload

A payload for a mutation.

Fields:

| code | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode) | Deleted `CategoryCode`. |
| ---- | ------------------------------------------------------------------ | ----------------------- |

### CategoryDeletedConnection

The connection for [**CategoryCode**](/graphql/overview/schema/scalars#categorycode)

Fields:

| edges      | [**\[CategoryDeletedEdge!\]**](#categorydeletededge) | Edges of the connection.          |
| ---------- | ---------------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                            | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)      | Count of all edges in connection. |

### CategoryDeletedEdge

An edge in a connection.

Fields:

| node   | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode) | Node of the Edge. |
| ------ | ------------------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)             | The Edge cursor.  |

### CategorySetNamePayload

A payload for a mutation.

Fields:

| category | [**Category!**](#category) | Changed `Category`. |
| -------- | -------------------------- | ------------------- |

### CategoryTree

Represent a tree of categories.

Fields:

| code                                                                                                                                        | [**CategoryTreeCode!**](/graphql/overview/schema/scalars#categorytreecode)      | Readable id of `CategoryTree`.                                                                                                                                                |
| ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language))                                                            | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Translatable name allowing to set different values in every active language.                                                                                                  |
| categoryTreeLeafList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int)) | [**CategoryTreeLeafConnection!**](#categorytreeleafconnection)                  | <p>A list of categories belonging to the <code>CategoryTree</code>.<br><code>first</code> argument cannot be lesser than 0, higher than 1000 and its default value is 50.</p> |

### CategoryTreeConnection

The connection for [**CategoryTree**](#categorytree)

Fields:

| edges      | [**\[CategoryTreeEdge!\]**](#categorytreeedge)  | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### CategoryTreeDeletedConnection

The connection for [Scalars](/graphql/overview/schema/scalars#categorytreecode)

Fields:

| edges      | [**\[CategoryTreeDeletedEdge!\]**](#categorytreedeletededge) | Edges of the connection.          |
| ---------- | ------------------------------------------------------------ | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                                    | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)              | Count of all edges in connection. |

### CategoryTreeDeletedEdge

An edge in a connection.

Fields:

| node   | [**CategoryTreeCode!**](/graphql/overview/schema/scalars#categorytreecode) | Node of the Edge. |
| ------ | -------------------------------------------------------------------------- | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)                     | The Edge cursor.  |

### CategoryTreeEdge

An edge in a connection.

Fields:

| node   | [**CategoryTree!**](#categorytree)                     | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### CategoryTreeLeaf

Represents a leaf (node) of a category tree.

Fields:

| category       | [**Category!**](#category) | A leaf of the tree.     |
| -------------- | -------------------------- | ----------------------- |
| parentCategory | [**Category**](#category)  | Parent leaf of to leaf. |

### CategoryTreeLeafConnection

The connection for [#categorytreeleaf](#categorytreeleaf "mention")

Fields:

| edges      | [**\[CategoryTreeLeafEdge!\]**](#categorytreeleafedge) | Edges of the connection.          |
| ---------- | ------------------------------------------------------ | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                              | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)        | Count of all edges in connection. |

### CategoryTreeLeafEdge

An edge in a connection.

Fields:

| node   | [**CategoryTreeLeaf!**](#categorytreeleaf)             | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### DateAttribute

Represents a date.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| format | [**DateFormat!**](/graphql/overview/schema/scalars#dateformat) | Represented date format. |
| ------ | -------------------------------------------------------------- | ------------------------ |

### DateAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**DateAttribute!**](#dateattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[DateAttributeValueTranslation!\]!**](#dateattributevaluetranslation) | A value translations.                |

### DateAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**String**](/graphql/overview/schema/scalars#string) | A translation value of an `Attribute`. |
| ----- | ----------------------------------------------------- | -------------------------------------- |

### FileAttribute

Represents a collection of multimedia files of any type.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

### FileAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**FileAttribute!**](#fileattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[FileAttributeValueTranslation!\]!**](#fileattributevaluetranslation) | A value translations.                |

### FileAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**\[Multimedia!\]!**](#multimedia) | A translation value of an `Attribute`. |
| ----- | ----------------------------------- | -------------------------------------- |

### GalleryAttribute

Represents a collection of images.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

### GalleryAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**GalleryAttribute!**](#galleryattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[GalleryAttributeValueTranslation!\]!**](#galleryattributevaluetranslation) | A value translations.                |

### GalleryAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**\[Multimedia!\]!**](#multimedia) | A translation value of an `Attribute`. |
| ----- | ----------------------------------- | -------------------------------------- |

### GroupedProduct

Represents a product grouped in [**GroupingProduct**](#groupingproduct) with a specific quantity for the set.

Fields:

| quantity | [**Int!**](/graphql/overview/schema/scalars#int)                                    | Quantity of a grouped `Product`. |
| -------- | ----------------------------------------------------------------------------------- | -------------------------------- |
| product  | [**GroupedProductProduct!**](/graphql/overview/schema/unions#groupedproductproduct) | Grouped `Product`.               |

### GroupedProductConnection

The connection for [**GroupedProduct**](#groupedproduct)

Fields:

| edges      | [**\[GroupedProductEdge!\]**](#groupedproductedge) | Edges of the connection.          |
| ---------- | -------------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                          | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)    | Count of all edges in connection. |

### GroupedProductEdge

An edge in a connection.

Fields:

| node   | [**GroupedProduct!**](#groupedproduct)                 | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### GroupingProduct

A product grouping other products. Can represent products like the ones with common features or promotional packages.

Implements:

* [**Product**](/graphql/overview/schema/interfaces#product)

Fields:

| childrenList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int)) | [**GroupedProductConnection!**](#groupedproductconnection) | <p>A list of children.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |
| ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |

### ImageAttribute

Represents an image.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

### ImageAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**ImageAttribute!**](#imageattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[ImageAttributeValueTranslation!\]!**](#imageattributevaluetranslation) | A value translations.                |

### ImageAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**Multimedia**](#multimedia) | A translation value of an `Attribute`. |
| ----- | ----------------------------- | -------------------------------------- |

### ImageCustomField

Represents an image.

Implements:

* [**CustomField**](/graphql/overview/schema/interfaces#customfield)

### ImageCustomFieldTranslatedValue

Represents an image translated value.

Implements:

* [**CustomFieldTranslatedValue**](/graphql/overview/schema/interfaces#customfieldtranslatedvalue)

Fields:

| customField | [**ImageCustomField!**](#imagecustomfield) | A `CustomField` describing the value. |
| ----------- | ------------------------------------------ | ------------------------------------- |
| value       | [**Multimedia**](#multimedia)              | A value in the context language.      |

### ImageCustomFieldValue

A custom field value.

Implements:

* [**CustomFieldValue**](/graphql/overview/schema/interfaces#customfieldvalue)

Fields:

| customField                                                                              | [**ImageCustomField!**](#imagecustomfield)                                      | A `CustomField` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------- |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[ImageCustomFieldValueTranslation!\]!**](#imagecustomfieldvaluetranslation) | A value translations.                 |

### ImageCustomFieldValueTranslation

Translation of a custom field value.

Implements:

* [**CustomFieldValueTranslation**](/graphql/overview/schema/interfaces#customfieldvaluetranslation)

Fields:

| value | [**Multimedia**](#multimedia) | A translation value of a `CustomField`. |
| ----- | ----------------------------- | --------------------------------------- |

### LanguageConnection

The connection for [**Language**](/graphql/overview/schema/scalars#language)

Fields:

| edges      | [**\[LanguageEdge!\]**](#languageedge)          | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### LanguageEdge

An edge in a connection.

Fields:

| node   | [**Language!**](/graphql/overview/schema/scalars#language) | Node of the Edge. |
| ------ | ---------------------------------------------------------- | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)     | The Edge cursor.  |

### Metadatum

Represents a metadatum of an attribute.

Fields:

| key   | [**MetadatumKey!**](/graphql/overview/schema/scalars#metadatumkey) | A key of metadatum. |
| ----- | ------------------------------------------------------------------ | ------------------- |
| value | [**String!**](/graphql/overview/schema/scalars#string)             | Metadata value.     |

### Multimedia

Represents a multimedia file. The multimedia can be a text file, image, document file, etc.

Fields:

| path                                                                                                                                                                                                                  | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath)          | Readable id of `Multimedia`.                                                                                           |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| name                                                                                                                                                                                                                  | [**MultimediaName!**](/graphql/overview/schema/scalars#multimedianame)          | Given file name.                                                                                                       |
| extension                                                                                                                                                                                                             | [**String!**](/graphql/overview/schema/scalars#string)                          | File extension.                                                                                                        |
| mime                                                                                                                                                                                                                  | [**String**](/graphql/overview/schema/scalars#string)                           | Mime type of the file.                                                                                                 |
| size                                                                                                                                                                                                                  | [**Int!**](/graphql/overview/schema/scalars#int)                                | File size in bytes.                                                                                                    |
| alt (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language))                                                                                                                                       | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Represents the alternate text for an image if it cannot be displayed.                                                  |
| title (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language))                                                                                                                                     | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Represents the title tooltip value.                                                                                    |
| url                                                                                                                                                                                                                   | [**String!**](/graphql/overview/schema/scalars#string)                          | URL to download binary multimedia file.                                                                                |
| folder                                                                                                                                                                                                                | [**MultimediaFolder**](#multimediafolder)                                       | Folder where multimedia is stored.                                                                                     |
| attributeList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int), codes: [**\[AttributeCode!\]**](/graphql/overview/schema/scalars#attributecode)) | [**AttributeValueConnection!**](#attributevalueconnection)                      | <p>A list of attribute values.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |
| profiles (codes: [**\[MultimediaProfileCode!\]**](/graphql/overview/schema/scalars#multimediaprofilecode))                                                                                                            | [**\[MultimediaProfileFile!\]**](#multimediaprofilefile)                        | A list of all profiles with their generated files.                                                                     |

### MultimediaAddAttributeValueTranslationsDatePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsFilePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsGalleryPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsImagePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsMultiSelectPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsNumericPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsPricePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsProductRelationPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsSelectPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsTextareaPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsTextPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAddAttributeValueTranslationsUnitPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaAttributeAddAttributePayload

A payload for a mutation.

Fields:

| multimediaAttributeList | [**AttributeConnection!**](#attributeconnection) | Updated list of attributes. |
| ----------------------- | ------------------------------------------------ | --------------------------- |

### MultimediaAttributeRemoveAttributePayload

A payload for a mutation.

Fields:

| multimediaAttributeList | [**AttributeConnection!**](#attributeconnection) | Updated list of attributes. |
| ----------------------- | ------------------------------------------------ | --------------------------- |

### MultimediaConnection

The connection for [**Multimedia**](#multimedia)

Fields:

| edges      | [**\[MultimediaEdge!\]**](#multimediaedge)      | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### MultimediaCreatePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Created `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaDeleteAttributeValueTranslationsPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaDeletePayload

A payload for a mutation.

Fields:

| path | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | Deleted `MultimediaPath`. |
| ---- | ---------------------------------------------------------------------- | ------------------------- |

### MultimediaEdge

An edge in a connection.

Fields:

| node   | [**Multimedia!**](#multimedia)                         | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### MultimediaFolder

Represents a filesystem-like folder allowing to organize multimedia. Does not correspond to the physical file path or its URL.

Fields:

| path | [**MultimediaFolderPath!**](/graphql/overview/schema/scalars#multimediafolderpath) | Readable id of `MultimediaFolder`. |
| ---- | ---------------------------------------------------------------------------------- | ---------------------------------- |
| name | [**MultimediaFolderName!**](/graphql/overview/schema/scalars#multimediafoldername) | Name of `MultimediaFolder`.        |

### MultimediaFolderConnection

The connection for [**MultimediaFolder**](#multimediafolder)

Fields:

| edges      | [**\[MultimediaFolderEdge!\]**](#multimediafolderedge) | Edges of the connection.          |
| ---------- | ------------------------------------------------------ | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                              | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)        | Count of all edges in connection. |

### MultimediaFolderCreatePayload

A payload for a mutation.

Fields:

| multimediaFolder | [**MultimediaFolder!**](#multimediafolder) | Changed `MultimediaFolder`. |
| ---------------- | ------------------------------------------ | --------------------------- |

### MultimediaFolderDeletePayload

A payload for a mutation.

Fields:

| path | [**MultimediaFolderPath!**](/graphql/overview/schema/scalars#multimediafolderpath) | Deleted `MultimediaFolderPath`. |
| ---- | ---------------------------------------------------------------------------------- | ------------------------------- |

### MultimediaFolderEdge

An edge in a connection.

Fields:

| node   | [**MultimediaFolder!**](#multimediafolder)             | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### MultimediaMovePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaProfileFile

Multimedia profile file representation.

Fields:

| profileCode | [**MultimediaProfileCode!**](/graphql/overview/schema/scalars#multimediaprofilecode) | Code of Multimedia profile file is being generated by.         |
| ----------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------- |
| url         | [**String!**](/graphql/overview/schema/scalars#string)                               | URL to download binary multimedia file generated from profile. |

### MultimediaReplacePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Replacing `Multimedia`. |
| ---------- | ------------------------------ | ----------------------- |

### MultimediaSetAltPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaSetFolderPayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaSetNamePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultimediaSetTitlePayload

A payload for a mutation.

Fields:

| multimedia | [**Multimedia!**](#multimedia) | Changed `Multimedia`. |
| ---------- | ------------------------------ | --------------------- |

### MultiSelectAttribute

Represents a set of options allowing multiple choices.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)
* [**OptionAttribute**](/graphql/overview/schema/interfaces#optionattribute)

### MultiSelectAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**MultiSelectAttribute!**](#multiselectattribute)                                      | An `Attribute` describing the value/ |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[MultiSelectAttributeValueTranslation!\]!**](#multiselectattributevaluetranslation) | A value translations.                |

### MultiSelectAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| translatedValue | [**\[OptionTranslatedValue!\]!**](#optiontranslatedvalue) | Represents simplified translated value containing scalar names in context language only. |
| --------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| value           | [**\[Option!\]!**](#option)                               | A translation value of an `Attribute`.                                                   |

### NumericAttribute

Represents a number.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| unique | [**Boolean!**](/graphql/overview/schema/scalars#boolean) | Enforces unique values among all same-type resources, i.e., products. |
| ------ | -------------------------------------------------------- | --------------------------------------------------------------------- |

### NumberAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**NumericAttribute!**](#numericattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[NumericAttributeValueTranslation!\]!**](#numericattributevaluetranslation) | A value translations.                |

### NumericAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**Float**](/graphql/overview/schema/scalars#float) | A translation value of an `Attribute`. |
| ----- | --------------------------------------------------- | -------------------------------------- |

### Option

Represents an option of a select and multi-select attribute.

Fields:

| code                                                                             | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)                     | Readable id of `Option`.                                                     |
| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring)    | Translatable name allowing to set different values in every active language. |
| customFields                                                                     | [**\[CustomFieldValue!\]!**](/graphql/overview/schema/interfaces#customfieldvalue) | `CustomField` values.                                                        |

### OptionConnection

The connection for [**Option**](#option)

Fields:

| edges      | [**\[OptionEdge!\]**](#optionedge)              | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### OptionEdge

An edge in a connection.

Fields:

| node   | [**Option!**](#option)                                 | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

Represents an option of a select and multi-select attribute.

Fields:

| code                                                                             | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)                  | Readable id of `Option`.                                                     |
| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Translatable name allowing to set different values in every active language. |

### OptionTranslatedValue

Simple representation of an Option of select and multi-select attributes with the name in a specific language only.

Fields:

| code | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode) | Code of `Option`.                      |
| ---- | -------------------------------------------------------------- | -------------------------------------- |
| name | [**String**](/graphql/overview/schema/scalars#string)          | `Option` name in the context language. |

### PageInfo

Information about pagination in a connection.

Fields:

| startCursor     | [**String**](/graphql/overview/schema/scalars#string)    | When paginating backwards, the cursor to continue. |
| --------------- | -------------------------------------------------------- | -------------------------------------------------- |
| endCursor       | [**String**](/graphql/overview/schema/scalars#string)    | When paginating forwards, the cursor to continue.  |
| hasPreviousPage | [**Boolean!**](/graphql/overview/schema/scalars#boolean) | When paginating backwards, are there more items?   |
| hasNextPage     | [**Boolean!**](/graphql/overview/schema/scalars#boolean) | When paginating forwards, are there more items?    |

### PriceAttribute

Represents a positive price of a specific currency.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| currency | [**Currency!**](/graphql/overview/schema/scalars#currency) | The currency price is in. |
| -------- | ---------------------------------------------------------- | ------------------------- |

### PriceAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**PriceAttribute!**](#priceattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[PriceAttributeValueTranslation!\]!**](#priceattributevaluetranslation) | A value translations.                |

### PriceAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**Float**](/graphql/overview/schema/scalars#float) | A translation value of an `Attribute`. |
| ----- | --------------------------------------------------- | -------------------------------------- |

### ProductAddAttributeValueTranslationsDatePayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsFilePayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsGalleryPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsImagePayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsMultiSelectPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsNumericPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsPricePayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsProductRelationPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsSelectPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsTextareaPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsTextPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddAttributeValueTranslationsUnitPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductAddCategoriesPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductConnection

The connection for [**Product**](/graphql/overview/schema/interfaces#product)

Fields:

| edges      | [**\[ProductEdge!\]**](#productedge)            | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### ProductCreateGroupingPayload

A payload for a mutation.

Fields:

| product | [**GroupingProduct!**](#groupingproduct) | Created `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductCreateSimplePayload

A payload for a mutation.

Fields:

| product | [**SimpleProduct!**](#simpleproduct) | Created `Product`. |
| ------- | ------------------------------------ | ------------------ |

### ProductCreateVariablePayload

A payload for a mutation.

Fields:

| product | [**VariableProduct!**](#variableproduct) | Created `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductDeletedConnection

The connection for [**Sku**](/graphql/overview/schema/scalars#sku)

Fields:

| edges      | [**\[ProductDeletedEdge!\]**](#productdeletededge) | Edges of the connection.          |
| ---------- | -------------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                          | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int)    | Count of all edges in connection. |

### ProductDeleteAttributeValueTranslationsPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductDeletedEdge

An edge in a connection.

Fields:

| node   | [**Sku!**](/graphql/overview/schema/scalars#sku)       | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### ProductDeletePayload

A payload for a mutation.

Fields:

| sku | [**Sku!**](/graphql/overview/schema/scalars#sku) | Deleted `Sku`. |
| --- | ------------------------------------------------ | -------------- |

### ProductEdge

An edge in a connection.

Fields:

| node   | [**Product!**](/graphql/overview/schema/interfaces#product) | Node of the Edge. |
| ------ | ----------------------------------------------------------- | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string)      | The Edge cursor.  |

### ProductGroupingAddChildPayload

A payload for a mutation.

Fields:

| product | [**GroupingProduct!**](#groupingproduct) | Changed `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductGroupingRemoveChildPayload

A payload for a mutation.

Fields:

| product | [**GroupingProduct!**](#groupingproduct) | Changed `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductGroupingSetChildQuantityPayload

A payload for a mutation.

Fields:

| product | [**GroupingProduct!**](#groupingproduct) | Changed `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductRelationAttribute

Represents a relation to the collection of products.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

### ProductRelationAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**ProductRelationAttribute!**](#productrelationattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[ProductRelationAttributeValueTranslation!\]!**](#productrelationattributevaluetranslation) | A value translations.                |

### ProductRelationAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**\[Product!\]!**](/graphql/overview/schema/interfaces#product) | A translation value of an `Attribute`. |
| ----- | ---------------------------------------------------------------- | -------------------------------------- |

### ProductRemoveCategoriesPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductSetStatusPayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductSetTemplatePayload

A payload for a mutation.

Fields:

| product | [**Product!**](/graphql/overview/schema/interfaces#product) | Changed `Product`. |
| ------- | ----------------------------------------------------------- | ------------------ |

### ProductStatus

A product status.

Fields:

| code           | [**StatusCode!**](/graphql/overview/schema/scalars#statuscode) | Readable id of `ProductStatus`.                     |
| -------------- | -------------------------------------------------------------- | --------------------------------------------------- |
| translatedName | [**String**](/graphql/overview/schema/scalars#string)          | Represents translated name in the context language. |

### ProductStatusTranslation

A product status translation.

Fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language of status. |
| -------- | ---------------------------------------------------------- | ------------------- |
| value    | [**ProductStatus**](#productstatus)                        | Status value.       |

### ProductVariableAddVariantPayload

A payload for a mutation.

Fields:

| product | [**VariableProduct!**](#variableproduct) | Changed `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductVariableRemoveVariantPayload

A payload for a mutation.

Fields:

| product | [**VariableProduct!**](#variableproduct) | Changed `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### ProductVariableSetBindingsPayload

A payload for a mutation.

Fields:

| product | [**VariableProduct!**](#variableproduct) | Changed `Product`. |
| ------- | ---------------------------------------- | ------------------ |

### Section

Represents a set of common attributes - technical data, SEO-related parameters, etc.

Fields:

| code                                                                                                                                 | [**SectionCode!**](/graphql/overview/schema/scalars#sectioncode)                | Readable id of `Section`.                                                                                                                         |
| ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language))                                                     | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Translatable name allowing to set different values in every active language.                                                                      |
| attributeList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int)) | [**AttributeConnection!**](#attributeconnection)                                | <p>A list of attributes used in the <code>Section</code>.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |

### SectionConnection

The connection for [**Section**](/graphql/overview/schema/objects#section)

Fields:

| edges      | [**\[SectionEdge!\]**](#sectionedge)            | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### SectionEdge

An edge in a connection.

Fields:

| node   | [**Section!**](#section)                               | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### SelectAttribute

Represents a set of options allowing a single choice.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)
* [**OptionAttribute**](/graphql/overview/schema/interfaces#optionattribute)

### SelectAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**SelectAttribute!**](#selectattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[SelectAttributeValueTranslation!\]!**](#selectattributevaluetranslation) | A value translations.                |

### SelectAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| translatedValue | [**OptionTranslatedValue**](#optiontranslatedvalue) | Represents simplified translated value containing scalar names in context language only. |
| --------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| value           | [**Option**](#option)                               | A translation value of an `Attribute`.                                                   |

### SimpleProduct

A simple product.

Implements:

* [**Product**](/graphql/overview/schema/interfaces#product)

Fields:

| isVariant | [**Boolean!**](/graphql/overview/schema/scalars#boolean) | Is product a variant of `VariableProduct`. |
| --------- | -------------------------------------------------------- | ------------------------------------------ |

### Template

Represents a set of attributes specific to a market segment.

Fields:

| code                                                                                                                                 | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode)              | Readable id of `Template`.                                                                                                                         |
| ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language))                                                     | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Translatable name allowing to set different values in every active language.                                                                       |
| attributeList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int)) | [**AttributeConnection!**](#attributeconnection)                                | <p>A list of attributes used in the <code>Template</code>.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |
| sectionList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int))   | [**SectionConnection!**](#sectionconnection)                                    | <p>A list of sections used in the <code>Template</code>.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p>   |

### TemplateConnection

The connection for [**Template**](#template)

Fields:

| edges      | [**\[TemplateEdge!\]**](#templateedge)          | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### TemplateCreatePayload

A payload for a mutation.

Fields:

| template | [**Template!**](#template) | Created `Template`. |
| -------- | -------------------------- | ------------------- |

### TemplateDeletePayload

A payload for a mutation.

Fields:

| code | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode) | Deleted `TemplateCode`. |
| ---- | ------------------------------------------------------------------ | ----------------------- |

### TemplateSetNamePayload

A payload for a mutation.

Fields:

| template | [**Template!**](#template) | Changed `Template`. |
| -------- | -------------------------- | ------------------- |

### TemplateEdge

An edge in a connection.

Fields:

| node   | [**Template!**](#template)                             | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### TextareaAttribute

Represents a text.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| richEdit | [**Boolean!**](/graphql/overview/schema/scalars#boolean) | Is rich text editor enabled. |
| -------- | -------------------------------------------------------- | ---------------------------- |

### TextareaAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**TextareaAttribute!**](#textareaattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TextareaAttributeValueTranslation!\]!**](#textareaattributevaluetranslation) | A value translations.                |

### TextareaAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value    | [**String**](/graphql/overview/schema/scalars#string) | A translation value of an `Attribute`.                                                                          |
| -------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| rawValue | [**String**](/graphql/overview/schema/scalars#string) | Represents raw textarea value translation with attribute variables unresolved in form of `{{#attribute_code}}`. |

### TextareaCustomField

Represents a text.

Implements:

* [**CustomField**](/graphql/overview/schema/interfaces#customfield)

### TextareaCustomFieldTranslatedValue

Represents a text translated value.

Implements:

* [**CustomFieldTranslatedValue**](/graphql/overview/schema/interfaces#customfieldtranslatedvalue)

Fields:

| customField | [**TextareaCustomField!**](#textareacustomfield)      | A `CustomField` describing the value. |
| ----------- | ----------------------------------------------------- | ------------------------------------- |
| value       | [**String**](/graphql/overview/schema/scalars#string) | A value in the context language.      |

### TextareaCustomFieldValue

A custom field value.

Implements:

* [**CustomFieldValue**](/graphql/overview/schema/interfaces#customfieldvalue)

Fields:

| customField                                                                              | [**TextareaCustomField!**](#textareacustomfield)                                      | A `CustomField` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------- |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TextareaCustomFieldValueTranslation!\]!**](#textareacustomfieldvaluetranslation) | A value translations.                 |

### TextareaCustomFieldValueTranslation

Translation of a custom field value.

Implements:

* [**CustomFieldValueTranslation**](/graphql/overview/schema/interfaces#customfieldvaluetranslation)

Fields:

| value | [**String**](/graphql/overview/schema/scalars#string) | A translation value of a `CustomField`. |
| ----- | ----------------------------------------------------- | --------------------------------------- |

### TextareaRTECustomField

Represents a text with RTE enabled.

Implements:

* [**CustomField**](/graphql/overview/schema/interfaces#customfield)

### TextareaRTECustomFieldTranslatedValue

Represents a text with RTE translated value.

Implements:

* [**CustomFieldTranslatedValue**](/graphql/overview/schema/interfaces#customfieldtranslatedvalue)

Fields:

| customField | [**TextareaRTECustomField!**](#textareartecustomfield) | A `CustomField` describing the value. |
| ----------- | ------------------------------------------------------ | ------------------------------------- |
| value       | [**String**](/graphql/overview/schema/scalars#string)  | A value in the context language.      |

### TextareaRTECustomFieldValue

A custom field value.

Implements:

* [**CustomFieldValue**](/graphql/overview/schema/interfaces#customfieldvalue)

Fields:

| customField                                                                              | [**TextareaRTECustomField!**](#textareartecustomfield)                                      | A `CustomField` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------- |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TextareaRTECustomFieldValueTranslation!\]!**](#textareartecustomfieldvaluetranslation) | A value translations.                 |

### TextareaRTECustomFieldValueTranslation

Translation of a custom field value.

Implements:

* [**CustomFieldValueTranslation**](/graphql/overview/schema/interfaces#customfieldvaluetranslation)

Fields:

| value | [**String**](/graphql/overview/schema/scalars#string) | A translation value of a `CustomField`. |
| ----- | ----------------------------------------------------- | --------------------------------------- |

### TextAttribute

Represents a short text of up to 255 chars.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| unique | [**Boolean!**](/graphql/overview/schema/scalars#boolean) | Enforces unique values among all same-type resources, i.e., products. |
| ------ | -------------------------------------------------------- | --------------------------------------------------------------------- |

### TextAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**TextAttribute!**](#textattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TextAttributeValueTranslation!\]!**](#textattributevaluetranslation) | A value translations.                |

### TextAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslation**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**String**](/graphql/overview/schema/scalars#string) | A translation value of an `Attribute`. |
| ----- | ----------------------------------------------------- | -------------------------------------- |

### TextCustomField

Represents a short text of up to 255 chars.

Implements:

* [**CustomField**](/graphql/overview/schema/interfaces#customfield)

### TextCustomFieldTranslatedValue

Represents a text translated value.

Implements:

* [**CustomFieldTranslatedValue**](/graphql/overview/schema/interfaces#customfieldtranslatedvalue)

Fields:

| customField | [**TextCustomField!**](#textcustomfield)              | A `CustomField` describing the value. |
| ----------- | ----------------------------------------------------- | ------------------------------------- |
| value       | [**String**](/graphql/overview/schema/scalars#string) | A value in the context language.      |

### TextCustomFieldValue

A custom field value.

Implements:

* [**CustomFieldValue**](/graphql/overview/schema/interfaces#customfieldvalue)

Fields:

| customField                                                                              | [**TextCustomField!**](#textcustomfield)                                     | A `CustomField` describing the value. |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------- |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TextCustomFieldValueTranslation!\]!**](#textcustomfieldtranslatedvalue) | A value translations.                 |

### TextCustomFieldValueTranslation

Translation of a custom field value.

Implements:

* [**CustomFieldValueTranslation**](/graphql/overview/schema/interfaces#customfieldvaluetranslation)

Fields:

| value | [**String**](/graphql/overview/schema/scalars#string) | A translation value of a `CustomField`. |
| ----- | ----------------------------------------------------- | --------------------------------------- |

### TranslatedString

Represents a translated value.

Fields:

| value    | [**String**](/graphql/overview/schema/scalars#string)      | Tranlated value.         |
| -------- | ---------------------------------------------------------- | ------------------------ |
| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language of translation. |

### Unit

Represents a unit. Can be used to define specific scalar types like a Meter.

Fields:

| name   | [**UnitName!**](/graphql/overview/schema/scalars#unitname) | Name o `Unit`.    |
| ------ | ---------------------------------------------------------- | ----------------- |
| symbol | [**String!**](/graphql/overview/schema/scalars#string)     | Symbol of `Unit`. |

### UnitAttribute

Represents a numeric scalar unit.

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| unit | [**Unit!**](#unit) | Unit of `Attribute`. |
| ---- | ------------------ | -------------------- |

### UnitAttributeValue

An attribute value.

Implements:

* [**AttributeValue**](/graphql/overview/schema/interfaces#attributevalue)

Fields:

| attribute                                                                                | [**UnitAttribute!**](#unitattribute)                                      | An `Attribute` describing the value. |
| ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------ |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[UnitAttributeValueTranslation!\]!**](#unitattributevaluetranslation) | A value translations.                |

### UnitAttributeValueTranslation

Translation of an attribute value.

Implements:

* [**AttributeValueTranslatio**](/graphql/overview/schema/interfaces#attributevaluetranslation)

Fields:

| value | [**Float**](/graphql/overview/schema/scalars#float) | A translation value of an `Attribute`. |
| ----- | --------------------------------------------------- | -------------------------------------- |

### UnitConnection

The connection for [**Unit**](#unit)

Fields:

| edges      | [**\[UnitEdge!\]**](#unitedge)                  | Edges of the connection.          |
| ---------- | ----------------------------------------------- | --------------------------------- |
| pageInfo   | [**PageInfo**](#pageinfo)                       | Page info of the connection.      |
| totalCount | [**Int**](/graphql/overview/schema/scalars#int) | Count of all edges in connection. |

### UnitEdge

An edge in a connection.

Fields:

| node   | [**Unit!**](#unit)                                     | Node of the Edge. |
| ------ | ------------------------------------------------------ | ----------------- |
| cursor | [**String!**](/graphql/overview/schema/scalars#string) | The Edge cursor.  |

### VariableProduct

A product representing multiple variants i.e. products of different sizes or colors.

Fields:

| bindings                                                                                                                           | [**\[SelectAttribute!\]!**](#selectattribute) | A list of attributes by which variants are bonded.                                                                                             |
| ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| variantList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int)) | [**ProductConnection!**](#productconnection)  | <p>A list of variants in <code>VariableProduct</code>.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |


# Interfaces

Interfaces represent a parent for Objects providing definition of common fields.

### Attribute

An attribute represents a type of value that can be assigned to a product.

Fields:

| code                                                                             | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)            | Readable id of `Attribute`.                                                  |
| -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| name (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[TranslatedString!\]!**](/graphql/overview/schema/objects#translatedstring) | Translatable name allowing to set different values in every active language. |
| scope                                                                            | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope)            | Scope of `Attribute` determining its values behavior.                        |
| metadata                                                                         | [**\[Metadatum!\]!**](/graphql/overview/schema/objects#metadatum)               | Metadata allows describing the `Attribute` in an enhanced, custom way.       |

Implemented by:

* [**DateAttribute**](/graphql/overview/schema/objects#dateattribute)
* [**FileAttribute**](/graphql/overview/schema/objects#fileattribute)
* [**GalleryAttribute**](/graphql/overview/schema/objects#galleryattribute)
* [**ImageAttribute**](/graphql/overview/schema/objects#imageattribute)
* [**MultiSelectAttribute**](/graphql/overview/schema/objects#multiselectattribute)
* [**NumericAttribute**](/graphql/overview/schema/objects#numericattribute)
* [**OptionAttribute**](#optionattribute)
* [**PriceAttribute**](/graphql/overview/schema/objects#priceattribute)
* [**ProductRelationAttribute**](/graphql/overview/schema/objects#productrelationattribute)
* [**SelectAttribute**](/graphql/overview/schema/objects#selectattribute)
* [**TextareaAttribute**](/graphql/overview/schema/objects#textareaattribute)
* [**TextAttribute**](/graphql/overview/schema/objects#textattribute)
* [**UnitAttribute**](/graphql/overview/schema/objects#unitattribute)

### AttributeValue

Represents a value defining a specific attribute.

Fields:

| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[AttributeValueTranslation!\]!**](/graphql/overview/schema/interfaces#attributevaluetranslation) | A value translations.                        |
| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------- |
| attribute                                                                                | [**Attribute!**](#attribute)                                                                         | An `Attribute` describing the type of value. |

Implemented by:

* [**DateAttributeValue**](/graphql/overview/schema/objects#dateattributevalue)
* [**FileAttributeValue**](/graphql/overview/schema/objects#fileattributevalue)
* [**GalleryAttributeValue**](/graphql/overview/schema/objects#galleryattributevalue)
* [**ImageAttributeValue**](/graphql/overview/schema/objects#imageattributevalue)
* [**MultiSelectAttributeValue**](/graphql/overview/schema/objects#multiselectattributevalue)
* [**NumericAttributeValue**](/graphql/overview/schema/objects#numericattributevalue)
* [**PriceAttributeValue**](/graphql/overview/schema/objects#priceattributevalue)
* [**ProductRelationAttributeValue**](/graphql/overview/schema/objects#productrelationattributevalue)
* [**SelectAttributeValue**](/graphql/overview/schema/objects#selectattributevalue)
* [**TextareaAttributeValue**](/graphql/overview/schema/objects#textareaattributevalue)
* [**TextAttributeValue**](/graphql/overview/schema/objects#textareaattributevalue)
* [**UnitAttributeValue**](/graphql/overview/schema/objects#unitattributevalue)

### AttributeValueTranslation

Represents a translated attribute value for language.

Fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | A language of a translation. |
| -------- | ---------------------------------------------------------- | ---------------------------- |

Implemented by:

* [**DateAttributeValueTranslation**](/graphql/overview/schema/objects#dateattributevaluetranslation)
* [**FileAttributeValueTranslation**](/graphql/overview/schema/objects#fileattributevaluetranslation)
* [**GalleryAttributeValueTranslation**](/graphql/overview/schema/objects#galleryattributevaluetranslation)
* [**ImageAttributeValueTranslation**](/graphql/overview/schema/objects#imageattributevaluetranslation)
* [**MultiSelectAttributeValueTranslation**](/graphql/overview/schema/objects#multiselectattributevaluetranslation)
* [**NumericAttributeValueTranslation**](/graphql/overview/schema/objects#numericattributevaluetranslation)
* [**PriceAttributeValueTranslation**](/graphql/overview/schema/objects#priceattributevaluetranslation)
* [**ProductRelationAttributeValueTranslation**](/graphql/overview/schema/objects#productrelationattributevaluetranslation)
* [**SelectAttributeValueTranslation**](/graphql/overview/schema/objects#selectattributevaluetranslation)
* [**TextareaAttributeValueTranslation**](/graphql/overview/schema/objects#textareaattributevaluetranslation)
* [**TextAttributeValueTranslation**](/graphql/overview/schema/objects#textattributevaluetranslation)
* [**UnitAttributeValueTranslation**](/graphql/overview/schema/objects#unitattributevaluetranslation)

### CustomField

A custom field represents a type of value that can be assigned to an attribute option.

Fields:

| code | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Readable id of `CustomField`. |
| ---- | ------------------------------------------------------------------------ | ----------------------------- |

Implemented by:

* [**ImageCustomField**](/graphql/overview/schema/objects#imagecustomfield)
* [**TextareaCustomField**](/graphql/overview/schema/objects#textareacustomfield)
* [**TextareaRTECustomField**](/graphql/overview/schema/objects#textareartecustomfield)
* [**TextCustomField**](/graphql/overview/schema/objects#textcustomfield)

### CustomFieldTranslatedValue

Represents a value defining a specific `CustomField` in specific language only.

Fields:

| customField | [**CustomField!**](#customfield) | A `CustomField` describing the type of value. |
| ----------- | -------------------------------- | --------------------------------------------- |

Implemented by:

* [**ImageCustomFieldTranslatedValue**](/graphql/overview/schema/objects#imagecustomfieldtranslatedvalue)
* [**TextareaCustomFieldTranslatedValue**](/graphql/overview/schema/objects#textareacustomfieldtranslatedvalue)
* [**TextareaRTECustomFieldTranslatedValue**](/graphql/overview/schema/objects#textareartecustomfieldtranslatedvalue)
* [**TextCustomFieldTranslatedValue**](/graphql/overview/schema/objects#textcustomfieldtranslatedvalue)

### CustomFieldValue

Represents a value defining a specific `CustomField`.

Fields:

| customField                                                                              | [**CustomField!**](#customfield)                                      | A `CustomField` describing the type of value. |
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------- |
| translations (languages: [**\[Language!\]**](/graphql/overview/schema/scalars#language)) | [**\[CustomFieldValueTranslation!\]!**](#customfieldvaluetranslation) | A value translations.                         |

Implemented by:

* [**ImageCustomFieldValue**](/graphql/overview/schema/objects#imagecustomfieldvalue)
* [**TextareaCustomFieldValue**](/graphql/overview/schema/objects#textareacustomfieldvalue)
* [**TextareaRTECustomFieldValue**](/graphql/overview/schema/objects#textareartecustomfieldvalue)
* [**TextCustomFieldValue**](/graphql/overview/schema/objects#textcustomfieldvalue)

### CustomFieldValueTranslation

Represents a translated custom field value for language.

Fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | A language of a translation. |
| -------- | ---------------------------------------------------------- | ---------------------------- |

Implemented by:

* [**ImageCustomFieldValueTranslation**](/graphql/overview/schema/objects#imagecustomfieldvaluetranslation)
* [**TextareaCustomFieldValueTranslation**](/graphql/overview/schema/objects#textareacustomfieldvaluetranslation)
* [**TextareaRTECustomFieldValueTranslation**](/graphql/overview/schema/objects#textareartecustomfieldvaluetranslation)
* [**TextCustomFieldValueTranslation**](/graphql/overview/schema/objects#textcustomfieldvaluetranslation)

### OptionAttribute

An attribute with a predefined set of values(options).

Implements:

* [**Attribute**](/graphql/overview/schema/interfaces#attribute)

Fields:

| optionList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int)) | [**OptionConnection!**](#optionconnection) | <p>A list of options of an <code>Attribute</code>.<br><code>first</code> argument cannot be lesser than 0 and higher than 200. The default value is 50.</p> |
| --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| customFields                                                                                                                      | [**\[CustomField!\]!**](#customfield)      | Configured attribute custom fields.                                                                                                                         |

Implemented by:

* [**MultiSelectAttribute**](/graphql/overview/schema/objects#multiselectattribute)
* [**SelectAttribute**](/graphql/overview/schema/objects#selectattribute)

### Product

Fields:

| sku                                                                                                                                                                                                                   | [**Sku!**](/graphql/overview/schema/scalars#sku)                                                | sku                                                                                                                                              |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| categoryList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int))                                                                                   | [**CategoryConnection!**](/graphql/overview/schema/objects#categoryconnection)                  | <p>A list of categories <code>Product</code> belongs to.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p> |
| template                                                                                                                                                                                                              | [**Template!**](/graphql/overview/schema/objects#template)                                      | Template of `Product`.                                                                                                                           |
| attributeList (after: [**String**](/graphql/overview/schema/scalars#string), first: [**Int**](/graphql/overview/schema/scalars#int), codes: [**\[AttributeCode!\]**](/graphql/overview/schema/scalars#attributecode)) | [**AttributeValueConnection!**](/graphql/overview/schema/objects#attributevalueconnection)      | <p>A list of <code>Attribute</code> values.<br><code>first</code> argument cannot be lesser than 0 and its default value is 50.</p>              |
| status                                                                                                                                                                                                                | [**\[ProductStatusTranslation!\]!**](/graphql/overview/schema/objects#productstatustranslation) | Status of `Product`.                                                                                                                             |
| createdAt                                                                                                                                                                                                             | [**DateTime!**](/graphql/overview/schema/scalars#datetime)                                      | Creation date.                                                                                                                                   |
| editedAt                                                                                                                                                                                                              | [**DateTime**](/graphql/overview/schema/scalars#datetime)                                       | Last edition date.                                                                                                                               |

Implemented by:

* [**GroupingProduct**](/graphql/overview/schema/objects#groupingproduct)
* [**SimpleProduct**](/graphql/overview/schema/objects#simpleproduct)
* [**VariableProduct**](/graphql/overview/schema/objects#variableproduct)


# Scalars

Scalars represent primitive values like Integer or String.

### AttributeCode

Represents a lowercased, alphanumeric, and `_` textual [**Attribute**](/graphql/overview/schema/interfaces#attribute) identifier of 1-128 chars in length. It cannot be `id` or start with `esa_`.

### Boolean

Represents `true` or `false`.

### CategoryCode

Represents a lowercased, alphanumeric, and `_` textual [**Category**](/graphql/overview/schema/objects#category) identifier of 1-128 chars in length.

### CategoryTreeCode

Represents a textual [**CategoryTree**](/graphql/overview/schema/objects#categorytree) identifier of 1-128 chars in length.

### Currency

Represents a currency code in ISO 4217 format. Example: `PLN`.

### CustomFieldCode

Represents a lowercased, alphanumeric, and `_` textual [**CustomField**](/graphql/overview/schema/interfaces#customfield) identifier in a single [**OptionAttribute**](/graphql/overview/schema/interfaces#optionattribute) context of 1-128 chars in length.

### DateFormat

Represents a date formatted in one of the: `yyyy-MM-dd`, `yy-MM-dd`, `dd.MM.yy`, `dd.MM.yyyy`, `MM/dd/yy`, `MM/dd/yyyy`, `MMMM dd, yyyy`, `dd MMMM yyyy`, `dd MMM yyyy`

### DateTime

Represents an ISO 8601 date. Example: `2021-04-09T17:25:26+00:00`

### Float

Represents signed double-precision fractional values as specified by IEEE 754.

### Int

Represents non-fractional signed whole numeric values.

### Language

Represents a 5 chars LCID language code. Example: `pl_PL`.

### MetadatumKey

Represents an alphanumeric and `_` [**Metadatum**](/graphql/overview/schema/objects#metadatum) key of 1-128 chars in length.

### MultimediaFolderName

Represents an alphanumeric, `\`, `-` and `_` textual [**MultimediaFolder**](/graphql/overview/schema/objects#multimediafolder) name of 1-255 chars in length.

### MultimediaFolderPath

Represents a textual combination of [**MultimediaFolderName**](#multimediafoldername) scalars joined with `/` [**MultimediaFolder**](/graphql/overview/schema/objects#multimediafolder) identifier pointing to its exact location.

### MultimediaName

Represents a not containing `/` textual [**Multimedia**](/graphql/overview/schema/objects#multimedia) name of 1-128 chars in length.

### MultimediaPath

Represents a textual combination of [**MultimediaFolderPath**](#multimediafolderpath), and [**MultimediaName**](#multimedianame) joined with `/` [**Multimedia**](/graphql/overview/schema/objects#multimedia) identifier pointing to its exact location.

### MultimediaProfileCode

Represents a lowercased, alphanumeric, and `_` textual **MultimediaProfile** identifier of 1-128 chars in length.&#x20;

### OptionCode

Represents a textual [**Option**](/graphql/overview/schema/objects#option) identifier in a single [**Attribute**](/graphql/overview/schema/interfaces#attribute) context of 1-128 chars in length.

### SectionCode

Represents a textual [**Section**](/graphql/overview/schema/objects#section) identifier of 3-32 chars in length.

### Sku

Represents a textual [**Product**](/graphql/overview/schema/interfaces#product) identifier of 1-255 chars in length.

### StatusCode

Represents a textual [**ProductStatus**](/graphql/overview/schema/objects#productstatus) identifier of 1-128 chars in length.

### String

Represents textual data, represented as UTF-8 character sequences. The `String` type is most often used by GraphQL to represent free-form human-readable text.

### TemplateCode

Represents a textual [**Template**](/graphql/overview/schema/objects#template) identifier of 3-32 chars in length.

### UnitName

Represents a textual [**Unit**](/graphql/overview/schema/objects#unit) name of 1-255 chars in length.


# Input objects

Input objects represent a set of fields allowing describing mutation.

### AttributeAddMetadataInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| -------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| metadata | [**\[MetadatumInput!\]!**](#metadatuminput)                          | Metadata to be set.                                      |

### AttributeCreateDateInput

Input fields:

| code   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.   |
| ------ | -------------------------------------------------------------------- | ---------------------- |
| scope  | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.  |
| name   | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.   |
| format | [**DateFormat!**](/graphql/overview/schema/scalars#dateformat)       | Format of `Attribute`. |

### AttributeCreateFileInput

Input fields:

| code  | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.  |
| ----- | -------------------------------------------------------------------- | --------------------- |
| scope | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`. |
| name  | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.  |

### AttributeCreateGalleryInput

Input fields:

| code  | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.  |
| ----- | -------------------------------------------------------------------- | --------------------- |
| scope | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`. |
| name  | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.  |

### AttributeCreateImageInput

Input fields:

| code  | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.  |
| ----- | -------------------------------------------------------------------- | --------------------- |
| scope | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`. |
| name  | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.  |

### AttributeCreateMultiSelectInput

Input fields:

| code    | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.    |
| ------- | -------------------------------------------------------------------- | ----------------------- |
| scope   | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.   |
| name    | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.    |
| options | [**\[OptionInput!\]!**](#optioninput)                                | Options of `Attribute`. |

### AttributeCreateNumericInput

Input fields:

| code   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.                                         |
| ------ | -------------------------------------------------------------------- | ------------------------------------------------------------ |
| scope  | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.                                        |
| name   | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.                                         |
| unique | [**Boolean**](/graphql/overview/schema/scalars#boolean)              | Is attribute representing unique value. Defaults to `false.` |

### AttributeCreatePriceInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.     |
| -------- | -------------------------------------------------------------------- | ------------------------ |
| scope    | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.    |
| name     | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.     |
| currency | [**Currency!**](/graphql/overview/schema/scalars#currency)           | Currency of `Attribute`. |

### AttributeCreateProductRelationInput

Input fields:

| code  | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.  |
| ----- | -------------------------------------------------------------------- | --------------------- |
| scope | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`. |
| name  | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.  |

### AttributeCreateSelectInput

Input fields:

| code    | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.    |
| ------- | -------------------------------------------------------------------- | ----------------------- |
| scope   | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.   |
| name    | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.    |
| options | [**\[OptionInput!\]!**](#optioninput)                                | Options of `Attribute`. |

### AttributeCreateTextareaInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.  |
| -------- | -------------------------------------------------------------------- | --------------------- |
| scope    | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`. |
| name     | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.  |
| richEdit | [**Boolean!**](/graphql/overview/schema/scalars#boolean)             | Is rich edit enabled. |

### AttributeCreateTextInput

Input fields:

| code   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.                                         |
| ------ | -------------------------------------------------------------------- | ------------------------------------------------------------ |
| scope  | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.                                        |
| name   | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.                                         |
| unique | [**Boolean**](/graphql/overview/schema/scalars#boolean)              | Is attribute representing unique value. Defaults to `false.` |

### AttributeCreateUnitInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | Code of `Attribute`.       |
| -------- | -------------------------------------------------------------------- | -------------------------- |
| scope    | [**AttributeScope!**](/graphql/overview/schema/enums#attributescope) | Scope of `Attribute`.      |
| name     | [**\[TranslatedStringInput!\]**](#translatedstringinput)             | Name of `Attribute`.       |
| unitName | [**UnitName!**](/graphql/overview/schema/scalars#unitname)           | Unit name for `Attribute`. |

### AttributeDateSetFormatInput

Input fields:

| code   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ------ | -------------------------------------------------------------------- | -------------------------------------------------------- |
| format | [**DateFormat!**](/graphql/overview/schema/scalars#dateformat)       | Format of `Attribute`.                                   |

### AttributeDeleteInput

Input fields:

| code | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ---- | -------------------------------------------------------------------- | -------------------------------------------------------- |

### AttributeDeleteMetadataInput

Input fields:

| code         | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)    | The code of `Attribute` the mutation to be performed on. |
| ------------ | ----------------------------------------------------------------------- | -------------------------------------------------------- |
| metadataKeys | [**\[MetadatumKey!\]!**](/graphql/overview/schema/scalars#metadatumkey) | Metadata keys to be deleted.                             |

### AttributeMultiSelectAddOptionInput

Input fields:

| code   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ------ | -------------------------------------------------------------------- | -------------------------------------------------------- |
| option | [**OptionInput!**](#optioninput)                                     | Option to be added.                                      |

### AttributeMultiSelectDeleteOptionInput

Input fields:

| code       | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ---------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)       | Option to be deleted.                                    |

### AttributeMultiSelectSetOptionNameInput

Input fields:

| code       | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ---------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)       | Option to be changed.                                    |
| optionName | [**\[TranslatedStringInput!\]!**](#translatedstringinput)            | Option name to be set.                                   |

### AttributeMultiSelectSetOptionsInput

Input fields:

| code    | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| options | [**\[OptionInput!\]!**](#optioninput)                                | Options to be set.                                       |

### AttributeOptionAddCustomFieldImageInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` the mutation to be performed on. |
| --------------- | ------------------------------------------------------------------------ | -------------------------------------------------------- |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Code of the custom field to be configured.               |

### AttributeOptionAddCustomFieldTextareaInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` the mutation to be performed on. |
| --------------- | ------------------------------------------------------------------------ | -------------------------------------------------------- |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Code of the custom field to be configured.               |

### AttributeOptionAddCustomFieldTextareaRTEInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` the mutation to be performed on. |
| --------------- | ------------------------------------------------------------------------ | -------------------------------------------------------- |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Code of the custom field to be configured.               |

### AttributeOptionAddCustomFieldTextInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` the mutation to be performed on. |
| --------------- | ------------------------------------------------------------------------ | -------------------------------------------------------- |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Code of the custom field to be configured.               |

### AttributeOptionAddOptionCustomFieldValueTranslationsImageInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                      | The code of `Attribute` the mutation to be performed on. |
| --------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode      | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)                            | Option to be changed.                                    |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode)                  | Code of the custom field to be configured.               |
| translations    | [**\[ImageCustomFieldValueTranslationInput!\]!**](#imagecustomfieldvaluetranslationinput) | Translations of the value to be added.                   |

### AttributeOptionAddOptionCustomFieldValueTranslationsTextareaInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                            | The code of `Attribute` the mutation to be performed on. |
| --------------- | ----------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode      | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)                                  | Option to be changed.                                    |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode)                        | Code of the custom field to be configured.               |
| translations    | [**\[TextareaCustomFieldValueTranslationInput!\]!**](#textareacustomfieldvaluetranslationinput) | Translations of the value to be added.                   |

### AttributeOptionAddOptionCustomFieldValueTranslationsTextareaRTEInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                                  | The code of `Attribute` the mutation to be performed on. |
| --------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode      | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)                                        | Option to be changed.                                    |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode)                              | Code of the custom field to be configured.               |
| translations    | [**\[TextareaRTECustomFieldValueTranslationInput!\]!**](#textareartecustomfieldvaluetranslationinput) | Translations of the value to be added.                   |

### AttributeOptionAddOptionCustomFieldValueTranslationsTextInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                    | The code of `Attribute` the mutation to be performed on. |
| --------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode      | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)                          | Option to be changed.                                    |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode)                | Code of the custom field to be configured.               |
| translations    | [**\[TextCustomFieldValueTranslationInput!\]!**](#textcustomfieldvaluetranslationinput) | Translations of the value to be added.                   |

### AttributeOptionDeleteCustomFieldInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` the mutation to be performed on. |
| --------------- | ------------------------------------------------------------------------ | -------------------------------------------------------- |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Code of the custom field to be deleted.                  |

### AttributeOptionDeleteOptionCustomFieldValueTranslationsInput

Input fields:

| code            | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` the mutation to be performed on. |
| --------------- | ------------------------------------------------------------------------ | -------------------------------------------------------- |
| optionCode      | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)           | Option to be changed.                                    |
| customFieldCode | [**CustomFieldCode!**](/graphql/overview/schema/scalars#customfieldcode) | Code of the custom field changed.                        |
| languages       | [**\[Language!\]!**](/graphql/overview/schema/scalars#language)          | Languages the translations to be deleted in.             |

### AttributeOptionListFilterInput

Input fields:

| optionCodes | [**\[OptionCode!\]**](/graphql/overview/schema/scalars#optioncode)   | Option codes to be filtered by. |
| ----------- | -------------------------------------------------------------------- | ------------------------------- |
| optionNames | [**\[TranslatedStringFilterInput!\]**](#translatedstringfilterinput) | Option names to be filtered by. |

### AttributePriceSetCurrencyInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| -------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| currency | [**Currency!**](/graphql/overview/schema/scalars#currency)           | Currency to be set.                                      |

### AttributeSelectAddOptionInput

Input fields:

| code   | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ------ | -------------------------------------------------------------------- | -------------------------------------------------------- |
| option | [**OptionInput!**](#optioninput)                                     | Option to be added.                                      |

### AttributeSelectDeleteOptionInput

Input fields:

| code       | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ---------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)       | Option to be deleted.                                    |

### AttributeSelectSetOptionNameInput

Input fields:

| code       | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ---------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| optionCode | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode)       | Option to be changed.                                    |
| optionName | [**\[TranslatedStringInput!\]!**](#translatedstringinput)            | Option name to be set.                                   |

### AttributeSelectSetOptionsInput

Input fields:

| code    | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| options | [**\[OptionInput!\]!**](#optioninput)                                | Options to be set.                                       |

### AttributeSetNameInput

Input fields:

| code | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| ---- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| name | [**\[TranslatedStringInput!\]!**](#translatedstringinput)            | Name to be set.                                          |

### AttributeTextareaSetRichEditInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| -------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| richEdit | [**Boolean!**](/graphql/overview/schema/scalars#boolean)             | Is rich edit enabled.                                    |

### AttributeUnitSetUnitInput

Input fields:

| code     | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` the mutation to be performed on. |
| -------- | -------------------------------------------------------------------- | -------------------------------------------------------- |
| unitName | [**UnitName!**](/graphql/overview/schema/scalars#unitname)           | Unit to be set.                                          |

### CategoryAddAttributeValueTranslationsDateInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[DateValueTranlationInput!\]!**](#datevaluetranslationinput)     | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsFileInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[FileValueTranlationInput!\]!**](#filevaluetranslationinput)     | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsGalleryInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)     | The code of `Category` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                |
| translations  | [**\[GalleryValueTranlationInput!\]!**](#galleryvaluetranslationinput) | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsImageInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[ImageValueTranlationInput!\]!**](#imagevaluetranslationinput)   | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsMultiSelectInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)             | The code of `Category` the mutation to be performed on. |
| ------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)           | The code of `Attribute` adding value to.                |
| translations  | [**\[MultiSelectValueTranlationInput!\]!**](#multiselectvaluetranslationinput) | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsNumericInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)     | The code of `Category` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                |
| translations  | [**\[NumericValueTranlationInput!\]!**](#numericvaluetranslationinput) | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsPriceInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[PriceValueTranlationInput!\]!**](#pricevaluetranslationinput)   | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsProductRelationInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)                     | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                   | The code of `Attribute` adding value to.                |
| translations  | [**\[ProductRelationValueTranlationInput!\]!**](#productrelationvaluetranslationinput) | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsSelectInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[SelectValueTranlationInput!\]!**](#selectvaluetranslationinput) | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsTextareaInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)       | The code of `Category` the mutation to be performed on. |
| ------------- | ------------------------------------------------------------------------ | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` adding value to.                |
| translations  | [**\[TextareaValueTranlationInput!\]!**](#textareavaluetranslationinput) | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsTextInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[TextValueTranlationInput!\]!**](#textvaluetranslationinput)     | Translations of the value to be added.                  |

### CategoryAddAttributeValueTranslationsUnitInput

Input fields:

| categoryCode  | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.                |
| translations  | [**\[UnitValueTranlationInput!\]!**](#unitvaluetranslationinput)     | Translations of the value to be added.                  |

### CategoryAttributeAddAttributeInput

Input fields:

| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` to be added. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------ |

### CategoryAttributeRemoveAttributeInput

Input fields:

| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` to be removed. |
| ------------- | -------------------------------------------------------------------- | -------------------------------------- |

### CategoryCreateInput

Input fields:

| code | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode) | The code of `Category`. |
| ---- | ------------------------------------------------------------------ | ----------------------- |
| name | [**\[TranslatedStringInput!\]**](#translatedstringinput)           | The name of `Category`. |

### CategoryDeleteAttributeValueTranslationsInput

Input fields:

| code          | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode)   | The code of `Category` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` deleting value from.            |
| languages     | [**\[Language!\]**](/graphql/overview/schema/scalars#language)       | Languages the translations to be deleted in.            |

### CategoryDeleteInput

Input fields:

| code | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode) | The code of `Category` the mutation to be performed on. |
| ---- | ------------------------------------------------------------------ | ------------------------------------------------------- |

### CategorySetNameInput

Input fields:

| code | [**CategoryCode!**](/graphql/overview/schema/scalars#categorycode) | The code of `Category` the mutation to be performed on. |
| ---- | ------------------------------------------------------------------ | ------------------------------------------------------- |
| name | [**\[TranslatedStringInput!\]!**](#translatedstringinput)          | Name to be set.                                         |

### DateValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)    | Translation value to be set.                                                                                                      |

### FileValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language)                   | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**\[MultimediaPath!\]!**](/graphql/overview/schema/scalars#multimediapath) | Translation value to be set.                                                                                                      |

### GalleryValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language)                   | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**\[MultimediaPath!\]!**](/graphql/overview/schema/scalars#multimediapath) | Translation value to be set.                                                                                                      |

### ImageCustomFieldValueTranslationInput

Input fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language)             | Language the translation to be added in. |
| -------- | ---------------------------------------------------------------------- | ---------------------------------------- |
| value    | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | Translation value to be set.             |

### ImageValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language)              | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | Translation value to be set.                                                                                                      |

### MetadatumInput

Input fields:

| key   | [**MetadatumKey!**](/graphql/overview/schema/scalars#metadatumkey) | Key of the metadata value to be set on. |
| ----- | ------------------------------------------------------------------ | --------------------------------------- |
| value | [**String!**](/graphql/overview/schema/scalars#string)             | Value to be set.                        |

### MultimediaAddAttributeValueTranslationsDateInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[DateValueTranlationInput!\]!**](#datevaluetranslationinput)       | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsFileInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[FileValueTranlationInput!\]!**](#filevaluetranslationinput)       | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsGalleryInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[GalleryValueTranlationInput!\]!**](#galleryvaluetranslationinput) | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsImageInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[ImageValueTranlationInput!\]!**](#imagevaluetranslationinput)     | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsMultiSelectInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath)         | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ------------------------------------------------------------------------------ | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)           | The code of `Attribute` adding value to.                  |
| translations  | [**\[MultiSelectValueTranlationInput!\]!**](#multiselectvaluetranslationinput) | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsNumericInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[NumericValueTranlationInput!\]!**](#numericvaluetranslationinput) | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsPriceInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[PriceValueTranlationInput!\]!**](#pricevaluetranslationinput)     | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsProductRelationInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath)                 | The path of `Multimedia` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                   | The code of `Attribute` adding value to.                  |
| translations  | [**\[ProductRelationValueTranlationInput!\]!**](#productrelationvaluetranslationinput) | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsSelectInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[SelectValueTranlationInput!\]!**](#selectvaluetranslationinput)   | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsTextareaInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath)   | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ------------------------------------------------------------------------ | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)     | The code of `Attribute` adding value to.                  |
| translations  | [**\[TextareaValueTranlationInput!\]!**](#textareavaluetranslationinput) | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsTextInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[TextValueTranlationInput!\]!**](#textvaluetranslationinput)       | Translations of the value to be added.                    |

### MultimediaAddAttributeValueTranslationsUnitInput

Input fields:

| path          | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ------------- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)   | The code of `Attribute` adding value to.                  |
| translations  | [**\[UnitValueTranlationInput!\]!**](#unitvaluetranslationinput)       | Translations of the value to be added.                    |

### MultimediaAttributeAddAttributeInput

Input fields:

| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` to be added. |
| ------------- | -------------------------------------------------------------------- | ------------------------------------ |

### MultimediaAttributeRemoveAttributeInput

Input fields:

| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` to be removed. |
| ------------- | -------------------------------------------------------------------- | -------------------------------------- |

### MultimediaCreateInput

Input fields:

| name       | [**MultimediaName!**](/graphql/overview/schema/scalars#multimedianame)            | The name of `Multimedia`.         |
| ---------- | --------------------------------------------------------------------------------- | --------------------------------- |
| folderPath | [**MultimediaFolderPath**](/graphql/overview/schema/scalars#multimediafolderpath) | Folder `Multimedia` to be put in. |

### MultimediaDeleteInput

Input fields:

| path | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ---- | ---------------------------------------------------------------------- | --------------------------------------------------------- |

### MultimediaFolderCreateInput

Input fields:

| name             | [**MultimediaFolderName!**](/graphql/overview/schema/scalars#multimediafoldername) | The name of `MultimediaFolder`.                            |
| ---------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| folderPath       | [**MultimediaFolderPath**](/graphql/overview/schema/scalars#multimediafolderpath)  | Folder `MultimediaFolder` to be put in.                    |
| createFolderPath | [**Boolean!**](/graphql/overview/schema/scalars#boolean)                           | Creates folderPath if does not exist. Defaults to `false`. |

### MultimediaFolderDeleteInput

Input fields:

| path | [**MultimediaFolderPath!**](/graphql/overview/schema/scalars#multimediafolderpath) | The path of `MultimediaFolder` the mutation to be performed on. |
| ---- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------- |

### MultimediaMoveInput

Input fields:

| path       | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath)            | The path of `Multimedia` the mutation to be performed on. |
| ---------- | --------------------------------------------------------------------------------- | --------------------------------------------------------- |
| folderPath | [**MultimediaFolderPath**](/graphql/overview/schema/scalars#multimediafolderpath) | Folder `Multimedia` to be put in.                         |

### MultimediaReplaceInput

Input fields:

| path | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ---- | ---------------------------------------------------------------------- | --------------------------------------------------------- |

### MultimediaSetAltInput

Input fields:

| path | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ---- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| alt  | [**\[TranslatedStringInput!\]!**](#translatedstringinput)              | Alt to be set.                                            |

### MultimediaSetNameInput

Input fields:

| path | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ---- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| name | [**MultimediaName!**](/graphql/overview/schema/scalars#multimedianame) | Name to be set.                                           |

### MultimediaSetTitleInput

Input fields:

| path  | [**MultimediaPath!**](/graphql/overview/schema/scalars#multimediapath) | The path of `Multimedia` the mutation to be performed on. |
| ----- | ---------------------------------------------------------------------- | --------------------------------------------------------- |
| title | [**\[TranslatedStringInput!\]!**](#translatedstringinput)              | Title to be set.                                          |

### MultiSelectValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language)           | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**\[OptionCode!\]!**](/graphql/overview/schema/scalars#optioncode) | Translation value to be set.                                                                                                      |

### NumericValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**Float!**](/graphql/overview/schema/scalars#float)      | Translation value to be set.                                                                                                      |

### OptionInput

Input fields:

| code | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode) | Code of the `Option` to be used. |
| ---- | -------------------------------------------------------------- | -------------------------------- |
| name | [**\[TranslatedStringInput!\]**](#translatedstringinput)       | Name to be set.                  |

### PriceValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**Float!**](/graphql/overview/schema/scalars#float)      | Translation value to be set.                                                                                                      |

### ProductAddAttributeValueTranslationsDateInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.              |
| translations  | [**\[DateValueTranlationInput!\]!**](#datevaluetranslationinput)     | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsFileInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.              |
| translations  | [**\[FileValueTranslationInput!\]!**](#filevaluetranslationinput)    | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsGalleryInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                        | The sku of `Product` the mutation to be performed on. |
| ------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)    | The code of `Attribute` adding value to.              |
| translations  | [**\[GalleryValueTranslationInput!\]!**](#galleryvaluetranslationinput) | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsImageInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.              |
| translations  | [**\[ImageValueTranslationInput!\]!**](#imagevaluetranslationinput)  | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsMultiSelectInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                                | The sku of `Product` the mutation to be performed on. |
| ------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)            | The code of `Attribute` adding value to.              |
| translations  | [**\[MultiSelectValueTranslationInput!\]!**](#multiselectvaluetranslationinput) | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsNumericInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                        | The sku of `Product` the mutation to be performed on. |
| ------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)    | The code of `Attribute` adding value to.              |
| translations  | [**\[NumericValueTranslationInput!\]!**](#numericvaluetranslationinput) | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsPriceInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.              |
| translations  | [**\[PriceValueTranslationInput!\]!**](#pricevaluetranslationinput)  | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsProductRelationInput

Input fields:

| sku            | [**Sku!**](/graphql/overview/schema/scalars#sku)                                        | The sku of `Product` the mutation to be performed on. |
| -------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode  | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)                    | The code of `Attribute` adding value to.              |
| translations   | [**\[ProductRelationValueTranslationInput!\]!**](#productrelationvaluetranslationinput) | Translations of the value to be added.                |
| twoWayRelation | [**TwoWayRelation**](/graphql/overview/schema/enums#twowayrelation)                     | Determines behavior of the value. Defaults to `None`  |

### ProductAddAttributeValueTranslationsSelectInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                      | The sku of `Product` the mutation to be performed on. |
| ------------- | --------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)  | The code of `Attribute` adding value to.              |
| translations  | [**\[SelectValueTranslationInput!\]!**](#selectvaluetranslationinput) | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsTextareaInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                          | The sku of `Product` the mutation to be performed on. |
| ------------- | ------------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode)      | The code of `Attribute` adding value to.              |
| translations  | [**\[TextareaValueTranslationInput!\]!**](#textareavaluetranslationinput) | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsTextInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.              |
| translations  | [**\[TextValueTranslationInput!\]!**](#textvaluetranslationinput)    | Translations of the value to be added.                |

### ProductAddAttributeValueTranslationsUnitInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` adding value to.              |
| translations  | [**\[UnitValueTranslationInput!\]!**](#unitvaluetranslationinput)    | Translations of the value to be added.                |

### ProductAddCategoriesInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                        | The sku of `Product` the mutation to be performed on. |
| ------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- |
| categoryCodes | [**\[CategoryCode!\]!**](/graphql/overview/schema/scalars#categorycode) | Categories to be added.                               |

### ProductCreateGroupingInput

Input fields:

| sku          | [**Sku**](/graphql/overview/schema/scalars#sku)                        | Sku of `Product`. If not provided, it will be created if "Generate SKU automatically" is enabled. |
| ------------ | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| templateCode | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode)     | Template of `Product`.                                                                            |
| categoryCode | [**\[CategoryCode!\]**](/graphql/overview/schema/scalars#categorycode) | Categories of `Product`.                                                                          |

### ProductCreateSimpleInput

Input fields:

| sku          | [**Sku**](/graphql/overview/schema/scalars#sku)                        | Sku of `Product`. If not provided, it will be created if "Generate SKU automatically" is enabled. |
| ------------ | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| templateCode | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode)     | Template of `Product`.                                                                            |
| categoryCode | [**\[CategoryCode!\]**](/graphql/overview/schema/scalars#categorycode) | Categories of `Product`.                                                                          |

### ProductCreateVariableInput

Input fields:

| sku          | [**Sku**](/graphql/overview/schema/scalars#sku)                        | Sku of `Product`. If not provided, it will be created if "Generate SKU automatically" is enabled. |
| ------------ | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| templateCode | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode)     | Template of `Product`.                                                                            |
| categoryCode | [**\[CategoryCode!\]**](/graphql/overview/schema/scalars#categorycode) | Categories of `Product`.                                                                          |

### ProductDeleteAttributeValueTranslationsInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                     | The sku of `Product` the mutation to be performed on. |
| ------------- | -------------------------------------------------------------------- | ----------------------------------------------------- |
| attributeCode | [**AttributeCode!**](/graphql/overview/schema/scalars#attributecode) | The code of `Attribute` deleting value from.          |
| languages     | [**\[Language!\]**](/graphql/overview/schema/scalars#language)       | Languages the translations to be deleted in.          |

### ProductDeleteInput

Input fields:

| sku | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of `Product` the mutation to be performed on. |
| --- | ------------------------------------------------ | ----------------------------------------------------- |

### ProductGroupingAddChildInput

Input fields:

| sku      | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of `Product` the mutation to be performed on. |
| -------- | ------------------------------------------------ | ----------------------------------------------------- |
| childSku | [**Sku!**](/graphql/overview/schema/scalars#sku) | Child to be added.                                    |
| quantity | [**Int**](/graphql/overview/schema/scalars#int)  | Quantity the child to be added in.                    |

### ProductGroupingRemoveChildInput

Input fields:

| sku      | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of `Product` the mutation to be performed on. |
| -------- | ------------------------------------------------ | ----------------------------------------------------- |
| childSku | [**Sku!**](/graphql/overview/schema/scalars#sku) | Child to be removed.                                  |

### ProductGroupingSetChildQuantityInput

Input fields:

| sku      | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of `Product` the mutation to be performed on. |
| -------- | ------------------------------------------------ | ----------------------------------------------------- |
| childSku | [**Sku!**](/graphql/overview/schema/scalars#sku) | Child quantity to be modified.                        |
| quantity | [**Int!**](/graphql/overview/schema/scalars#int) | Quantity to be set.                                   |

### ProductRelationValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**\[Sku!\]!**](/graphql/overview/schema/scalars#sku)     | Translation value to be set.                                                                                                      |

### ProductRemoveCategoriesInput

Input fields:

| sku           | [**Sku!**](/graphql/overview/schema/scalars#sku)                        | The sku of `Product` the mutation to be performed on. |
| ------------- | ----------------------------------------------------------------------- | ----------------------------------------------------- |
| categoryCodes | [**\[CategoryCode!\]!**](/graphql/overview/schema/scalars#categorycode) | Categories to be removed.                             |

### ProductSetStatusInput

Input fields:

| sku        | [**Sku!**](/graphql/overview/schema/scalars#sku)               | The sku of `Product` the mutation to be performed on. |
| ---------- | -------------------------------------------------------------- | ----------------------------------------------------- |
| statusCode | [**StatusCode!**](/graphql/overview/schema/scalars#statuscode) | Status to be set.                                     |
| language   | [**Language!**](/graphql/overview/schema/scalars#language)     | Language the status to be set in.                     |

### ProductSetTemplateInput

Input fields:

| sku      | [**Sku!**](/graphql/overview/schema/scalars#sku)                   | The sku of `Product` the mutation to be performed on. |
| -------- | ------------------------------------------------------------------ | ----------------------------------------------------- |
| template | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode) | Template to be set.                                   |

### ProductVariableAddVariantInput

Input fields:

| sku        | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of `Product` the mutation to be performed on. |
| ---------- | ------------------------------------------------ | ----------------------------------------------------- |
| variantSku | [**Sku!**](/graphql/overview/schema/scalars#sku) | Variant to be added.                                  |

### ProductVariableRemoveVariantInput

Input fields:

| sku        | [**Sku!**](/graphql/overview/schema/scalars#sku) | The sku of `Product` the mutation to be performed on. |
| ---------- | ------------------------------------------------ | ----------------------------------------------------- |
| variantSku | [**Sku!**](/graphql/overview/schema/scalars#sku) | Variant to be removed.                                |

### ProductVariableSetBindingsInput

Input fields:

| sku          | [**Sku!**](/graphql/overview/schema/scalars#sku)                          | The sku of `Product` the mutation to be performed on. |
| ------------ | ------------------------------------------------------------------------- | ----------------------------------------------------- |
| bindingCodes | [**\[AttributeCode!\]!**](/graphql/overview/schema/scalars#attributecode) | Binding attributes to be set.                         |

### SelectValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language)      | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**OptionCode!**](/graphql/overview/schema/scalars#optioncode) | Translation value to be set.                                                                                                      |

### TemplateCreateInput

Input fields:

| code | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode) | Code of `Template`. |
| ---- | ------------------------------------------------------------------ | ------------------- |
| name | [**\[TranslatedStringInput!\]**](#translatedstringinput)           | Name of `Template`. |

### TemplateDeleteInput

Input fields:

| code | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode) | The code of `Template` the mutation to be performed on. |
| ---- | ------------------------------------------------------------------ | ------------------------------------------------------- |

### TemplateSetNameInput

Input fields:

| code | [**TemplateCode!**](/graphql/overview/schema/scalars#templatecode) | The code of `Template` the mutation to be performed on. |
| ---- | ------------------------------------------------------------------ | ------------------------------------------------------- |
| name | [**\[TranslatedStringInput!\]!**](#translatedstringinput)          | Name to be set.                                         |

### TextareaCustomFieldValueTranslationInput

Input fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. |
| -------- | ---------------------------------------------------------- | ---------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)     | Translation value to be set.             |

### TextareaRTECustomFieldValueTranslationInput

Input fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. |
| -------- | ---------------------------------------------------------- | ---------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)     | Translation value to be set.             |

### TextareaValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)    | <p>Translation value to be set.<br>Accepts Attribute Variables in format <code>{{#attribute\_code}}</code>.</p>                   |

### TextCustomFieldValueTranslationInput

Input fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. |
| -------- | ---------------------------------------------------------- | ---------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)     | Translation value to be set.             |

### TextValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)    | Translation value to be set.                                                                                                      |

### TranslatedStringFilterInput

Input fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language the translation to be filtered in. |
| -------- | ---------------------------------------------------------- | ------------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)     | Translation value to be filtered by.        |

### TranslatedStringInput

Input fields:

| language | [**Language!**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. |
| -------- | ---------------------------------------------------------- | ---------------------------------------- |
| value    | [**String!**](/graphql/overview/schema/scalars#string)     | Translation value to be set.             |

### UnitValueTranslationInput

Input fields:

| language | [**Language**](/graphql/overview/schema/scalars#language) | Language the translation to be added in. Allowed empty only in case of [**GLOBAL**](/graphql/overview/schema/enums#global) scope. |
| -------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| value    | [**Float!**](/graphql/overview/schema/scalars#float)      | Translation value to be set.                                                                                                      |


# Enums

Enums represent a predefined sets o values.

### AttributeScope

Represents the behavior of language translation of [**Attribute**](/graphql/overview/schema/interfaces#attribute) values.

Values:

#### LOCAL

Value translation is set individually in every language.

#### GLOBAL

Value translation is the same in every language.

### TwoWayRelation

Represents the behavior of language translation of [**Attribute**](/graphql/overview/schema/interfaces#attribute) values.

Determines the behavior of [ProductRelationAttribute](/graphql/overview/schema/objects#productrelationattribute) value.

Values:

#### None

Do not modify related products.

#### New

Set backward relations to the modified product only in its newly related products. Already related products remain unmodified.

#### All

Set backward relations to the modified product in all its related products.


# Unions

Unions represent possible many types.

### GroupedProductProduct

Represents a product grouped in `GroupingProduct`.

Types:

* [**SimpleProduct**](/graphql/overview/schema/objects#simpleproduct)
* [**VariableProduct**](/graphql/overview/schema/objects#variableproduct)


# Limitations

Limitations for data Queries and Mutations in place to protect against excessive usage of Ergonode servers.

Rate limits are designed to diversify the server traffic and ensure stable operation of all Ergonode servers. The limits are plan-based and counted per minute per entire Tenant.

Scale: 1000 requests/minute

Advance: 400 requests/minute

Free: 100 requests/minute

All older plans (Essential, Start, Start+, Pro) have a limit of 500 requests/minute.

{% hint style="info" %}
GraphQL provides great flexibility for accessing complex PIM data, allowing you to fetch details of multiple resource types in a single request.

We try not to put immoderate API restrictions that would decrease GraphQL possibilities; however, this comes with certain responsibilities on the client.

Occasionally, with large Queries, it is possible to reach server processing limits, as thousands of different objects will be generated as a result. On such an occurrence, it is vital to try to simplify the Query and fetch only required fields or filtered data to reduce the size of the generated response.

A similar case can be encountered with Mutations - it is possible to send a large set in one batch, which may end up in a 504 HTTP error (Gateway Timeout). Some strategies to avoid the issue are discussed in the Batching mutations section of this documentation.
{% endhint %}

Every API response will contain the `Ratelimit-Remaining` header describing the current available limit and `Ratelimit-Limit` defining the overall limit.

On overusage, the API will return HTTP response code 429 - Too Many Requests. The response will contain `Retry-After` header after how many seconds the limit resets.

The API is also limited to 6 concurrent requests per Tenant.

### Media API limits

GraphQL, as a query language by definition, handles text data (JSON format), which means it does not provide Media files (binaries) directly but URLs.

Media API has a separate limitation in place to protect the server's bandwidth. As with the GraphQL API, the limits are plan-based and in place per minute.

Scale: 500 requests/minute

Advance: 200 requests/minute

Free: 50 requests/minute

All older plans have a limit of 250 requests/minute.

#### Media API limits handling

Next to rate limit handling, additional strategies can be applied to improve integration performance.

The API endpoints implement an ETag header.

Every response provides `ETag` HTTP header. This header uniquely represents the response content - a binary file. It allows us to improve API usage - on the following request to the same resource, the API can be prompted with the request HTTP header `If-None-Match` containing an ETag value - if this is the same file as on the previous fetch, the API will return a 304 response (Not Modified), and the client is certain that it has the current Media file version.

Such requests not only allow limiting bandwidth usage and the time needed to process the data but also, on success (304 response code), are not counted towards the usage limits.


# Changelog

The changelog is a list of recent changes to GraphQL API schema.

## 2026-06-30

* `Mutation.templateCreate` added
* `Mutation.templateDelete` added
* `Mutation.templateSetName` added
* `SimpleProduct.isVariant` added

## 2026-06-09

* `Query.unitList` added
* `AttributeCreateNumericInput.unique` added
* `AttributeCreateTextInput.unique` added
* `Template.name` added
* `Section.name` added

## 2026-04-14

* `Multimedia.profiles` added

## 2026-04-07

* `ProductCreateGroupingInput.sku` becomes nullable
* `ProductCreateSimpleInput.sku` becomes nullable
* `ProductCreateVariableInput.sku` becomes nullable
* `NumericAttribute.unique` added
* `TextAttribute.unique` added

## 2026-03-10

* `Multimedia.attributeList` added
* `Query.multimediaAttributeList` added
* `Mutation.multimediaAttributeAddAttribute` added
* `Mutation.multimediaAttributeRemoveAttribute` added
* `Mutation.multimediaAttributeAddAttribute` added
* `Mutation.multimediaDeleteAttributeValueTranslations` added
* `Mutation.multimediaAddAttributeValueTranslationsText` added
* `Mutation.multimediaAddAttributeValueTranslationsTextarea` added
* `Mutation.multimediaAddAttributeValueTranslationsNumeric` added
* `Mutation.multimediaAddAttributeValueTranslationsPrice` added
* `Mutation.multimediaAddAttributeValueTranslationsUnit` added
* `Mutation.multimediaAddAttributeValueTranslationsImage` added
* `Mutation.multimediaAddAttributeValueTranslationsGallery` added
* `Mutation.multimediaAddAttributeValueTranslationsFile` added
* `Mutation.multimediaAddAttributeValueTranslationsProductRelation` added
* `Mutation.multimediaAddAttributeValueTranslationsDate` added
* `Mutation.multimediaAddAttributeValueTranslationsSelect` added
* `Mutation.multimediaAddAttributeValueTranslationsMultiSelect` added

## 2024-11-21

* `Query.productVariantParent` added
* `Product.status` added
* `Mutation.productSetStatus` added

## 2024-10-16

* `Query.productByUniqueAttribute` added

## 2024-07-15

* `ProductAddAttributeValueTranslationsProductRelationInput.twoWayRelation` added

## 2024-06-25

* `Mutation.multimediaFolderDelete` added
* `Query.attributeOptionList` added

## 2024-04-16

* `MultiSelectAttribute.options` removed
* `SelectAttribute.options` removed

## 2024-01-25

* `OptionAttribute.optionList` argument `codes` added
* `Template.sectionList` added
* `Query.section` added
* `Query.sectionList` added
* `Query.template` added

## 2023-12-20

* `OptionAttribute` interface added
* `SelectAttribute` implements `OptionAttribute`
* `MultiSelectAttribute` implements `OptionAttribute`
* `OptionAttribute.customFields` added
* `Option.customFields` added
* `Mutation.attributeOptionAddCustomFieldImage` added
* `Mutation.attributeOptionAddCustomFieldText` added
* `Mutation.attributeOptionAddCustomFieldTextarea` added
* `Mutation.attributeOptionAddCustomFieldTextareaRTE` added
* `Mutation.attributeOptionAddOptionCustomFieldValueTranslationsImage` added
* `Mutation.attributeOptionAddOptionCustomFieldValueTranslationsText` added
* `Mutation.attributeOptionAddOptionCustomFieldValueTranslationsTextarea` added
* `Mutation.attributeOptionAddOptionCustomFieldValueTranslationsTextareaRTE` added
* `Mutation.attributeOptionDeleteCustomField` added
* `Mutation.attributeOptionDeleteOptionCustomFieldValueTranslations` added

## 2023-09-07

* `Query.multimediaFolder` added
* `MultimediaFolderCreateInput.createFolderPath` added
* `MultimediaCreateInput.folderName` removed
* `Mutation.multimediaSetFolder` removed

## 2023-08-23

* `MultiSelectAttribute.optionList` added
* `MultiSelectAttribute.options` becomes deprecated. Use `MultiSelectAttribute.optionList` instead
* `SelectAttribute.optionList` added
* `SelectAttribute.options` becomes deprecated. Use `SelectAttribute.optionList` instead
* `Mutation.attributeMultiSelectAddOption` added
* `Mutation.attributeMultiSelectDeleteOption` added
* `Mutation.attributeMultiSelectSetOptionName` added
* `Mutation.attributeSelectAddOption` added
* `Mutation.attributeSelectDeleteOption` added
* `Mutation.attributeSelectSetOptionName` added
* `Mutation.multimediaReplace` added

## 2023-07-25

* `Query.multimedia` added

## 2023-05-08

* `MultimediaFolder.path` added
* `Mutation.multimediaMove` added
* `Mutation.multimediaFolderCreate` added
* `MultimediaCreateInput.folderPath` added
* `MultimediaCreateInput.folderName` becomes deprecated. If passed together with `folderPath` this argument becomes disregarded
* `Mutation.multimediaSetFolder` becomes deprecated

## 2023-04-17

* `MultiSelectAttributeValueTranslation.translatedValue` added
* `SelectAttributeValueTranslation.translatedValue` added

## 2023-02-28

* `AttributeValue.valueTranslations` removed
* `TextareaAttributeValueTranslation.rawValue` added

## 2023-02-22

* `Attribute.metadata` added
* `Mutation.attributeAddMetadata` added
* `Mutation.attributeDeleteMetadata` added

## 2023-02-14

* `Mutation.multimediaSetFolder` added

## 2022-12-21

* `Query.categoryAttributeList` added
* `Mutation.categoryAttributeAddAttribute` added
* `Mutation.categoryAttributeRemoveAttribute` added

## 2022-12-07

* `Mutation.attributeSetLabel` removed
* `OptionInput.label` removed
* `Option.label` removed
* `Attribute.label` removed
* `label` removed from `Attribute` create mutation input objects
  * `AttributeCreateDateInput`
  * `AttributeCreateFileInput`
  * `AttributeCreateGalleryInput`
  * `AttributeCreateImageInput`
  * `AttributeCreateMultiSelectInput`
  * `AttributeCreateNumericInput`
  * `AttributeCreatePriceInput`
  * `AttributeCreateProductRelationInput`
  * `AttributeCreateSelectInput`
  * `AttributeCreateTextareaInput`
  * `AttributeCreateTextInput`
  * `AttributeCreateUnitInput`

## 2022-11-09

* `Category.attributeList` added
* `Mutation.categoryDeleteAttributeValueTranslations` added
* `Mutation.categoryAddAttributeValueTranslationsText` added
* `Mutation.categoryAddAttributeValueTranslationsTextarea` added
* `Mutation.categoryAddAttributeValueTranslationsNumeric` added
* `Mutation.categoryAddAttributeValueTranslationsPrice` added
* `Mutation.categoryAddAttributeValueTranslationsUnit` added
* `Mutation.categoryAddAttributeValueTranslationsImage` added
* `Mutation.categoryAddAttributeValueTranslationsGallery` added
* `Mutation.categoryAddAttributeValueTranslationsFile` added
* `Mutation.categoryAddAttributeValueTranslationsProductRelation` added
* `Mutation.categoryAddAttributeValueTranslationsDate` added
* `Mutation.categoryAddAttributeValueTranslationsSelect` added
* `Mutation.categoryAddAttributeValueTranslationsMultiSelect` added
* `GroupingProduct.childList` removed
* `Template.name` removed
* `Template.defaultLabel` removed

## 2022-10-19

* `MultimediaCreateInput.folderName` added

## 2022-09-26

* `AttributeValue.translations` added - represents the translation value type per `Attribute` type. `MultiSelectAttributeValue` and `SelectAttributeValue` instead of simple `OptionCode` provides entire `Option`
* `AttributeValue.valueTranslations` becomes deprecated
* `AttributeValue` implementations per `Attribute` type added

## 2022-08-11

* `TranslatedAttributeValue.inherited` removed
* `Query.languageTreeLeafList` removed

## 2022-08-09

* `Template.attributeList` added
* `Query.templateList` added
* `Attribute.name` added - represents the same value as `Attribute.label` field
* `Attribute.label` becomes deprecated
* `Option.name` added - represents the same value as `Option.label` field
* `Option.label` becomes deprecated
* `OptionInput.name` added
  * if passed together with `label` field it takes precedence
* `Mutation.attributeSetName` added
* `Mutation.attributeSetLabel` becomes deprecated
* `name` field added in `Attribute` create mutation input objects. It replaces `label` field. If passed together with it `name` takes precedence
  * `AttributeCreateDateInput`
  * `AttributeCreateFileInput`
  * `AttributeCreateGalleryInput`
  * `AttributeCreateImageInput`
  * `AttributeCreateMultiSelectInput`
  * `AttributeCreateNumericInput`
  * `AttributeCreatePriceInput`
  * `AttributeCreateProductRelationInput`
  * `AttributeCreateSelectInput`
  * `AttributeCreateTextareaInput`
  * `AttributeCreateTextInput`
  * `AttributeCreateUnitInput`

## 2022-08-01

* `Attribute.hint` removed
* `Attribute.placeholder` removed
* `Mutation.attributeSetHint` removed
* `Mutation.attributeSetPlaceholder` removed
* `placeholder` and `hint` fields removed from `Attribute` create mutation input objects
  * `AttributeCreateDateInput`
  * `AttributeCreateFileInput`
  * `AttributeCreateGalleryInput`
  * `AttributeCreateImageInput`
  * `AttributeCreateMultiSelectInput`
  * `AttributeCreateNumericInput`
  * `AttributeCreatePriceInput`
  * `AttributeCreateProductRelationInput`
  * `AttributeCreateSelectInput`
  * `AttributeCreateTextareaInput`
  * `AttributeCreateTextInput`
  * `AttributeCreateUnitInput`

## 2022-07-14

* `Multimedia.title` added
* `Mutation.multimediaSetTitle` added

## 2022-06-09

* `ProductGroupingAddChildInput.quantity` added
* `Mutation.productGroupingSetChildQuantity` added
* `GroupingProduct.childrenList` added
* `GroupingProduct.childList` becomes deprecated
* `Template.name` becomes deprecated
* `Template.defaultLabel` becomes deprecated

## 2022-05-10

* `AttributeValue.code` removed
* `AttributeValue.value` removed
* `Option.attribute` removed

## 2022-05-04

* `TranslatedAttributeValue.inherited` becomes deprecated
* `Query.languageTree` becomes deprecated
* `Query.languageList` added
* `language` field becomes nullable for(valid for global attributes only)
  * `DateValueTranslationInput`
  * `FileValueTranslationInput`
  * `GalleryValueTranslationInput`
  * `ImageValueTranslationInput`
  * `MultiSelectValueTranslationInput`
  * `NumericValueTranslationInput`
  * `PriceValueTranslationInput`
  * `ProductRelationValueTranslationInput`
  * `SelectValueTranslationInput`
  * `TextareaValueTranslationInput`
  * `TextValueTranslationInput`
  * `UnitValueTranslationInput`

## 2022-03-15

* `Attribute.hint` becomes deprecated
* `Attribute.placeholder` becomes deprecated
* `Mutation.attributeSetHint` becomes deprecated
* `Mutation.attributeSetPlaceholder` becomes deprecated

## 2022-01-31

* `Option.attribute` becomes deprecated

## 2022-01-18

* `AttributeValue.valueTranslations` added
* `AttributeValue.value` becomes deprecated

## 2022-01-04

* Mutation schema has been added to the API. For a full list of mutations available use an introspection
  * every existing API key has preserved its read access but did not receive write access. In order to obtain write access create a new key with it


# Breaking changes

The list of recent and upcoming breaking changes

At Ergonode we strive to make your integration process as fluent as possible but from time to time we discover a flaw in the design of the schema or introduce a really cool new feature that is impossible to be provided in a fully-compatible non-breaking way.

In such a situation, we will always aim to not break your integration with the new release and provide you with a transition period of approximately 3-months to adjust your consumer. Every such change shall be communicated in the following list.

## 2023-08-23

Breaking change scheduled for 04-2024

* `MultiSelectAttribute.options` is going to be removed
* `SelectAttribute.options` is going to be removed

## 2023-05-08

Breaking change scheduled for 09-2023

* `MultimediaCreateInput.folderName` is going to be removed
* `Mutation.multimediaSetFolder` is going to be removed

## 2022-09-26

Breaking changes scheduled for 02-2023

* `AttributeValue.valueTranslations` is going to be removed

## 2022-08-09

Breaking changes scheduled for 12-2022

* `Attribute.label` is going to be removed
* `Option.label` is going to be removed
* `OptionInput.label` is going to be removed
* `Mutation.attributeSetLabel` is going to be removed
* `label` field is going to be removed from `Attribute` create mutation input objects
  * `AttributeCreateDateInput`
  * `AttributeCreateFileInput`
  * `AttributeCreateGalleryInput`
  * `AttributeCreateImageInput`
  * `AttributeCreateMultiSelectInput`
  * `AttributeCreateNumericInput`
  * `AttributeCreatePriceInput`
  * `AttributeCreateProductRelationInput`
  * `AttributeCreateSelectInput`
  * `AttributeCreateTextareaInput`
  * `AttributeCreateTextInput`
  * `AttributeCreateUnitInput`

## 2022-06-09

Breaking changes scheduled for 10-2022

* `GroupingProduct.childList` is going to be removed
* `Template.name` is going to be removed
* `Template.defaultLabel` is going to be removed

## 2022-05-04

Breaking changes scheduled for 08-2022

* `TranslatedAttributeValue.inherited` is going to be removed
* `Query.languageTreeLeafList` is going to be removed

## 2022-03-15

Breaking change scheduled for 07-2022

* `Attribute.hint` is going to be removed
* `Attribute.placeholder` is going to be removed
* `Mutation.attributeSetHint` is going to be removed
* `Mutation.attributeSetPlaceholder` is going to be removed
* `placeholder` and `hint` fields are going to be removed from `Attribute` create mutation input objects
  * `AttributeCreateDateInput`
  * `AttributeCreateFileInput`
  * `AttributeCreateGalleryInput`
  * `AttributeCreateImageInput`
  * `AttributeCreateMultiSelectInput`
  * `AttributeCreateNumericInput`
  * `AttributeCreatePriceInput`
  * `AttributeCreateProductRelationInput`
  * `AttributeCreateSelectInput`
  * `AttributeCreateTextareaInput`
  * `AttributeCreateTextInput`
  * `AttributeCreateUnitInput`

## 2022-01-31

Breaking change scheduled for 05-2022

* `Option.attribute` is going to be removed

## 2022-01-18

Breaking change scheduled for 05-2022

* `AttributeValue.value` is going to be removed
* `AttributeValue.code` is going to be removed


# Authentication

GraphQL API requires to be authenticated in order to process requests.

In order to obtain access to API resources, an API key is required to be sent along with the appropriate GraphQL query as an HTTP header - `X-API-KEY`.

{% hint style="info" %}
Keys can be created in Ergonode System Settings in the API keys tab.
{% endhint %}

## Mutations

By default, the API key grants you access to queries, meaning you can only read data. If mutations(write) access is required you need to specify write access on key creation.

## Limiting products catalog with segments

A regular API key provides you with access to the entire product catalog. It is also possible to limit that by assigning a segment while creating the key. If assigned the consumer will only have access to the products available in the specific segment. This also means that, if write access is granted, you'll be able only to modify the data of products available within the segment.

The only exception from that is when the product is created in batch request with further mutations - though possibly not yet part of the segment since you are the creator of it you can modify its data within this request.

{% hint style="info" %}
API keys, due to security reasons, cannot be changed. If you require a different key just generate a new one in Ergonode settings.
{% endhint %}

{% hint style="warning" %}
Segment recalculation is an asynchronous process, therefore, sending mutations in separate requests(create and then update) can fail on update - access can not yet be granted.

The best approach for keys assigned to the segment is to create and update the product in [batch mutation](/graphql/guides/batching-mutations).
{% endhint %}


# Basic query tutorial

Queries in GraphQL are created by opening curly brackets.

```
{

}
```

If we have more than one query, we need to name them and specify that this is the query, we do it as follows.

```graphql
query queryName {

}
```

An example of a simple query that will return the value of "pageInfo" from the "productStream" branch, and from there provide the value of "endCursor". Additionally, from the "productStream" branch, it will return the value "totalCount". Think of it as a tree, a branch, and a leaf. To get information from a leaf, you must first reach it by going through all the steps one by one. Each subsequent indentation must be called using the next curly bracket. Until it's closed, we are constantly working within the same space.

For better understanding, I've stretched the code below to reflect these indents.

```graphql
query queryName {
                productStream {
                                pageInfo {
                                                endCursor
                                }
                                totalCount
                }
}
```

The query can also use arguments. The list of available parameters can be found in the API schema(documentation). Here, we will use the "first" argument.

Without using this argument, the system would return all the data it finds, here we want to limit ourselves to the first 2 results.

```graphql
query queryName {
  productStream (first: 2) {
    pageInfo {
      endCursor
    }
    totalCount
  }
}
```

It is also possible, to refer to the same place with several arguments, in this example we wanted to get the first 2 results and the then results after something.

```graphql
query queryName {
  productStream(first: 2) {
    pageInfo {
      endCursor
    }
    totalCount
  }
  productStream(after: "YXJyYXljb25uZWN0aW9uOjM0Mw==") {
    pageInfo {
      endCursor
    }
    totalCount
  }
}
```

However, the above query will not work without a slight modification. If to a given object we refer more than once, we must use aliases. Below I used two aliases: "firstTwo" and "dataAfter". Remember to use a colon after the alias.

```graphql
query queryName {
  firstTwo: productStream(first: 2) {
    pageInfo {
      endCursor
    }
    totalCount
  }
  dataAfter: productStream(after: "YXJyYXljb25uZWN0aW9uOjM0Mw==") {
    pageInfo {
      endCursor
    }
    totalCount
  }
}
```

{% hint style="info" %}
Remember that in this case, the "after" filter refers to the cursor, which in this case is "YXJyYXljb25uZWN0aW9uOjM0Mw==". In your case, it will be a completely different string.
{% endhint %}

{% hint style="info" %}
Check available cursors with a query:
{% endhint %}

```graphql
query x {
  productStream {
    pageInfo {
      endCursor
    }
  }
}
```

Note that in the query (the previous one, not the one about available cursors) we call the same "totalCount" data 2 times unnecessarily. We can simplify this by using fragments.

The following query will return us exactly the same data as the previous one.

Of course, if I'm querying only one thing, there's no point in throwing it into a fragment.

However, if there were more objects or the query was more complicated, fragments allow us to optimize it.

```graphql
query queryName {
  firstTwo: productStream(first: 2) {
    pageInfo {
      endCursor
    }
    ...fragmentName
  }
  dataAfter: productStream(after: "YXJyYXljb25uZWN0aW9uOjM0Mw==") {
    pageInfo {
      endCursor
    }
    ...fragmentName
  }
}

fragment fragmentName on ProductConnection {
  totalCount
}
```

In GraphQL it is also possible to use variables, variables are usually passed on by programming languages, but for the sake of completeness, I will show you how to use them.

Before the first curly bracket, I open a round bracket and define ( with the $ sign ) a variable named x in it, then I make a colon and a space and define the type of the variable, in this example, it will be Int (Integer). I could be done here, but I still would like to define a default value, so I put an equals sign followed by "2".

Then in the place where the variable should be passed I simply call it bt $x:

```graphql
query queryName ($x: Int = 2) {
  firstTwo: productStream(first: $x) {
    pageInfo {
      endCursor
    }
    ...fragmentName
  }
  dataAfter: productStream(after: "YXJyYXljb25uZWN0aW9uOjM0Mw==") {
    pageInfo {
      endCursor
    }
    ...fragmentName
  }
}

fragment fragmentName on ProductConnection {
  totalCount
}
```

Queries can also use directives. In other words, conditional statements.

I'm going to add a second variable to my query named condition and set its type to Boolean, with the default value true.&#x20;

Then after pageInfo I placed @include(if: $condition) directive.

```graphql
query queryName ($x: Int = 2, $condition: Boolean = true) {
  firstTwo: productStream(first: $x) {
    pageInfo @include(if: $condition) {
      endCursor
    }
    ...fragmentName
  }
  dataAfter: productStream(after: "YXJyYXljb25uZWN0aW9uOjM0Mw==") {
    pageInfo {
      endCursor
    }
    ...fragmentName
  }
}

fragment fragmentName on ProductConnection {
  totalCount
}
```

Since I have previously set the default value of the $condition variable to true, the condition will be met and the data will show up, but if I change it to false, the data will not.

```graphql
query queryName ($x: Int = 2, $condition: Boolean = true) {
  firstTwo: productStream(first: $x) {
    pageInfo @include(if: $condition) {
      endCursor
    }
    ...fragmentName
  }
  dataAfter: productStream(after: "YXJyYXljb25uZWN0aW9uOjM0Mw==") {
    pageInfo {
      endCursor
    }
    ...fragmentName
  }
}

fragment fragmentName on ProductConnection {
  totalCount
}
```


# Batching mutations

API mutations are designed to be very small and atomic on purpose - thanks to that design, you don't have to prefetch data to send it back to the server and worry only about the actual change you want to perform.

On the other hand, occasionally your intention is to create or change resources with data that a single mutation does not handle. GraphQL comes in handy here - thanks to its design you can batch mutations(and queries) which means that multiple operations can be performed in one, single request - this not only makes it easier to make updates but also speeds up operations.

```graphql
mutation {
  create: productCreateSimple(input: {sku: "new_product", templateCode: "template"}) {
    __typename
  }
  assignDescription: productAddAttributeValueTranslationsTextarea(
    input: {
      sku: "new_product"
      attributeCode: "description"
      translations: [{ value: "Long description", language: "en_GB" }]
    }
  ) {
    __typename
  }
  assignShortDescription: productAddAttributeValueTranslationsTextarea(
    input: {
      sku: "new_product"
      attributeCode: "short_description"
      translations: [{ value: "Short description", language: "en_GB" }]
    }
  ) {
    __typename
  }
}
```

{% hint style="info" %}
Batch mutations are executed synchronously which also means their order does matter. You need to create the product first in order to assign values to it.

All mutations in the batch are performed one after another and if one or more fails all the others will still be tried to execute. The batch result will contain requested data from each mutation as well as specific errors which occurred for those which failed.
{% endhint %}

{% hint style="info" %}
Note that each mutation has an alias (`create: (...)`) - which means a custom name is assigned to it.\
Aliasing is required if there are at least two same mutations in one batch - `productAddAttributeValueTranslationsTextarea` in this case - this behavior allows differentiation of the data in the result which in another case would not be possible.

In the above example for simplicity, all mutations have been aliased in the example but it'd also suffice to only alias duplicates.
{% endhint %}

{% hint style="info" %}
As tempting as it may sound to make one update of all data in the system bear in mind the fact of synchronicity of the batch process - it means that the process will last as long as there are some mutations left to be executed.

In practice, it means that too-long running processes are usually more faulty and also it's harder to handle potential errors. In most extreme cases, you can even reach timeout from your HTTP client or the server can drop the handling of the request as it takes too long to process.

A usually recommended approach would be to limit the batch to a single resource(product, attribute, multimedia) or with a similar intention in mind.
{% endhint %}


# Integrating data

Note: the following examples are based on the API Stream integration concept - if you are not yet familiar with it check an overview of the [Query types](/graphql/overview/query-types) to understand the approach.

### A simple example of integrating categories into the system from scratch:

#### Fetch the first page of the Category stream

```graphql
{
  categoryStream(first: 1) {
    pageInfo {
      endCursor
      hasNextPage
    }
    edges {
      node {
        code
        name {
          value
          language
        }
      }
      cursor
    }
  }
}
```

{% hint style="info" %}
`first` parameter put on limit how many categories are fetched in one result
{% endhint %}

example response:

```graphql
{
  "data": {
    "categoryStream": {
      "pageInfo": {
        "endCursor": "YXJyYXljb25uZWN0aW9uOjQ5",
        "hasNextPage": true
      },
      "edges": [
        {
          "node": {
            "code": "category_name_clothing",
            "name": [
              {
                "value": "Clothing",
                "language": "en_GB"
              },
              {
                "value": "Odzież",
                "language": "pl_PL"
              }
            ]
          },
          "cursor": "YXJyYXljb25uZWN0aW9uOjQ5"
        }
      ]
    }
  }
}
```

#### Fetch the next page of the Category stream

Since we received information that the next page exists `data.categoryStream.pageInfo.hasNextPage=true` we should request the next resource. The query is very similar to the previous one except we are passing the appropriate `cursor` with the request:

```graphql
{
  categoryStream(first: 1, after: "YXJyYXljb25uZWN0aW9uOjQ5") {
    ...
}
```

{% hint style="info" %}
`after` parameter represents the appropriate cursor that identifies a last-fetched resource. Available as either `cursor` field of the node or the `endCursor` of `PageInfo` object.
{% endhint %}

example response:

```graphql
{
  "data": {
    "categoryStream": {
      "pageInfo": {
        "endCursor": "YXJyYXljb25uZWN0aW9uOjUw",
        "hasNextPage": false
      }
      ...
    }
  }
}
```

we do know that there is no next page, therefore, there is nothing to fetch at the very moment. We can retry the next request(for the retrieved cursor) with i.e., an increased interval not to waste resources.

### &#x20;A more complex example of integrating categories

Alternatively in some systems, we will want only to fetch the identifier of the resource using some sort of queueing system in order to distribute the consumption processes. In that case, we can just fetch our resource ID (code in the case of categories) and the `PageInfo` object:

```graphql
{
  categoryStream(first: 1) {
    pageInfo {
      endCursor
      hasNextPage
    }
    edges {
      node {
        code
      }
    }
  }
}
```

and fetch it in the separate consuming process via a single resource query:

```graphql
{
  category(code: "category_name_clothing") {
    name {
      value
      language
    }
    code
  }
}
```

The rest of the process looks the same for the paginating over the stream.

{% hint style="info" %}
Though given above content provides an example of handling categories you can use the same approach for every other resource available via streams like products, multimedia, and attributes.
{% endhint %}


# Best Practices

## 1. Batch Size Recommendations

* Keep batches to a maximum of 50 mutations to avoid timeouts.
* Instead of one large batch with 50+ mutations, split into smaller batches of mutations each.

```graphql
mutation SmallBatch1 {
  op1: productCreateSimple(input: {...}) { __typename }
  op2: productCreateSimple(input: {...}) { __typename }
  op3: productCreateSimple(input: {...}) { __typename }
  op4: productCreateSimple(input: {...}) { __typename }
  op5: productCreateSimple(input: {...}) { __typename }
}
mutation SmallBatch2 {
  op6: productCreateSimple(input: {...}) { __typename }
  op7: productCreateSimple(input: {...}) { __typename }
  # ... continue with next batch
}
```

* Focus on single resource operations per batch.

```graphql
mutation BatchedMutations {
  create: productCreateSimple(
    input: {sku: "new_product", templateCode: "template"}
  ) {
    __typename
  }
  assignDescription: productAddAttributeValueTranslationsTextarea(
    input: {sku: "new_product", attributeCode: "description", translations: [{value: "Long description", language: "en_GB"}]}
  ) {
    __typename
  }
  assignShortDescription: productAddAttributeValueTranslationsTextarea(
    input: {sku: "new_product", attributeCode: "short_description", translations: [{value: "Short description", language: "en_GB"}]}
  ) {
    __typename
  }
}
```

* Consider the synchronous execution nature.

## 2. Error Handling Strategy

* Each mutation in a batch can succeed/fail independently, with code 200 - read responses for error information.
* Use \_\_typename for minimal successful response validation.
* Implement retry logic for failed operations.

## 3. Aliasing for Duplicate Mutations

```graphql
mutation {
  first: productAddAttributeValueTranslationsText(input: {...}) { __typename }
  second: productAddAttributeValueTranslationsText(input: {...}) { __typename }
  # Aliases required for duplicate mutation types
}
```

## 4. Efficient Data Flow

* Use streams for bulk data reading.

```graphql
query {
  productStream(first: 50, after:"<endCursor>") {
    pageInfo {
      hasNextPage
      endCursor
    }
    edges {
      node {
        sku
        attributeList {
          edges {
            node {
              attribute {
                code
              }
            }
          }
        }
      }
    }
  }
}
```

* Minimize response payload size.
* Leverage cursor-based pagination.

## 5. Input Object Optimization

* Structure your input objects efficiently by grouping related fields.

```graphql
mutation OptimizedAttributeAssignment {
  assignText: productAddAttributeValueTranslationsText(input: {
    sku: "product_sku"
    attributeCode: "name"
    translations: [
      {value: "English Name", language: "en_GB"},
      {value: "Polish Name", language: "pl_PL"},
      {value: "German Name", language: "de_DE"}
    ]
  }) {
    __typename
  }
}
```

## 6. API Keys

### Securing Ergonode PIM API Keys

<table data-full-width="false"><thead><tr><th width="146.2265625" align="center">Area</th><th align="center">Best practice</th><th align="center">Why it matters</th><th align="center">How to implement</th></tr></thead><tbody><tr><td align="center">Secret storage</td><td align="center">Use environment variables or a managed secrets manager</td><td align="center">Prevents leaks from code/repos and enables RBAC, audit, and encryption</td><td align="center">Inject ERGONODE_API_KEY at runtime from AWS Secrets Manager, GCP Secret Manager, Azure Key Vault, or Vault; never commit .env files</td></tr><tr><td align="center">No hardcoding</td><td align="center">Never embed keys in code, front-end, mobile, or docs</td><td align="center">Hardcoded keys are easily leaked via repos, builds, or source maps</td><td align="center">Enable secret scanners in CI and pre-commit; block pushes with detected patterns; review historical commits periodical</td></tr><tr><td align="center">Least privilege</td><td align="center">Scope keys per environment and integration with minimal permissions</td><td align="center">Limits blast radius and reduces misuse risk</td><td align="center">Separate keys for dev/stage/prod and for ERP sync, ecommerce export, DAM/analytics; prefer read-only for exports</td></tr><tr><td align="center">Network restrictions</td><td align="center">Restrict by IP/VPC/hostname where supported</td><td align="center">Stops use from unexpected networks</td><td align="center">Allowlist egress IPs of integration services or gateways calling Ergonode</td></tr><tr><td align="center">Server-side usage</td><td align="center">Keep keys off client devices and browsers</td><td align="center">Client apps are untrusted; keys can be extracted</td><td align="center">Use a backend/edge proxy to call Ergonode; clients receive only necessary data</td></tr><tr><td align="center">Encryption</td><td align="center">Enforce TLS and encrypt at rest (including backups)</td><td align="center">Protects keys in transit and storage</td><td align="center">HTTPS-only to Ergonode; use KMS-backed secret stores and encrypted volumes/backups</td></tr><tr><td align="center">Centralization &#x26; ownership</td><td align="center">Single source of truth with clear ownership</td><td align="center">Avoids duplication, drift, and orphaned secrets</td><td align="center">Maintain a key inventory: owner, purpose, scope, environment, creation/expiry</td></tr><tr><td align="center">Secret scanning</td><td align="center">Continuous scanning of code, logs, artifacts</td><td align="center">Finds leaks quickly</td><td align="center">Scan repos, containers, CI logs, tickets; treat any external appearance as compromise</td></tr><tr><td align="center">RBAC &#x26; audits</td><td align="center">Role-based access and regular reviews</td><td align="center">Prevents unauthorized access; removes stale keys</td><td align="center">Quarterly reviews; disable unused keys; least-privilege access to read/rotate secrets</td></tr><tr><td align="center">Logging hygiene</td><td align="center">Mask secrets in logs and traces</td><td align="center">Prevents secondary leaks</td><td align="center">Redact ERGONODE_API_KEY in app/CI logs; sanitize error payloads</td></tr></tbody></table>

### Revocation (when a key may be compromised)

<table><thead><tr><th width="143.0546875" align="center">Step</th><th align="center">Action</th><th align="center">Goal</th><th align="center">Notes</th></tr></thead><tbody><tr><td align="center">Immediate control</td><td align="center">Disable/revoke the key ASAP</td><td align="center">Stop further misuse</td><td align="center">If disable is delayed, tighten scope, IP allowlists, and quotas temporarily</td></tr><tr><td align="center">Replacement</td><td align="center">Issue a new key and distribute securely</td><td align="center">Maintain availability</td><td align="center">Update secret manager; roll out to all services; verify traffic before final revoke</td></tr><tr><td align="center">Investigation</td><td align="center">Identify exposure vector</td><td align="center">Prevent recurrence</td><td align="center">Check repos, CI/CD, artifacts, screenshots, tickets, tracing/logs, container layers</td></tr><tr><td align="center">Communication</td><td align="center">Notify stakeholders and document</td><td align="center">Coordinated response</td><td align="center">Share migration steps, timelines; capture root cause and corrective actions</td></tr></tbody></table>

### Rotation (regular, safe key changes)

<table><thead><tr><th width="127.453125" align="center">Practice</th><th align="center">Action</th><th align="center">Benefit</th><th align="center">Implementation tips</th></tr></thead><tbody><tr><td align="center">Policy</td><td align="center">Rotate on schedule (e.g., 60–90 days) and on events</td><td align="center">Limits lifetime of leaked keys</td><td align="center">Shorter lifetimes for write/high-privilege keys</td></tr><tr><td align="center">Dual-key overlap</td><td align="center">Support new+old keys during rollout</td><td align="center">Zero/minimal downtime</td><td align="center">Add new key, update consumers, validate, then retire old key</td></tr><tr><td align="center">Drills</td><td align="center">Test rotation in staging</td><td align="center">Confidence and speed</td><td align="center">Run periodic game days; verify end-to-end behavior</td></tr></tbody></table>

By combining strict key handling (no hardcoding), managed secret storage, environment and integration scoping, continuous monitoring, and disciplined revocation/rotation, Ergonode customers can protect product data, sustain uptime, and minimize the blast radius of any credential exposure.<br>

## **7. Strategies for Handling Rate Limits**

Effective rate-limit handling ensures reliability and fairness when integrating with APIs. Below are pragmatic strategies to keep traffic smooth and resilient.

### Exponential Backoff with Jitter

* **What it is**: On receiving rate-limit responses (e.g., 429), retry after increasing delays: baseDelay × 2^attempt, plus random jitter.
* **Why it works**: Spreads retries across time, avoiding thundering herds and synchronized spikes.
* **How to implement**:
  * Use capped backoff (e.g., max 60s) and a max attempts threshold.
  * Prefer “full jitter” (random between 0 and current backoff) to reduce contention.

### Queueing Requests

* **What it is**: Buffer requests and release them at a controlled pace aligned with known limits.
* **Why it works**: Smooths bursts, keeps within quotas, and avoids unnecessary failures.
* **How to implement**:
  * Use per-integration queues (stage/prod) to isolate traffic.
  * Enforce concurrency caps so parallel workers don’t exceed limits collectively.

### Combining Backoff and Queues

* **Queue first**; if the API still returns 429 or 503, apply exponential backoff with jitter.
* **Add circuit breakers**: temporarily halt dispatch if repeated rate-limit errors occur, then probe with a small number of requests.

### Adaptive Throttling

* Continuously measure success rates and latency.
* Increase send rate cautiously when error rates are low; decrease aggressively on 429/5xx spikes.
* Apply exponential decay to recent failures to react quickly.

### Stronger Retry Policy and Control

* Separate retry classes by failure domain:
  * Transport-level: DNS/TLS/connect timeouts, socket errors → retry with jitter.
  * HTTP-level: 429/503 honor Retry-After; 5xx apply jitter; 4xx no retry (except 409 on rare idempotent writes, if applicable).
  * GraphQL-level: retry only specific transient codes (RATE\_LIMITED/TIMEOUT/SERVICE\_UNAVAILABLE/INTERNAL\_ERROR/THROTTLED or extensions.retriable=true).
* Add retry budget per-call and per-process:
  * Keep max\_attempts, but also enforce a per-call deadline and a global budget to prevent retry storms.
* Include a circuit breaker:
  * If the failure ratio exceeds a threshold over a small rolling window (e.g., 50% 429/5xx in the last 20 attempts), open the breaker for a cool-off period, then half-open with probes.

By combining controlled queuing, adaptive throttling, jittered backoff, and strong observability, integrations stay within limits while maximizing throughput and reliability.

## 8. Schema-Aware Pre-Validation and Introspection Caching

* Pre-flight validation:
  * Validate that mutation/query names exist against a cached introspection schema at startup. This avoids GRAPHQL\_ERROR in hot paths (typos like productCreatdeSimple).
* Introspection cache:
  * Cache the schema and refresh periodically or on a rolling schedule.
  * Optionally add a linter for common pitfalls: required variables missing, wrong scalar names, max first exceeded, and alias missing for duplicates.
* Version pinning:
  * Snapshot the schema hash/version at deploy-time. If it changes at runtime (breaking updates), surface alerts.

## 9. Understanding and Avoiding the N+1 Problem in GraphQL

The N+1 problem is a performance pitfall that can make integrations slow and unpredictable, especially when fetching related data at scale. This guide explains the issue in practical terms and offers concrete best practices tailored for Ergonode PIM customers using the GraphQL API.

### What is the N+1 Problem? <a href="#what-is-the-n1-problem" id="what-is-the-n1-problem"></a>

* In plain terms, one request asks for a list of items (the “1”), and then the same request implicitly triggers one additional request for each item in the list (the “N”). The total work grows with the number of items retrieved.
* Example scenario: requesting a list of products and, for each product, requesting multiple related fields (e.g., attributes, categories, multimedia). If the integration retrieves these related pieces one-by-one per product, total work scales linearly with the list size, increasing latency and resource usage.

### Why it matters for Ergonode customers <a href="#why-it-matters-for-ergonode-customers" id="why-it-matters-for-ergonode-customers"></a>

* Slower syncs and exports: large product or attribute lists combined with deeply nested fields can cause long-running jobs.
* Unpredictable performance: the same query may be fast for small result sets and slow for larger ones.
* Higher operational costs: inefficient access patterns increase request counts and processing time in the integration infrastructure.
* User impact: storefronts, channels, or downstream systems, depending on timely updates, may experience delays.

### Recognizing N+1 in your integration <a href="#recognizing-n1-in-your-integration" id="recognizing-n1-in-your-integration"></a>

* Latency grows roughly with the number of items requested (doubling the list doubles the duration).
* Logs show repeated, similar data retrieval steps per item (e.g., identical lookups for related data across all products).
* Deeply nested selections on large lists produce inconsistent run times, especially when not using pagination.

### Best practices to avoid the N+1 problem <a href="#best-practices-to-avoid-the-n1-problem" id="best-practices-to-avoid-the-n1-problem"></a>

* Prefer stream-based pagination and sensible page sizes.
* Use stream queries (e.g., productStream, attributeStream, categoryStream) with first and after.
* Keep page sizes reasonable (often 50–100, per resource limits) to cap work per request.
* Always iterate using pageInfo.hasNextPage and pageInfo.endCursor to continue efficiently.

### Request only what is needed

* Select only the fields required for the use case.
* Avoid pulling heavy subtrees (e.g., large attribute lists, complete multimedia details) when not strictly necessary.

### Flatten data access where possible

* Prefer connection fields that already surface data in a list-friendly way (e.g., attributeList, variantList).
* If a workflow needs multiple related pieces, try grouping them in a single, well-structured selection per page rather than repeating similar selections across multiple small calls.

### Use batching in mutation workflows

* When updating data, batch related mutations for a single resource into one request, and keep batches focused (order matters).
* Limit batch size (aim ≤50) to reduce timeouts and make error handling predictable.
* Use aliases for duplicate mutation types to keep results clear and avoid collisions.

### Keep nested depth under control

* Avoid deep nesting over large lists. Instead of requesting many secondary lists under each product in one go, break the work into phased steps:
  * Step 1: fetch products with essential fields.
  * Step 2: for only those requiring updates, fetch specific related slices (e.g., attributes for a shortlist of SKUs).
* This keeps each request predictable and bounded.

### Leverage targeted queries for expensive fields

* If only a subset of items needs heavy data (e.g., galleries, large attribute sets), isolate that into a dedicated query for those items, not for every item on every page.
* Use codes/skus captured from the stream page to drive targeted follow-ups.

### Embrace idempotent, repeatable workflows

* Design integration steps so they can safely repeat without duplicating work, enabling confident retries with smaller, more efficient selections.
* This reduces the temptation to “fetch everything everywhere” in one pass.

### Monitor and tune

* Track average and p95/p99 durations per operation type and page size.
* Watch for depth and breadth in selections that creep up over time (e.g., new fields added to a shared fragment).
* Adjust page sizes and split queries when p95 grows.

### Practical patterns for use cases <a href="#practical-patterns-for-ergonode-use-cases" id="practical-patterns-for-ergonode-use-cases"></a>

* Continuous catalog sync:
  * Use productStream with a moderate first.
  * Select essential identifiers.
  * Run a targeted query to fetch the specific attributes or media required by the downstream system.
* Attribute-driven exports:
  * Iterate attributeStream; avoid requesting full option details unless needed.
  * If options or translations are required, fetch them for the subset of attributes referenced by the current job.
* Multimedia usage:
  * Do not fetch full multimedia objects for every product by default.
  * Resolve multimedia details only when an item requires them (e.g., newly added or updated images).

### Red flags to avoid <a href="#red-flags-to-avoid" id="red-flags-to-avoid"></a>

* Selecting the full attributeList for every product in a large page when only a few attributes are actually needed.
* Fetching full multimedia details for all products, regardless of whether the images have changed.
* Deep nested fields under large lists without pagination at each level.

### A simple decision checklist <a href="#a-simple-decision-checklist" id="a-simple-decision-checklist"></a>

* Is the selection pulling large nested data for every item? If yes, try splitting into phases.
* Can the result be paginated at the top level? If not, can the nested lists be paginated or reduced?
* Are only a few fields truly needed? Remove or defer the rest.
* Does each page’s work look proportional and bounded? If not, lower first or split the query.

By structuring queries around streams and pagination, limiting nested selections, and targeting detailed lookups only when necessary, Ergonode customers can avoid the N+1 problem and keep integrations fast, reliable, and cost-effective.


# List of products with attributes and they values in product stream

This is how you can get a list of products with ALL attribute types, if you do not need all of them, simply remove any fragment that is not needed

```graphql
query {
	productStream {
		pageInfo {
			hasNextPage
			endCursor
		}
		edges {
			node {
				sku
				attributeList {
					edges {
						node {
							...AttributeValue
						}
					}
				}
			}
		}
	}
}

fragment AttributeValue on AttributeValue {
	__typename
	attribute {
		code
		name {
			language
			value
		}
	}
	... on TextAttributeValue {
		textAttributeValueTranslations: translations {
			value
			language
		}
	}
	... on TextareaAttributeValue {
		textareaAttributeValueTranslations: translations {
			value
			language
		}
	}
	... on DateAttributeValue {
		dateAttributeValueTranslations: translations {
			value
			language
		}
	}
	... on UnitAttributeValue {
		unitAttribute: attribute {
			# unit might be useful in the value context
			unit {
				name
				symbol
			}
		}
		unitAttributeValueTranslations: translations {
			value
			language
		}
	}
	... on PriceAttributeValue {
		priceAttribute: attribute {
			# currency might be useful in the price context
			currency
		}
		priceAttributeValueTranslations: translations {
			value
			language
		}
	}
	... on NumberAttributeValue {
		numericAttributeValueTranslations: translations {
			value
			language
		}
	}
	... on ProductRelationAttributeValue {
		productRelationAttributeValueTranslations: translations {
			value {
				sku
			}
			language
		}
	}
	... on FileAttributeValue {
		fileAttributeValueTranslations: translations {
			value {
				...Multimedia
			}
			language
		}
	}
	... on GalleryAttributeValue {
		galleryAttributeValueTranslations: translations {
			value {
				...Multimedia
			}
			language
		}
	}
	... on ImageAttributeValue {
		imageAttributeValueTranslations: translations {
			value {
				...Multimedia
			}
			language
		}
	}
	... on MultiSelectAttributeValue {
		multiSelectAttributeValueTranslations: translations {
			translatedValue {
				...OptionTranslatedValue
			}
			language
		}
	}
	... on SelectAttributeValue {
		selectAttributeValueTranslations: translations {
			translatedValue {
				...OptionTranslatedValue
			}
			language
		}
	}
}
fragment Multimedia on Multimedia {
	path
	name
	extension
	mime
	size
	alt {
		value
		language
	}
	title {
		value
		language
	}
	url
}
fragment OptionTranslatedValue on OptionTranslatedValue {
	code
	name
	customFields {
		... on ImageCustomFieldTranslatedValue {
			customField {
				code
			}
			image: value {
				path
				name
				extension
				mime
				size
				alt {
					language
					value
				}
				title {
					language
					value
				}
				url
				folder {
					name
					path
				}
			}
		}
		... on TextCustomFieldTranslatedValue {
			customField {
				code
			}
			value
		}
		... on TextareaCustomFieldTranslatedValue {
			customField {
				code
			}
			value
		}
		... on TextareaRTECustomFieldTranslatedValue {
			customField {
				code
			}
			value
		}
	}
}

```


# Get information about specific product and specific attribute values in specific language

This is an example of how you can get values of specific attributes in specific languages of a specific product using pagination.

Please keep in mind that this is just an example and more data can be pulled. How to deal with other attribute types can be seen in the fragment AttributeValue [here](https://docs.ergonode.com/v/graphql-api/query-examples/list-of-products-with-attributes-and-they-values-in-product-stream).

{% tabs %}
{% tab title="Query" %}
{% code fullWidth="true" %}

```graphql
query getAttValues {
    product(sku: "0123456789") {
        # SKU of a single product to get data from
        sku
        createdAt
        editedAt
        template {
            code
        }
        attributeList(
            first: 10 # nuber of entries to return in a single page (max response time is 60s)
            after: "YXJyYXljb25uZWN0aW9uOjA=" # endCursor from the response to get rest of the data if "hasNextPage": true
            codes: [
                # attributes to get values from
                "name"
                "color"
                "short_description"
                "price_local_eur"
                "galeria_zdjec"
            ]
        ) {
            ... on AttributeValueConnection {
                pageInfo {
                    hasNextPage
                    endCursor
                }
                edges {
                    node {
                        ... on PriceAttributeValue {
                            priceAttribute: attribute {
                                # currency might be useful in the price context
                                currency
                            }
                            priceAttributeValue: translations(
                                languages: ["en_GB", "pl_PL"]
                            ) {
                                language
                                value
                            }
                        }
                        ... on SelectAttributeValue {
                            SelectAttributeValue: translations(
                                languages: ["en_GB", "pl_PL"]
                            ) {
                                language
                                translatedValue {
                                    ...OptionTranslatedValue
                                }
                            }
                        }
                        ... on TextAttributeValue {
                            attribute {
                                name(languages: ["en_GB", "pl_PL"]) {
                                    language
                                    value
                                }
                            }
                            TextAttributeValue: translations(
                                languages: ["en_GB", "pl_PL"]
                            ) {
                                language
                                value
                            }
                        }
                        ... on TextareaAttributeValue {
                            attribute {
                                name(languages: ["en_GB", "pl_PL"]) {
                                    language
                                    value
                                }
                            }
                            TextareaAttributeValue: translations(
                                languages: ["en_GB", "pl_PL"]
                            ) {
                                language
                                value
                            }
                        }
                        ... on GalleryAttributeValue {
                            GalleryAttributeValue: translations {
                                language
                                value {
                                    ...Multimedia
                                }
                            }
                        }
                    }
                }
            }
        }
        __typename
    }
}

fragment Multimedia on Multimedia {
    path
    name
    extension
    mime
    sizeInBytes: size
    alt(languages: ["en_GB", "pl_PL"]) {
        language
        value
    }
    title(languages: ["en_GB", "pl_PL"]) {
        language
        value
    }
}
fragment OptionTranslatedValue on OptionTranslatedValue {
    code
    name
}

```

{% endcode %}
{% endtab %}

{% tab title="Response" %}

```json
{
    "data": {
        "product": {
            "sku": "0123456789",
            "createdAt": "2024-04-04T11:44:54+00:00",
            "editedAt": "2024-04-04T13:33:46+00:00",
            "template": {
                "code": "GraphQL"
            },
            "attributeList": {
                "pageInfo": {
                    "hasNextPage": false,
                    "endCursor": "YXJyYXljb25uZWN0aW9uOjQ="
                },
                "edges": [
                    {
                        "node": {
                            "SelectAttributeValue": [
                                {
                                    "language": "en_GB",
                                    "translatedValue": {
                                        "code": "blk",
                                        "name": "Black"
                                    }
                                },
                                {
                                    "language": "pl_PL",
                                    "translatedValue": {
                                        "code": "blk",
                                        "name": "Czarny"
                                    }
                                }
                            ]
                        }
                    },
                    {
                        "node": {
                            "attribute": {
                                "name": [
                                    {
                                        "language": "en_GB",
                                        "value": "Short description"
                                    },
                                    {
                                        "language": "pl_PL",
                                        "value": "Krótki opis"
                                    }
                                ]
                            },
                            "TextareaAttributeValue": [
                                {
                                    "language": "en_GB",
                                    "value": "Short countertop description"
                                },
                                {
                                    "language": "pl_PL",
                                    "value": "Krótki opis blatu"
                                }
                            ]
                        }
                    },
                    {
                        "node": {
                            "priceAttribute": {
                                "currency": "EUR"
                            },
                            "priceAttributeValue": [
                                {
                                    "language": "en_GB",
                                    "value": 10.1
                                },
                                {
                                    "language": "pl_PL",
                                    "value": 9.99
                                }
                            ]
                        }
                    },
                    {
                        "node": {
                            "GalleryAttributeValue": [
                                {
                                    "language": "en_GB",
                                    "value": [
                                        {
                                            "path": "semir-beige-kapinos-stopnica-narozna-33x33-g1.webp",
                                            "name": "semir-beige-kapinos-stopnica-narozna-33x33-g1.webp",
                                            "extension": "webp",
                                            "mime": "image\/webp",
                                            "sizeInBytes": 46116,
                                            "alt": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ],
                                            "title": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ]
                                        },
                                        {
                                            "path": "ILARIO_Beige_stopnica_narozna_kapinos_330x330_3D@2x.webp",
                                            "name": "ILARIO_Beige_stopnica_narozna_kapinos_330x330_3D@2x.webp",
                                            "extension": "webp",
                                            "mime": "image\/webp",
                                            "sizeInBytes": 158884,
                                            "alt": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ],
                                            "title": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "language": "pl_PL",
                                    "value": [
                                        {
                                            "path": "semir-beige-kapinos-stopnica-narozna-33x33-g1.webp",
                                            "name": "semir-beige-kapinos-stopnica-narozna-33x33-g1.webp",
                                            "extension": "webp",
                                            "mime": "image\/webp",
                                            "sizeInBytes": 46116,
                                            "alt": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ],
                                            "title": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ]
                                        },
                                        {
                                            "path": "ILARIO_Beige_stopnica_narozna_kapinos_330x330_3D@2x.webp",
                                            "name": "ILARIO_Beige_stopnica_narozna_kapinos_330x330_3D@2x.webp",
                                            "extension": "webp",
                                            "mime": "image\/webp",
                                            "sizeInBytes": 158884,
                                            "alt": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ],
                                            "title": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ]
                                        }
                                    ]
                                },
                                {
                                    "language": "de_DE",
                                    "value": [
                                        {
                                            "path": "semir-beige-kapinos-stopnica-narozna-33x33-g1.webp",
                                            "name": "semir-beige-kapinos-stopnica-narozna-33x33-g1.webp",
                                            "extension": "webp",
                                            "mime": "image\/webp",
                                            "sizeInBytes": 46116,
                                            "alt": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ],
                                            "title": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ]
                                        },
                                        {
                                            "path": "ILARIO_Beige_stopnica_narozna_kapinos_330x330_3D@2x.webp",
                                            "name": "ILARIO_Beige_stopnica_narozna_kapinos_330x330_3D@2x.webp",
                                            "extension": "webp",
                                            "mime": "image\/webp",
                                            "sizeInBytes": 158884,
                                            "alt": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ],
                                            "title": [
                                                {
                                                    "language": "en_GB",
                                                    "value": null
                                                },
                                                {
                                                    "language": "pl_PL",
                                                    "value": null
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    }
                ]
            },
            "__typename": "SimpleProduct"
        }
    }
}
```

{% endtab %}
{% endtabs %}


# List of 100 grouped products with simple and variable products in stream

This will allow you to get list of first 100 product no matter if they're simple or variable.

{% hint style="info" %}
By default, the query would return the first 50 products if no "first" argument is used.
{% endhint %}

{% hint style="info" %}
Please remember that the limit for "first" is 200
{% endhint %}

```graphql
query groupingProduct {
  productStream(first: 100) {
    ...ProductConnection
    edges {
      node {
        ... on GroupingProduct {
          ...Product
          childrenList {
            pageInfo {
              hasNextPage
              endCursor
            }
            edges {
              node {
                quantity
                product {
                  ...SimpleProduct
                  ...VariableProduct
                }
              }
            }
          }
        }
        template {
          code
        }
      }
    }
  }
}

fragment SimpleProduct on SimpleProduct {
  ...Product
  attributeList {
    ...AttributeValueConnection
  }
}

fragment VariableProduct on VariableProduct {
  ...Product
  attributeList {
    ...AttributeValueConnection
  }
  bindings {
    ...Attribute
    optionList(first: 10, after: "") {
      edges {
        node {
          code
          customFields {
            customField {
              code
            }
          }
          name(languages: ["en_US"]) {
            value
            language
          }
        }
      }
    }
  }
  variantList {
    ...ProductConnection
  }
}

fragment AttributeValueConnection on AttributeValueConnection {
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      attribute {
        ...Attribute
      }
      translations {
        language
      }
    }
  }
}

fragment Attribute on Attribute {
  code
  name(languages: ["en_US"]) {
    value
    language
  }
  scope
}

fragment Product on Product {
  __typename
  sku
  createdAt
  editedAt
}

fragment ProductConnection on ProductConnection {
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      ...Product
    }
  }
}
```


# List of grouped products with simple and variable products AFTER some end cursor

This is how you can get data after some cursor via API.

{% hint style="info" %}
This approach can be helpful if you do not use the "first" argument or records in a stream that exceeded 200.
{% endhint %}

{% hint style="info" %}
Please take note that the cursor is a string, therefore needs to be put in quotes.
{% endhint %}

{% hint style="info" %}
To understand what streams and cursors are, please refer to the "Query types" article in the "Overview" section on this page.
{% endhint %}

```graphql
query groupingProduct {
  productStream(after: "YXJyYXljb25uZWN0aW9uOjM2MTE=") {
    ...ProductConnection
    edges {
      node {
        ... on GroupingProduct {
          ...Product
          childrenList {
            pageInfo {
              hasNextPage
              endCursor
            }
            edges {
              node {
                quantity
                product {
                  ...SimpleProduct
                  ...VariableProduct
                }
              }
            }
          }
        }
        template {
          code
        }
      }
    }
  }
}

fragment SimpleProduct on SimpleProduct {
  ...Product
  attributeList {
    ...AttributeValueConnection
  }
}

fragment VariableProduct on VariableProduct {
  ...Product
  attributeList {
    ...AttributeValueConnection
  }
  bindings {
    ...Attribute
    optionList(first: 10) {
      edges {
        node {
          code
          name(languages: ["en_US"]) {
            value
            language
          }
        }
      }
    }
  }
  variantList {
    ...ProductConnection
  }
}

fragment AttributeValueConnection on AttributeValueConnection {
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      attribute {
        ...Attribute
      }
      translations {
        language
      }
    }
  }
}

fragment Attribute on Attribute {
  code
  name(languages: ["en_US"]) {
    value
    language
  }
  scope
}

fragment Product on Product {
  __typename
  sku
  createdAt
  editedAt
}

fragment ProductConnection on ProductConnection {
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      ...Product
    }
  }
}
```

{% hint style="info" %}
It's also possible to use both "after" and "first" arguments in one query. Example below will return 100 records (if they exist), that are after endCursor in productStream.
{% endhint %}

```graphql
query groupingProduct {
  productStream(after: "YXJyYXljb25uZWN0aW9uOjM2MTE=", first: 100) {
    ... ProductConnection
    edges {
      node {
        ... on GroupingProduct {
          ... Product
          childrenList {
            pageInfo {
              hasNextPage
              endCursor
            }
            edges {
              node {
                quantity
                product {
                  ... SimpleProduct
                  ... VariableProduct
                }
              }
            }
          }
        }
        template {
          code
        }
      }
    }
  }
}

fragment SimpleProduct on SimpleProduct {
  ... Product
  attributeList {
    ... AttributeValueConnection
  }
}

fragment VariableProduct on VariableProduct {
  ... Product
  attributeList {
    ... AttributeValueConnection
  }
  bindings {
    ... Attribute
    options {
      code
      name {
        value
        language
      }
    }
  }
  variantList {
    ... ProductConnection
  }
}

fragment AttributeValueConnection on AttributeValueConnection {
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      attribute {
        ... Attribute
      }
      translations {
        language
      }
    }
  }
}

fragment Attribute on Attribute {
  code
  name {
    value
    language
  }
  scope
}

fragment Product on Product {
  __typename
  sku
  createdAt
  editedAt
}

fragment ProductConnection on ProductConnection {
  pageInfo {
    hasNextPage
    endCursor
  }
  edges {
    node {
      ... Product
    }
  }
}
```


# List of active languages

```graphql
query {
  languageList {
    edges {
      node
    }
  }
}
```


# List of templates with attributes

```graphql
query {
  templateList {
    pageInfo {
      hasNextPage
      endCursor
    }
    edges {
      node {
        code
        attributeList {
          edges {
            node {
              scope
              code
              name {
                value
                language
              }
            }
          }
        }
      }
    }
  }
}
```


# List of all multimedia in stream

This query will return all multimedia in PIM and extra info about them.

```graphql
query multimedia {
  multimediaStream {
    pageInfo {
      hasNextPage
      endCursor
    }
    edges {
      __typename
      node {
        name
        path
        alt {
          value
          language
        }
        extension
        mime
        size
        folder {
          name
        }
        url
      }
    }
  }
}
```


# List of product relations for a specific product

{% hint style="info" %}
In this example, we're using a specific product with SKU47.

For your query please use your own.
{% endhint %}

```graphql
query productRelation {
  product(sku: "001") {
    sku
    createdAt
    editedAt
    attributeList {
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        node {
          attribute {
            code
          }
          translations {
            ... on ProductRelationAttributeValueTranslation {
              language
              value {
                sku
              }
            }
          }
        }
      }
    }
  }
}

```


# Get values of custom fields

Example query on how to get values of custom fields options

```graphql
fragment Option on Option {
    code
    name(languages: ["en_US"]) {
        value
        language
    }
    customFields {
        __typename
        customField {
            code
        }
        translations(languages: ["en_US"]) {
            language
            ... on ImageCustomFieldValueTranslation {
                imageCustomFieldValue: value {
                    path
                }
            }
            ... on TextCustomFieldValueTranslation {
                textCustomFieldValue: value
            }
            ... on TextareaCustomFieldValueTranslation {
                textareaCustomFieldValue: value
            }
            ... on TextareaRTECustomFieldValueTranslation {
                textareaRTECustomFieldValue: value
            }
        }
    }
}
```


# Create a simple product

This is how you can create a simple product via API.

{% hint style="info" %}
Please note that for this to work, you need to create a template beforehand. This mutation can only assign products to an already existing template, and will NOT create a new one.
{% endhint %}

```graphql
mutation {
  productCreateSimple(
    input: { sku: "SKU_test2", templateCode: "Tshirts"}
  ) {
    __typename
  }
}
```

You can also assign a category to the newly created product in the same query.

{% hint style="info" %}
While templateCode is required, categoryCodes is not. But if used, also needed to be created beforehand.
{% endhint %}

```graphql
mutation {
  productCreateSimple(
    input: { sku: "SKU_test2", templateCode: "Tshirts", categoryCodes: "DELL" }
  ) {
    __typename
  }
}
```


# Create a grouping product

This is how you can create a simple product via API.

{% hint style="info" %}
Please note that for this to work, you need to create a template beforehand. This mutation can only assign products to an already existing template, and will NOT create a new one.
{% endhint %}

```graphql
mutation {
  productCreateGrouping(
    input: { sku: "SKU_GR_PRODUCT", templateCode: "Tshirts"}
  ) {
    __typename
  }
}
```

You can also assign a category to the newly created product in the same query.

{% hint style="info" %}
While templateCode is required, categoryCodes is not. But if used, also needed to be created beforehand.
{% endhint %}

```graphql
mutation {
  productCreateGrouping(
    input: { sku: "SKU_GR_PRODUCT", templateCode: "Tshirts", categoryCodes: "DELL"}
  ) {
    __typename
  }
}
```


# Create a variable product

This is how you can create variable product via API.

{% hint style="info" %}
Please note that for this to work, you need to create a template beforehand. This mutation can only assign the product to an already existing template, and will NOT create a new one.&#x20;
{% endhint %}

{% hint style="info" %}
While templateCode is required, categoryCodes is not. But if used, also needed to be created beforehand.
{% endhint %}

```graphql
mutation {
  productCreateVariable(
    input: {
      sku: "SKU_VAR_PRODUCT"
      templateCode: "Tshirts"
      categoryCodes: "DELL"
    }
  ) {
    __typename
  }
}
```


# Add a child product to grouping one

That's how you add child product to grouping one.

{% hint style="info" %}
Please bear in mind, that quantity isn't required and if used, cannot be a string - must be Integer (so there's no quotation mark)
{% endhint %}

{% hint style="info" %}
Both products must exist before this operation.&#x20;
{% endhint %}

```graphql
mutation {
  productGroupingAddChild(
    input: { sku: "SKU_GR_PRODUCT", childSku: "SKU_test2", quantity: 1 }
  ) {
    __typename
  }
}
```


# Set quantity of child product

Here's how you can set child product quantity via API.

```graphql
mutation {
  productGroupingSetChildQuantity(
    input: { sku: "SKU_GR_PRODUCT", childSku: "SKU_test2", quantity: 2 }
  ) {
    __typename
  }
}
```


# Remove a child product from grouping one

This is how you remove child product from grouping one via API.

```graphql
mutation {
  productGroupingRemoveChild(input: { sku: "SKU_GR_PRODUCT", childSku: "SKU_test2" }
  ) {
    __typename
  }
}
```


# Add a variant to variable product

Here's how to add variant to variable product via API.

{% hint style="info" %}
Both products must exist before this operation.&#x20;
{% endhint %}

```graphql
mutation {
  productVariableAddVariant(input: { sku: "SKU_VAR_PRODUCT", variantSku: "SKU_test2" }) {
    __typename
  }
}
```


# Get products with variants, binding attributes and variants list

```graphql
query {
  productStream (first:10, after:"") {
    pageInfo {
      hasNextPage
      endCursor
    }
    edges {
      node {
        ... on VariableProduct {
          sku
          bindings {
            code
            __typename
          }
          variantList {
            edges {
              node {
                sku
              }
            }
          }
        }
      }
    }
  }
}
```


# Remove a variant product from variable one

This is how you can remove variant product from variable one via API

```graphql
mutation {
  productVariableRemoveVariant(input: { sku: "SKU_VAR_PRODUCT", variantSku: "SKU_test2" }
  ) {
    __typename
  }
}
```


# Multimedia create

This is how you can create multimedia via API.

{% hint style="info" %}
To create multimedia via API you need to send the data by a multipart request with `upload` and `query` headers.
{% endhint %}

{% hint style="info" %}
The folder to which multimedia will be uploaded must already exist.
{% endhint %}

{% hint style="info" %}
folderPath parameter is optional, if not included multimedia will be uploaded to the main folder.
{% endhint %}

{% hint style="info" %}
Max allowed file size is 100 MB
{% endhint %}

```graphql
mutation {
  multimediaCreate(
    input: { name: "file_name.extension", folderPath: "folder_path" }
  ) {
    __typename
  }
}
```

#### Example in PHP8

```php
$client = new \GuzzleHttp\Client(); // Guzzle version 6

$resp = $client->post(
    $url,
    [
        'multipart' => [
            [
                'name' => 'upload',
                'contents' => fopen(__DIR__ . '/test.png', 'r'),
            ],
            [
                'name' => 'query',
                'contents' => '
                    mutation {
                        multimediaCreate(input: {name: "new.png", folderPath: null}) {__typename}
                    }
                ',
            ],
        ],
        'headers' => [
            'X-API-KEY' => $apiKey,
        ],
    ],
);
```

#### Example in Python3

```python
from urllib import response
import requests

url = "https://marcin.ergonode.app/api/graphql/"

data = {
    'upload': open('C:\\temp\\temp.png', 'rb'),
    'query': (None, 'mutation{multimediaCreate(input:{name:"<choose_a_name>",folderPath: "<some_folder_path>"}){__typename}}')
}

headers = {
    'X-API-KEY': '<some_api_key>',
}

response = requests.post(url, files=data, headers=headers)

print (response.text)

```


# Add images to the gallery attribute

```graphql
mutation {
  productAddAttributeValueTranslationsGallery(
    input: {
      sku: "1"
      attributeCode: "gallery"
      translations: [
        { language: "pl_PL", value: ["1.jpg", "2.jpg", "3.jpg"] }
      ]
    }
  ) {
    __typename
  }
}
```

{% hint style="info" %}
Attribute Gallery and Product identified with SKU must already exist.
{% endhint %}

{% hint style="info" %}
value: is the path to an image, you can get it with query "multimediaStream"
{% endhint %}


# Change the name of the multimedia

This is how you can change the name of single multimedia via API.

{% hint style="info" %}
The `MultimediaPath` scalar type represents a textual combination of `MultimediaFolderPath,` and `MultimediaName` joined with '/' `Multimedia` identifier pointing to its exact location. If the file is in the root folder you need to skip `MultimediaFolderPath in path.`
{% endhint %}

```graphql
mutation {
  multimediaSetName(
    input: {
      path: "multimedia.jpg"
      name: "multimedia_2.jpg"
    }
  ) {
    __typename
  }
}
```


# Set alternative value for a multimedia

This is how you can set alternative value to a single multimedia via API.

{% hint style="info" %}
The `MultimediaPath` scalar type represents a textual combination of `MultimediaFolderPath,` and `MultimediaName` joined with '/' `Multimedia` identifier pointing to its exact location. If the file is in the root folder you need to skip `MultimediaFolderPath in path.`
{% endhint %}

```graphql
mutation {
  multimediaSetAlt(
    input: {
      path: "multimedia.jpg"
      alt: { language: "en_GB", value: "Alternative value" }
    }
  ) {
    __typename
  }
}
```


# Delete Multimedia

{% hint style="info" %}
The `MultimediaPath` scalar type represents a textual combination of `MultimediaFolderPath,` and `MultimediaName` joined with '/' `Multimedia` identifier pointing to its exact location. If the file is in the root folder you need to skip `MultimediaFolderPath in path.`
{% endhint %}

```graphql
mutation {
  multimediaDelete(input: { path: "multimedia.jpg" }) {
    __typename
  }
}
```


# Add a file to the product

{% hint style="info" %}
Product, attribute, and file must already exist

value -  path to the file

The `MultimediaPath` scalar type represents a textual combination of `MultimediaFolderName`, and `MultimediaName` joined with '/' `Multimedia` identifier pointing to its exact location.

The path to the file can be found with this [query](https://docs.ergonode.com/v/graphql-api/query-examples/list-of-all-multimedia-in-stream).
{% endhint %}

```graphql
mutation {
  productAddAttributeValueTranslationsFile(input: {
    sku:"SKU77"
    attributeCode:"file_test"
    translations:{
      language:"pl_PL"
      value:"bike-1.jpg"
    }
  })
  {__typename}
}
```


# Get attributes list by SKU

This is how you can query GraphQL API on product attributes  by SKU

```graphql
query product {
  product(sku: "SKU72") {
    sku
    attributeList {
      edges {
        node {
          attribute {
            code
            scope
            name {
              value
              language
            }
          }
        }
      }
    }
  }
}
```


# Create a product and assign / modify attributes values

{% hint style="info" %}
This mutation assumes that below already exists in the system:

* template with code `template`
* textarea attribute with code `description`
* textarea attribute with code `short_description`
* text attribute with code `text`
* `pl_PL` language is active
  {% endhint %}

{% hint style="info" %}
Note that each mutation is aliased (`create: (...)`).\
Aliasing is required if there are at least two same mutations in one batch - `productAddAttributeValueTranslationsTextarea` in this case.

For simplicity, all mutations have been aliased in the example but it'd also suffice to only alias duplicates.
{% endhint %}

```graphql
mutation {
  create: productCreateSimple(input: {sku: "new_product", templateCode: "template"}) {
    __typename
  }
  assignDescription: productAddAttributeValueTranslationsTextarea(
    input: {
      sku: "new_product"
      attributeCode: "description"
      translations: [{ value: "Długi opis", language: "pl_PL" }]
    }
  ) {
    __typename
  }
  assignShortDescription: productAddAttributeValueTranslationsTextarea(
    input: {
      sku: "new_product"
      attributeCode: "short_description"
      translations: [{ value: "Krótki opis", language: "pl_PL" }]
    }
  ) {
    __typename
  }
  assignText: productAddAttributeValueTranslationsText(
    input: {
      sku: "new_product"
      attributeCode: "text"
      translations: [{ value: "wartość", language: "pl_PL" }]
    }
  ) {
    __typename
  }
}
```


# Assign the template to a product

{% hint style="info" %}
Both sku and template must already exist.
{% endhint %}

```graphql
mutation {
  productSetTemplate(input: { sku: "SKU78", template: "template" }) {
    __typename
  }
}
```


# Create a category

```graphql
mutation {
  categoryCreate(
    input:{
      code: "category_name"
      name: {
        language:"pl_PL"
        value:"nazwa_kategorii"
      }
    }
  ) {
    __typename
  }
      
}
```

{% hint style="info" %}
code  - system name of the category

language - language code ex: pl\_PL

value - translated name of the category (string)
{% endhint %}


# Get category tree by category tree code

```graphql
query {
  categoryTree(code: "<code_of_the_category_tree>") {
    code
    categoryTreeLeafList {
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        node {
          category {
            code
          }
          parentCategory {
            code
          }
        }
      }
    }
  }
}
```


# Get a specific category with values of the category attribute

{% hint style="info" %}
Remember to change "buty" with your own category code (system name)
{% endhint %}

```graphql
query catWithAttVal {
  category(code: "buty") {
    code
    attributeList {
      pageInfo {
        hasNextPage
        endCursor
      }
      edges {
        node {
          ...AttributeValue
        }
      }
    }
  }
}

fragment AttributeValue on AttributeValue {
  __typename
  attribute {
    code
    name {
      language
      value
    }
  }
  ... on TextAttributeValue {
    textAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on TextareaAttributeValue {
    textareaAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on DateAttributeValue {
    dateAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on UnitAttributeValue {
    unitAttribute: attribute {
      # unit might be useful in the value context
      unit {
        name
        symbol
      }
    }
    unitAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on PriceAttributeValue {
    priceAttribute: attribute {
      # currency might be useful in the price context
      currency
    }
    priceAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on NumberAttributeValue {
    numericAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on ProductRelationAttributeValue {
    productRelationAttributeValueTranslations: translations {
      value {
        sku
      }
      language
    }
  }
  ... on FileAttributeValue {
    fileAttributeValueTranslations: translations {
      value {
        ...Multimedia
      }
      language
    }
  }
  ... on GalleryAttributeValue {
    galleryAttributeValueTranslations: translations {
      value {
        ...Multimedia
      }
      language
    }
  }
  ... on ImageAttributeValue {
    imageAttributeValueTranslations: translations {
      value {
        ...Multimedia
      }
      language
    }
  }
  ... on MultiSelectAttributeValue {
    multiSelectAttributeValueTranslations: translations {
      translatedValue {
        ...OptionTranslatedValue
      }
      language
    }
  }
  ... on SelectAttributeValue {
    selectAttributeValueTranslations: translations {
      translatedValue {
        ...OptionTranslatedValue
      }
      language
    }
  }
}
fragment Multimedia on Multimedia {
  path
  name
  extension
  mime
  size
  alt {
    value
    language
  }
  title {
    value
    language
  }
  url
}
fragment OptionTranslatedValue on OptionTranslatedValue {
  code
  name
}
```


# Set multiple options in multiselect attribute on specific product

```graphql
mutation {
  productAddAttributeValueTranslationsMultiSelect(
    input: {
      sku: "product_2" # SKU of a product we want to set attribute options in
      attributeCode: "labels" # attribute code
      translations: [
        { value: ["test1", "test2"], language: "en_GB" } # options to set in a specific language
      ]
    }
  ) {
    __typename
  }
}
```


# Add option to select type attribute

{% hint style="info" %}
Please keep in mind that to add the option attribute "Model" must first exist.
{% endhint %}

```graphql
mutation {
  attributeSelectAddOption(
    input: {
      code: "Model"
      option: {
        code: "eve_1011"
        name: { language: "pl_PL", value: "eve_1011" }
      }
    }
  ) {
    __typename
  }
}
```


# Ergonode transfer

This doc provides an overview of our CSV files format.

Ergonode transfer allows you both to fetch the data to your external system via the export and to populate the Ergonode with your data via the import.

Import and export files are symmetrical which means that the same standard applies to the files created by the Ergonode and the files used for importing data.


# Files format

Overview of the import and export files format

The entire format is represented as an `.zip` archive containing the following `.csv` files.

{% hint style="warning" %}
Only zip-archived files are processed properly in case of an import - a simple `.csv` file upload won't work.

Files within the archive must be named accordingly, as in the documentation below.
{% endhint %}

{% hint style="info" %}
The maximum archive size is 350 MB.

The maximum single file size within the archive is 1000 MB.
{% endhint %}

{% hint style="info" %}
Columns are separated using ","(comma) or ";"(semicolon) separator depending on the configuration.
{% endhint %}

{% hint style="info" %}
Files have to be UTF-8 formatted.
{% endhint %}

{% hint style="info" %}
Cell values need to be escaped with the " sign if they contain a column separator.\
`"sku1,sku2" - for`comma separator

`"the ; sign is called semicolon"` - for the semicolon
{% endhint %}

{% hint style="info" %}
The files are placed in the zip archive as top-level entities.\
Those should not be placed in a subdirectory within the archive - an often-made mistake for MacOS users - when using the right-click menu on a directory containing files and using the option `Compress "directory"` which does just that.
{% endhint %}

Below you can find an example of importing data.&#x20;

{% file src="/files/CdVgzYPoDvIRvxfQEM55" %}

**Please refer to a specific file description for more details.**

* [products.csv](/ergonode-transfer/overview/files-format/products.csv) - the product data
* [multimedia.csv](/ergonode-transfer/overview/files-format/multimedia.csv) - the multimedia resources
* [multimedia\_attributes.csv](/ergonode-transfer/overview/files-format/multimedia_attributes.csv) - the multimedia allowed attributes configuration
* [categories.csv](/ergonode-transfer/overview/files-format/categories.csv) - the categories
* [category\_attributes.csv](/ergonode-transfer/overview/files-format/category_attributes.csv) - the category allowed attributes configuration
* [category\_trees.csv](/ergonode-transfer/overview/files-format/category_trees.csv) - the category trees
* [category\_trees\_elements.csv](/ergonode-transfer/overview/files-format/category_trees_elements.csv) - the category trees configuration
* [completeness\_sets.csv](/ergonode-transfer/overview/files-format/completeness_sets.csv) - the completeness sets
* [multimedia\_folders.csv](/ergonode-transfer/overview/files-format/multimedia_folder.csv) - the multimedia folders
* [attributes.csv](/ergonode-transfer/overview/files-format/attributes.csv) - the attributes
* [attribute\_groups.csv](/ergonode-transfer/overview/files-format/attribute_groups.csv) - the attribute groups
* [custom\_fields.csv](/ergonode-transfer/overview/files-format/custom_fields.csv) - the custom fields
* [options.csv](/ergonode-transfer/overview/files-format/options.csv) - the collection attributes options
* [units.csv](/ergonode-transfer/overview/files-format/units.csv) - the units
* [templates.csv](/ergonode-transfer/overview/files-format/templates.csv) - the templates
* [templates\_elements.csv](/ergonode-transfer/overview/files-format/templates_elements.csv) - the templates configuration
* [section\_templates.csv](/ergonode-transfer/overview/files-format/section_templates.csv) - the section templates
* [section\_templates\_elements.csv](/ergonode-transfer/overview/files-format/section_templates_elements.csv) - the section templates configuration
* [roles.csv](/ergonode-transfer/overview/files-format/roles.csv) - the roles
* [roles\_feature\_privileges.csv](/ergonode-transfer/overview/files-format/roles_feature_privileges.csv) - the role privileges
* [automations.csv](/ergonode-transfer/overview/files-format/automations.csv) - the automations
* [automations\_actions.csv](/ergonode-transfer/overview/files-format/automation_actions.csv) - the automation actions
* [workflows\_statuses.csv](/ergonode-transfer/overview/files-format/workflows_statuses.csv) - the workflow statuses
* [workflows.csv](/ergonode-transfer/overview/files-format/workflows.csv) - the workflows
* [workflows\_transitions.csv](/ergonode-transfer/overview/files-format/workflows_transitions.csv) - the workflow transitions


# products.csv

{% hint style="info" %}
This file can be used to: Create new products, make changes to existing ones, add variants to products with variants, and add products to a grouping product. Leave the attribute value empty to also delete its value in PIM.
{% endhint %}

<table><thead><tr><th width="222.19772459788152">column</th><th width="174.08606461839716">required</th><th>limitation</th></tr></thead><tbody><tr><td>_sku</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 255 chars.</td></tr><tr><td>_template</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Template Codes.</td></tr><tr><td>_type</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>SIMPLE-PRODUCT</code>, <code>GROUPING-PRODUCT</code>, <code>VARIABLE-PRODUCT</code>}</td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if attribute values columns present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr><tr><td>_children</td><td></td><td>Applies for grouping and variable product types. Only existing SKUs. In case of <code>GROUPING-PRODUCT</code> multiplication of SKUs is allowed - the amount represents the quantity.</td></tr><tr><td>_bindings</td><td></td><td>Applies for <code>VARIABLE-PRODUCT</code> type only. Only existing Attribute Codes.</td></tr><tr><td>_categories</td><td></td><td>One of existing Category Codes.</td></tr><tr><td>attribute_code<mark style="color:red;">*</mark></td><td></td><td>Column header represents existing Attribute Code. Value should be valid according to given attribute type.<br>Example: <code>product_description</code></td></tr></tbody></table>

{% hint style="warning" %}
In the example, some values are collections(\_children, \_categories, multiselect\_attribute, etc) separated by semicolons.

If your column separator is a semicolon, then the CSV file should contain those values escaped with `"` sign to tell the importer that the value represents a single column, i.e. `"option_code_1,option_code_2"`.
{% endhint %}

Example:

<table><thead><tr><th width="200">_sku</th><th>_template</th><th>_language</th><th>_type</th><th>_children</th><th>_bindings</th><th>_categories</th><th>text_short_description</th><th>textarea_description</th><th data-type="number">numeric_size</th><th data-type="number">price</th><th data-type="number">unit_weight</th><th>date</th><th>select_brand</th><th>multiselect_attribute</th><th>image</th><th>gallery</th><th>file_appendix</th><th>product_relation</th></tr></thead><tbody><tr><td>sku_with_variants</td><td>template_code</td><td>en_GB</td><td>VARIABLE-PRODUCT</td><td>sku_simple1,sku_simple2</td><td>product_size</td><td>category_code_1,category_code_2</td><td>text1</td><td>textarea1</td><td>-1</td><td>1</td><td>1</td><td>2022-01-25</td><td>option_code_1</td><td>option_code_1,option_code_2</td><td>multimedia.jpg</td><td>folder/multimedia.jpg,multimedia2.jpg</td><td>docs.pdf</td><td></td></tr><tr><td>sku_simple1</td><td>template_code</td><td>en_GB</td><td>SIMPLE-PRODUCT</td><td></td><td></td><td></td><td>text2</td><td>textarea2</td><td>-2</td><td>2</td><td>2</td><td>25-01-2022</td><td>option_code_1</td><td>option_code_1,option_code_2</td><td>folder/multimedia.jpg</td><td>folder/multimedia.jpg,multimedia2.jpg</td><td>docs.pdf</td><td>sku_with_variants,sku_simple2</td></tr><tr><td>sku_simple2</td><td>template_code</td><td>en_GB</td><td>SIMPLE-PRODUCT</td><td></td><td></td><td></td><td>text3</td><td>textarea3</td><td>3</td><td>3</td><td>-3</td><td>2022-01-25 12:00:00</td><td>option_code_1</td><td>option_code_1,option_code_2</td><td>folder/multimedia.jpg</td><td>folder/multimedia.jpg,multimedia2.jpg</td><td>docs.pdf</td><td></td></tr><tr><td>sku_grouping</td><td>template_code</td><td>en_GB</td><td>GROUPING-PRODUCT</td><td>sku_with_variants,sku_simple1</td><td></td><td></td><td>text4</td><td>textarea4</td><td>4</td><td>4</td><td>-4</td><td>2022-01-25</td><td>option_code_1</td><td>option_code_1,option_code_2</td><td>folder/multimedia.jpg</td><td>folder/multimedia.jpg,multimedia2.jpg</td><td>docs.pdf</td><td></td></tr></tbody></table>

<mark style="color:red;">\*</mark> Note in the above example columns not starting with `_` prefix represents product attribute values. Each header name represents an attribute code identifying this Attribute and the cell contains the value.

* `text_short_description` text attribute represented by the text value
* `textarea_description` textarea attribute represented by the text value
* `numeric_size` numeric attribute represented by the numeric value
* `price` price attribute represented by the positive numeric value
* `unit_weight` unit attribute represented by the numeric value
* `date` date attribute represented by the date value
* `select_brand` select attribute represented by the Attribute Option Code
* `multiselect_attribute` multiselect attribute represented by the list of Attribute Option Codes separated by a comma
* `image` image attribute represented by the Multimedia Path
* `gallery` gallery attribute represented by the list of Multimedia Paths separated with a comma
* `file_appendix` file attribute represented by the list of Multimedia Paths separated with a comma
* `product_relation` product relation attribute represented by the list of SKUs separated with a comma


# multimedia.csv

{% hint style="info" %}
This file can be used to: Add supported files to Ergonode resources, add media translation, and media alternative text.
{% endhint %}

{% hint style="warning" %}
Please keep in mind that importing multimedia via HTTPS protocol requires an SSL certificate to be valid, otherwise, you will receive an import error "Can't download media from URL ... "
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_name</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Only existing folders(if given). Name has to contain a matching MIME type extension.</td></tr><tr><td>_url</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>URL from multimedia can be downloaded from. Download happen only once on multimedia creation.</td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_alt</code> or <code>_title</code> column present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr><tr><td>_alt</td><td></td><td>Max length of 128 chars.</td></tr><tr><td>_title</td><td></td><td>Max length of 100 chars.</td></tr><tr><td>attribute_code<mark style="color:red;">*</mark></td><td></td><td>Column header represents existing Attribute Code. Value should be valid according to given attribute type.<br>Example: <code>product_description</code></td></tr></tbody></table>

{% hint style="info" %}
Note that `_name` has to contain an extension valid according to the files MIME type.
{% endhint %}

{% hint style="warning" %}
In the example, some values are collections(\_children, \_categories, multiselect\_attribute, etc) separated by semicolons.

If your column separator is a semicolon, then the CSV file should contain those values escaped with `"` sign to tell the importer that the value represents a single column, i.e. `"option_code_1,option_code_2"`.
{% endhint %}

Example:

<table><thead><tr><th>_name</th><th width="286">_url</th><th>_language</th><th>_alt</th><th>text_short_description</th><th>textarea_description</th><th>numeric_size</th><th>price</th><th>unit_weight</th><th>date</th><th>select_brand</th><th>multiselect_attribute</th><th>image</th><th>gallery</th><th>file_appendix</th><th>product_relation</th></tr></thead><tbody><tr><td>filename.jpg</td><td>www.ergonode.com/image1.jpg</td><td>en_GB</td><td>alternative text</td><td>text1</td><td>textarea1</td><td>1</td><td>1.23</td><td>3.45</td><td>2026-03-10</td><td>option_code_1</td><td>option_code_1,option_code_2</td><td>multimedia.jpg</td><td>multimedia1.jpg,multimedia2.jpg</td><td>docs.pdf</td><td>sku1,sku2</td></tr><tr><td>folder/filename.jpg</td><td>www.ergonode.com/image2.jpeg</td><td>en_GB</td><td>tekst alternatywny</td><td>text2</td><td>textarea2</td><td>2</td><td>2.34</td><td>4</td><td>2026-03-10</td><td>option_code_2</td><td>option_code_3,option_code_4</td><td>folder/multimedia.jpg</td><td>folder/multimedia1.jpg,folder/multimedia2.jpg</td><td>docs.pdf</td><td>sku3</td></tr></tbody></table>

<mark style="color:red;">\*</mark> Note in the above example columns not starting with `_` prefix represents product attribute values. Each header name represents an attribute code identifying this Attribute and the cell contains the value.

* `text_short_description` text attribute represented by the text value
* `textarea_description` textarea attribute represented by the text value
* `numeric_size` numeric attribute represented by the numeric value
* `price` price attribute represented by the positive numeric value
* `unit_weight` unit attribute represented by the numeric value
* `date` date attribute represented by the date value
* `select_brand` select attribute represented by the Attribute Option Code
* `multiselect_attribute` multiselect attribute represented by the list of Attribute Option Codes separated by a comma
* `image` image attribute represented by the Multimedia Path
* `gallery` gallery attribute represented by the list of Multimedia Paths separated with a comma
* `file_appendix` file attribute represented by the list of Multimedia Paths separated with a comma
* `product_relation` product relation attribute represented by the list of SKUs separated with a comma


# multimedia\_attributes.csv

{% hint style="info" %}
This file can be used to: Assign existing attributes to be used as attribute values in multimedia.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Attribute Codes.</td></tr></tbody></table>


# categories.csv

{% hint style="info" %}
This file can be used to: Create new categories, and add category name translations.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Lowercased, alphanumerical and "_" signes are accepted.</td></tr><tr><td>_name</td><td></td><td>Max length of 255 chars. </td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_name</code> column present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr><tr><td>attribute_code<mark style="color:red;">*</mark></td><td></td><td>Column header represents existing Attribute Code. Value should be valid according to given attribute type.<br>Example: <code>product_description</code></td></tr></tbody></table>

{% hint style="warning" %}
In the example, some values are collections(multiselect\_attribute, gallery, etc) separated by semicolons.

If your column separator is semicolon as well the CSV file should contain those values escaped(surrounded) with `"` sign to tell the importer that the value represents a single column i.e. `"option_code_1,option_code_2"`.
{% endhint %}

{% hint style="info" %}
In order to import attribute values the attributes need to be enabled in Category attributes. This can be done either by Ergonode UI or via import file category\_attributes.csv.
{% endhint %}

Example:

<table><thead><tr><th>_code</th><th width="286">_name</th><th>_language</th><th>text_short_description</th><th>textarea_description</th><th>numeric_size</th><th>price</th><th>unit_weight</th><th>date</th><th>select_brand</th><th>multiselect_attribute</th><th>image</th><th>gallery</th><th>file_appendix</th><th>product_relation_attribute</th></tr></thead><tbody><tr><td>category</td><td>category one</td><td>en_GB</td><td>text1</td><td>textarea1</td><td>-1</td><td>1</td><td>1</td><td>2022-11-09</td><td>option1</td><td>option_code_1,option_code_2</td><td>folder/multimedia.jpg</td><td>folder/multimedia.jpg,multimedia2.jpg</td><td>docs.pdf</td><td>sku_with_variants,sku_simple2</td></tr><tr><td>category</td><td>pierwsze kategoria</td><td>pl_PL</td><td>text2</td><td>textarea2</td><td>2</td><td>2</td><td>-2</td><td>09-11-2022</td><td>option2</td><td>option_code_1</td><td>folder/multimedia.jpg</td><td>folder/multimedia.jpg,multimedia2.jpg</td><td>docs.pdf</td><td></td></tr></tbody></table>

<mark style="color:red;">\*</mark> Note in the above example columns not starting with `_` prefix represents product attribute values. Each header name represents an attribute code identifying this Attribute and the cell contains the value.

* `text_short_description` text attribute represented by the text value
* `textarea_description` textarea attribute represented by the text value
* `numeric_size` numeric attribute represented by the numeric value
* `price` price attribute represented by the positive numeric value
* `unit_weight` unit attribute represented by the numeric value
* `date` date attribute represented by the date value
* `select_brand` select attribute represented by the Attribute Option Code
* `multiselect_attribute` multiselect attribute represented by the list of Attribute Option Codes separated by a comma
* `image` image attribute represented by the Multimedia Path
* `gallery` gallery attribute represented by the list of Multimedia Paths separated with a comma
* `file_appendix` file attribute represented by the list of Multimedia Paths separated with a comma
* `product_relation` product relation attribute represented by the list of SKUs separated with a comma


# category\_attributes.csv

{% hint style="info" %}
This file can be used to: Assign attributes as category attributes.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Attribute Codes.</td></tr></tbody></table>


# category\_trees.csv

{% hint style="info" %}
This file can be used to: Create a new category tree, and add category tree name translation.
{% endhint %}

| column     | required                                      | limitation                                   |
| ---------- | --------------------------------------------- | -------------------------------------------- |
| \_code     | :white\_check\_mark:                          | Max length of 64 chars.                      |
| \_name     |                                               | Max length of 255 chars.                     |
| \_language | :white\_check\_mark:if `_name` column present | 5 chars LCID language code. Example: `pl_PL` |

Example:

| \_code            | \_name            | \_language |
| ----------------- | ----------------- | ---------- |
| category\_tree\_1 | Category tree one | en\_GB     |
| category\_tree\_2 | Category tree two | en\_GB     |


# category\_trees\_elements.csv

{% hint style="info" %}
This file can be used to: Create the category tree structure, or change the category branch location in the existing category tree.
{% endhint %}

| column     | required             | limitation                            |
| ---------- | -------------------- | ------------------------------------- |
| \_code     | :white\_check\_mark: | One of existing Category Trees Codes. |
| \_parent   |                      | One of existing Category Codes.       |
| \_category | :white\_check\_mark: | One of existing Category Codes.       |

Example:

| \_code            | \_parent       | \_category      |
| ----------------- | -------------- | --------------- |
| category\_tree\_1 |                | category\_root  |
| category\_tree\_1 | category\_root | category\_child |
|                   |                |                 |


# completeness\_sets.csv

{% hint style="info" %}
This file can be used to: Create the completeness set.
{% endhint %}

| column                                              | required             | limitation                 |
| --------------------------------------------------- | -------------------- | -------------------------- |
| \_code                                              | :white\_check\_mark: | Completeness set code.     |
| name\_{language} <mark style="color:red;">\*</mark> |                      | Name in specific language. |

<mark style="color:red;">\*</mark> Language is 5 chars LCID language code. Example: `name_en_GB`.

Example:

| \_code               | name\_en\_GB          |
| -------------------- | --------------------- |
| completeness\_set\_1 | Completeness set name |
| completeness\_set\_2 | Completeness set name |


# multimedia\_folder.csv

{% hint style="info" %}
This file can be used to: Create a new multimedia folder and the folder tree structure.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_name</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 255 chars.</td></tr></tbody></table>

Example:

| \_name                  |
| ----------------------- |
| folder\_one             |
| folder\_one/folder\_two |


# attributes.csv

{% hint style="info" %}
This file can be used to: Create new attributes, add attribute translations, define attribute type, scope, and other attribute specifications accordingly.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Lowercased, alphanumerical and "_" signes are accepted.</td></tr><tr><td>_type</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>TEXT</code>, <code>TEXT_AREA</code>, <code>NUMERIC</code>, <code>PRICE</code>, <code>UNIT</code>, <code>DATE</code>, <code>SELECT</code>, <code>MULTI_SELECT</code>, <code>IMAGE</code>, <code>GALLERY</code>, <code>FILE</code>, <code>PRODUCT_RELATION</code>}</td></tr><tr><td>_scope</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>local</code>, <code>global</code>}</td></tr><tr><td>_group</td><td></td><td>One of existing Attribute Group Codes.</td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span>if one of <code>_name</code>, <code>_hint</code> or <code>_placeholder</code> columns present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr><tr><td>_name</td><td></td><td>Max length of 255 chars. Lowercased, alphanumerical and "_" signes are accepted.</td></tr><tr><td>_hint</td><td></td><td>Max length of 4000 chars. Lowercased, alphanumerical and "_" signes are accepted.</td></tr><tr><td>format</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is DATE</td><td>One of existing date formats (see table below)</td></tr><tr><td>currency</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is PRICE</td><td>One of existing Currencies.</td></tr><tr><td>rich_edit</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is TEXTAREA</td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>unit</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is UNIT</td><td>One of existing Unit Symbols.</td></tr><tr><td>unique</td><td></td><td>One of {<code>true</code>, <code>false</code>}</td></tr></tbody></table>

Available date formats:

| Date             | CSV Date Format |
| ---------------- | --------------- |
| 1999-01-31       | yyyy-MM-dd      |
| 99-01-31         | yy-MM-dd        |
| 31.01.1999       | dd.MM.yyyy      |
| 31.01.99         | dd.MM.yy        |
| 01/31/99         | MM/dd/yy        |
| 01/31/1999       | MM/dd/yyyy      |
| January 31, 1999 | MMMM dd, yyyy   |
| 31 January 1999  | dd MMMM yyyy    |
| 31 Jan 1999      | dd MMM yyyy     |

Example:

<table><thead><tr><th>_code</th><th width="286">_type</th><th>_scope</th><th>_group</th><th>_language</th><th>_name</th><th>format</th><th>currency</th><th>rich_edit</th><th>unit</th></tr></thead><tbody><tr><td>text</td><td>TEXT</td><td>local</td><td>default</td><td>en_GB</td><td>text</td><td></td><td></td><td></td><td></td></tr><tr><td>textarea</td><td>TEXT_AREA</td><td>global</td><td>default</td><td>en_GB</td><td>textarea</td><td></td><td></td><td>true</td><td></td></tr><tr><td>numeric</td><td>NUMERIC</td><td>local</td><td>default</td><td>en_GB</td><td>numeric</td><td></td><td></td><td></td><td></td></tr><tr><td>price</td><td>PRICE</td><td>global</td><td>default</td><td>en_GB</td><td>price</td><td></td><td>PLN</td><td></td><td></td></tr><tr><td>unit</td><td>UNIT</td><td>local</td><td>default</td><td>en_GB</td><td>unit</td><td></td><td></td><td></td><td>m</td></tr><tr><td>data</td><td>DATE</td><td>global</td><td>default</td><td>en_GB</td><td>date</td><td>yyyy-MM-dd</td><td></td><td></td><td></td></tr><tr><td>select</td><td>SELECT</td><td>local</td><td>default</td><td>en_GB</td><td>select</td><td></td><td></td><td></td><td></td></tr><tr><td>multiselect</td><td>MULTI_SELECT</td><td>global</td><td>default</td><td>en_GB</td><td>multiselect</td><td></td><td></td><td></td><td></td></tr><tr><td>image</td><td>IMAGE</td><td>local</td><td>default</td><td>en_GB</td><td>image</td><td></td><td></td><td></td><td></td></tr><tr><td>gallery</td><td>GALLERY</td><td>global</td><td>default</td><td>en_GB</td><td>gallery</td><td></td><td></td><td></td><td></td></tr><tr><td>file</td><td>FILE</td><td>local</td><td>default</td><td>en_GB</td><td>file</td><td></td><td></td><td></td><td></td></tr><tr><td>product_relation</td><td>PRODUCT_RELATION</td><td>global</td><td>default</td><td>en_GB</td><td>product relation</td><td></td><td></td><td></td><td></td></tr></tbody></table>


# attribute\_groups.csv

{% hint style="info" %}
This file can be used to: Create new attribute groups and edit the existing ones.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Alphanumerical and "_" signes are accepted.</td></tr><tr><td>_name_{language}</td><td></td><td>Existing content language.</td></tr></tbody></table>

Example:

<table><thead><tr><th>_code</th><th width="286">_name_en_GB</th></tr></thead><tbody><tr><td>attribute_group</td><td>Attribute group</td></tr></tbody></table>


# custom\_fields.csv

{% hint style="info" %}
This file can be used to: Create new custom fields in the SELECT and MULTISELECT attribute type.
{% endhint %}

| column      | required             | limitation                                                                        |
| ----------- | -------------------- | --------------------------------------------------------------------------------- |
| \_code      | :white\_check\_mark: | Max length of 128 chars. Lowercased, alphanumerical and "\_" signes are accepted. |
| \_type      | :white\_check\_mark: | One of { IMAGE , TEXT , TEXTAREA , TEXTAREA\_RTE}                                 |
| \_attribute | :white\_check\_mark: | Code of the attribute<mark style="color:red;">\*</mark>                           |

<mark style="color:red;">\*</mark> Note that this attribute must already exist, or the proper attributes.csv file that creates it must be included in the import zip, only SELECT and MULTI\_SELECT attribute types support Custom Fields.

Example:

<table><thead><tr><th width="64">_code</th><th width="64">_type</th><th width="64">_attribute</th></tr></thead><tbody><tr><td>custom_field_1_code</td><td>IMAGE</td><td>attribute_custom_values</td></tr><tr><td>custom_field_2_code</td><td>TEXT</td><td>attribute_custom_values</td></tr><tr><td>custom_field_3_code</td><td>TEXTAREA</td><td>attribute_custom_values</td></tr><tr><td>custom_field_4_code</td><td>TEXTAREA_RTE</td><td>attribute_custom_values</td></tr></tbody></table>


# options.csv

{% hint style="info" %}
This file can be used to: Create options in SELECT and MULTISELECT attribute types. Add options for translations. Add custom field value to already existing custom fields.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars.</td></tr><tr><td>_attribute</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td><p>Applies for <code>SELECT</code> and  <code>MULTI_SELECT</code> Attribute types only.</p><p>One of existsing Attribute Codes.</p></td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span>if <code>_name</code> column present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr><tr><td>_name</td><td></td><td>Max length of 255 chars.</td></tr><tr><td>custom_field_code<mark style="color:red;">*</mark></td><td></td><td>Column header represents existing Custom Field Code. Value should be valid according to given type.</td></tr></tbody></table>

<mark style="color:red;">\*</mark> Note in the above example columns not starting with `_` prefixes represent custom field code values. Each header name represents a custom field identifying this option and the cell contains the value.

Example:

<table><thead><tr><th>_code</th><th width="286">_attribute</th><th>_name</th><th>_language</th></tr></thead><tbody><tr><td>select</td><td>select</td><td>name</td><td>en_GB</td></tr><tr><td>multiselect</td><td>multiselect</td><td>name</td><td>en_GB</td></tr></tbody></table>


# units.csv

{% hint style="info" %}
This file can be used to: Create a new unit with a name and corresponding symbol.
{% endhint %}

| column   | required             | limitation               |
| -------- | -------------------- | ------------------------ |
| \_symbol | :white\_check\_mark: | Max length of 16 chars.  |
| \_name   | :white\_check\_mark: | Max length of 255 chars. |


# templates.csv

{% hint style="info" %}
This file can be used to: Create a new template, and add a translation of the template name.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars.</td></tr><tr><td>_name</td><td></td><td>Max length of 128 chars.</td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if _name column present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr></tbody></table>

Example:

| \_code | \_name | \_language |
| ------ | ------ | ---------- |
| code   | name   | en\_GB     |


# templates\_elements.csv

{% hint style="info" %}
This file can be used to: Create a template structure using numeric values representing the position of each template element.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Template Codes.</td></tr><tr><td>_type</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>attribute</code>, <code>section</code>, <code>heading</code>, <code>divider</code>, <code>note</code>}</td></tr><tr><td>_x</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Numeric value 0-3.</td></tr><tr><td>_y</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Positive numeric value.</td></tr><tr><td>_width</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Numeric value 1-4.</td></tr><tr><td>_height</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Numeric value 1-10.</td></tr><tr><td>attribute</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>attribute</code></td><td>One of existing Attribute Codes.</td></tr><tr><td>require</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>attribute</code></td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>label (<span data-gb-custom-inline data-tag="emoji" data-code="26a0">⚠️</span> deprecated - if given on import with default - default takes precedense)</td><td></td><td><p>Max length of 255 chars.</p><p>Available for column <code>_type</code> -<code>heading</code>.</p></td></tr><tr><td>default</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>heading</code> or <code>note</code></td><td>Max length of 255 chars.</td></tr><tr><td>section</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>section</code></td><td>One of existing Section Template Codes.</td></tr><tr><td>completeness_set</td><td></td><td>One of existing Completeness Set Codes.</td></tr><tr><td></td><td></td><td>Available for column <code>_type</code> -<code>section</code>.</td></tr><tr><td>translation_{language} <mark style="color:red;">*</mark></td><td></td><td>Translation in specific language. Available for column <code>_type</code> - <code>heading</code> and <code>note</code>.</td></tr></tbody></table>

<mark style="color:red;">\*</mark> Language is 5 chars LCID language code. Example: `translation_pl_PL`.


# section\_templates.csv

{% hint style="info" %}
This file can be used to: Create a new section template, and add a translation of the section template name.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars.</td></tr><tr><td>_name</td><td></td><td>Max length of 128 chars.</td></tr><tr><td>_language</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if _name column present</td><td>5 chars LCID language code. Example: <code>pl_PL</code></td></tr></tbody></table>

Example:

| \_code | \_name | \_language |
| ------ | ------ | ---------- |
| code   | name   | en\_GB     |


# section\_templates\_elements.csv

{% hint style="info" %}
This file can be used to: Create a section template structure using numeric values representing the position of each section template element.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Section Template Codes.</td></tr><tr><td>_type</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>attribute</code>, <code>heading</code>, <code>divider</code>, <code>note</code>}</td></tr><tr><td>_x</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Numeric value 0-3.</td></tr><tr><td>_y</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Positive numeric value.</td></tr><tr><td>_width</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Numeric value 1-4.</td></tr><tr><td>_height</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Numeric value 1-10.</td></tr><tr><td>attribute</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>attribute</code></td><td>One of existing Attribute Codes.</td></tr><tr><td>require</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>attribute</code></td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>label (<span data-gb-custom-inline data-tag="emoji" data-code="26a0">⚠️</span> deprecated - if given on import with default - default takes precedense)</td><td></td><td><p>Max length of 255 chars.</p><p>Available for column <code>_type</code> - <code>heading</code>.</p></td></tr><tr><td>default</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span> if <code>_type</code> column is <code>heading</code> or <code>note</code></td><td>Max length of 255 chars.</td></tr><tr><td>translation_{language} <mark style="color:red;">*</mark></td><td></td><td>Translation in specific language. Available for column <code>_type</code> - <code>heading</code> and <code>note</code>.</td></tr></tbody></table>

<mark style="color:red;">\*</mark> Language is 5 chars LCID language code. Example: `translation_pl_PL`.


# roles.csv

{% hint style="info" %}
This file can be used to: Create new roles and edit the description of existing ones.
{% endhint %}

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Lowercased, alphanumerical and "_" signes are accepted.</td></tr><tr><td>_description</td><td></td><td>Max length of 500 chars.</td></tr></tbody></table>


# roles\_feature\_privileges.csv

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Role Codes.</td></tr><tr><td>_feature</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>IMPORT</code>, <code>CATEGORY_TREE</code>, <code>CATEGORY</code>,<code>PRODUCT</code>,<code>ATTRIBUTE</code>,<code>ATTRIBUTE_GROUP</code>,<code>TEMPLATE_DESIGNER</code>,<code>MULTIMEDIA</code>,<code>USER_ROLE</code>,<code>USER</code>,<code>APP</code>,<code>WORKFLOW</code>,<code>SEGMENT</code>,<code>CHANNEL</code>,<code>PRODUCT_COLLECTION</code>,<code>SETTINGS</code>,<code>INTEGRATION_API_KEY</code>,<code>CONFIGURATION_CATEGORY_ATTRIBUTES</code>,<code>SHARED_VIEWS</code>,<code>ACTIVITIES</code>,<code>PRODUCT_IMPORTER</code>,<code>PLAN</code>,<code>AUTOMATION</code>}</td></tr><tr><td>_create</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>_read</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>_update</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>_delete</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>true</code>, <code>false</code>}</td></tr></tbody></table>


# automations.csv

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Alphanumerical and "_" signes are accepted.</td></tr><tr><td>_name</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars.</td></tr><tr><td>_active</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>true</code>, <code>false</code>}</td></tr><tr><td>_conditions</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td></td></tr></tbody></table>


# automation\_actions.csv

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Automation Codes.</td></tr><tr><td>_property</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of {<code>attribute</code>, <code>language</code>, <code>value</code>,<code>type</code>,<code>template</code>,<code>from</code>,<code>to</code>}</td></tr><tr><td>_position</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td></td></tr><tr><td>_value</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>According to specific _property.</td></tr></tbody></table>


# workflows\_statuses.csv

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Alphanumerical and "_" signes are accepted.</td></tr><tr><td>_color</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Hexadecimal color value.</td></tr><tr><td>name_{language}</td><td></td><td>Max length of 100 chars.</td></tr><tr><td>description_{language}</td><td></td><td>Max length of 500 chars.<br>Existing Content language.</td></tr></tbody></table>


# workflows.csv

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>Max length of 128 chars. Lowercased, alphanumerical and "_" signes are accepted.</td></tr><tr><td>_default</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Status Codes.</td></tr></tbody></table>


# workflows\_transitions.csv

<table><thead><tr><th>column</th><th width="150">required</th><th>limitation</th></tr></thead><tbody><tr><td>_code</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Workflow Codes.</td></tr><tr><td>_from</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Status Codes.</td></tr><tr><td>_to</td><td><span data-gb-custom-inline data-tag="emoji" data-code="2705">✅</span></td><td>One of existing Status Codes.</td></tr><tr><td>_roles</td><td></td><td>Only existing Role Codes.</td></tr><tr><td>_users</td><td></td><td>Only existing User Emails.</td></tr><tr><td>_conditions</td><td></td><td></td></tr></tbody></table>


# Incremental import

Basic concepts behind the format in terms of importing data

Importing data via provided import files is incremental.

Only present-in-the-file data is changed and the rest is not modified. Consider following:

* translation data is changed only in languages provided in the file (column `_language`)
* if a column is not present corresponding resource property is left unmodified
* if a `Product` attribute column is not present values for this attribute are not changed
* if a translation column is present and has an empty value the translation value shall be deleted

{% hint style="info" %}
templates\_elements.csv, section\_templates\_elements.csv, category\_trees\_elements.csv are exceptions from the above rules. Since those files represent one resource they are attached to the entire resource(template, section, category tree) is imported at once which means if an element is missing in the file the element will be deleted from the resource if was there prior to import.
{% endhint %}


# Import configuration

#### Name

allows identifying the import profile.

#### Headers

list of HTTP Headers to be sent by import while downloading Multimedia. For example, those can be used to authorize when requesting multimedia files via URL.

#### Delimiter

determines what sign divides columns in the imported file.

#### Include in the imports

a list of resources participating in the import process. If a resource is included in the import and its files are missing in the ZIP archive the import is not started with an error message about the missing file. Only files of included resources will be processed and others in the archive will be ignored.

following options are available:

* Attributes - requires `attributes.csv` and enables support for `custom_fields.csv`
* Categories - requires `categories.csv`
* Category trees - requires `category_trees.csv` and `category_tree_elements.csv`
* Category attributes - requires `category_attributes.csv`
* Completeness sets - requires `completeness_sets.csv`
* Options - requires `options.csv`
* Products - requires `products.csv`
* Templates - requires `templates.csv` and `templates_elements.csv`
* Sections - requires `section_tempates.csv` and `section_templates_elements.csv`
* Multimedia - requires `multimedia.csv`
* Multimedia folders - requires `multimedia_folders.csv`
* Units - requires `units.csv`


# Export configuration

#### Name

allows identifying the export profile.

#### Include in the exports

a list of resources generated in the export.

following options are available:

* Attributes - includes `attributes.csv` and `custom_fields.csv`
* Categories - includes `categories.csv`
* Category trees - includes `category_trees.csv` and `category_tree_elements.csv`
* Category attributes - includes `category_attributes.csv`
* Completeness sets - includes `completeness_sets.csv`
* Options - includes `options.csv`
* Products - includes `products.csv`
* Templates - includes `templates.csv` and `templates_elements.csv`
* Sections - includes `section_tempates.csv` and `section_templates_elements.csv`
* Multimedia - includes `multimedia.csv`
* Multimedia folders - includes `multimedia_folders.csv`
* Units - includes `units.csv`

#### Languages

limits the exported files to lines containing values only in specified languages.

#### Delimiter

determines what sign divides columns in the exported file.

#### Export type

works only within the context of products. Once you edit or add new products only those changes will appear in the export.

#### Segment

works only within the context of products. Only products available within chosen segment will be exported to `products.csv` file.

#### Behavior of variables

works only within the context of products. When textarea value contains variables those will be either exported as #attribute\_code or as parsed value.


# Changelog

The changelog is a list of recent changes to GraphQL API schema.

## 2026-03-10

* roles.csv file added
* roles\_feature\_privileges.csv file added
* attribute\_groups.csv file added
* automations.csv file added
* automations\_actions.csv file added
* multimedia\_attributes.csv file added
* workflows\_statuses.csv file added
* workflows.csv file added
* workflows\_transitions.csv file added
* multimedia.csv attributes value added
* attributes.csv `_group` added.

## 2024-05-21

* completeness\_sets.csv file added
* templates\_elements.csv `completeness_set` added

## 2024-05-14

* templates\_elements.csv new `_type` values added - `divider` and `note`
* templates\_elements.csv `default` added. If passed together with it `label` takes precedence
* templates\_elements.csv `translation_{language}` added
* templates\_elements.csv `label` becomes deprecated
* section\_templates\_elements.csv new `_type` values added - `divider` and `note`
* section\_templates\_elements.csv `default` added. If passed together with it `label` takes precedence
* section\_templates\_elements.csv `translation_{language}` added
* section\_templates\_elements.csv `label` becomes deprecated

## 2024-04-09

* attributes.csv `unique` added

## 2024-01-25

* custom\_fields.csv file added
* options.csv custom field values added

## 2023-05-31

* templates.csv `_name` represents from now on the actual Template name rather than the code
* templates.csv `_language` added
* section\_templates.csv `_name` added
* section\_templates.csv `_language` added

## 2023-02-22

* options.csv `_label` removed

## 2023-01-27

* category\_attributes.csv file added

## 2023-01-10

* units.csv file added

## 2022-11-09

* categories.csv attributes value added

## 2022-10-19

* category\_trees.csv file added
* category\_trees\_elements.csv file added

## 2022-10-11

* attributes.csv `_placeholder` removed
* options.csv `_name` added. It replaces `_label` column. If passed together with it `_name` takes precedence

## 2022-07-14

* multimedia.csv `_title` column added
* templates\_elements.csv `sections` column added
* templates.csv `_language` removed
* section\_templates.csv file support added
* section\_templates\_elements.csv file support added

## 2022-06-09

* products.csv `_children` column will contain duplicated SKU entries for GROUPING-PRODUCT according to the quantity set for the relation
* templates.csv `_name` becomes deprecated

## 2022-05-10

* templates.csv `_language` becomes deprecated

## 2022-03-15

* attributes.csv `_placeholder` becomes deprecated


# Breaking changes

The list of recent and upcoming breaking changes

At Ergonode we strive to make your integration process as fluent as possible but from time to time we discover a flaw in the design of the schema or introduce a really cool new feature that is impossible to be provided in a fully-compatible non-breaking way. In such a situation, we will always aim to not break your integration with the new release and provide you with a transition period of approximately 3-months to adjust your consumer. Every such change shall be communicated in the following list.

## 2024-05-14

Breaking change scheduled for 09-2024

* templates\_elements.csv `label` is going to be removed
* section\_templates\_elements.csv `label` is going to be removed

## 2022-10-11

Breaking change scheduled for 01-2023

* options.csv `_label` is going to be removed

## 2022-06-09

Breaking change scheduled for 10-2022

* templates.csv `_name` is going to be removed

## 2022-05-10

Breaking change scheduled for 07-2022

* templates.csv `_language` is going to be removed

## 2022-03-15

Breaking change scheduled for 07-2022

* attributes.csv `_placeholder` is going to be removed


# Apps

This doc provides an overview of Ergonode Apps framework.

Apps allow you to extend the user interface of Ergonode - thanks to them you can do more in one place, eventually making handling your data and processes easier.

## What's an App?

The App is a small custom web application (microservice) that resolves your business-specific problem.

It can generate a CSV file, integrate your data with an external eCommerce system, or even modify the data within Ergonode to i.e. automate some of the data management processes.

The App communicates with Ergonode through its public application programming interfaces (APIs) - you don't modify Ergonode code itself but instead provide a separate web application that, together with your Ergonode instance, removes obstacles on your path.

Since the App is a standalone application you are not limited to any specific programming language - you can develop it in PHP, Java, Python, JavaScript, and many more.

It can be written by yourself, by an agency you work with, or you can use one of the native Apps provided by the Ergonode team itself.

## How can I start with the development of my custom App?

Follow this [documentation](/apps2/quick-start), or contact one of our trusted partners or your development agency.


# Quick start

Overview of steps required to create an App

To create an App you only need basic development knowledge.

You are not limited to a specific programming language, only to the possibilities granted via Ergonode by its communication interfaces.

To develop a functional App you only need to follow a couple of simple steps.

## Create a Manifest

[Manifest reference](/apps2/detailed-reference/manifest)

Firstly, you need to provide a Manifest - a simple JSON file determining the basic App behavior and possibilities it is utilizing.

The file is required for the app registration process for the New App to display in your available apps tab.

## Prepare authentication

[Authentication reference](/apps2/detailed-reference/authentication)

Next up it's essential to keep your data safe. To achieve that you should have a functional authentication system.

The App has to be able to identify itself so that Ergonode will know it can perform the API operation it is trying to execute. It is also crucial that when the App receives a request it can determine whether it comes from a trustworthy source.

On App installation, Ergonode exchanges handshake with App with data allowing authentication of the following requests performed, assuring that no 3rd party is tempering the data.

## Handle your configuration

[Configuration reference](/apps2/detailed-reference/configuration)

Some Apps require dedicated configuration. Once provided by Manifest App users will be able to set up their App within Ergonode to make it work appropriately to the installation needs - App should validate and persist your configuration.

## Implement event endpoints

[Event endpoints reference](/apps2/detailed-reference/event-endpoints)

If your App needs to know about basic events create specific events handling.

## Implement your business logic

It is up to you what exactly the App will do.

## Implement synchronization endpoints

This step is optional and depends on your intent.

[Synchronization endpoints reference](/apps2/detailed-reference/synchronization/synchronization-endpoints)

If your App is meant to generate a file, integrate the data into the eCommerce system, or has a similar purpose forcing having the long-running process to handle all of the data, rather than implementing the entire synchronization yourself, let Ergonode orchestrate the process and focus only on the development of your business logic.

## Host your application

Host your application on an HTTP server of choice.

{% hint style="info" %}
For development and testing use tools like [ngrok](https://ngrok.com/) to make quicker code iterations.
{% endhint %}

{% hint style="info" %}
Ergonode currently does not provide hosting for custom Apps.
{% endhint %}

## Register your App

Once all set up register your App in the available apps tab.

{% hint style="info" %}
To refresh the App Manifest, it has to be changed and reapplied just like on App registration. Ergonode does not refresh it automatically.

Remember also, on refreshment, to raise the version - otherwise, changes won't be applied as described in the [version](/apps2/detailed-reference/manifest#version) restrictions description.
{% endhint %}

<figure><img src="/files/SzvZskrd7cRTUMXHps7y" alt="" width="375"><figcaption><p>Click on New app button</p></figcaption></figure>

<figure><img src="/files/nuekNGxvamz7NgmXIJsa" alt="" width="375"><figcaption><p>Fill your Manifest URL</p></figcaption></figure>


# Manifest

Full reference of Manifest file.

Manifest is a simple JSON file that describes your App behavior and its possibilities.

{% hint style="info" %}
To refresh the App Manifest, it has to be changed and reapplied - just like on App registration. Ergonode does not refresh it automatically.

Remember also, on refreshment, to raise the version - otherwise, changes won't be applied as described in the [version](#version) restrictions description.
{% endhint %}

Contained fields:

## name

A simple text describing under what name your app is visible in the Ergonode available Apps tab.

This value should allow easy identification of what your App does.

Restrictions:

* has to exist and not be empty
* the length of the name is limited to 30 chars and should be no less than 3 chars.

## description

A simple text describing the purpose fulfilled by the App.

Restrictions:

* has to exist and not be empty
* the length of the name is limited to 200 chars and should be no less than 20 chars.

## version

A [semantic version](https://semver.org/) of your manifest. It does not necessarily need to address your application version but rather the content of the Manifest file.

Restrictions:

* has to exist and not be empty
* when reapplying the Manifest for App update the changes may only be applied when the new version is higher than the existing ones - otherwise, changes will not take effect.

## compatible

A[ semantic version](https://semver.org/) that the current version of the Manifest is compatible with.

This allows Apps Engine to determine whether an App administrator should take action and reconfigure the App for the new needs - fill out previously not existing configuration fields etc.

So for instance if, on the App update, the compatible field is higher than the last version(i.e. `compatible = 1.1.0` and `last version = 1.0.0`) of the App installations will be set in `Configuration required` status - implicating the need for action and disallowing following actions with an App.

Restrictions:

* has to exist and not be empty
* the value cannot be greater than the `version` field

## configuration\_schema

A list of [JSON schemas](https://json-schema.org/) to allow building simple or multi-step configuration forms.

[Detailed reference can be found here.](/apps2/detailed-reference/manifest/configuration-schema)

## features

&#x20;A list of predefined features App utilizes:

#### synchronization

Enables the ability to run synchronization via the App.

The synchronization is always run as delta via this feature - meaning only changes from the last synchronization will be sent to the App.

* on first synchronization, all data state is being transferred to an App
* on every following synchronization, the App receives only data that has changed from the previous execution

#### synchronization\_full

Enables the ability to run full synchronization via the App.

All configured within App data is synchronized via this feature disregarding delta - which means the entire data state is transferred to the App on every synchronization.

This feature is always a secondary option in the Run synchronization split button if enabled together with `synchronization`.

<figure><img src="/files/Pao7lSDR0UEFRNknZcSq" alt="" width="375"><figcaption><p>Run synchronization split button</p></figcaption></figure>

#### synchronization\_file\_download

Claims that the App generates a file as the result of the synchronization - for the enabled feature every finished synchronization will receive a file download button within the right-hand menu as well as a Download last synchronization button in the main App menu

<figure><img src="/files/Vhi2GjgHNpBhQCERwF7s" alt="" width="375"><figcaption><p>Download file buttons</p></figcaption></figure>

When this feature is enabled follow the [File download endpoint reference](/apps2/detailed-reference/synchronization/file-download-endpoint).

#### synchronization\_file\_download\_latest

This feature enables `Copy feed URL` button. This URL is publicly available, with no need for authorization.

<figure><img src="/files/GFCGXK0L8gFS61tfQaRa" alt="" width="375"><figcaption><p>Copy feed URL button</p></figcaption></figure>

When this feature is enabled follow the [File download endpoint reference](/apps2/detailed-reference/synchronization/file-download-endpoint) as for `synchronization_file_download` feature.

#### synchronization\_scheduler

This feature enabled `Scheduler tab`

<figure><img src="/files/7U4plX7TbKsd52A2aPLp" alt="" width="375"><figcaption><p>Scheduler tab</p></figcaption></figure>

## events

Events the App subscribes to. Available:

#### app\_installed

App installed by the user in the Ergonode interface.

#### app\_uninstalled

App uninstalled by the user in the Ergonode interface.

#### attribute\_created

Attribute created.

Currently available only in the synchronization context.

In the synchronization context, the event also contains detailed updated payloads.

#### attribute\_updated

Attribute updated.

Currently available only in the synchronization context.

#### attribute\_deleted

Attribute deleted.

Currently available only in the synchronization context.

#### category\_created

Category created.

Currently available only in the synchronization context.

In the synchronization context, the event also contains detailed updated payloads.

#### category\_updated

Category updated.

Currently available only in the synchronization context.

#### category\_deleted

Category deleted.

Currently available only in the synchronization context.

#### product\_created

Product created.

Currently available only in the synchronization context.

In the synchronization context, the event also contains detailed updated payloads. It also represents the access granted event i.e. when the product is added to a segment.

#### product\_updated

Product updated.

Currently available only in the synchronization context.

#### product\_deleted

Product deleted.

Currently only available in the synchronization context.

In the synchronization context, it also represents the access revoked event i.e. when the product is removed from a segment.

#### synchronization\_started

The new synchronization process started.

#### synchronization\_ended

The synchronization process ended.

## write\_access

Claims that the App requires the write access to fulfill its purpose.

A user is notified of the request on App installation.

When installed the App can use Ergonode API write capabilities to manipulate the data.

Restrictions:

* currently the field cannot be changed after the initial App registration

## icon

Icon allows easy identification of the App within available and installed Apps.

Restrictions:

* value has to be represented as a Base64 image i.e. `data:image/jpeg;base64,*`
* value cannot be greater than 10 KB

## url

Base URL under which the App is available. When not provided a host of the Manifest Url is taken as this parameter.

Restrictions:

* a valid URL string
* currently, the value of the field cannot be changed after the initial App registration

## Example Manifest

```json
{
    "name": "My custom App",
    "description": "My custom App description",
    "version": "0.1.0",
    "compatible": "0.0.0",
    "configuration_schema": [
        {
            "title": "Connection",
            "type": "object",
            "properties": {
                "apiKey": {
                    "type": "string",
                    "title": "API key",
                    "propertyOrder": 1
                }
            },
            "required": [
                "apiKey"
            ]
        },
        {
            "title": "Settings",
            "type": "object",
            "properties": {
                "setting": {
                    "type": "string",
                    "title": "Specific app setting",
                    "propertyOrder": 1
                }
            },
            "required": [
                "setting"
            ]
        }
    ],
    "features": [
        "synchronization",
        "synchronization_full",
        "synchronization_file_download",
        "synchronization_file_download_latest"
    ],
    "events": [
        "product_created",
        "product_updated",
        "product_deleted",
        "synchronization_ended",
        "app_uninstalled"
    ],
    "icon": "data:image/webp;base64,UklGRsAFAABXRUJQVlA4ILQFAACwLQCdASoIAQgBPpFIoEulpKMhpFb4OLASCWVu4XSZz39d84G2/0j8LdH4ePpu0QehvzAP0K/3n9P6yHmF/mHTO/2XqHf9XqQPQg6WT9h8I9/zM4Xvm7T3+A3tolr1x1F/0Vg126lTUDoHQOgdA6B0DoHQOgdA6B0DoHQOgdA6B0DoHQOgdA6B0DoHQOgdA5YhX87OLqYej4fP5yIn49Vg7edLvNQxEgQalakkLTjaZWmeCj7XffMI5IYlK0H7LlDHGTFhS6vTeEXq852czXpeRmXsxCi0hiYJG9C0UX9wFkJ6wZ03+QSxDeEXuSwN4yHW16ggnSEcEzOCjkjao/OEhI842ptUF9WjpAQeuoViARullbWalo2TJGbhF7ozRavokygEYnRBuOaQQEt+I8zEZWgn7Saf6ji042l91UXREER4l7n0b5uWuySXuk6B0DrCpKm1NqbU2ptTam1NqbU2ptTam1NqbU2ptTam1NqbU2ptTalgAAD+9lD2Zb//9dx/53H/ncZmgmWCEYsIAAAABy+r8RtwslSEv0snvKmjf+wInhYkZ69wA2wOi6vvlXllaLZ/sfosQCfzDV3EhuLH28SIxv98IkoczaEb3+Pl/8lD7E5cjhfvtAqKX91uhXb/8+/jjTWZYnNDQcQpn7Qffa8BGDhmqHf/M7cbE1vw/J5Kvr6Ds9cY1vA/6oJs/W/ARFbYq46Wx7Cmni4CYRb9V7U2kNsAddu0pNKwqOmkJpIX91ey5qNB4dRRyvDmAMF8ftrTHLXBJXZvtFHIIQOWL8iyHGTBt7DyAeLbHpUatyM+BJPKf8P1fA/HxZ9ats9DiutJzmji9J0V68O26e8IJEfNt7aZe2yLrDPDpGUk/2hf+HncO7gxhdoMOUgx2pMGdkYG4lVEZM0RL3QQcS4F1rN5z+6DmeJ5QhrmEbZuomukKdaYrwLcEQOV4RJ2exJt2rh6tC7Vn1ghzf8Ju3d+zm0AU79dzF3aVBmQMgP7MJ+Jxyb3ZCnuWtoG+o1hIs3/UTjIAYfTcrU2YC0/tamgX46tYj/3wTjU73Foj+ihuOQfk0Jo1GjTBMU8mnJ4A2JMmrIPKskquNRO09Kyo64HIvPDuggb8efQoVvLEyvn1wKzChX5nmvAENOVMBlHEsM+1b4h+8+v+W9Drw9X8o1wL04LfPxnBlY/8hYE3j1tlvjbo0J3YuV4Ih8vfSb63IcJmPYhRdHXavcpv+WMVV//86gH9wjqzpqdZG+Twfz722biI4aGAxGfeH/O/CILnplEgyXU0eySpNflC2JJso1d5Eyiue8eMje4XM65KS/8Kz16F2wYJgGfjlC+YgYXnlaX8x29FYeIiWivNG3zvahM5k3LTiE90cgsZnPH0rCLRe8OuHIFGfeWCv7exWhddIf3YekuFg4n+HY999JzYmmgFBwooH/lM16Z/MdSU7JG9ahFC4ywu0MxIfhQyOSvt05rW6ts7L6QmJ+gFjKsod3FudEjADbQHjhVN/Gb1KtyknKXXrTr6hmgEuFb3TD0tyv4MXxJuoTaeiWcygV7WMVtJWfb80UcJ4f+NQe7OJp5P7H7w5e4jMSIMbQFGEkyOzi0xw+FFdOso6ZQaqqBdqeCB9Z9TdrQDwdfihNr4H+BGO4xrdLk3jAGRACNjN+yBZx5TYeRjWTDFZXpnnUlECHlvCzRtWAuZf19qOKzDsy4ypJ/N28ilq4e9TEykVocV5tnf5pGcHSza3EAWyBrWTEPj7k3JetvhbuASW2M2BRBZk+GtI3RsTSYQnWV77fANxGp1vIufGmRj/QxF9w1umS/BUIpkt9TAArXG6USpH7V9AFA377J8BS6p8wMUmcsHCymFOuM1l0BnEnGP+o13bk9uwHkx2k4g6AMXR6ZnnzdQhlB0lsHhdGROJnO3dxQgKhcojXvVPlrLX8whSU6gAAAAAAAAA=="
}
```


# Configuration schema

Overview of how to build App configuration

## Introduction

App most usually requires some sort of configuration specific to its installation.

Below you can find the Ergonode CSV App configuration.

<figure><img src="/files/VFLeVjqB5oogzKeh01o0" alt="" width="375"><figcaption><p>Ergonode CSV App configuration</p></figcaption></figure>

Such configuration can be achieved by setting up the [configuration\_schema](/apps2/detailed-reference/manifest#configuration_schema) section in the Manifest file.

The value is a list of [JSON Schemas](https://json-schema.org/) allowing you to build a form.

{% hint style="info" %}
Not full JSON Schema is yet covered in Ergonode.

If you have a case of a feature that suits your needs and is a part of the JSON Schema standard we may consider extending our implementation.

Please contact the respective Ergonode representative with the details.
{% endhint %}

The reason it's a list is fairly simple - in some scenarios, at first you need to input i.e. API Token, then choose which attributes from the App you'd want to configure - a piece of information that is only accessible once authorized within the system App is handling.

So the following steps in the form(following JSON Schemas) will be built once you correctly fill the current step.

## Example schema

```json
{
  // (...) rest of the Manifest file
  "configuration_schema": [
    {
      "title": "Configuration",
      "type": "object",
      "properties": {
        "simpleText": {
          "type": "string",
          "title": "Just a text",
          "propertyOrder": 1
        },
        "secret": {
          "type": "string",
          "title": "Secret password",
          "widget": "password",
          "propertyOrder": 2
        },
        "multilineText": {
          "type": "string",
          "title": "Multiline text",
          "widget": "textarea",
          "propertyOrder": 2
        },
        "simpleEnum": {
          "type": "string",
          "title": "Simple Enum",
          "enum": [
            "1",
            "2"
          ],
          "options": {
            "enum_titles": [
              "one",
              "two"
            ]
          },
          "propertyOrder": 4
        },
        "enumMultiple": {
          "items": {
            "type": "string",
            "enum": [
              "one",
              "two"
            ],
            "options": {
              "enum_titles": [
                "Choice one",
                "Choice two"
              ]
            }
          },
          "minItems": 1,
          "uniqueItems": true,
          "type": "array",
          "title": "Multiple choice enum",
          "propertyOrder": 6
        },
        "dictionaryErgonodeEnum": {
          "type": "string",
          "title": "Dictionary Ergonode Enum",
          "options": {
            "enum_dictionary": "ergonode:languages"
          },
          "propertyOrder": 7
        },
        "dictionaryAppEnum": {
          "type": "string",
          "title": "Dictionary App Enum",
          "items": {
            "type": "string",
            "options": {
              "enum_dictionary": "app:app-dictionary"
            },
            "minItems": 1,
            "uniqueItems": true
          },
          "propertyOrder": 8
        },
        "attributeMapping": {
          "type": "array",
          "title": "Attribute mapping",
          "items": {
            "title": "prototype",
            "type": "object",
            "properties": {
              "ergonode": {
                "type": "string",
                "title": "ergonode",
                "propertyOrder": 1
              },
              "app": {
                "type": "string",
                "title": "app",
                "propertyOrder": 2
              }
            },
            "required": [
              "ergonode",
              "app"
            ]
          },
          "widget": {
            "type": "mapper",
            "options": {
              "ergonodeDictionary": "ergonode:attributes",
              "appDictionary": "app:attributes"
            }
          },
          "propertyOrder": 9
        }
      },
      "required": [
        "simpleText",
        "secret",
        "multilineText",
        "simpleEnum",
        "enumMultiple",
        "dictionaryErgonodeEnum",
        "dictionaryAppEnum",
        "attributeMapping"
      ]
    }
  ]
}
```

Ok, so a lot is going on in this example. Let's break it down field by field.

#### simpleText

This is the simplest case.

It's a plain text that your user can input. It'll be displayed as a regular HTML text input.

<figure><img src="/files/88BMsPwMBRct4XiIHucq" alt="" width="375"><figcaption></figcaption></figure>

#### secret

The secret is very similar to the previous simple text example but as with any other sensitive data you do not always want it visible constantly on your configuration. That's why a [password widget](#password) is added - it results in a hidden secret text.

<figure><img src="/files/X5FxCldoaamSz0dF9Kve" alt="" width="375"><figcaption></figcaption></figure>

#### multilineText

Sometimes one-line text won't suffice. You can extend the text presentation thanks to the [textarea widget](#textarea).

<figure><img src="/files/Q4UXBlJKdVkackI4WSYI" alt="" width="375"><figcaption></figcaption></figure>

#### simpleEnum

Another frequent case is a limited of values from which a user can choose. That's where the enum comes into play. There are 2 additional special fields added here

* enum - represents the actual valid value list to choose from
* options.enum\_titles - represents the presentational titles list to be displayed to the user in dropdown

<figure><img src="/files/8QigLegQRgqjD5LQw4nb" alt="" width="375"><figcaption></figcaption></figure>

#### enumMultiple

An extended example of simple enums is when you have multiple choice allowed. Instead of using type `string` adjust it to `array` with `string` type elements.

#### dictionaryErgonodeEnum

Here's where things get a bit more kinky. You, again, need a predefined set of values but those values are already there in Ergonode i.e. a list of languages to choose from or an attribute.

A field `options.enum_dictionary` is added - in short, you tell the interpreter to render a list of languages from Ergonode via a dictionary `ergonode:languages` - this is resolved by Ergonode.

[Ergonode dictionaries reference can be found here.](/apps2/detailed-reference/manifest/dictionaries#ergonode)

<figure><img src="/files/UYRJgzHT3W4g8UVkITql" alt="" width="375"><figcaption></figcaption></figure>

#### dictionaryAppEnum

Another possibility is that the predefined list is not part of Ergonode data but the App or system it integrates with. The App may define multiple dictionaries with different data.

[App dictionaries reference can be found here.](/apps2/detailed-reference/manifest/dictionaries#app)

Note this time `options.enum_dictionary` is wrapped into `items` - this changes the select to multi-select in the dropdown list.

#### attributeMapping

Occasionally, especially on synchronization Apps, you'll need attributes mapping from Ergonode to an external system. This is possible by combining two things.

A structure definition that can carry on the mapping

```
[
  {
    "ergonode": "attribute_one",
    "app": "attribute_two"
  }
]
```

and [mapper widget](#mapper) capable of making it easier to map the data in the configuration user interface.

<figure><img src="/files/51wLrGjdnF0sDTMKNCqc" alt="" width="375"><figcaption></figcaption></figure>

## Widgets

Widgets are dedicated UI components that allow a custom presentation of a specific field.

#### password

Changes displaying of the plain text in HTML text input into password input.

<figure><img src="/files/X5FxCldoaamSz0dF9Kve" alt="" width="375"><figcaption><p>password widget</p></figcaption></figure>

#### textarea

Presents text input in the form of textarea input.

<figure><img src="/files/Q4UXBlJKdVkackI4WSYI" alt="" width="375"><figcaption><p>textarea widget</p></figcaption></figure>

#### mapper

Allows for drag-and-drop mapping of the attributes and handles validation of their types.

The widget accepts 2 options:

* ergonodeDictionary - saying where from claim data - this option is mandatory
* appDictionary - this field is optional - if not present the Ergonode mapping will be possible to textual values

<figure><img src="/files/51wLrGjdnF0sDTMKNCqc" alt="" width="375"><figcaption><p>Attribute mapping widget overview</p></figcaption></figure>

<figure><img src="/files/MS7QFtxicCMOVY310U6G" alt=""><figcaption><p>Attributes mapping widget details</p></figcaption></figure>


# Dictionaries

Extend the configuration via dictionaries

Sometimes you need to choose from a predefined list of values already existing in the system.

In the configuration, it's not always easy as the values may be related to the configuration itself. The values may be available only after configuring the API Key in step one etc, therefore, cannot be part of the regular schema.

That's where the dictionaries come in handy. There are two sources of the configuration. The data either come from Ergonode or App.

The source of the dictionary is recognized via prefixes `ergonode:` and `app:`

## Ergonode

List of available dictionaries

* ergonode:attributes
  * it is possible to limit types of attributes thanks to query parameters - `egonode:attributes?type=TEXT,TEXT_AREA`
* ergonode:categories
* ergonode:languages
* ergonode:media\_profiles

## App

In App, you can define as many custom dictionaries as you require.

In Manifest [configuration\_schema](/apps2/detailed-reference/manifest/configuration-schema) you reference the dictionary by the conjunction of `app:` prefix and dictionary ID suffix i.e `app:attributes`.

App provides custom dictionaries by implementing `/dictionary/{dictionary}` endpoint.

For the above example, the endpoint would be `/dictionary/attributes`.

{% hint style="info" %}
The dictionary endpoint will be called only when the step of the configuration schema it is defined in is generated, so you have all the configuration from earlier steps at your disposal during dictionary retrieval(like API keys, etc).
{% endhint %}

The endpoint response for the valid dictionary should return

```json
{
  "dictionary": [
    {
      "id": "value",
      "label": "Presentation label"
    }
  ]
}
```

#### Type validation

If your mapping requires extra type validation, you may provide `type`  for every entry that matches the mapping context. For multiple types, separate them with `|`.

```json
{
  "dictionary": [
    {
      "id": "description",
      "label": "Description attribute",
      "type": "TEXT_AREA|TEXT"
    }
  ]
}
```

#### Merging values

By default, mapping on dictionary items allows only one value to be mapped to a specific attribute. It is possible to override this behavior by declaring the possibility of merging via `allows_merging` flag.

If enabled, the App is responsible for merging value itself according to internal strategy - flag only changes the behavior of the mapper, and values are provided to App the same way.

```json
{
  "dictionary": [
    {
      "id": "description",
      "label": "Description attribute",
      "allows_merging": true
    }
  ]
}
```


# Authentication

Description of concepts behind authentication system and how to prepare your own security.

Requests between Ergonode and App are signed using [JWT](https://jwt.io/) tokens.

These tokens allow the safe exchange of custom data(claims) between two parties.

The token contains claims describing the context of the execution - what specific installation the token is referencing etc.

The token is always available in `X-APP-TOKEN` HTTP header with a signature signed using HMAC SHA-256.

{% hint style="info" %}
Note you should not be forced to implement JWT authentication on your own.

There are multiple well-developed and acknowledged open-source solutions to handle the issue.
{% endhint %}

## Handshake

To authenticate the token firstly, on App installation, a handshake is exchanged.

Handshake is a request to `[POST] /handshake` path of [your App](/apps2/detailed-reference/manifest#url).

It contains two important pieces of information:

* `X-APP-TOKEN` HTTP header
* shared secret in the request body

```
{
  "shared_secret": "your_app_installation_shared_secret"
}
```

This secret should be persisted, i.e. the database of choice, and kept by your App safe with information about the app installation it belongs to and the Ergonode API URL retrieved from claims:

* app\_installation\_id
* api\_url

All the following requests by Ergonode to an App should be authenticated using this secret.

You should also encrypt the shared secret within the persistent storage so it is not easily retrievable.

The response status has to be 2xx to process installation appropriately.

## Authentication of the incoming request

Steps to verify whether the request is coming for a specific App installation from Ergonode

1. obtain the token from `X-APP-TOKEN` HTTP header of the request
2. extract the `app_installation_id` claim from the JWT without signature verification
3. retrieve shared secret persisted on the handshake
4. verify JWTs signature using HMAC SHA-256 algorithm and the shared secret

## Authenticate the request to Ergonode

Steps to create an appropriate token authenticating in Ergonode API

1. establish the App installation ID
2. create claims - at the very minimum the following claims are required: `app_installation_id`, `nbf`(not before), `iat`(issued at), `exp`(expiration time)
3. retrieve, persisted on the handshake, shared secret
4. create  JWT with signature signed with HMAC SHA-256 algorithm and the shared secret
5. send the token as `X-APP-TOKEN` HTTP header to Ergonode API URL from handshake

Alternatively, on the requests from the Ergonode, i.e. in synchronization context, you can reuse the token provided by the Ergonode.


# Configuration

Configure your App in Ergonode

If the App requires configuration and defines configuration form in [configuration\_schema](/apps2/detailed-reference/manifest#configuration_schema) it has to appropriately handle the values.

It has to be able to validate and persist the configuration and also provide the configuration for reading.

To do so 2 endpoints implementation is necessary.

{% hint style="info" %}
Each endpoint receives an appropriate `X-APP-TOKEN` HTTP header with JWT that allows [authentication](/apps2/detailed-reference/authentication#authentication-of-the-incoming-request) of the caller.
{% endhint %}

#### \[GET] /configuration

The endpoint should return all so-far persisted schemas in update configuration steps in the form of an array of data - according to your schema.

For example for a simple configuration schema

```json
{
  "configuration_schema": [
    {
      "title": "Connection",
      "type": "object",
      "properties": {
        "token": {
          "type": "string",
          "title": "API token",
          "widget": "password",
          "propertyOrder": 1
        }
      },
      "required": [
        "token"
      ]
    },
    {
      "title": "Settings",
      "type": "object",
      "properties": {
        "setting1": {
          "type": "string",
          "title": "setting 1",
          "propertyOrder": 1
        },
        "setting2": {
          "type": "string",
          "title": "setting 2",
          "propertyOrder": 1
        }
      },
      "required": [
        "text"
      ]
    }
  ]
}
```

the expected response would be

```json
[
  {
    "token": "secret API token"
  },
  {
    "setting1": "user input text 1",
    "setting2": "user input text 2"
  }
]
```

{% hint style="info" %}
Every object represents single form step/one configuration schema.
{% endhint %}

{% hint style="info" %}
Preserving the configured objects under the same indexes as their definitions in the configuration schema is mandatory.
{% endhint %}

#### \[POST] /configuration

The endpoint accepts, validates, and persists in the configuration step.

payload

{% tabs %}
{% tab title="Example" %}

```json
{
  "index": 0,
  "configuration": {
    "text": "user input text"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "index": {
      "type": "integer",
      "description": "The index of the configuration step from configuration schema."
    },
    "configuration": {
      "type": "object",
      "description": "The form data according to configuration schema."
    }
  },
  "required": [
    "index",
    "configuration"
  ]
}
```

{% endtab %}
{% endtabs %}

All 2xx responses will be treated as success.

#### Error handling

The forms are validated against configuration schema but not all validation can be performed based on JSON schema.

I.e. API token can only be verified in the App.

{% hint style="info" %}
Though the frontend application performs configuration validation on every step it is a good practice to perform full validation in the App as well to limit any potential errors.
{% endhint %}

To assign a custom error message to specific user form fields it is required to return an error response with code 422 and the payload

{% tabs %}
{% tab title="Example" %}

```json
{
  "title": "Form validation errors.",
  "detail": "Token for API is not valid",
  "violations": [
    {
      "propertyPath": "token",
      "title": "Token for API is not valid",
      "template": "Token for %parameter% is not valid",
      "parameters": {
        "%parameter%": "API"
      }
    }
  ]
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "The title of an error."
    },
    "detail": {
      "type": "string",
      "description": "Detailed errors description."
    },
    "violations": {
      "type": "array",
      "description": "The list of violations.",
      "items": {
        "type": "object",
        "properties": {
          "propertyPath": {
            "type": "string",
            "description": "Path to the field the violation applies"
          },
          "title": {
            "type": "string",
            "description": "Ready to use message"
          },
          "template": {
            "type": "string",
            "description": "Template of the message"
          },
          "parameters": {
            "type": "object",
            "description": "Parameters of the template"
          }
        }
      }
    }
  },
  "required": [
    "index",
    "configuration"
  ]
}
```

{% endtab %}
{% endtabs %}

All other error codes will be treated with a generic error message.


# Event endpoints

React on events occurring in your App

There are several endpoints corresponding to events in the Manifest configuration.

{% hint style="info" %}
Each endpoint receives an appropriate `X-APP-TOKEN` HTTP header with JWT that allows [authentication](/apps2/detailed-reference/authentication#authentication-of-the-incoming-request) of the caller.
{% endhint %}

#### /consume/app\_installed

subscribed event: [app\_installed](/apps2/detailed-reference/manifest#app_installed)

example payload:

```json
{
  "name": "app_installed"
}
```

#### /consume/app\_uninstalled

subscribed event: [app\_uninstalled](#consume-app_uninstalled)

example payload:

```json
{
  "name": "app_uninstalled"
}
```

### Synchronization endpoints

Next to App events, there are multiple Synchronization events for which there are respective endpoints to be implemented.

[A full reference can be found here](#synchronization-endpoints)


# Synchronization

Let Ergonode orchestrate the synchronization process and worry only about your business logic

At the heart of every PIM-including ecosystem, there's data integration.

A need to keep your data well-organized thanks to PIM and easily accessible to eCommerce system(s).

We do realize that creating the synchronization process is not an easy task. At the very minimum, it most usually requires:

* a queue system like RabbitMQ, Amazon SQS, etc
* a worker
* well-developed and robust logic to handle the process
  * progress state
  * both process and entry statuses
  * history
  * frontend application displaying all that data
* persistent storage i.e. database
* business logic implementation

which is a lot and usually not that easy to do, especially, in the distributed environment of multiple services.

That's why at the core of the Apps engine we created an entire synchronization process orchestration with the intent of you only being left with implementing your desired business logic and the minimum effort needed around it.

Need only an incremental export of data you have recently changed? We've got you covered.

Does it have to handle full export each time? It's possible with an App.

## Creating synchronization App

To start with a synchronization App enable at least one of those features in your Manifest.

* synchronization - enables the basic integration. During every synchronization, you'll only receive data changed from the last iteration
* synchronization\_full - enables the possibility of running full integration on every execution

Both features may be enabled next to each other or you can pick just one.

<figure><img src="/files/jDvrwSApyVAG4KpRrmtj" alt=""><figcaption><p>With both features enabled they are available via split button with full synchronization as a secondary choice.</p></figcaption></figure>

If your App generates a file, enable features according to your needs

* synchronization\_file\_download - enables file download for each synchronization
* synchronization\_file\_download\_latest - generates constant URL under last-generated file will be available for feed-like functionalities

Finally, you need to develop your business logic in [synchronization endpoints](/apps2/detailed-reference/synchronization/synchronization-endpoints) and [file download endpoint](/apps2/detailed-reference/synchronization/file-download-endpoint) if your App utilizes this feature.


# Data flow

Overview of the data flow during synchronization process

## Synchronization start

This phase is optional based on [events](/apps2/detailed-reference/manifest#events) the App subscribes to.

Status: Preparing

## Data preparation

This is the internal phase.

Status: Preparing

Apps engine gathers the data required for the synchronization process.

{% hint style="info" %}
This process can take some time. Its length depends on the amount of data to process and the cache size needed to be built.

Most usually it'll be the longest on the first run of the synchronization and significantly shorter on the following one, even if it is the same full synchronization.
{% endhint %}

## Planning

This is the internal phase.

Status: Preparing

In this phase synchronization plan is created resulting in entries in the history created and put in `Planned` status.

## Attributes synchronization

This phase is optional based on [events](/apps2/detailed-reference/manifest#events) the App subscribes to.

Status: Execution

Firstly, as Attributes are the base of the Ergonode data model, their data is synchronized.

## Categories synchronization

This phase is optional based on [events](/apps2/detailed-reference/manifest#events) the App subscribes to.

Status: Execution

As a second Categories data is delivered to an App.

## Products synchronization

This phase is optional based on [events](/apps2/detailed-reference/manifest#events) the App subscribes to.

Status: Execution

As products utilize all of the previously synchronized resources they are the last ones to be sent.

## Products relations synchronization

This phase is optional based on [events](/apps2/detailed-reference/manifest#events) the App subscribes to.

Status: Execution

Lastly, relation data is being sent - variants, children assignment, and product relation attribute values.

This is to avoid circular reference problems where product A depends on B and B on A - all the products should exist in this phase already.

Relations payloads are always provided with `product_updated` events.

## Synchronization end

This phase is optional based on [events](/apps2/detailed-reference/manifest#events) the App subscribes to.

Status: Finished


# Synchronization endpoints

A place where the synchronization business logic is implemented

Synchronization endpoints have a very similar role to message handlers in a message queue system.

They receive the event(message) with data and react to its payload.

There are several endpoints corresponding to events in the Manifest configuration.

{% hint style="info" %}
Each endpoint receives an appropriate `X-APP-TOKEN` HTTP header with JWT that allows [authentication](/apps2/detailed-reference/authentication#authentication-of-the-incoming-request) of the caller.
{% endhint %}

JWT for all synchronization endpoint requests is extended with an extra context claim `synchronization_id`.

This claim is a UUID and allows identification of the synchronization process.

Every endpoint should respond with a 2xx HTTP code to be treated as a success.

## Synchronization endpoints

All the endpoints follow the semantic `[PUT] /consume/{event}`.

{% hint style="info" %}
`synchronization.events` contains an array of detailed payloads containing actual changes - [the full list can be found here](/apps2/detailed-reference/synchronization/synchronization-events).

Those events allow retrieving information about what has changed and reacting to that change.

This field for DELETED events is always an empty array.
{% endhint %}

#### /consume/attribute\_created

subscribed event: [attribute\_created](/apps2/detailed-reference/manifest#attribute_created)

example payload:

```json
{
  "name": "attribute_created",
  "resource_id": {
    "id": "Attribute_code",
    "type": "attribute_code"
  },
  "synchronization": {
    "resource_customs": null,
    "events": []
  }
}
```

#### /consume/attribute\_updated

subscribed event: [attribute\_updated](/apps2/detailed-reference/manifest#attribute_updated)

#### /consume/attribute\_deleted

subscribed event: [attribute\_deleted](/apps2/detailed-reference/manifest#attribute_deleted)

example payload:

```json
{
  "name": "attribute_deleted",
  "resource_id": {
    "id": "Attribute_code",
    "type": "attribute_code"
  },
  "synchronization": {
    "resource_customs": {"your": "custom"},
    "events": []
  }
}
```

#### /consume/category\_created

subscribed event: [category\_created](/apps2/detailed-reference/manifest#category_created)

example payload:

```json
{
  "name": "category_created",
  "resource_id": {
    "id": "Category_code",
    "type": "category_code"
  },
  "synchronization": {
    "resource_customs": null,
    "events": []
  }
}
```

#### /consume/category\_updated

subscribed event: [category\_updated](/apps2/detailed-reference/manifest#category_updated)

example payload:

```json
{
  "name": "category_updated",
  "resource_id": {
    "id": "Category_code",
    "type": "category_code"
  },
  "synchronization": {
    "resource_customs": {"your": "custom"},
    "events": []
  }
}
```

#### /consume/category\_deleted

subscribed event: [category\_deleted](/apps2/detailed-reference/manifest#category_deleted)

example payload:

```json
{
  "name": "category_deleted",
  "resource_id": {
    "id": "Category_code",
    "type": "category_code"
  },
  "synchronization": {
    "resource_customs": {"your": "custom"},
    "events": []
  }
}
```

#### /consume/product\_created

subscribed event: [product\_created](/apps2/detailed-reference/manifest#product_created)

example payload:

```json
{
  "name": "product_created",
  "resource_id": {
    "id": "Product SKU",
    "type": "sku"
  },
  "synchronization": {
    "resource_customs": null,
    "events": []
  }
}

```

#### /consume/product\_updated

subscribed event: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

example payload:

```json
{
  "name": "product_updated",
  "resource_id": {
    "id": "Product SKU",
    "type": "sku"
  },
  "synchronization": {
    "resource_customs": {"your": "custom"},
    "events": []
  }
}
```

#### /consume/product\_deleted

subscribed event: [product\_deleted](/apps2/detailed-reference/manifest#product_deleted)

example payload:

```json
{
  "name": "product_updated",
  "resource_id": {
    "id": "Product SKU",
    "type": "sku"
  },
  "synchronization": {
    "resource_customs": {"your": "custom"},
    "events": []
  }
}
```

#### /consume/synchronization\_started

subscribed event: [synchronization\_started](/apps2/detailed-reference/manifest#synchronization_started)

example payload:

```json
{
    "name": "synchronization_started"
}
```

#### /consume/synchronization\_ended

subscribed event: [synchronization\_ended](/apps2/detailed-reference/manifest#synchronization_ended)

example payload:

```json
{
    "name": "synchronization_started"
}
```

### Resource customs

In the above examples, you might have noticed the `resource_customs` field.

This mechanic allows small pieces of information such as JSON to be stored in the engine.

The most common use case for this would be storing the ID of the eCommerce entity next to the resource. It'll be passed with every following request so it's easier for your business logic to create the requests to the eCommerce system without the need of reaching to the database.

To persist the custom in the response of the endpoint add the following payload

```json
{
  "resource_customs": {
    "id": 1,
    "other_relevent_information": "here"
  }
}
```

The resource custom will only be persisted on 2xx(non-204) HTTP responses.

### Errors handling

Handling of the request payload may fail.

In such case, there are a couple of scenarios:

* failed connection(including 502 and 503 HTTP errors) - the event will be retried a couple of times before aborting completely
* 5xx and 3xx HTTP responses&#x20;
  * for a single resource, the event is not retried as of an internal error and the history entry is marked with a generic message
  * for a synchronization error event is going to be retried eventually leading to the failed synchronization status
* 4xx HTTP responses
  * for a single resource
    * a custom behavior may be applied via an appropriate response

      ```json
      {
        "custom_message": "your custom error message",
        "retryable": false
      }
      ```

      retryable parameter determines whether the event can be retried. Otherwise, the fail and custom error message will be applied immediately.\
      The message should not exceed the length of 256 chars. If the length is exceeded the message will be truncated.
    * the event is not retried and the history entry is marked with a generic message
  * for a synchronization error event is going to be retried eventually leading to the failed synchronization status


# Synchronization events

Detailed events containing data changes.

## Attributes

#### attribute\_created

included with events: [attribute\_created](/apps2/detailed-reference/manifest#attribute_created)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_created",
  "payload": {
    "code": "attribute_code",
    "type": "TEXT",
    "scope": "local",
    "name": [
      {
        "language": "en_GB",
        "value": "This is the attribute name"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "code": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": ["DATE", "FILE", "GALLERY", "IMAGE", "MULTI_SELECT", "NUMERIC", "PRICE", "PRODUCT_RELATION", "SELECT", "TEXT_AREA", "TEXT", "UNIT"]
        },
        "scope": {
          "type": "string",
          "enum": ["local", "global"]
        },
        "name": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "language": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "language",
              "value"
            ]
          }
        }
      },
      "required": [
        "code",
        "type",
        "scope",
        "name"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### attribute\_name\_changed

included with events: [attribute\_created](/apps2/detailed-reference/manifest#attribute_created), [attribute\_updated](/apps2/detailed-reference/manifest#attribute_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_name_changed",
  "payload": {
    "name": [
      {
        "language": "en_GB",
        "value": "This is the new attribute name"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "name": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "language": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "language",
              "value"
            ]
          }
        }
      },
      "required": [
        "name"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### attribute\_option\_code\_changed

included with events: [attribute\_created](/apps2/detailed-reference/manifest#attribute_created), [attribute\_updated](/apps2/detailed-reference/manifest#attribute_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_option_code_changed",
  "payload": {
    "option_code": "option_code",
    "previous_option_code": "previous_option_code"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "option_code": {
          "type": "string"
        },
        "previous_option_code": {
          "type": "string"
        }
      },
      "required": [
        "option_code",
        "previous_option_code"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### attribute\_option\_created

included with events: [attribute\_created](/apps2/detailed-reference/manifest#attribute_created), [attribute\_updated](/apps2/detailed-reference/manifest#attribute_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_option_created",
  "payload": {
    "option_code": "option_code",
    "option_name": [
      {
        "language": "en_GB",
        "value": "This is the option name"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "option_code": {
          "type": "string"
        },
        "option_name": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "language": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "language",
              "value"
            ]
          }
        }
      },
      "required": [
        "option_code",
        "option_name"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### attribute\_option\_deleted

included with events: [attribute\_updated](/apps2/detailed-reference/manifest#attribute_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_option_deleted",
  "payload": {
    "option_code": "option_code"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "option_code": {
          "type": "string"
        }
      },
      "required": [
        "option_code"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### attribute\_option\_name\_changed

included with events: [attribute\_created](/apps2/detailed-reference/manifest#attribute_created), [attribute\_updated](/apps2/detailed-reference/manifest#attribute_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_option_name_changed",
  "payload": {
    "option_code": "option_code",
    "option_name": [
      {
        "language": "en_GB",
        "value": "This is the new option name"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "option_code": {
          "type": "string"
        },
        "option_name": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "language": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "language",
              "value"
            ]
          }
        }
      },
      "required": [
        "option_code",
        "option_name"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

## Categories

#### category\_created

included with events: [category\_created](/apps2/detailed-reference/manifest#category_created)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "category_created",
  "payload": {
    "code": "category_code",
    "name": [
      {
        "language": "en_GB",
        "value": "This is the category name"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "code": {
          "type": "string"
        },
        "name": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "language": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "language",
              "value"
            ]
          }
        }
      },
      "required": [
        "code",
        "name"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### category\_name\_changed

included with events: [category\_created](/apps2/detailed-reference/manifest#category_created), [category\_updated](/apps2/detailed-reference/manifest#category_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "attribute_name_changed",
  "payload": {
    "name": [
      {
        "language": "en_GB",
        "value": "This is the new category name"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "code": {
          "type": "string"
        },
        "name": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "language": {
                "type": "string"
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "language",
              "value"
            ]
          }
        }
      },
      "required": [
        "code",
        "name"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

## Products

#### product\_added\_to\_category

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created), [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_added_to_category",
  "payload": {
    "category_code": "category_code"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "category_code": {
          "type": "string"
        }
      },
      "required": [
        "category_code"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_binding\_added

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created), [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_binding_added",
  "payload": {
    "attribute_code": "attribute_code"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "attribute_code": {
          "type": "string"
        }
      },
      "required": [
        "attribute_code"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_binding\_removed

included with events: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_binding_removed",
  "payload": {
    "attribute_code": "attribute_code"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "attribute_code": {
          "type": "string"
        }
      },
      "required": [
        "attribute_code"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_child\_added

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created), [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_child_added",
  "payload": {
    "child_sku": "Child sku",
    "child_quantity": 2
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "child_sku": {
          "type": "string"
        },
        "child_quantity": {
          "type": "integer"
        }
      },
      "required": [
        "child_sku",
        "child_quantity"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_child\_quantity\_changed

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created), [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_child_quantity_changed",
  "payload": {
    "child_sku": "Child sku",
    "child_quantity": 2
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "child_sku": {
          "type": "string"
        },
        "child_quantity": {
          "type": "integer"
        }
      },
      "required": [
        "child_sku",
        "child_quantity"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_child\_removed

included with events: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_child_removed",
  "payload": {
    "child_sku": "Child sku"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "child_sku": {
          "type": "string"
        }
      },
      "required": [
        "child_sku"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_created

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_created",
  "payload": {
    "sku": "Product SKU",
    "type": "SIMPLE-PRODUCT",
    "category_codes": ["category_code"]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "sku": {
          "type": "string"
        },
        "type": {
          "type": "string",
          "enum": ["SIMPLE-PRODUCT", "GROUPING-PRODUCT", "VARIABLE-PRODUCT"]
        },
        "category_codes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "sku",
        "type",
        "category_codes"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_removed\_from\_category

included with events: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_removed_from_category",
  "payload": {
    "category_code": "category_code"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "category_code": {
          "type": "string"
        }
      },
      "required": [
        "category_code"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_value\_added

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created), [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_value_added",
  "payload": {
    "attribute_code": "attribute_code",
    "attribute_type": "TEXT",
    "attribute_scope": "local",
    "value": [
      {
        "language": "en_GB",
        "translation": "This is the attribute value"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "attribute_code": {
          "type": "string"
        },
        "attribute_type": {
          "type": "string",
          "enum": ["DATE", "FILE", "GALLERY", "IMAGE", "MULTI_SELECT", "NUMERIC", "PRICE", "PRODUCT_RELATION", "SELECT", "TEXT_AREA", "TEXT", "UNIT"]
        },
        "attribute_scope": {
          "type": "string",
          "enum": ["local", "global"]
        },
        "value": {
          "oneOf": [
            {
              "type": "string",
              "description": "For global attribute of type DATE, SELECT, TEXT_AREA and TEXT"
            },
            {
              "type": "number",
              "description": "For global attribute of type NUMERIC, PRICE and UNIT"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "For global attribute of type MULTI_SELECT and PRODUCT_RELATION"
            },
            {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "url",
                "path"
              ],
              "description": "For global attribute of type IMAGE"
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string"
                  }
                },
                "required": [
                  "url",
                  "path"
                ]
              },
              "description": "For global attribute of type FILE and GALLERY"
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "language": {
                    "type": "string"
                  },
                  "value": {
                    "oneOf": [
                      {
                        "$ref": "#/components/schemas/AttributeValue"
                      }
                    ]
                  }
                },
                "required": [
                  "language",
                  "value"
                ]
              },
              "description": "For local attributes same types as for global wrapped in translation array"
            }
          ]
        }
      },
      "required": [
        "attribute_code",
        "attribute_type",
        "attribute_scope",
        "value"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_value\_changed

included with events: [product\_created](/apps2/detailed-reference/manifest#product_created), [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_value_changed",
  "payload": {
    "attribute_code": "attribute_code",
    "attribute_type": "TEXT",
    "attribute_scope": "global",
    "value": "This is the attribute value"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "attribute_code": {
          "type": "string"
        },
        "attribute_type": {
          "type": "string",
          "enum": ["DATE", "FILE", "GALLERY", "IMAGE", "MULTI_SELECT", "NUMERIC", "PRICE", "PRODUCT_RELATION", "SELECT", "TEXT_AREA", "TEXT", "UNIT"]
        },
        "attribute_scope": {
          "type": "string",
          "enum": ["local", "global"]
        },
        "value": {
          "oneOf": [
            {
              "type": "string",
              "description": "For global attribute of type DATE, SELECT, TEXT_AREA and TEXT"
            },
            {
              "type": "number",
              "description": "For global attribute of type NUMERIC, PRICE and UNIT"
            },
            {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "For global attribute of type MULTI_SELECT and PRODUCT_RELATION"
            },
            {
              "type": "object",
              "properties": {
                "url": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                }
              },
              "required": [
                "url",
                "path"
              ],
              "description": "For global attribute of type IMAGE"
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string"
                  },
                  "path": {
                    "type": "string"
                  }
                },
                "required": [
                  "url",
                  "path"
                ]
              },
              "description": "For global attribute of type FILE and GALLERY"
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "language": {
                    "type": "string"
                  },
                  "value": {
                    "oneOf": [
                      {
                        "$ref": "#/components/schemas/AttributeValue"
                      }
                    ]
                  }
                },
                "required": [
                  "language",
                  "value"
                ]
              },
              "description": "For local attributes same types as for global wrapped in translation array"
            }
          ]
        }
      },
      "required": [
        "attribute_code",
        "attribute_type",
        "attribute_scope",
        "value"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_value\_removed

included with events: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_value_removed",
  "payload": {
    "attribute_code": "attribute_code",
    "attribute_type": "TEXT"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "attribute_code": {
          "type": "string"
        },
        "attribute_type": {
          "type": "string",
          "enum": ["DATE", "FILE", "GALLERY", "IMAGE", "MULTI_SELECT", "NUMERIC", "PRICE", "PRODUCT_RELATION", "SELECT", "TEXT_AREA", "TEXT", "UNIT"]
        }
      },
      "required": [
        "attribute_code",
        "attribute_type"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_variant\_added

included with events: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_variant_added",
  "payload": {
    "variant_sku": "Variant SKU",
    "binding_values": [
      {
        "attribute_code": "attribute_code",
        "attribute_type": "SELECT",
        "attribute_scope": "global",
        "value": "attribute_option_code"
      }
    ]
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "variant_sku": {
          "type": "string"
        },
        "binding_values": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "attribute_code": {
                "type": "string"
              },
              "attribute_type": {
                "type": "string",
                "enum": ["SELECT"]
              },
              "attribute_scope": {
                "type": "string",
                "enum": ["global"]
              },
              "value": {
                "type": "string"
              }
            },
            "required": [
              "attribute_code",
              "attribute_type",
              "attribute_scope",
              "value"
            ]
          }
        }
      },
      "required": [
        "variant_sku",
        "binding_values"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}

#### product\_variant\_removed

included with events: [product\_updated](/apps2/detailed-reference/manifest#product_updated)

{% tabs %}
{% tab title="Example" %}

```json
{
  "type": "product_variant_removed",
  "payload": {
    "variant_sku": "Variant SKU"
  }
}
```

{% endtab %}

{% tab title="Schema" %}

```json
{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "description": "The type of synchronization event."
    },
    "payload": {
      "type": "object",
      "description": "The detailed payload of the synchronization event.",
      "properties": {
        "variant_sku": {
          "type": "string"
        }
      },
      "required": [
        "variant_sku"
      ]
    }
  },
  "required": [
    "type",
    "payload"
  ]
}
```

{% endtab %}
{% endtabs %}


# File download endpoint

If an App purpose it to generate a file as a result of synchronization enable any of the following features based on your needs

* [synchronization\_file\_download](/apps2/detailed-reference/manifest#synchronization_file_download)
* [synchronization\_file\_download\_latest](/apps2/detailed-reference/manifest#synchronization_file_download_latest)

To allow access to Ergonode for generated files you need to implement the following endpoint.

#### /download-file

{% hint style="info" %}
Use `synchronization_id` claim from JWT to determine which file should be returned.
{% endhint %}

The endpoint should return the binary file.

The response can contain `content-type` and `content-length` HTTP headers so that those are passed to the browser on file download.


# Design considerations

Good practices and tips

## Security

Carefully approach multitenant Apps. Since Apps can handle multiple installations, even on multiple Ergonode instances, query your persistent data with that in mind to prevent data security leaks.

Get to know the [authentication](/apps2/detailed-reference/authentication) section well.

## Concurrency

The App should be highly available to accept multiple requests simultaneously.

To increase the performance of the synchronization process Ergonode can send a couple of requests at one time concurrently. Not only from one instance but also during one synchronization, especially if there's a lot of data being integrated.

## Use cache

If your app needs extra PIM data fetched by Ergonode APIs, especially during synchronization, cache it internally for at least the length of the process. It shall significantly speed up your processing.




---

[Next Page](/llms-full.txt/1)

