---
title: Create and query nested cart lines
description: Learn how to create nested cart lines using our APIs.
source_url:
  html: >-
    https://shopify.dev/docs/apps/build/product-merchandising/nested-cart-lines/create-nested-cart-lines
  md: >-
    https://shopify.dev/docs/apps/build/product-merchandising/nested-cart-lines/create-nested-cart-lines.md
---

# Create and query nested cart lines

### Creating nested cart lines

You can add a nested cart line from a variety of Shopify APIs:

* [Cart Ajax API](https://shopify.dev/docs/api/ajax/reference/cart)
* [Checkout UI Extension API](https://shopify.dev/docs/api/checkout-ui-extensions/latest/target-apis/checkout-apis/cart-lines-api)
* [Storefront API](https://shopify.dev/docs/api/storefront/unstable/input-objects/CartLineInput)

### Query for nested cart lines

Nested cart lines are represented across the following APIs:

* [Cart Ajax API](https://shopify.dev/docs/api/ajax/reference/cart)
* [Checkout UI Extension API](https://shopify.dev/docs/api/checkout-ui-extensions/latest/target-apis/checkout-apis/cart-lines-api)
* [Function API](https://shopify.dev/docs/api/functions/latest#function-anatomy)
* [Liquid API](https://shopify.dev/docs/api/liquid/objects/line_item)
* [Order API](https://shopify.dev/docs/api/admin-graphql/unstable/objects/LineItemGroup)
* [Storefront API](https://shopify.dev/docs/api/storefront/unstable/objects/CartLine)
* [Webhook API](https://shopify.dev/docs/api/webhooks)

***

## Create nested cart lines

To create a nested cart line, specify a `parent` in the API input.

### Storefront API

Use the `parent` field in the cart mutation input. You can reference the parent by `lineId` (for existing line items in the cart) or `merchandiseId` (for adding both parent and nested cart lines in the same request).

* Only one of `lineId` or `merchandiseId` should be used per line.
* The response will return the nested cart line with a reference to its parent cart line under the `parentRelationship` object.

Example: Add TV and attach Warranty as an add-on

## POST https://{shop}.myshopify.com/api/{api\_version}/graphql.json

## GraphQL mutation

```graphql
mutation cartLinesAdd($cartId: ID!, $lines: [CartLineInput!]!) {
  cartLinesAdd(cartId: $cartId, lines: $lines) {
    cart {
      lines(first: 10) {
        edges {
          node {
            id
            merchandise {
              ... on ProductVariant {
                id
                title
              }
            }
            ... on CartLine {
              parentRelationship {
                parent {
                  id
                }
              }
              instructions {
                canRemove
                canUpdateQuantity
              }
            }
          }
        }
      }
    }
  }
}
```

## Variables

```json
{
  "cartId": "gid://shopify/Cart/1",
  "lines": [
    {
      "merchandiseId": "gid://shopify/ProductVariant/1",
      "quantity": 1
    },
    {
      "merchandiseId": "gid://shopify/ProductVariant/2",
      "quantity": 1,
      "parent": {
        "merchandiseId": "gid://shopify/ProductVariant/1"
      }
    }
  ]
}
```

## JSON response

```json
{
  "data": {
    "cartLinesAdd": {
      "cart": {
        "lines": {
          "edges": [
            {
              "node": {
                "id": "gid://shopify/CartLine/123",
                "merchandise": {
                  "id": "gid://shopify/ProductVariant/1",
                  "title": "TV"
                },
                "parentRelationship": null,
                "instructions": {
                  "canRemove": true,
                  "canUpdateQuantity": true
                }
              }
            },
            {
              "node": {
                "id": "gid://shopify/CartLine/456",
                "merchandise": {
                  "id": "gid://shopify/ProductVariant/2",
                  "title": "1 year Warranty"
                },
                "parentRelationship": {
                  "parent": {
                    "id": "gid://shopify/CartLine/123"
                  }
                },
                "instructions": {
                  "canRemove": true,
                  "canUpdateQuantity": true
                }
              }
            }
          ]
        }
      }
    }
  }
}
```

### Cart AJAX API

You can reference the parent by specifying a `parent_line_key` (for existing line items in the cart) or `parent_id` (for adding both parent and nested cart lines in the same request) in the API input.

**Notes:**

* Only one of `parent_line_key` or `parent_id` should be used per line.
* The response will return the nested cart line with a reference to its parent cart line under the `parent_relationship` object.

Example: Add TV and attach a warranty as an add-on.

## POST https://{shop}.myshopify.com/cart/add.js

## Variables

```json
[
    {
        "id": 1,
        "quantity": 1
    },
    {
        "id": 2,
        "quantity": 1,
        "parent_id": 1
    }
]
```

## JSON response

```json
{
  "items": [
    {
        "id": 1,
        "properties": {},
        "quantity": 1,
        "variant_id": 1,
        "key": "1:12345",
        "title": "TV",
        "product_title": "TV",
        "variant_title": null,
        "handle": "tv",
        "requires_shipping": true
    },
    {
        "id": 2,
        "properties": {},
        "quantity": 1,
        "variant_id": 2,
        "key": "2:56789",
        "title": "Leash Warranty - 1 year",
        "product_title": "Leash Warranty",
        "variant_title": "1 year",
        "parent_relationship": {
            "parent_key": "1:12345"
        },
        "instructions": {
            "can_remove": true,
            "can_update_quantity": true
        },
        "handle": "tv-warranty",
        "requires_shipping": true
    }
  ]
}
```

### Checkout UI Extension

Example: Add a warranty as an add-on to a product in the cart

## Preact

```typescript
import {render} from 'preact';
import {useCartLineTarget} from '@shopify/ui-extensions/checkout/preact';


export default function extension() {
  render(<Extension />, document.body);
}


function Extension() {
  const cartLines = useCartLines();
  const lineId = cartLines[0]?.id;
  const warrantyVariantId = "gid://shopify/ProductVariant/2";


  const handleNestWarranty = async () => {
    try {
      const result = await shopify.applyCartLinesChange({
        type: 'addCartLine',
        merchandiseId: warrantyVariantId,
        quantity: 1,
        parent: {
          lineId,
        }
      });


      if (result.type === 'error') {
        throw new Error(result.message);
      }
    } catch (error) {
      throw new Error(error)
    }


  return (
    <s-button onClick={handleNestWarranty}>Nest line</s-button>
  );
}
```

***

## Next steps

* Learn how to [build an add-ons app](https://shopify.dev/docs/apps/build/product-merchandising/nested-cart-lines/tutorial)

***
