🔍 Unity GCR Asset Scanner

Check which of your assets from Greater China Region publishers will be removed on March 31st, 2026

Due to updated regional licensing, distribution, and compliance policy requirements, assets from publishers based in Greater China Region (including Hong Kong and Macau) will be removed from the Global Unity Asset Store.

📄 View Full List of Assets Being Removed (PDF)
1

Export Your Assets

First, you need to export your assets from Unity Asset Store. Follow these steps:

  1. Go to Unity Asset Store - My Assets
  2. Make sure you're logged in
  3. Press F12 to open Chrome DevTools
  4. Go to the Console tab
  5. Copy the script below and paste it in the console
  6. Press Enter and wait for the download
(async function(){
  const endpoint = "https://assetstore.unity.com/api/graphql/batch";
  
  // Get CSRF token from cookies
  const csrf = (() => {
    for (let c of document.cookie.split(";")) {
      let [n, v] = c.trim().split("=");
      if (n === "_csrf") return decodeURIComponent(v);
    }
    return null;
  })();
  
  if (!csrf) {
    console.error("CSRF token not found! Make sure you're logged in.");
    return;
  }
  
  // GraphQL query
  const query = `query SearchMyAssets($page: Int, $pageSize: Int, $q: [String], 
    $tagging: [String!], $assignFrom: [String!], $ids: [String!], 
    $sortBy: Int, $reverse: Boolean, $other: String) {
    searchMyAssets(page: $page, pageSize: $pageSize, q: $q, tagging: $tagging, 
      assignFrom: $assignFrom, ids: $ids, sortBy: $sortBy, reverse: $reverse, 
      other: $other) {
      results {
        id orderId grantTime tagging assignFrom
        product {
          id productId itemId name
          mainImage { icon75 icon __typename }
          publisher { id name __typename }
          publishNotes state
          currentVersion { name publishedDate __typename }
          downloadSize __typename
        }
        __typename
      }
      total __typename
    }
  }`;
  
  // Fetch a page of assets with optional tagging filter
  async function fetchPage(page, tagging = []) {
    const response = await fetch(endpoint, {
      method: "POST",
      headers: {
        "Content-Type": "application/json;charset=UTF-8",
        "Accept": "application/json, text/plain, */*",
        "x-csrf-token": csrf,
        "x-requested-with": "XMLHttpRequest",
        "x-source": "storefront",
        "operations": "SearchMyAssets"
      },
      credentials: "include",
      body: JSON.stringify([{
        query: query,
        variables: {
          page: page,
          pageSize: 100,
          q: [],
          tagging: tagging,
          ids: [],
          assignFrom: [],
          sortBy: 7
        },
        operationName: "SearchMyAssets"
      }])
    });
    return (await response.json())[0];
  }
  
  // Fetch all pages for a given tagging filter
  async function fetchAll(label, tagging) {
    console.log("Fetching " + label + "...");
    let first = await fetchPage(0, tagging);
    let total = first.data.searchMyAssets.total;
    let pages = Math.ceil(total / 100);
    let assets = [...first.data.searchMyAssets.results];
    for (let p = 1; p < pages; p++) {
      console.log(label + " page " + (p + 1) + "/" + pages);
      let d = await fetchPage(p, tagging);
      assets.push(...d.data.searchMyAssets.results);
      await new Promise(r => setTimeout(r, 300));
    }
    console.log("Found " + assets.length + " " + label);
    return assets;
  }
  
  // Fetch visible + hidden assets
  let visible = await fetchAll("visible assets", []);
  let hidden = await fetchAll("hidden assets", ["#BIN"]);
  let allAssets = [...visible, ...hidden];
  
  // Fetch wishlist: saved cart + favorites
  console.log("Fetching wishlist...");
  let wishlistItems = [];
  try {
    let userId = (() => {
      for (let c of document.cookie.split(";")) {
        let [n, v] = c.trim().split("=");
        if (n.trim() === "LS") return v.split("-")[0];
      }
      return null;
    })();
    
    // Fetch saved cart
    let cartRes = await fetch(endpoint, {
      method: "POST",
      headers: {
        "Content-Type": "application/json;charset=UTF-8",
        "Accept": "application/json, text/plain, */*",
        "x-csrf-token": csrf,
        "x-requested-with": "XMLHttpRequest",
        "x-source": "storefront",
        "operations": "ShoppingCartQuery"
      },
      credentials: "include",
      body: JSON.stringify([{
        query: 'query ShoppingCartQuery {\n  currentCart(namespace: "asset_store_saved_cart") {\n    id\n    cartId\n    items {\n      id\n      product {\n        id\n        name\n        mainImage { icon icon75 __typename }\n        publisher { id name __typename }\n        state\n        __typename\n      }\n      __typename\n    }\n    __typename\n  }\n}\n',
        operationName: "ShoppingCartQuery"
      }])
    });
    let cartData = await cartRes.json();
    let cartItems = cartData[0]?.data?.currentCart?.items || [];
    for (let item of cartItems) {
      if (item.product) wishlistItems.push(item.product);
    }
    
    // Fetch favorites (separate request)
    let favRes = await fetch(endpoint, {
      method: "POST",
      headers: {
        "Content-Type": "application/json;charset=UTF-8",
        "Accept": "application/json, text/plain, */*",
        "x-csrf-token": csrf,
        "x-requested-with": "XMLHttpRequest",
        "x-source": "storefront",
        "operations": "ListDetail"
      },
      credentials: "include",
      body: JSON.stringify([{
        query: 'query ListDetail {\n  listDetail(listId: "favorite") {\n    packages(size: 200) {\n      results {\n        ...product\n        __typename\n      }\n      total\n      __typename\n    }\n    __typename\n  }\n}\nfragment product on Product {\n    id productId itemId slug name\n    publisher { id name __typename }\n    mainImage { icon75 icon __typename }\n    originalPrice { originalPrice finalPrice isFree currency __typename }\n    state\n    __typename\n  }\n',
        operationName: "ListDetail"
      }])
    });
    let favData = await favRes.json();
    let favItems = favData[0]?.data?.listDetail?.packages?.results || [];
    // Deduplicate by id
    let existingIds = new Set(wishlistItems.map(i => i.id));
    for (let item of favItems) {
      if (!existingIds.has(item.id)) wishlistItems.push(item);
    }
    
    console.log("Found " + wishlistItems.length + " wishlist items");
  } catch(e) {
    console.log("Could not fetch wishlist:", e.message);
  }
  
  // Create download
  let exportData = [{
    data: {
      searchMyAssets: { count: allAssets.length, results: allAssets },
      wishlist: { count: wishlistItems.length, results: wishlistItems }
    }
  }];
  
  let blob = new Blob([JSON.stringify(exportData, null, 2)], {
    type: "application/json"
  });
  let a = document.createElement("a");
  a.href = URL.createObjectURL(blob);
  a.download = "myassets.json";
  a.click();
  
  console.log("Downloaded " + allAssets.length + " assets (" + visible.length + " visible + " + hidden.length + " hidden) + " + wishlistItems.length + " wishlist items!");
})();
2

Upload Your Assets File

Upload the myassets.json file you just downloaded:

📁

Drop your myassets.json here

or

3

Scan Results

Upload your assets file to see the scan results

💰 Refund Information

If you purchased an affected asset within the past 6 months, you can request a refund (exception to normal refund policy).

After a refund is issued, you will lose entitlement to that asset.

Important: Your license to use these assets remains valid. You can continue using them in your projects and download via Package Manager. However, publishers will no longer provide updates or support after March 31st.