Skip to content

Catalog Product — Detail (GraphQL)

GraphQL item query that returns a single catalog product by its IRI. Every nested block is a field-selectable Relay connection — sub-select exactly the fields you need with edges { node { … } }.

Operation

OperationType
adminCatalogProductQuery (item)

Overview

See the Products overview for how this menu works, product types, and the create/update flow.

Authentication

All admin endpoints require an admin Bearer token — see Authentication.

Arguments

ArgumentTypeRequiredDescription
idID!YesAPI Platform IRI of the product (e.g. "/api/admin/catalog/products/42")

Response shape

  • Top-level scalars (sku, name, type, price, formattedPrice, quantity, inStock, status, weight, urlKey, meta*, created/updated, …) are always returned. Eloquent stringifies numeric/boolean scalars over GraphQL, so status comes back as "1", inStock as "1", etc. — cast client-side.
  • Connections — every nested block is a connection you sub-select with { edges { node { … } } }:
ConnectionNode fieldsPresent for
images_id, type, path, url, positionall
videos_id, type, path, url, positionall
categories_id, name, slugall
inventories_id, sourceId, sourceCode, qtyall
customerGroupPrices_id, customerGroupId, qty, valueType, value, uniqueIdall
translations_id, locale, name, description, shortDescription, urlKey, metaTitle, metaDescription, metaKeywordsall
channels_id, code, nameall (the product's assigned channels)
attributeValues_id, attributeId, code, adminName, type, isRequired, groupCode, valueall (the stored EAV values)
superAttributes_id, code, type, adminName, options { edges { node { _id adminName swatchValue sortOrder } } }configurable
variants_id, sku, name, price, formattedPrice, quantity, inStock, attributeValues { edges { node { code adminName value } } }configurable
bundleOptions_id, label, type, position, isRequired, products { edges { node { _id productId sku name qty isDefault sortOrder } } }bundle
linkedProducts_id, associatedProductId, sku, name, qty, sortOrdergrouped
downloadableLinks_id, sortOrder, downloads, price, formattedPrice, type, file, fileUrl, sampleFile, sampleFileUrl, sampleType, translations { edges { node { _id locale title } } }downloadable
downloadableSamples_id, sortOrder, type, file, fileUrl, translations { edges { node { _id locale title } } }downloadable
customizableOptions_id, type, isRequired, sortOrder, maxCharacters, supportedFileExtensions, translations { edges { node { _id locale label } } }, prices { edges { node { _id label price sortOrder } } }all
relatedProducts / upSells / crossSells_id, sku, type, nameall

Type-specific connections (superAttributes/variants, bundleOptions, linkedProducts, downloadableLinks/downloadableSamples) return empty edges on non-matching types — switch on type to know which to read.

attributes and bookingProduct are REST-only

The full computed attributes block (the admin edit-screen field set, with empty family fields shown) and the bookingProduct block are returned only by the REST endpoint GET /api/admin/catalog/products/{id}. Over GraphQL, query the attributeValues connection for the product's stored attribute values (one node per set value; empty fields are not included), and read booking products via REST.

Notes

  • Connections, not bare JSON (changed). Nested data is now field-selectable — query images { edges { node { url } } }, not bare images. This matches the storefront/Shopify shape; pick only the fields you need.
  • id argument is the IRI. Construct it as "/api/admin/catalog/products/{_id}" from a listing's _id, or pass a listing edge's id directly.
  • REST is the flat counterpart. GET /api/admin/catalog/products/{id} returns the same data with every nested block as a flat inline array/object (plus the full attributes and bookingProduct blocks).
  • Mutations don't return connections. createAdminCatalogProduct / updateAdminCatalogProduct return the product's scalars; re-query adminCatalogProduct for the connections.

Released under the MIT License.