Single Product
About
The product query retrieves a single product by its unique identifier, SKU, or URL key. Use this query to:
- Fetch individual products for detail pages
- Look up products by different identifier types (ID, SKU, URL)
- Display complete product information including images, variants, and attributes
- Show product pricing, descriptions, and SEO metadata
- Retrieve inventory and availability status
- Build product-specific API integrations
- Generate product detail pages with all metadata
This query supports multiple lookup methods (ID, SKU, or URL key) and can return minimal data for previews or comprehensive data for full product detail pages, making it flexible for various use cases.
Why Booking Product Types Are Documented Separately
All product types (simple, configurable, grouped, bundle, downloadable, virtual) share the same core fields (name, sku, price, images, variants, attributeValues, etc.) and can be queried using the same base query structure. However, booking products are documented with separate examples because each booking type (Appointment, Rental, Default, Table, Event) exposes its own unique relationship and slot structure through the bookingProducts field. These sub-types have different fields and response shapes (e.g., appointmentSlot, rentalSlot, defaultSlot, tableSlot, eventTickets), so dedicated examples are provided to show how to query each one correctly.
Arguments
| Argument | Type | Description |
|---|---|---|
id | ID | Product's unique system identifier. Use this for direct lookups. |
sku | String | Stock Keeping Unit. Alternative identifier for product lookup. |
urlKey | String | URL-friendly product slug. Alternative lookup method. |
include_variants | Boolean | Include product variants (colors, sizes, options). Default: false |
include_images | Boolean | Include product images. Default: false |
include_attributes | Boolean | Include custom product attributes. Default: true |
image_resolution | String | Image quality: thumbnail, medium, large, original. Default: large |
include_recommendations | Boolean | Include related and recommended products. Default: false |
Possible Returns
| Field | Type | Description |
|---|---|---|
id | ID! | Unique product identifier. |
name | String! | Product display name. |
sku | String! | Stock Keeping Unit for inventory tracking. |
urlKey | String! | URL-friendly product slug for SEO. |
type | String! | Product type (simple, configurable, grouped, bundle). |
description | String | Full product description with formatting. |
shortDescription | String | Brief product summary. |
price | Float! | Base product price. |
specialPrice | Float | Promotional/discounted price if applicable. |
superAttributeOptions | String (JSON) | JSON-encoded array of configurable attribute options (e.g. color, size) with their available values. Only populated for configurable products — returns the attributes and selectable options that define the product's variants. |
combinations | String (JSON) | JSON-encoded object mapping variant product IDs to their attribute option combinations. Each key is a variant ID and the value contains the attribute option IDs that define that variant. Only populated for configurable products. |
taxClass | String | Tax classification for the product. |
images | [ProductImage!] | Array of product images with URLs and metadata. |
images.url | String! | Image URL. |
images.altText | String | Image alt text for accessibility. |
images.position | Int | Image order in gallery. |
images.width | Int | Image width in pixels. |
images.height | Int | Image height in pixels. |
attributes | [ProductAttribute!] | Custom product attributes and values. |
variants | [ProductVariant!] | Product variants (colors, sizes, options). |
variants.sku | String! | Variant SKU. |
variants.price | Float! | Variant-specific price. |
inventory | InventoryInfo! | Stock availability information. |
inventory.stock | Int! | Current stock quantity. |
inventory.status | String! | Stock status (in_stock, out_of_stock, low_stock). |
categories | [Category!]! | Categories this product belongs to. |
tags | [String!] | Product tags and labels. |
seo | ProductSEO! | SEO metadata. |
status | String! | Product status (active, draft, inactive). |
visibility | String! | Visibility status (visible, not visible, search only). |
createdAt | DateTime! | Product creation date. |
updatedAt | DateTime! | Last modification date. |
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:
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 anidandlabel
Use this field to render attribute dropdowns (e.g. color picker, size selector) on the product detail page.
combinations
This field returns a JSON-encoded object that maps each variant product ID to its specific attribute option combination. For example:
{"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
- Use
superAttributeOptionsto render the attribute dropdowns on your product page - When the customer selects options (e.g. Color: Blue, Size: M), match their selection against the
combinationsobject to find the corresponding variant ID - 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, etc.), both
superAttributeOptionsandcombinationswill benull.
Downloadable Products
A downloadable product contains digital files that customers can download after purchase. Each downloadable product can have two types of sample files:
downloadableLinks
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.
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 do not require authentication. Purchased file downloads require customer authentication and have 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.
groupedProducts
This field returns the list of associated child products via the groupedProducts connection. Each node contains:
id— the grouped product relationship IDqty— the default quantity for that child product in the groupsortOrder— the display order of the child productassociatedProduct— the full child product details includingid,name,sku,price,formattedPrice,specialPrice,formattedSpecialPrice, andimages
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 productmaximumPrice— 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, the
groupedProductsfield will return 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 Type | Relationship Field | Key Fields | Use Case |
|---|---|---|---|
| Appointment | appointmentSlot | duration, breakTime, sameSlotAllDays, slots | Salon visits, doctor appointments, consultations |
| Rental | rentalSlot | rentingType, dailyPrice, hourlyPrice, slots | Equipment rental, vehicle hire, venue booking |
| Default | defaultSlot | bookingType, duration, breakTime, slots | General time-slot bookings |
| Table | tableSlot | priceType, guestLimit, duration, breakTime, preventSchedulingBefore, slots | Restaurant reservations, meeting rooms |
| Event | eventTickets | price, qty, specialPrice, specialPriceFrom, specialPriceTo | Concerts, workshops, conferences |
TIP
Only the relationship matching the product's booking type will contain data. For example, an appointment booking product will have data in appointmentSlot but not in rentalSlot or tableSlot. Always check the type field first to determine which relationship to query.

