> ## Documentation Index
> Fetch the complete documentation index at: https://redo-44af351d-docs-v3-graphql-api-reference.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# createProductFamily

> Create a new product family.

**Required scopes:**
[`products_write`](/docs/api-reference/v3/reference/scopes#scope-products_write)

## Arguments

<ResponseField name="input" type={<a href="/docs/api-reference/v3/reference/catalog/create-product-family-input">CreateProductFamilyInput!</a>} required>
  The details of the product family to create.

  <Expandable title="fields" lazyRender>
    <ResponseField name="description" type="String">
      The product family's long-form description.
    </ResponseField>

    <ResponseField name="options" type={<a href="/docs/api-reference/v3/reference/catalog/product-family-option-input">[ProductFamilyOptionInput!]</a>}>
      The variant options to create on the family.

      <Expandable title="fields" lazyRender>
        <ResponseField name="name" type="String!" required>
          The option's name (e.g. Size).
        </ResponseField>

        <ResponseField name="position" type="Int">
          The option's ordering position within the family.
        </ResponseField>

        <ResponseField name="values" type="[String!]">
          The allowed values for this option (e.g. S, M, L).
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="products" type={<a href="/docs/api-reference/v3/reference/catalog/create-product-input">[CreateProductInput!]</a>}>
      The products (variants) to create under the family.

      <Expandable title="fields" lazyRender>
        <ResponseField name="options" type={<a href="/docs/api-reference/v3/reference/catalog/product-option-value-input">[ProductOptionValueInput!]</a>}>
          The product's selected values for the family's options.
        </ResponseField>

        <ResponseField name="price" type={<a href="/docs/api-reference/v3/reference/common/money-input">MoneyInput</a>}>
          The product's selling price.
        </ResponseField>

        <ResponseField name="sku" type="String">
          The stock keeping unit for the product.
        </ResponseField>

        <ResponseField name="title" type="String!" required>
          The product's title.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="tags" type="[String!]">
      Free-form tags to apply to the product family.
    </ResponseField>

    <ResponseField name="title" type="String!" required>
      The product family's title.
    </ResponseField>

    <ResponseField name="vendor" type="String">
      The vendor or manufacturer of the product family.
    </ResponseField>
  </Expandable>
</ResponseField>

## Returns

<ResponseField name="createProductFamily" type={<a href="/docs/api-reference/v3/reference/catalog/product-family">ProductFamily!</a>} required>
  A merchant catalog item — a group of related products (variants).

  <Expandable title="fields" lazyRender>
    <ResponseField name="attribute" type={<a href="/docs/api-reference/v3/reference/catalog/attribute">Attribute</a>}>
      Look up a single attribute on this family by its name, if set.

      **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)

      <Expandable title="fields" lazyRender>
        **Arguments**

        <ResponseField name="name" type="String!" required>
          The machine name of the attribute to look up.
        </ResponseField>

        **Fields**

        <ResponseField name="description" type="String">
          An optional description of what the attribute represents.
        </ResponseField>

        <ResponseField name="displayName" type="String!" required>
          The human-readable label shown for the attribute.
        </ResponseField>

        <ResponseField name="id" type="ID!" required>
          The unique identifier of the attribute's definition.
        </ResponseField>

        <ResponseField name="name" type="String!" required>
          The attribute's machine name, unique within the account.
        </ResponseField>

        <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/catalog/attribute-type">AttributeType!</a>} required>
          The data type of the attribute's value.
        </ResponseField>

        <ResponseField name="value" type={<a href="/docs/api-reference/v3/reference/common/json">JSON</a>}>
          The attribute's value, resolved to the typed JSON form for its `type` — read `type` to know the shape. E.g. SHORT\_TEXT → a string, WEIGHT → \{ value, unit }, MONEY → \{ amount, currency }. Null if unset. See AttributeType for each type's shape.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="attributes" type={<a href="/docs/api-reference/v3/reference/catalog/attribute">[Attribute!]!</a>} required>
      The merchant-defined attributes set on this family.

      <Expandable title="fields" lazyRender>
        <ResponseField name="description" type="String">
          An optional description of what the attribute represents.
        </ResponseField>

        <ResponseField name="displayName" type="String!" required>
          The human-readable label shown for the attribute.
        </ResponseField>

        <ResponseField name="id" type="ID!" required>
          The unique identifier of the attribute's definition.
        </ResponseField>

        <ResponseField name="name" type="String!" required>
          The attribute's machine name, unique within the account.
        </ResponseField>

        <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/catalog/attribute-type">AttributeType!</a>} required>
          The data type of the attribute's value.
        </ResponseField>

        <ResponseField name="value" type={<a href="/docs/api-reference/v3/reference/common/json">JSON</a>}>
          The attribute's value, resolved to the typed JSON form for its `type` — read `type` to know the shape. E.g. SHORT\_TEXT → a string, WEIGHT → \{ value, unit }, MONEY → \{ amount, currency }. Null if unset. See AttributeType for each type's shape.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
      When the record was created.
    </ResponseField>

    <ResponseField name="description" type="String!" required>
      The product family's long-form description.
    </ResponseField>

    <ResponseField name="id" type="ID!" required>
      The id of this product family.
    </ResponseField>

    <ResponseField name="image" type={<a href="/docs/api-reference/v3/reference/catalog/product-family-image">ProductFamilyImage</a>}>
      The first (default) image for this family, if any.

      **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)

      <Expandable title="fields" lazyRender>
        <ResponseField name="altText" type="String!" required>
          Alternative text describing the image.
        </ResponseField>

        <ResponseField name="default" type="Boolean!" required>
          Whether this is the default image.
        </ResponseField>

        <ResponseField name="id" type="ID!" required>
          The id of this image.
        </ResponseField>

        <ResponseField name="position" type="Int!" required>
          The image's ordering position.
        </ResponseField>

        <ResponseField name="url" type="String!" required>
          The public URL of the image.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="images" type={<a href="/docs/api-reference/v3/pagination">ProductFamilyImageConnection!</a>} required>
      A paginated list of the family's images.

      **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)

      <Expandable title="fields" lazyRender>
        **Arguments**

        <ResponseField name="after" type="String">
          Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
        </ResponseField>

        <ResponseField name="before" type="String">
          Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
        </ResponseField>

        <ResponseField name="first" type="Int">
          Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
        </ResponseField>

        <ResponseField name="last" type="Int">
          Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
        </ResponseField>

        **Fields**

        <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[ProductFamilyImageEdge!]!</a>} required>
          The list of edges (each a node plus its pagination `cursor`).

          <Expandable title="fields" lazyRender>
            <ResponseField name="cursor" type="String!" required>
              Opaque cursor for this item; pass to `after`/`before` to page from here.
            </ResponseField>

            <ResponseField name="node" type={<a href="/docs/api-reference/v3/reference/catalog/product-family-image">ProductFamilyImage!</a>} required>
              The item at this edge.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/catalog/product-family-image">[ProductFamilyImage!]!</a>} required>
          The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.

          <Expandable title="fields" lazyRender>
            <ResponseField name="altText" type="String!" required>
              Alternative text describing the image.
            </ResponseField>

            <ResponseField name="default" type="Boolean!" required>
              Whether this is the default image.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this image.
            </ResponseField>

            <ResponseField name="position" type="Int!" required>
              The image's ordering position.
            </ResponseField>

            <ResponseField name="url" type="String!" required>
              The public URL of the image.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
          Pagination metadata for the current page.

          <Expandable title="fields" lazyRender>
            <ResponseField name="endCursor" type="String">
              Cursor of the last edge in this page; pass to `after` to page forward.
            </ResponseField>

            <ResponseField name="hasNextPage" type="Boolean!" required>
              Whether more items exist after this page (drives forward pagination with `first`/`after`).
            </ResponseField>

            <ResponseField name="hasPreviousPage" type="Boolean!" required>
              Whether more items exist before this page (drives backward pagination with `last`/`before`).
            </ResponseField>

            <ResponseField name="startCursor" type="String">
              Cursor of the first edge in this page; pass to `before` to page backward.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="options" type={<a href="/docs/api-reference/v3/reference/catalog/product-family-option">[ProductFamilyOption!]!</a>} required>
      The variant options (e.g. Size, Color) for this family.

      <Expandable title="fields" lazyRender>
        <ResponseField name="id" type="ID!" required>
          The id of this option.
        </ResponseField>

        <ResponseField name="name" type="String!" required>
          The option's name (e.g. Size).
        </ResponseField>

        <ResponseField name="position" type="Int!" required>
          The option's ordering position within the family.
        </ResponseField>

        <ResponseField name="values" type="[String!]!" required>
          The allowed values for this option (e.g. S, M, L).
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="products" type={<a href="/docs/api-reference/v3/pagination">ProductConnection!</a>} required>
      A paginated list of the products (variants) in this family.

      **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)

      <Expandable title="fields" lazyRender>
        **Arguments**

        <ResponseField name="after" type="String">
          Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
        </ResponseField>

        <ResponseField name="before" type="String">
          Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
        </ResponseField>

        <ResponseField name="first" type="Int">
          Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
        </ResponseField>

        <ResponseField name="last" type="Int">
          Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
        </ResponseField>

        **Fields**

        <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[ProductEdge!]!</a>} required>
          The list of edges (each a node plus its pagination `cursor`).

          <Expandable title="fields" lazyRender>
            <ResponseField name="cursor" type="String!" required>
              Opaque cursor for this item; pass to `after`/`before` to page from here.
            </ResponseField>

            <ResponseField name="node" type={<a href="/docs/api-reference/v3/reference/catalog/product">Product!</a>} required>
              The item at this edge.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/catalog/product">[Product!]!</a>} required>
          The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.

          <Expandable title="fields" lazyRender>
            <ResponseField name="attribute" type={<a href="/docs/api-reference/v3/reference/catalog/attribute">Attribute</a>}>
              Look up a single attribute on this product by its name, if set.

              **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)

              <Expandable title="fields" lazyRender>
                **Arguments**

                <ResponseField name="name" type="String!" required>
                  The machine name of the attribute to look up.
                </ResponseField>
              </Expandable>
            </ResponseField>

            <ResponseField name="attributes" type={<a href="/docs/api-reference/v3/reference/catalog/attribute">[Attribute!]!</a>} required>
              The merchant-defined attributes set on this product.
            </ResponseField>

            <ResponseField name="barcodes" type="[String!]!" required>
              Barcodes associated with this product.
            </ResponseField>

            <ResponseField name="cost" type={<a href="/docs/api-reference/v3/reference/common/money">Money</a>}>
              The merchant's unit cost for the product.
            </ResponseField>

            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the record was created.
            </ResponseField>

            <ResponseField name="description" type="String!" required>
              The product's long-form description.
            </ResponseField>

            <ResponseField name="dimensions" type={<a href="/docs/api-reference/v3/reference/catalog/dimensions">Dimensions</a>}>
              The product's length, width, and height, expressed in a single shared unit.
            </ResponseField>

            <ResponseField name="hsCode" type="String">
              The Harmonized System code used for customs.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this product.
            </ResponseField>

            <ResponseField name="image" type={<a href="/docs/api-reference/v3/reference/catalog/product-image">ProductImage</a>}>
              The first (default) image for this product, if any.

              **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)
            </ResponseField>

            <ResponseField name="images" type={<a href="/docs/api-reference/v3/pagination">ProductImageConnection!</a>} required>
              A paginated list of the product's images.

              **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)

              <Expandable title="fields" lazyRender>
                **Arguments**

                <ResponseField name="after" type="String">
                  Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
                </ResponseField>

                <ResponseField name="before" type="String">
                  Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
                </ResponseField>

                <ResponseField name="first" type="Int">
                  Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
                </ResponseField>

                <ResponseField name="last" type="Int">
                  Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
                </ResponseField>
              </Expandable>
            </ResponseField>

            <ResponseField name="inventoryLevel" type={<a href="/docs/api-reference/v3/reference/inventory/location-inventory-level">LocationInventoryLevel</a>}>
              This product's inventory level at a single location, if any.

              **Requires:** [`inventory_read`](/docs/api-reference/v3/reference/scopes#scope-inventory_read)

              <Expandable title="fields" lazyRender>
                **Arguments**

                <ResponseField name="locationId" type="ID!" required>
                  The id of the location to fetch the level at.
                </ResponseField>
              </Expandable>
            </ResponseField>

            <ResponseField name="inventoryLevels" type={<a href="/docs/api-reference/v3/pagination">LocationInventoryLevelConnection!</a>} required>
              Per-location inventory levels for this product.

              **Requires:** [`inventory_read`](/docs/api-reference/v3/reference/scopes#scope-inventory_read)

              <Expandable title="fields" lazyRender>
                **Arguments**

                <ResponseField name="after" type="String">
                  Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
                </ResponseField>

                <ResponseField name="before" type="String">
                  Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
                </ResponseField>

                <ResponseField name="first" type="Int">
                  Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
                </ResponseField>

                <ResponseField name="last" type="Int">
                  Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
                </ResponseField>
              </Expandable>
            </ResponseField>

            <ResponseField name="options" type={<a href="/docs/api-reference/v3/reference/catalog/product-option-value">[ProductOptionValue!]!</a>} required>
              The variant's selected option values (e.g. Size: M, Color: Red), ordered by the family's option positions.
            </ResponseField>

            <ResponseField name="originCountry" type="String">
              The country of origin, as a country code.
            </ResponseField>

            <ResponseField name="physicalItem" type="Boolean!" required>
              Whether the product is a physical, shippable item.
            </ResponseField>

            <ResponseField name="price" type={<a href="/docs/api-reference/v3/reference/common/money">Money</a>}>
              The product's selling price.
            </ResponseField>

            <ResponseField name="productFamily" type={<a href="/docs/api-reference/v3/reference/catalog/product-family">ProductFamily</a>}>
              The product family this product belongs to, if any.

              **Requires:** [`products_read`](/docs/api-reference/v3/reference/scopes#scope-products_read)
            </ResponseField>

            <ResponseField name="sku" type="String">
              The stock keeping unit identifying this product.
            </ResponseField>

            <ResponseField name="tags" type="[String!]!" required>
              Free-form tags applied to the product.
            </ResponseField>

            <ResponseField name="taxCode" type="String">
              The tax code used to classify the product for taxation.
            </ResponseField>

            <ResponseField name="taxable" type="Boolean!" required>
              Whether the product is subject to tax.
            </ResponseField>

            <ResponseField name="title" type="String!" required>
              The product's title.
            </ResponseField>

            <ResponseField name="upc" type="String">
              The Universal Product Code for this product.
            </ResponseField>

            <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the record was last updated.
            </ResponseField>

            <ResponseField name="vendor" type="String">
              The vendor or manufacturer of the product.
            </ResponseField>

            <ResponseField name="weight" type={<a href="/docs/api-reference/v3/reference/catalog/weight">Weight</a>}>
              The product's weight.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
          Pagination metadata for the current page.

          <Expandable title="fields" lazyRender>
            <ResponseField name="endCursor" type="String">
              Cursor of the last edge in this page; pass to `after` to page forward.
            </ResponseField>

            <ResponseField name="hasNextPage" type="Boolean!" required>
              Whether more items exist after this page (drives forward pagination with `first`/`after`).
            </ResponseField>

            <ResponseField name="hasPreviousPage" type="Boolean!" required>
              Whether more items exist before this page (drives backward pagination with `last`/`before`).
            </ResponseField>

            <ResponseField name="startCursor" type="String">
              Cursor of the first edge in this page; pass to `before` to page backward.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="tags" type="[String!]!" required>
      Free-form tags applied to the product family.
    </ResponseField>

    <ResponseField name="title" type="String!" required>
      The product family's title.
    </ResponseField>

    <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
      When the record was last updated.
    </ResponseField>

    <ResponseField name="vendor" type="String">
      The vendor or manufacturer of the product family.
    </ResponseField>
  </Expandable>
</ResponseField>

## Example

```graphql theme={null}
mutation {
  createProductFamily(input: { ... }) {
    createdAt
    description
    id
    images {
      nodes {
        altText
        default
        id
        position
        url
      }
      pageInfo { hasNextPage endCursor }
    }
    products {
      nodes {
        barcodes
        createdAt
        description
        hsCode
        id
        originCountry
        physicalItem
        sku
        # ...
      }
      pageInfo { hasNextPage endCursor }
    }
    tags
    title
    updatedAt
    # ...
  }
}
```
