Skip to main content

Advanced concepts

Note

The REST Admin API is a legacy API as of October 1, 2024. All apps and integrations should be built with the GraphQL Admin API. For details and migration steps, visit our migration guide.

Legacy

The REST Admin API is a legacy API as of October 1, 2024. All apps and integrations should be built with the GraphQL Admin API. For details and migration steps, visit our migration guide.

Learn how to optimize your GraphQL implementation further by using inline fragments and building multi-query requests.


Inline fragments enhance query flexibility and reusability by enabling type-specific transformations and conditional inclusion of fields. Inline fragments use the ... on <TYPE> syntax.

For example, you can use the node field on the GraphQL Admin API QueryRoot object to request specific objects by their ID. The object is returned as a generic node object, which doesn't let you request any information other than the ID.

If you use an inline fragment, then you can ask for more specific data to return when the node is of a specific type. This is especially useful on nodes that don't have an easy access point through the QueryRoot object, such as a single LineItem object.

You can specify multiple inline fragments, which enables you to build conditionals in your request that enable you to request different return fields based on the node type. This is useful for selections that can return many different types of fields, such as the nodes connection on the GraphQL Admin API's QueryRoot object, which accepts an array of IDs and can return any number of different node types.

The following example uses all the concepts covered so far to find where a line item is stocked so that it can be fulfilled from that location. The query uses the node field on the QueryRoot object and provides the line item's ID.

Tip

You can obtain a line item ID by querying the orders connection on the QueryRoot and using the lineItem connection to return a list of line item IDs.

POST /admin/api/{api_version}/graphql.json

GraphQL query

query getLineItemLocationId($id: ID!) {
node(id: $id) {
... on LineItem {
id
variant {
inventoryItem {
inventoryLevels(first: 1) {
nodes {
location {
id
name
}
}
}
}
}
}
}
}

Variables

{
"id": "gid://shopify/LineItem/3111147110422"
}

JSON response

{
"data": {
"node": {
"id": "gid://shopify/LineItem/3111147110422",
"variant": {
"inventoryItem": {
"inventoryLevels": {
"nodes": [
{
"location": {
"id": "gid://shopify/Location/6884556842",
"name": "151 O'Connor St"
}
}
]
}
}
}
}
},
...
}

Anchor to Make multiple queries in one requestMake multiple queries in one request

You can submit multiple queries or mutations in a single GraphQL request. This enables you to query the same field or run the name mutation multiple times with different arguments.

Note

Submitting multiple queries or mutations in a single request doesn't provide rate-limiting benefits, because the operation complexities are additive.

The syntax for submitting multiple queries has the following key elements:

  • At the beginning of the request, declare whether the operations are queries or mutations
  • Give each operation a custom alias with <your-custom-name>: <query field or mutation name> (<arguments>)
  • The operations don't have to be the same
  • Each operation must select the fields that it wants to return

The following example uses multiple customerUpdate mutations to set three different tags on three different customers in a single request:

POST /admin/api/{api_version}/graphql.json

GraphQL mutation

mutation {
VipGold: customerUpdate(
input: {
id: "gid://shopify/Customer/1322001989654",
tags: ["Gold"]
}
)
{
customer {
tags
}
}
VipPlatinum: customerUpdate(
input: {
id: "gid://shopify/Customer/774173917206",
tags: ["Platinum"]
}
)
{
customer {
tags
}
}
VipDiamond: customerUpdate(
input: {
id: "gid://shopify/Customer/773091000342",
tags: ["Diamond"]
}
)
{
customer {
tags
}
}
}

JSON response

{
"data": {
"VipGold": {
"customer": {
"tags": [
"Gold"
]
}
},
"VipPlatinum": {
"customer": {
"tags": [
"Platinum"
]
}
},
"VipDiamond": {
"customer": {
"tags": [
"Diamond"
]
}
}
},
...
}


Was this page helpful?