Catalog Attribute Family — Detail (GraphQL)
GraphQL item query that returns a single attribute family by its IRI, including all attribute groups and — within each group — all attributes associated via the attribute_group_mappings pivot (with their pivot position and column).
This is the query to call when an admin needs the complete structure of an attribute family — e.g. when pre-populating the edit form in Catalog → Attribute Families.
Operation
| Operation | Type |
|---|---|
adminAttributeFamily | Query (item) |
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
id | ID! | Yes | API Platform IRI of the attribute family (e.g. "/api/admin/catalog/families/1") |
Take the IRI straight from the id of an adminAttributeFamilies edge node, or build it as /api/admin/catalog/families/<numericId>.
Fields
| Field | Type | Description |
|---|---|---|
id | ID | API Platform IRI (e.g. /api/admin/catalog/families/1) |
_id | Int | Raw family ID |
code | String | Family code (e.g. default, apparel) |
name | String | Family display name (e.g. Default, Apparel) |
attributeGroups | scalar (JSON array|null) | All attribute groups with nested attributes — see shape below |
attributeGroups item shape
attributeGroups is returned as a plain JSON array (scalar in GraphQL). Each element corresponds to one row in attribute_groups:
| Key | Type | Description |
|---|---|---|
id | integer | Attribute group ID |
code | string | Group code (e.g. general, price) |
name | string | Group display name |
column | integer | Layout column position for the group |
position | integer | Display order position of the group within the family |
attributes | array | Attributes mapped to this group (see below) |
attributeGroups[].attributes[] item shape
Each element corresponds to one attribute mapped via attribute_group_mappings:
| Key | Type | Description |
|---|---|---|
id | integer | Attribute ID |
code | string | Attribute code (e.g. sku, name, color) |
type | string | Attribute type (e.g. text, select, boolean) |
isRequired | integer | 1 = required on product forms, 0 = optional |
column | integer | Layout column position of this attribute within the group |
position | integer | Display order position of this attribute within the group |
attributeGroups Is a JSON Scalar
Select attributeGroups as a bare field — a sub-selection is a schema error. The whole structure comes back in one piece, each group carrying its own nested attributes list.
Every id inside is numeric, not an IRI: a group's id, and each attribute's id. Use those directly when referencing an attribute elsewhere.
Errors
| Scenario | GraphQL errors[] | HTTP Status |
|---|---|---|
| Unknown ID | errors[] populated or data.adminAttributeFamily: null | 200 (GraphQL convention) |
| Missing auth | "Unauthenticated" in errors[] | 200 |
Notes
attributeGroupsis a plain JSON scalar, not a typed GraphQL object list. You access it as a regular JSON array in the response. This avoids API Platform serializing nested objects as IRI strings instead of inline objects — a known behavior when using nested DTO types in API Platform GraphQL.attributeGroupsis returned whole — query it as a bare field (not with a sub-selection); the entire structure resolves over GraphQL. The REST detail endpoint returns the same array.- GraphQL and REST return identical data for this query — both embed every group with its nested attributes including the
columnandpositionfields. - The
idargument is the IRI, not the numeric integer. Construct it as"/api/admin/catalog/families/{_id}"using the_idfield from a listing query, or pass theidfield directly from a listing result. - No timestamps. The
attribute_familiestable has$timestamps = false, socreatedAtandupdatedAtare not available on either transport. - Attribute detail fields are slim. Each attribute inside
attributeGroups[].attributescarries only the fields needed for family-structure display:id,code,type,isRequired,column,position. For the full attribute payload (translations, options, validation), useadminAttribute(id: ID!)orGET /api/admin/catalog/attributes/{id}.

