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

# Product Object

Represents an individual item for sale in the storefront.

```graphql
type Product implements Node, ObjectWithMetadata, ObjectWithAttributes {
  id: ID!
  privateMetadata: [MetadataItem!]!
  privateMetafield(
    key: String!
  ): String
  privateMetafields(
    keys: [String!]
  ): Metadata
  metadata: [MetadataItem!]!
  metafield(
    key: String!
  ): String
  metafields(
    keys: [String!]
  ): Metadata
  assignedAttribute(
    slug: String!
  ): AssignedAttribute
  assignedAttributes(
    limit: PositiveInt = 100
  ): [AssignedAttribute!]!
  seoTitle: String
  seoDescription: String
  name: String!
  description: JSONString
  productType: ProductType!
  slug: String!
  category: Category
  created: DateTime!
  updatedAt: DateTime!
  chargeTaxes: Boolean! @deprecated
  weight: Weight
  defaultVariant: ProductVariant
  rating: Float @deprecated
  channel: String
  descriptionJson: JSONString @deprecated
  thumbnail(
    size: Int
    format: ThumbnailFormatEnum = ORIGINAL
  ): Image
  pricing(
    address: AddressInput
  ): ProductPricingInfo
  isAvailable(
    address: AddressInput
  ): Boolean
  taxType: TaxType @deprecated
  attribute(
    slug: String!
  ): SelectedAttribute @deprecated
  attributes: [SelectedAttribute!]! @deprecated
  channelListings: [ProductChannelListing!]
  mediaById(
    id: ID!
  ): ProductMedia
  imageById(
    id: ID!
  ): ProductImage @deprecated
  variant(
    id: ID
    sku: String
  ): ProductVariant @deprecated
  variants: [ProductVariant!] @deprecated
  productVariants(
    filter: ProductVariantFilterInput
    where: ProductVariantWhereInput
    sortBy: ProductVariantSortingInput
    before: String
    after: String
    first: Int
    last: Int
  ): ProductVariantCountableConnection
  media(
    sortBy: MediaSortingInput
  ): [ProductMedia!]
  images: [ProductImage!] @deprecated
  collections: [Collection!]
  translation(
    languageCode: LanguageCodeEnum!
  ): ProductTranslation
  availableForPurchase: Date @deprecated
  availableForPurchaseAt: DateTime
  isAvailableForPurchase: Boolean
  taxClass: TaxClass
  externalReference: String
}
```

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

### Fields

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

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

The ID of the product.

<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-private-metafield-key"></a>

##### [`key`](#product-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-private-metafields-keys"></a>

##### [`keys`](#product-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-metafield-key"></a>

##### [`key`](#product-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-metafields-keys"></a>

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

<a id="assigned-attribute"></a>

#### [`assignedAttribute`](#assigned-attribute) ● [`AssignedAttribute`](/api-reference/attributes/interfaces/assigned-attribute.md)

Get a single attribute attached to product by attribute slug.

Added in Saleor 3.22

<a id="product-assigned-attribute-slug"></a>

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

Slug of the attribute

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

#### [`assignedAttributes`](#assigned-attributes) ● [`[AssignedAttribute!]!`](/api-reference/attributes/interfaces/assigned-attribute.md)

List of attributes assigned to this product.

Added in Saleor 3.22

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

##### [`limit`](#product-assigned-attributes-limit) ● [`PositiveInt`](/api-reference/miscellaneous/scalars/positive-int.md)

Maximum number of attributes to return. Default is 100.

<a id="seo-title"></a>

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

SEO title of the product.

<a id="seo-description"></a>

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

SEO description of the product.

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

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

SEO description of the product.

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

#### [`description`](#description) ● [`JSONString`](/api-reference/miscellaneous/scalars/jsonstring.md)

Description of the product.

Rich text format. For reference see [https://editorjs.io/](https://editorjs.io/)

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

#### [`productType`](#product-type) ● [`ProductType!`](/api-reference/products/objects/product-type.md)

Type of the product.

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

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

Slug of the product.

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

#### [`category`](#category) ● [`Category`](/api-reference/products/objects/category.md)

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

#### [`created`](#created) ● [`DateTime!`](/api-reference/miscellaneous/scalars/date-time.md)

The date and time when the product was created.

<a id="updated-at"></a>

#### [`updatedAt`](#updated-at) ● [`DateTime!`](/api-reference/miscellaneous/scalars/date-time.md)

The date and time when the product was last updated.

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

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

Weight of the product.

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

#### [`defaultVariant`](#default-variant) ● [`ProductVariant`](/api-reference/products/objects/product-variant.md)

Default variant of the product.

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

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

Channel given to retrieve this product. Also used by federation gateway to resolve this object in a federated query.

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

#### [`thumbnail`](#thumbnail) ● [`Image`](/api-reference/miscellaneous/objects/image.md)

Thumbnail of the product.

<a id="product-thumbnail-size"></a>

##### [`size`](#product-thumbnail-size) ● [`Int`](/api-reference/miscellaneous/scalars/int.md)

Desired longest side the image in pixels. Defaults to 4096. Images are never cropped. Pass 0 to retrieve the original size (not recommended).

<a id="product-thumbnail-format"></a>

##### [`format`](#product-thumbnail-format) ● [`ThumbnailFormatEnum`](/api-reference/miscellaneous/enums/thumbnail-format-enum.md)

The format of the image. When not provided, format of the original image will be used.

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

#### [`pricing`](#pricing) ● [`ProductPricingInfo`](/api-reference/products/objects/product-pricing-info.md)

Lists the storefront product's pricing, the current price and discounts, only meant for displaying.

<a id="product-pricing-address"></a>

##### [`address`](#product-pricing-address) ● [`AddressInput`](/api-reference/miscellaneous/inputs/address-input.md)

Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration.

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

#### [`isAvailable`](#is-available) ● [`Boolean`](/api-reference/miscellaneous/scalars/boolean.md)

Whether the product is in stock, set as available for purchase in the given channel, and published.

<a id="product-is-available-address"></a>

##### [`address`](#product-is-available-address) ● [`AddressInput`](/api-reference/miscellaneous/inputs/address-input.md)

DEPRECATED

No longer supported

Destination address used to find warehouses where stock availability for this product is checked. If address is empty, uses `Shop.companyAddress` or fallbacks to server's `settings.DEFAULT_COUNTRY` configuration. When `Shop.useLegacyShippingZoneStockAvailability` is disabled, this argument is ignored — stock availability is determined by the direct warehouse-channel link instead of shipping zones.

<a id="channel-listings"></a>

#### [`channelListings`](#channel-listings) ● [`[ProductChannelListing!]`](/api-reference/products/objects/product-channel-listing.md)

List of availability in channels for the product.

Requires the MANAGE\_PRODUCTS permission.

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

#### [`mediaById`](#media-by-id) ● [`ProductMedia`](/api-reference/products/objects/product-media.md)

Get a single product media by ID.

<a id="product-media-by-id-id"></a>

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

ID of a product media.

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

#### [`productVariants`](#product-variants) ● [`ProductVariantCountableConnection`](/api-reference/products/objects/product-variant-countable-connection.md)

List of variants for the product.

Requires the following permissions to include the unpublished items: MANAGE\_ORDERS MANAGE\_DISCOUNTS MANAGE\_PRODUCTS

Added in Saleor 3.21

<a id="product-product-variants-filter"></a>

##### [`filter`](#product-product-variants-filter) ● [`ProductVariantFilterInput`](/api-reference/products/inputs/product-variant-filter-input.md)

DEPRECATED

Use `where` filter instead.

Filtering options for product variant.

<a id="product-product-variants-where"></a>

##### [`where`](#product-product-variants-where) ● [`ProductVariantWhereInput`](/api-reference/products/inputs/product-variant-where-input.md)

Where filtering options for product variants.

<a id="product-product-variants-sort-by"></a>

##### [`sortBy`](#product-product-variants-sort-by) ● [`ProductVariantSortingInput`](/api-reference/products/inputs/product-variant-sorting-input.md)

Sort products variants.

<a id="product-product-variants-before"></a>

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

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

<a id="product-product-variants-after"></a>

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

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

<a id="product-product-variants-first"></a>

##### [`first`](#product-product-variants-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-product-variants-last"></a>

##### [`last`](#product-product-variants-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="media"></a>

#### [`media`](#media) ● [`[ProductMedia!]`](/api-reference/products/objects/product-media.md)

List of media for the product.

<a id="product-media-sort-by"></a>

##### [`sortBy`](#product-media-sort-by) ● [`MediaSortingInput`](/api-reference/products/inputs/media-sorting-input.md)

Sort media.

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

#### [`collections`](#collections) ● [`[Collection!]`](/api-reference/products/objects/collection.md)

List of collections for the product.

Requires the following permissions to include the unpublished items: MANAGE\_ORDERS MANAGE\_DISCOUNTS MANAGE\_PRODUCTS

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

#### [`translation`](#translation) ● [`ProductTranslation`](/api-reference/products/objects/product-translation.md)

Returns translated product fields for the given language code.

<a id="product-translation-language-code"></a>

##### [`languageCode`](#product-translation-language-code) ● [`LanguageCodeEnum!`](/api-reference/miscellaneous/enums/language-code-enum.md)

A language code to return the translation for product.

<a id="available-for-purchase-at"></a>

#### [`availableForPurchaseAt`](#available-for-purchase-at) ● [`DateTime`](/api-reference/miscellaneous/scalars/date-time.md)

Date when product is available for purchase.

<a id="is-available-for-purchase"></a>

#### [`isAvailableForPurchase`](#is-available-for-purchase) ● [`Boolean`](/api-reference/miscellaneous/scalars/boolean.md)

Refers to a state that can be set by admins to control whether a product is available for purchase in storefronts. This does not guarantee the availability of stock. When set to `False`, this product is still visible to customers, but it cannot be purchased.

<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="external-reference"></a>

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

External ID of this product.

Show deprecatedHide deprecated

<a id="charge-taxes"></a>

#### [`chargeTaxes`](#charge-taxes) ● [`Boolean!`](/api-reference/miscellaneous/scalars/boolean.md)

DEPRECATED

Use `Channel.taxConfiguration` field to determine whether tax collection is enabled.

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

#### [`rating`](#rating) ● [`Float`](/api-reference/miscellaneous/scalars/float.md)

DEPRECATED

Product rating is deprecated and will be removed. Use a numeric attribute instead.

Rating of the product.

<a id="description-json"></a>

#### [`descriptionJson`](#description-json) ● [`JSONString`](/api-reference/miscellaneous/scalars/jsonstring.md)

DEPRECATED

Use the `description` field instead.

Description of the product.

Rich text format. For reference see [https://editorjs.io/](https://editorjs.io/)

<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="attribute"></a>

#### [`attribute`](#attribute) ● [`SelectedAttribute`](/api-reference/attributes/objects/selected-attribute.md)

DEPRECATED

Use the `assignedAttribute` field instead.

Get a single attribute attached to product by attribute slug.

<a id="product-attribute-slug"></a>

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

Slug of the attribute

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

#### [`attributes`](#attributes) ● [`[SelectedAttribute!]!`](/api-reference/attributes/objects/selected-attribute.md)

DEPRECATED

Use the `assignedAttributes` field instead.

List of attributes assigned to this product.

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

#### [`imageById`](#image-by-id) ● [`ProductImage`](/api-reference/products/objects/product-image.md)

DEPRECATED

Use the `mediaById` field instead.

Get a single product image by ID.

<a id="product-image-by-id-id"></a>

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

ID of a product image.

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

#### [`variant`](#variant) ● [`ProductVariant`](/api-reference/products/objects/product-variant.md)

DEPRECATED

Use top-level `variant` query.

Get a single variant by SKU or ID.

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

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

ID of the variant.

<a id="product-variant-sku"></a>

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

SKU of the variant.

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

#### [`variants`](#variants) ● [`[ProductVariant!]`](/api-reference/products/objects/product-variant.md)

DEPRECATED

Use `productVariants` field instead.

List of variants for the product.

Requires the following permissions to include the unpublished items: MANAGE\_ORDERS MANAGE\_DISCOUNTS MANAGE\_PRODUCTS

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

#### [`images`](#images) ● [`[ProductImage!]`](/api-reference/products/objects/product-image.md)

DEPRECATED

Use the `media` field instead.

List of images for the product.

<a id="available-for-purchase"></a>

#### [`availableForPurchase`](#available-for-purchase) ● [`Date`](/api-reference/miscellaneous/scalars/date.md)

DEPRECATED

Use the `availableForPurchaseAt` field to fetch the available for purchase date.

Date when product is available for purchase.

<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="objectwithattributes"></a>

#### [`ObjectWithAttributes`](/api-reference/attributes/interfaces/object-with-attributes.md)

An object with attributes.

Added in Saleor 3.22

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

### Returned By

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

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

### Member Of

[`AssignedMultiProductReferenceAttribute`](/api-reference/attributes/objects/assigned-multi-product-reference-attribute.md) object  ● [`AssignedSingleProductReferenceAttribute`](/api-reference/attributes/objects/assigned-single-product-reference-attribute.md) object  ● [`GiftCard`](/api-reference/gift-cards/objects/gift-card.md) object  ● [`ProductBulkResult`](/api-reference/products/objects/product-bulk-result.md) object  ● [`ProductChannelListingUpdate`](/api-reference/products/objects/product-channel-listing-update.md) object  ● [`ProductCountableEdge`](/api-reference/products/objects/product-countable-edge.md) object  ● [`ProductCreate`](/api-reference/products/objects/product-create.md) object  ● [`ProductCreated`](/api-reference/products/objects/product-created.md) object  ● [`ProductDelete`](/api-reference/products/objects/product-delete.md) object  ● [`ProductDeleted`](/api-reference/products/objects/product-deleted.md) object  ● [`ProductMediaCreate`](/api-reference/products/objects/product-media-create.md) object  ● [`ProductMediaDelete`](/api-reference/products/objects/product-media-delete.md) object  ● [`ProductMediaReorder`](/api-reference/products/objects/product-media-reorder.md) object  ● [`ProductMediaUpdate`](/api-reference/products/objects/product-media-update.md) object  ● [`ProductMetadataUpdated`](/api-reference/products/objects/product-metadata-updated.md) object  ● [`ProductReorderAttributeValues`](/api-reference/products/objects/product-reorder-attribute-values.md) object  ● [`ProductTranslatableContent`](/api-reference/products/objects/product-translatable-content.md) object  ● [`ProductTranslate`](/api-reference/products/objects/product-translate.md) object  ● [`ProductUpdate`](/api-reference/products/objects/product-update.md) object  ● [`ProductUpdated`](/api-reference/products/objects/product-updated.md) object  ● [`ProductVariant`](/api-reference/products/objects/product-variant.md) object  ● [`ProductVariantReorder`](/api-reference/products/objects/product-variant-reorder.md) object  ● [`ProductVariantSetDefault`](/api-reference/products/objects/product-variant-set-default.md) object

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

### Implemented By

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