> Documentation index: [Saleor](/llms.txt) · [This section](/api-reference/products/llms.txt)
> Source: https://docs.saleor.io/api-reference/products/objects/product-type

# ProductType Object

Represents a type of product. It defines what attributes are available to products of this type.

```graphql
type ProductType implements Node, ObjectWithMetadata {
  id: ID!
  privateMetadata: [MetadataItem!]!
  privateMetafield(
    key: String!
  ): String
  privateMetafields(
    keys: [String!]
  ): Metadata
  metadata: [MetadataItem!]!
  metafield(
    key: String!
  ): String
  metafields(
    keys: [String!]
  ): Metadata
  name: String!
  slug: String!
  hasVariants: Boolean! @deprecated
  isShippingRequired: Boolean!
  isDigital: Boolean! @deprecated
  weight: Weight
  kind: ProductTypeKindEnum!
  products(
    channel: String
    before: String
    after: String
    first: Int
    last: Int
  ): ProductCountableConnection @deprecated
  taxType: TaxType @deprecated
  taxClass: TaxClass
  variantAttributes(
    variantSelection: VariantAttributeScope
  ): [Attribute!] @deprecated
  assignedVariantAttributes(
    variantSelection: VariantAttributeScope
  ): [AssignedVariantAttribute!]
  productAttributes: [Attribute!]
  availableAttributes(
    filter: AttributeFilterInput
    where: AttributeWhereInput
    search: String
    before: String
    after: String
    first: Int
    last: Int
  ): AttributeCountableConnection
}
```

<a id="fields"></a>

### Fields

<a id="id"></a>

#### [`id`](#id) ● [`ID!`](/api-reference/miscellaneous/scalars/id.md)

The ID of the product type.

<a id="private-metadata"></a>

#### [`privateMetadata`](#private-metadata) ● [`[MetadataItem!]!`](/api-reference/miscellaneous/objects/metadata-item.md)

List of private metadata items. Requires staff permissions to access.

<a id="private-metafield"></a>

#### [`privateMetafield`](#private-metafield) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

A single key from private metadata. Requires staff permissions to access.

Tip: Use GraphQL aliases to fetch multiple keys.

<a id="product-type-private-metafield-key"></a>

##### [`key`](#product-type-private-metafield-key) ● [`String!`](/api-reference/miscellaneous/scalars/string.md)

<a id="private-metafields"></a>

#### [`privateMetafields`](#private-metafields) ● [`Metadata`](/api-reference/miscellaneous/scalars/metadata.md)

Private metadata. Requires staff permissions to access. Use `keys` to control which fields you want to include. The default is to include everything.

<a id="product-type-private-metafields-keys"></a>

##### [`keys`](#product-type-private-metafields-keys) ● [`[String!]`](/api-reference/miscellaneous/scalars/string.md)

<a id="metadata"></a>

#### [`metadata`](#metadata) ● [`[MetadataItem!]!`](/api-reference/miscellaneous/objects/metadata-item.md)

List of public metadata items. Can be accessed without permissions.

<a id="metafield"></a>

#### [`metafield`](#metafield) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

A single key from public metadata.

Tip: Use GraphQL aliases to fetch multiple keys.

<a id="product-type-metafield-key"></a>

##### [`key`](#product-type-metafield-key) ● [`String!`](/api-reference/miscellaneous/scalars/string.md)

<a id="metafields"></a>

#### [`metafields`](#metafields) ● [`Metadata`](/api-reference/miscellaneous/scalars/metadata.md)

Public metadata. Use `keys` to control which fields you want to include. The default is to include everything.

<a id="product-type-metafields-keys"></a>

##### [`keys`](#product-type-metafields-keys) ● [`[String!]`](/api-reference/miscellaneous/scalars/string.md)

<a id="name"></a>

#### [`name`](#name) ● [`String!`](/api-reference/miscellaneous/scalars/string.md)

Name of the product type.

<a id="slug"></a>

#### [`slug`](#slug) ● [`String!`](/api-reference/miscellaneous/scalars/string.md)

Slug of the product type.

<a id="is-shipping-required"></a>

#### [`isShippingRequired`](#is-shipping-required) ● [`Boolean!`](/api-reference/miscellaneous/scalars/boolean.md)

Whether shipping is required for this product type.

<a id="weight"></a>

#### [`weight`](#weight) ● [`Weight`](/api-reference/miscellaneous/objects/weight.md)

Weight of the product type.

<a id="kind"></a>

#### [`kind`](#kind) ● [`ProductTypeKindEnum!`](/api-reference/products/enums/product-type-kind-enum.md)

The product type kind.

<a id="tax-class"></a>

#### [`taxClass`](#tax-class) ● [`TaxClass`](/api-reference/taxes/objects/tax-class.md)

Tax class assigned to this product type. All products of this product type use this tax class, unless it's overridden in the `Product` type.

Requires one of the following permissions: AUTHENTICATED\_STAFF\_USER AUTHENTICATED\_APP

<a id="assigned-variant-attributes"></a>

#### [`assignedVariantAttributes`](#assigned-variant-attributes) ● [`[AssignedVariantAttribute!]`](/api-reference/attributes/objects/assigned-variant-attribute.md)

Variant attributes of that product type with attached variant selection.

<a id="product-type-assigned-variant-attributes-variant-selection"></a>

##### [`variantSelection`](#product-type-assigned-variant-attributes-variant-selection) ● [`VariantAttributeScope`](/api-reference/products/enums/variant-attribute-scope.md)

Define scope of returned attributes.

<a id="product-attributes"></a>

#### [`productAttributes`](#product-attributes) ● [`[Attribute!]`](/api-reference/attributes/objects/attribute.md)

Product attributes of that product type.

<a id="available-attributes"></a>

#### [`availableAttributes`](#available-attributes) ● [`AttributeCountableConnection`](/api-reference/attributes/objects/attribute-countable-connection.md)

List of attributes which can be assigned to this product type.

Requires the MANAGE\_PRODUCTS permission.

<a id="product-type-available-attributes-filter"></a>

##### [`filter`](#product-type-available-attributes-filter) ● [`AttributeFilterInput`](/api-reference/attributes/inputs/attribute-filter-input.md)

DEPRECATED

Use `where` filter instead.

Filtering options for attributes of this product type.

<a id="product-type-available-attributes-where"></a>

##### [`where`](#product-type-available-attributes-where) ● [`AttributeWhereInput`](/api-reference/attributes/inputs/attribute-where-input.md)

Where filtering options for attributes of this product type.

<a id="product-type-available-attributes-search"></a>

##### [`search`](#product-type-available-attributes-search) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

Search attributes.

<a id="product-type-available-attributes-before"></a>

##### [`before`](#product-type-available-attributes-before) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

Return the elements in the list that come before the specified cursor.

<a id="product-type-available-attributes-after"></a>

##### [`after`](#product-type-available-attributes-after) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

Return the elements in the list that come after the specified cursor.

<a id="product-type-available-attributes-first"></a>

##### [`first`](#product-type-available-attributes-first) ● [`Int`](/api-reference/miscellaneous/scalars/int.md)

Retrieve the first n elements from the list. Note that the system only allows fetching a maximum of 100 objects in a single query.

<a id="product-type-available-attributes-last"></a>

##### [`last`](#product-type-available-attributes-last) ● [`Int`](/api-reference/miscellaneous/scalars/int.md)

Retrieve the last n elements from the list. Note that the system only allows fetching a maximum of 100 objects in a single query.

Show deprecatedHide deprecated

<a id="has-variants"></a>

#### [`hasVariants`](#has-variants) ● [`Boolean!`](/api-reference/miscellaneous/scalars/boolean.md)

DEPRECATED

This is a leftover from the past Simple/Configurable product distinction. Products can have multiple variants regardless of this setting.

Whether the product type has variants.

<a id="is-digital"></a>

#### [`isDigital`](#is-digital) ● [`Boolean!`](/api-reference/miscellaneous/scalars/boolean.md)

DEPRECATED

Will be removed in v3.24.0, use metadata or attributes instead.

Whether the product type is digital - doesn't have any effect, it's present for backward-compatibility.

<a id="products"></a>

#### [`products`](#products) ● [`ProductCountableConnection`](/api-reference/products/objects/product-countable-connection.md)

DEPRECATED

Use the top-level `products` query with the `productTypes` filter.

List of products of this type.

<a id="product-type-products-channel"></a>

##### [`channel`](#product-type-products-channel) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

Slug of a channel for which the data should be returned.

<a id="product-type-products-before"></a>

##### [`before`](#product-type-products-before) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

Return the elements in the list that come before the specified cursor.

<a id="product-type-products-after"></a>

##### [`after`](#product-type-products-after) ● [`String`](/api-reference/miscellaneous/scalars/string.md)

Return the elements in the list that come after the specified cursor.

<a id="product-type-products-first"></a>

##### [`first`](#product-type-products-first) ● [`Int`](/api-reference/miscellaneous/scalars/int.md)

Retrieve the first n elements from the list. Note that the system only allows fetching a maximum of 100 objects in a single query.

<a id="product-type-products-last"></a>

##### [`last`](#product-type-products-last) ● [`Int`](/api-reference/miscellaneous/scalars/int.md)

Retrieve the last n elements from the list. Note that the system only allows fetching a maximum of 100 objects in a single query.

<a id="tax-type"></a>

#### [`taxType`](#tax-type) ● [`TaxType`](/api-reference/taxes/objects/tax-type.md)

DEPRECATED

Use `taxClass` field instead.

A type of tax. Assigned by enabled tax gateway

<a id="variant-attributes"></a>

#### [`variantAttributes`](#variant-attributes) ● [`[Attribute!]`](/api-reference/attributes/objects/attribute.md)

DEPRECATED

Use `assignedVariantAttributes` instead.

Variant attributes of that product type.

<a id="product-type-variant-attributes-variant-selection"></a>

##### [`variantSelection`](#product-type-variant-attributes-variant-selection) ● [`VariantAttributeScope`](/api-reference/products/enums/variant-attribute-scope.md)

Define scope of returned attributes.

<a id="interfaces"></a>

### Interfaces

<a id="node"></a>

#### [`Node`](/api-reference/miscellaneous/interfaces/node.md)

An object with an ID

<a id="objectwithmetadata"></a>

#### [`ObjectWithMetadata`](/api-reference/miscellaneous/interfaces/object-with-metadata.md)

<a id="returned-by"></a>

### Returned By

[`productType`](/api-reference/products/queries/product-type.md) query

<a id="member-of"></a>

### Member Of

[`Product`](/api-reference/products/objects/product.md) object  ● [`ProductAttributeAssign`](/api-reference/products/objects/product-attribute-assign.md) object  ● [`ProductAttributeAssignmentUpdate`](/api-reference/products/objects/product-attribute-assignment-update.md) object  ● [`ProductAttributeUnassign`](/api-reference/products/objects/product-attribute-unassign.md) object  ● [`ProductTypeCountableEdge`](/api-reference/products/objects/product-type-countable-edge.md) object  ● [`ProductTypeCreate`](/api-reference/products/objects/product-type-create.md) object  ● [`ProductTypeDelete`](/api-reference/products/objects/product-type-delete.md) object  ● [`ProductTypeReorderAttributes`](/api-reference/products/objects/product-type-reorder-attributes.md) object  ● [`ProductTypeUpdate`](/api-reference/products/objects/product-type-update.md) object

<a id="implemented-by"></a>

### Implemented By

[`_Entity`](/api-reference/miscellaneous/unions/entity.md) union  ● [`ReferenceType`](/api-reference/miscellaneous/unions/reference-type.md) union
