# collectionRemoveProducts - admin - MUTATION
Version: unstable

## Description
Removes a set of products from a given collection. The mutation can take a long time to run. Instead of returning an updated collection the mutation returns a job, which should be [polled](https://shopify.dev/api/admin-graphql/latest/queries/job). For use with manual collections only.

### Access Scopes
`write_products` access scope. Also: The user must have a permission to remove products from a collection.


## Arguments
* [id](/docs/api/admin/unstable/scalars/ID): ID! - The ID of the collection to remove products from. The ID must reference an existing manual collection.
* [productIds](/docs/api/admin/unstable/scalars/ID): ID! - The IDs of products to remove from the collection. The mutation doesn't validate that the products belong to the collection or whether the products exist.


## Returns
* [job](/docs/api/admin/unstable/objects/Job): Job The asynchronous job removing the products.
* [userErrors](/docs/api/admin/unstable/objects/UserError): UserError! The list of errors that occurred from executing the mutation.


## Examples
### Remove a product from a manual collection
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/unstable/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) { collectionRemoveProducts(id: $id, productIds: $productIds) { job { done id } userErrors { field message } } }\",\n \"variables\": {\n    \"id\": \"gid://shopify/Collection/1007901140\",\n    \"productIds\": [\n      \"gid://shopify/Product/20995642\"\n    ]\n  }\n}'\n"
Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n  data: {\n    \"query\": `mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n      collectionRemoveProducts(id: $id, productIds: $productIds) {\n        job {\n          done\n          id\n        }\n        userErrors {\n          field\n          message\n        }\n      }\n    }`,\n    \"variables\": {\n      \"id\": \"gid://shopify/Collection/1007901140\",\n      \"productIds\": [\n        \"gid://shopify/Product/20995642\"\n      ]\n    },\n  },\n});\n"
Ruby example: "session = ShopifyAPI::Auth::Session.new(\n  shop: \"your-development-store.myshopify.com\",\n  access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n  session: session\n)\n\nquery = <<~QUERY\n  mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }\nQUERY\n\nvariables = {\n  \"id\": \"gid://shopify/Collection/1007901140\",\n  \"productIds\": [\"gid://shopify/Product/20995642\"]\n}\n\nresponse = client.query(query: query, variables: variables)\n" 
Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n  `#graphql\n  mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }`,\n  {\n    variables: {\n      \"id\": \"gid://shopify/Collection/1007901140\",\n      \"productIds\": [\n        \"gid://shopify/Product/20995642\"\n      ]\n    },\n  },\n);\n\nconst data = await response.json();\n"
Graphql query: "mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n  collectionRemoveProducts(id: $id, productIds: $productIds) {\n    job {\n      done\n      id\n    }\n    userErrors {\n      field\n      message\n    }\n  }\n}"
#### Graphql Input
{
  "id": "gid://shopify/Collection/1007901140",
  "productIds": [
    "gid://shopify/Product/20995642"
  ]
}
#### Graphql Response
{
  "data": {
    "collectionRemoveProducts": {
      "job": {
        "done": false,
        "id": "gid://shopify/Job/0d9c63ab-d903-4f1e-b9b1-6ddf55948dfb"
      },
      "userErrors": []
    }
  }
}

### Remove a product from a non-existent collection
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/unstable/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) { collectionRemoveProducts(id: $id, productIds: $productIds) { job { done id } userErrors { field message } } }\",\n \"variables\": {\n    \"id\": \"gid://shopify/Collection/-1\",\n    \"productIds\": [\n      \"gid://shopify/Product/20995642\"\n    ]\n  }\n}'\n"
Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n  data: {\n    \"query\": `mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n      collectionRemoveProducts(id: $id, productIds: $productIds) {\n        job {\n          done\n          id\n        }\n        userErrors {\n          field\n          message\n        }\n      }\n    }`,\n    \"variables\": {\n      \"id\": \"gid://shopify/Collection/-1\",\n      \"productIds\": [\n        \"gid://shopify/Product/20995642\"\n      ]\n    },\n  },\n});\n"
Ruby example: "session = ShopifyAPI::Auth::Session.new(\n  shop: \"your-development-store.myshopify.com\",\n  access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n  session: session\n)\n\nquery = <<~QUERY\n  mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }\nQUERY\n\nvariables = {\n  \"id\": \"gid://shopify/Collection/-1\",\n  \"productIds\": [\"gid://shopify/Product/20995642\"]\n}\n\nresponse = client.query(query: query, variables: variables)\n" 
Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n  `#graphql\n  mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }`,\n  {\n    variables: {\n      \"id\": \"gid://shopify/Collection/-1\",\n      \"productIds\": [\n        \"gid://shopify/Product/20995642\"\n      ]\n    },\n  },\n);\n\nconst data = await response.json();\n"
Graphql query: "mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n  collectionRemoveProducts(id: $id, productIds: $productIds) {\n    job {\n      done\n      id\n    }\n    userErrors {\n      field\n      message\n    }\n  }\n}"
#### Graphql Input
{
  "id": "gid://shopify/Collection/-1",
  "productIds": [
    "gid://shopify/Product/20995642"
  ]
}
#### Graphql Response
{
  "data": {
    "collectionRemoveProducts": {
      "job": null,
      "userErrors": [
        {
          "field": [
            "id"
          ],
          "message": "Collection does not exist"
        }
      ]
    }
  }
}

### Remove a product from a smart collection
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/unstable/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) { collectionRemoveProducts(id: $id, productIds: $productIds) { job { done id } userErrors { field message } } }\",\n \"variables\": {\n    \"id\": \"gid://shopify/Collection/142458073\",\n    \"productIds\": [\n      \"gid://shopify/Product/108828309\"\n    ]\n  }\n}'\n"
Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n  data: {\n    \"query\": `mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n      collectionRemoveProducts(id: $id, productIds: $productIds) {\n        job {\n          done\n          id\n        }\n        userErrors {\n          field\n          message\n        }\n      }\n    }`,\n    \"variables\": {\n      \"id\": \"gid://shopify/Collection/142458073\",\n      \"productIds\": [\n        \"gid://shopify/Product/108828309\"\n      ]\n    },\n  },\n});\n"
Ruby example: "session = ShopifyAPI::Auth::Session.new(\n  shop: \"your-development-store.myshopify.com\",\n  access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n  session: session\n)\n\nquery = <<~QUERY\n  mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }\nQUERY\n\nvariables = {\n  \"id\": \"gid://shopify/Collection/142458073\",\n  \"productIds\": [\"gid://shopify/Product/108828309\"]\n}\n\nresponse = client.query(query: query, variables: variables)\n" 
Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n  `#graphql\n  mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }`,\n  {\n    variables: {\n      \"id\": \"gid://shopify/Collection/142458073\",\n      \"productIds\": [\n        \"gid://shopify/Product/108828309\"\n      ]\n    },\n  },\n);\n\nconst data = await response.json();\n"
Graphql query: "mutation collectionRemoveProducts($id: ID!, $productIds: [ID!]!) {\n  collectionRemoveProducts(id: $id, productIds: $productIds) {\n    job {\n      done\n      id\n    }\n    userErrors {\n      field\n      message\n    }\n  }\n}"
#### Graphql Input
{
  "id": "gid://shopify/Collection/142458073",
  "productIds": [
    "gid://shopify/Product/108828309"
  ]
}
#### Graphql Response
{
  "data": {
    "collectionRemoveProducts": {
      "job": null,
      "userErrors": [
        {
          "field": [
            "id"
          ],
          "message": "Can't manually remove products from a smart collection"
        }
      ]
    }
  }
}

### Removes a product from a collection
Curl example: "curl -X POST \\\nhttps://your-development-store.myshopify.com/admin/api/unstable/graphql.json \\\n-H 'Content-Type: application/json' \\\n-H 'X-Shopify-Access-Token: {access_token}' \\\n-d '{\n\"query\": \"mutation RemoveFromCollection($id: ID!, $productIds: [ID!]!) { collectionRemoveProducts(id: $id, productIds: $productIds) { job { done id } userErrors { field message } } }\",\n \"variables\": {\n    \"id\": \"gid://shopify/Collection/1007901140\",\n    \"productIds\": [\n      \"gid://shopify/Product/20995642\"\n    ]\n  }\n}'\n"
Node example: "const client = new shopify.clients.Graphql({session});\nconst data = await client.query({\n  data: {\n    \"query\": `mutation RemoveFromCollection($id: ID!, $productIds: [ID!]!) {\n      collectionRemoveProducts(id: $id, productIds: $productIds) {\n        job {\n          done\n          id\n        }\n        userErrors {\n          field\n          message\n        }\n      }\n    }`,\n    \"variables\": {\n      \"id\": \"gid://shopify/Collection/1007901140\",\n      \"productIds\": [\n        \"gid://shopify/Product/20995642\"\n      ]\n    },\n  },\n});\n"
Ruby example: "session = ShopifyAPI::Auth::Session.new(\n  shop: \"your-development-store.myshopify.com\",\n  access_token: access_token\n)\nclient = ShopifyAPI::Clients::Graphql::Admin.new(\n  session: session\n)\n\nquery = <<~QUERY\n  mutation RemoveFromCollection($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }\nQUERY\n\nvariables = {\n  \"id\": \"gid://shopify/Collection/1007901140\",\n  \"productIds\": [\"gid://shopify/Product/20995642\"]\n}\n\nresponse = client.query(query: query, variables: variables)\n" 
Remix example: "const { admin } = await authenticate.admin(request);\n\nconst response = await admin.graphql(\n  `#graphql\n  mutation RemoveFromCollection($id: ID!, $productIds: [ID!]!) {\n    collectionRemoveProducts(id: $id, productIds: $productIds) {\n      job {\n        done\n        id\n      }\n      userErrors {\n        field\n        message\n      }\n    }\n  }`,\n  {\n    variables: {\n      \"id\": \"gid://shopify/Collection/1007901140\",\n      \"productIds\": [\n        \"gid://shopify/Product/20995642\"\n      ]\n    },\n  },\n);\n\nconst data = await response.json();\n"
Graphql query: "mutation RemoveFromCollection($id: ID!, $productIds: [ID!]!) {\n  collectionRemoveProducts(id: $id, productIds: $productIds) {\n    job {\n      done\n      id\n    }\n    userErrors {\n      field\n      message\n    }\n  }\n}"
#### Graphql Input
{
  "id": "gid://shopify/Collection/1007901140",
  "productIds": [
    "gid://shopify/Product/20995642"
  ]
}
#### Graphql Response
{
  "data": {
    "collectionRemoveProducts": {
      "job": {
        "done": false,
        "id": "gid://shopify/Job/8b553d69-6076-4dee-bc21-8c2d52457a36"
      },
      "userErrors": []
    }
  }
}