productUpdate
Requires access scope. Also: The user must have a permission to update products.
Updates a product.
For versions 2024-01
and older:
If you update a product and only include some variants in the update,
then any variants not included will be deleted.
To safely manage variants without the risk of deleting excluded variants, use productVariantsBulkUpdate.
If you want to update a single variant, then use productVariantUpdate.
Arguments
- Anchor to mediamedia•
List of new media to be added to the product.
- Anchor to productproduct•
The updated properties for a product.
- Anchor to inputinput•Product
Input Deprecated The updated properties for a product. Deprecated as of
2024-10
.Use
product
argument instead.
Anchor to ProductUpdatePayload returnsProductUpdatePayload returns
- Anchor to productproduct•
The updated product object.
- Anchor to userErrorsuser•
Errors [UserError!]! non-null The list of errors that occurred from executing the mutation.
- Add new media to an existing product
- Create a new metafield and update another on an existing product
- Update a product's title and return the product ID
- Updates a product
- productUpdate reference
Examples
mutation UpdateProductWithNewMedia($input: ProductInput!, $media: [CreateMediaInput!]) {
productUpdate(input: $input, media: $media) {
product {
id
media(first: 10) {
nodes {
alt
mediaContentType
preview {
status
}
}
}
}
userErrors {
field
message
}
}
}
curl -X POST \
https://your-development-store.myshopify.com/admin/api/2025-01/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation UpdateProductWithNewMedia($input: ProductInput!, $media: [CreateMediaInput!]) { productUpdate(input: $input, media: $media) { product { id media(first: 10) { nodes { alt mediaContentType preview { status } } } } userErrors { field message } } }",
"variables": {
"input": {
"id": "gid://shopify/Product/912855135"
},
"media": [
{
"originalSource": "https://cdn.shopify.com/shopifycloud/brochure/assets/sell/image/image-@artdirection-large-1ba8d5de56c361cec6bc487b747c8774b9ec8203f392a99f53c028df8d0fb3fc.png",
"alt": "Gray helmet for bikers",
"mediaContentType": "IMAGE"
},
{
"originalSource": "https://www.youtube.com/watch?v=4L8VbGRibj8&list=PLlMkWQ65HlcEoPyG9QayqEaAu0ftj0MMz",
"alt": "Testing helmet resistance against impacts",
"mediaContentType": "EXTERNAL_VIDEO"
}
]
}
}'
const { admin } = await authenticate.admin(request);
const response = await admin.graphql(
`#graphql
mutation UpdateProductWithNewMedia($input: ProductInput!, $media: [CreateMediaInput!]) {
productUpdate(input: $input, media: $media) {
product {
id
media(first: 10) {
nodes {
alt
mediaContentType
preview {
status
}
}
}
}
userErrors {
field
message
}
}
}`,
{
variables: {
"input": {
"id": "gid://shopify/Product/912855135"
},
"media": [
{
"originalSource": "https://cdn.shopify.com/shopifycloud/brochure/assets/sell/image/image-@artdirection-large-1ba8d5de56c361cec6bc487b747c8774b9ec8203f392a99f53c028df8d0fb3fc.png",
"alt": "Gray helmet for bikers",
"mediaContentType": "IMAGE"
},
{
"originalSource": "https://www.youtube.com/watch?v=4L8VbGRibj8&list=PLlMkWQ65HlcEoPyG9QayqEaAu0ftj0MMz",
"alt": "Testing helmet resistance against impacts",
"mediaContentType": "EXTERNAL_VIDEO"
}
]
},
},
);
const data = await response.json();
const client = new shopify.clients.Graphql({session});
const data = await client.query({
data: {
"query": `mutation UpdateProductWithNewMedia($input: ProductInput!, $media: [CreateMediaInput!]) {
productUpdate(input: $input, media: $media) {
product {
id
media(first: 10) {
nodes {
alt
mediaContentType
preview {
status
}
}
}
}
userErrors {
field
message
}
}
}`,
"variables": {
"input": {
"id": "gid://shopify/Product/912855135"
},
"media": [
{
"originalSource": "https://cdn.shopify.com/shopifycloud/brochure/assets/sell/image/image-@artdirection-large-1ba8d5de56c361cec6bc487b747c8774b9ec8203f392a99f53c028df8d0fb3fc.png",
"alt": "Gray helmet for bikers",
"mediaContentType": "IMAGE"
},
{
"originalSource": "https://www.youtube.com/watch?v=4L8VbGRibj8&list=PLlMkWQ65HlcEoPyG9QayqEaAu0ftj0MMz",
"alt": "Testing helmet resistance against impacts",
"mediaContentType": "EXTERNAL_VIDEO"
}
]
},
},
});
session = ShopifyAPI::Auth::Session.new(
shop: "your-development-store.myshopify.com",
access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
session: session
)
query = <<~QUERY
mutation UpdateProductWithNewMedia($input: ProductInput!, $media: [CreateMediaInput!]) {
productUpdate(input: $input, media: $media) {
product {
id
media(first: 10) {
nodes {
alt
mediaContentType
preview {
status
}
}
}
}
userErrors {
field
message
}
}
}
QUERY
variables = {
"input": {
"id": "gid://shopify/Product/912855135"
},
"media": [{"originalSource"=>"https://cdn.shopify.com/shopifycloud/brochure/assets/sell/image/image-@artdirection-large-1ba8d5de56c361cec6bc487b747c8774b9ec8203f392a99f53c028df8d0fb3fc.png", "alt"=>"Gray helmet for bikers", "mediaContentType"=>"IMAGE"}, {"originalSource"=>"https://www.youtube.com/watch?v=4L8VbGRibj8&list=PLlMkWQ65HlcEoPyG9QayqEaAu0ftj0MMz", "alt"=>"Testing helmet resistance against impacts", "mediaContentType"=>"EXTERNAL_VIDEO"}]
}
response = client.query(query: query, variables: variables)