Skip to content

Single Product

About

The product query returns one product's full detail, looked up by ID, SKU, or URL key. Use it to:

  • Render a product detail page
  • Resolve a storefront slug straight to a product, with no ID lookup first
  • Read pricing, descriptions, images, variants, and SEO metadata in one call
  • Read the type-specific structure of a bundle, grouped, downloadable, or booking product

Every product type shares the same core fields — name, sku, price, images, attributeValues — and is fetched with the same query. What differs is the type-specific connection each one populates: variants and superAttributeOptions for configurable, bundleOptions for bundle, groupedProducts for grouped, downloadableLinks for downloadable, and bookingProducts for booking. Booking goes one level further — each of its five sub-types (Appointment, Rental, Default, Table, Event) exposes a different slot relationship, which is why each has its own dropdown example.

Select only the fields you need. The full field list is in Product Fields Reference and Product Relationships Reference below.

Arguments

Supply exactly one of id, sku, or urlKey to identify the product.

ArgumentTypeDescription
idIDProduct identifier — IRI (/api/shop/products/1) or numeric (1).
skuStringStock Keeping Unit. Alternative lookup.
urlKeyStringURL-friendly product slug. Alternative lookup. Matched across all locales — a slug created in any locale resolves regardless of the request's locale.
localeStringLocale for translated values. Overrides the X-Locale header for this query.
channelStringChannel to read the product against. Overrides the X-Channel header for this query.

There are no arguments for including or excluding parts of the response — GraphQL field selection already controls that. Ask for images and you get images; leave it out and you do not.

Configurable Products

A configurable product is a product that has multiple variants based on attributes like color, size, or material. For example, a T-shirt that comes in 3 colors and 2 sizes would have 6 variants. When querying a configurable product, two additional fields are returned that are essential for building a variant selection UI:

Selectable options — superAttributeOptions

This field returns a JSON-encoded string containing the configurable attributes and their selectable options. Each entry includes:

  • code — the attribute code (e.g. color, size)
  • label — the display label (e.g. Color, Size)
  • options — an array of available values, each with an id and label

Use this field to render attribute dropdowns (e.g. color picker, size selector) on the product detail page.

Variant map — combinations

This field returns a JSON-encoded object that maps each variant product ID to its specific attribute option combination. For example:

json
{"8": {"color": 3, "size": 7}, "9": {"color": 3, "size": 8}}

This means variant ID 8 is the product with color option 3 and size option 7. When a customer selects a color and size from the dropdowns, use this mapping to resolve which variant ID to load (for pricing, stock, images, etc.).

How they work together

  1. Use superAttributeOptions to render the attribute dropdowns on your product page
  2. When the customer selects options (e.g. Color: Blue, Size: M), match their selection against the combinations object to find the corresponding variant ID
  3. Use that variant ID to display the correct price, stock status, and images for the selected variant

For non-configurable product types (simple, grouped, bundle, and the rest), both superAttributeOptions and combinations are null.

Downloadable Products

A downloadable product contains digital files that customers can download after purchase. Each downloadable product can have two types of sample files:

These are the individual download links that make up the product (e.g. Track 1, Track 2 for a music album, or Chapter 1, Chapter 2 for an e-book). Each link has its own price and can optionally have a sample file attached for preview. The fields sampleFile, sampleFileUrl, and sampleUrl provide details about the sample associated with each link.

Product-level samples — downloadableSamples

These are product-level samples — general preview files for the entire product rather than a specific link. The _id from each sample node is used to download the sample via:

GET /api/shop/downloadable/download-sample/sample/{_id}

Downloading purchased files

After a customer purchases a downloadable product, the purchased files can be downloaded using the _id from the Get Downloadable Products query (not the product query). See the Download Downloadable Product page for full details.

Sample downloads are free and need no authentication. Purchased file downloads require customer authentication and are capped at a limited number of downloads.

Grouped Products

A grouped product bundles multiple simple products together, allowing customers to purchase them as a set. Unlike a bundle product where the customer selects options, a grouped product presents each child product with a default quantity that the customer can adjust before adding to cart.

Associated children — groupedProducts

This field returns the list of associated child products via the groupedProducts connection. Each node contains:

  • id — the grouped product relationship ID
  • qty — the default quantity for that child product in the group
  • sortOrder — the display order of the child product
  • associatedProduct — the full child product details including id, name, sku, price, formattedPrice, specialPrice, formattedSpecialPrice, and images

Pricing behavior

A grouped product's own price is always 0 because it does not have a standalone price. Instead, the price range is derived from its child products:

  • minimumPrice — the lowest priced child product
  • maximumPrice — the highest priced child product

The customer's total depends on which child products they select and in what quantities.

For non-grouped product types, groupedProducts returns an empty edges array.

Booking Product Types

All standard product types (simple, configurable, grouped, bundle, downloadable, virtual) share the same core fields and can be queried using any of the general examples above. Booking products, however, require special attention because each booking type exposes a different relationship with its own unique fields through the bookingProducts connection.

The bookingProducts field returns a type that determines which slot/ticket relationship contains the data:

Booking TypeRelationship FieldKey FieldsUse Case
AppointmentappointmentSlotduration, breakTime, sameSlotAllDays, slotsSalon visits, doctor appointments, consultations
RentalrentalSlotrentingType, dailyPrice, hourlyPrice, slotsEquipment rental, vehicle hire, venue booking
DefaultdefaultSlotbookingType, duration, breakTime, slotsGeneral time-slot bookings
TabletableSlotpriceType, guestLimit, duration, breakTime, preventSchedulingBefore, slotsRestaurant reservations, meeting rooms
EventeventTicketsprice, qty, specialPrice, specialPriceFrom, specialPriceToConcerts, workshops, conferences

Only the relationship matching the product's booking type carries data — an appointment product populates appointmentSlot and leaves rentalSlot and tableSlot empty. Read the type field first to decide which relationship to query.

Starting-from price

Each bookingProducts node also exposes a computed "starting from" price — the product base price plus the cheapest bookable extra — matching what the storefront shows on the product card / detail page:

FieldMeaning
startingPriceFinal (post-discount) starting price.
formattedStartingPriceCurrency-formatted startingPrice.
startingRegularPricePre-discount starting price. Differs from startingPrice only when an event ticket is on sale — use both to render a strike-through.
formattedStartingRegularPriceCurrency-formatted startingRegularPrice.

The extra is the cheapest event ticket (for event) or the minimum rental unit rate (for rental, whichever of hourly/daily is smallest). For default, appointment and table there is no composed extra, so all four fields are null and the product's own price is the correct figure.

Product Fields Reference

Below is a complete reference of all available fields on the Product type. Use this as a lookup when building your queries — include only the fields you need.

Basic Information

FieldTypeDescription
idID!Unique product identifier in IRI format (e.g. /api/shop/products/1)
_idInt!Numeric database ID
skuString!Stock Keeping Unit — unique product code for inventory tracking
typeString!Product type: simple, virtual, configurable, grouped, bundle, downloadable, booking
nameStringProduct display name
urlKeyStringURL-friendly slug (e.g. premium-wireless-headphones)
statusStringProduct status (1 = active, 0 = inactive)
localeStringLocale of the returned product data
channelStringChannel the product belongs to
productNumberStringOptional product number assigned by the store
additionalIterableAdditional product data stored as key-value pairs
createdAtStringProduct creation timestamp
updatedAtStringLast modification timestamp

Descriptions

FieldTypeDescription
descriptionStringFull product description (plain text)
descriptionHtmlStringFull product description with HTML formatting preserved
shortDescriptionStringBrief product summary for listing pages

Pricing

FieldTypeDescription
priceStringBase catalog price. Reflects active currency conversion.
specialPriceStringDiscounted price if set, otherwise null
specialPriceFromStringStart date for the special price (YYYY-MM-DD)
specialPriceToStringEnd date for the special price (YYYY-MM-DD)
costStringProduct cost/purchase price (internal use)
minimumPriceStringLowest effective price — accounts for special price and variant pricing. Used for price sorting.
maximumPriceStringHighest effective price across all variants
regularMinimumPriceStringRegular (non-discounted) minimum price
regularMaximumPriceStringRegular (non-discounted) maximum price
formattedPriceStringprice with currency symbol (e.g. $99.00)
formattedSpecialPriceStringspecialPrice with currency symbol
formattedMinimumPriceStringminimumPrice with currency symbol
formattedMaximumPriceStringmaximumPrice with currency symbol
formattedRegularMinimumPriceStringregularMinimumPrice with currency symbol
formattedRegularMaximumPriceStringregularMaximumPrice with currency symbol
taxCategoryIdStringTax category ID assigned to the product

Physical Dimensions

FieldTypeDescription
weightStringProduct weight
lengthStringProduct length
widthStringProduct width
heightStringProduct height

Attributes

FieldTypeDescription
colorStringColor attribute value (if applicable)
sizeStringSize attribute value (if applicable)
brandStringBrand attribute value (if applicable)

SEO

FieldTypeDescription
metaTitleStringSEO meta title for the product page
metaKeywordsStringSEO meta keywords
metaDescriptionStringSEO meta description

Flags & Settings

FieldTypeDescription
isSaleableStringWhether the product can be purchased (1 = yes)
newStringWhether the product is marked as "new" (1 = yes)
featuredStringWhether the product is featured (1 = yes)
visibleIndividuallyStringWhether the product appears in catalog listings (1 = yes)
guestCheckoutStringWhether guest users can purchase this product (1 = yes)
manageStockStringWhether stock is managed for this product (1 = yes)
isInWishlistStringWhether the product is in the signed-in customer's wishlist for the active channel ("1" = yes). Needs the customer Bearer token; always "0" for guests.
isInCompareStringWhether the product is in the signed-in customer's compare list ("1" = yes). Needs the customer Bearer token; always "0" for guests.
bookingTypeStringBooking sub-type for booking products (appointment, rental, default, table, event). null for every other type.

Configurable Product Fields

FieldTypeDescription
superAttributeOptionsStringJSON-encoded array of configurable attributes and their selectable options. See Configurable Products.
combinationsStringJSON-encoded object mapping variant IDs to their attribute option combinations. See Configurable Products.

Media

FieldTypeDescription
baseImageUrlStringURL of the product's primary/base image

Product Relationships Reference

These are the connection/relationship fields available on the Product type. Each returns a paginated cursor connection supporting first, last, before, and after arguments.

Core Relationships

RelationshipReturn TypeDescription
imagesProductImagesCursorConnectionProduct gallery images with id, publicPath, and position
videosProductVideosCursorConnectionProduct videos
categoriesCategoryCursorConnectionCategories the product belongs to, with translation { name }
attributeValuesAttributeValueCursorConnectionAll attribute values with value and attribute { code, adminName }
attributeFamilyAttributeFamilyThe attribute family this product belongs to (not paginated)
channelsChannelCursorConnectionChannels this product is assigned to

Variant & Configuration

RelationshipReturn TypeDescription
variantsProductCursorConnectionChild variant products (for configurable products). Each variant is a full Product with its own id, name, sku, price, and attributeValues.
superAttributesAttributeCursorConnectionThe attributes used for configurable options (e.g. Color, Size)
parentProductParent product (for variant products — returns the configurable parent)

Product Type-Specific

RelationshipReturn TypeDescriptionDropdown Example
groupedProductsProductGroupedProductCursorConnectionAssociated child products with qty, sortOrder, and associatedProduct details"Get Grouped Product"
bundleOptionsProductBundleOptionCursorConnectionBundle option groups with selectable products and quantities
downloadableLinksProductDownloadableLinkCursorConnectionDownloadable links with price, formattedPrice, translation { title }, and sample info"Get Downloadable Product with Samples"
downloadableSamplesProductDownloadableSampleCursorConnectionProduct-level sample files with file, fileUrl, url, and translation { title }"Get Downloadable Product with Samples"
bookingProductsBookingProductCursorConnectionBooking configuration with type, availableFrom, availableTo, qty, location, and type-specific slots"Get Appointment/Rental/Default/Table/Event Booking Product"
customizableOptionsProductCustomizableOptionCursorConnectionCustom product options (e.g. engraving text, gift wrapping)
RelationshipReturn TypeDescription
relatedProductsProductCursorConnectionProducts marked as related — typically shown in a "Related Products" section on the product page
upSellsProductCursorConnectionUp-sell products — higher-value alternatives shown on the product page
crossSellsProductCursorConnectionCross-sell products — complementary items shown during checkout or in the cart

Reviews

RelationshipReturn TypeDescription
reviewsProductReviewCursorConnectionAll reviews for this product (all statuses)
approvedReviewsProductReviewCursorConnectionOnly admin-approved reviews — use this for public-facing display

Every relationship above is cursor-paginated and accepts first, last, before, and afterimages(first: 5) returns only the first five images. Page through a large collection with the nested pageInfo { hasNextPage endCursor }.

Released under the MIT License.