Skip to content

Instantly share code, notes, and snippets.

@jamiephan
Last active February 27, 2025 20:08
Show Gist options
  • Save jamiephan/0c04986c7f2e62d5c87c4e8c8ce115fc to your computer and use it in GitHub Desktop.
Save jamiephan/0c04986c7f2e62d5c87c4e8c8ce115fc to your computer and use it in GitHub Desktop.
A script to automatically add ALL items to your account in quixel

Script to add all items from quixel

As quixel is being removed, all items are free to aquire. This script is to automate the process to add items to your account (As of writing, a total of 18874 items)

Note: This script only tested in the latest version of Chrome.

How to use

  1. Copy the script from below (run.js)
  2. Login into https://quixel.com
  3. Go to https://quixel.com/megascans/collections
  4. Open devtools (F12) -> Go to "Console" tab
  5. Paste in the script and press Enter.
  6. A dialog should popup confirming the execution, click "OK"
  7. Sit back and wait

Common issues

  • Getting "Forbidden" error. (Even after refresh, the whole page just shows "Forbidden")
    • There is a chance that the API adding too fast and you hit the rate limit of the API. (My testing is around after 10 pages, so ~10k items).
    • Wait after ~10-20 minutes and continue. See Common Fixes -> Restart script to continue the execution after you can load https://quixel.com.
  • The script seems to be paused/hang
    • It could be too much logging going it. Try monitor the script, if it says "END PAGE X", note the page number down (in case need restart) and clear the console by clicking the "🚫" icon in devtools.
    • See Common Fixes -> Restart script for fixing.
  • Getting the error **UNABLE TO ADD ITEM**
    • There should have the error message shown in ( ). If it is user already owns specified asset at a higher or equal resolution, then its already in your account.
  • Getting the error cannot find authentication token. Please login again
    • Clear browser cookies and re-login quixel again. Try just simply add 1 item manully. If it success, then see Common Fixes -> Restart script for continue the execution.

Common Fixes

Restart Script

  1. Note which page it was running
  2. Copy the run.js script
  3. Update the startPage = 0 on the first line to startPage = 10 (assuming page 10 was hanged)

Change Log

  1. Initial Script launch
  2. Update to clear logs to reduce chance of hanging
  3. [CURRENT] Skip adding items that already was acquired. Reduced logs. Added more info after script completion to show purchased item count. Due to now skipping purchased items, you technically don't need to specify the startPage anymore.
((async (startPage = 0, autoClearConsole = true) => {
const getCookie = (name) => {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
}
const callCacheApi = async (params = {}) => {
const defaultParams = {
page: 0,
maxValuesPerFacet: 1000,
hitsPerPage: 1000,
attributesToRetrieve: ["id", "name"].join(",")
}
const response = await fetch("https://proxy-algolia-prod.quixel.com/algolia/cache", {
"headers": {
"x-api-key": "2Zg8!d2WAHIUW?pCO28cVjfOt9seOWPx@2j"
},
"body": JSON.stringify({
url: "https://6UJ1I5A072-2.algolianet.com/1/indexes/assets/query?x-algolia-application-id=6UJ1I5A072&x-algolia-api-key=e93907f4f65fb1d9f813957bdc344892",
params: new URLSearchParams({ ...defaultParams, ...params }).toString()
}),
"method": "POST",
})
return await response.json()
}
const callAcl = async ({ id, name }) => {
const response = await fetch("https://quixel.com/v1/acl", {
"headers": {
"authorization": "Bearer " + authToken,
"content-type": "application/json;charset=UTF-8",
},
"body": JSON.stringify({ assetID: id }),
"method": "POST",
});
const json = await response.json()
if (json?.isError) {
console.error(` --> **UNABLE TO ADD ITEM** Item ${id} | ${name} (${json?.msg})`)
} else {
console.log(` --> ADDED ITEM Item ${id} | ${name}`)
}
}
const callAcquired = async () => {
const response = await fetch("https://quixel.com/v1/assets/acquired", {
"headers": {
"authorization": "Bearer " + authToken,
"content-type": "application/json;charset=UTF-8",
},
"method": "GET",
});
return await response.json()
}
// 1. Check token exist, quixel API needs it
console.log("-> Checking Auth API Token...")
let authToken = ""
try {
const authCookie = getCookie("auth") ?? "{}"
authToken = JSON.parse(decodeURIComponent(authCookie))?.token
if (!authToken) {
return console.error("-> Error: cannot find authentication token. Please login again.")
}
} catch (_) {
return console.error("-> Error: cannot find authentication token. Please login again.")
}
// 2. Get all currently acquired items
console.log("-> Get Acquired Items...")
const acquiredItems = (await callAcquired()).map(a => a.assetID)
// 3. Get total count of items
console.log("-> Getting Total Number of Pages....")
const { nbPages: totalPages, hitsPerPage: itemsPerPage, nbHits: totalItems } = await callCacheApi()
console.log("-> ==============================================")
console.log(`-> Total # of items: ${totalItems}`)
console.log(`-> ${totalPages} total pages with ${itemsPerPage} per page`)
console.log(`-> Total Items to add: ${(totalItems - acquiredItems.length)}.`)
console.log("-> ==============================================")
if (!confirm(`Click OK to start adding ${(totalItems - acquiredItems.length)} items in your account.`)) return
// Loop
for (let pageIdx = startPage || 0; pageIdx < totalPages; pageIdx++) {
console.log(`-> ======================= PAGE ${pageIdx + 1}/${totalPages} START =======================`)
console.log("-> Getting Items from page " + (pageIdx + 1) + " ...")
const { hits: items } = await callCacheApi({ page: pageIdx })
console.log("-> Adding non-acquired items...")
// Filter out owned items
const unownedItems = items.filter(i => !acquiredItems.includes(i.id))
const aclPromises = unownedItems.map(callAcl)
await Promise.all(aclPromises)
console.log(`-> ======================= PAGE ${pageIdx + 1}/${totalPages} COMPLETED =======================`)
if (autoClearConsole) console.clear() // Fix the issue that too much log hangs the console. Set autoClearConsole = false to keep the logs
}
console.log("-> Getting new acquired info...")
// Get acquired items again
const newItemsAcquired = (await callAcquired()).length
const newTotalCount = (await callCacheApi()).nbHits
console.log(`-> Completed. Your account now have a total of ${newItemsAcquired} out of ${newTotalCount} items.`)
alert(`-> Your account now have a total of ${newItemsAcquired} out of ${newTotalCount} items.\n\nIf you find some items missing, try refresh the page and run the script again.`)
})())
@scarlet-tobar
Copy link

scarlet-tobar commented Nov 22, 2024 via email

@tgrafk12
Copy link

Does this still work? If so, great, if not, crap. I JUST started using Quixel about a week ago, and now things wont download. 😭

Im trying to download https://quixel.com/megascans/home?search=FabricPattern&assetId=pgjhtls0 and every time i click download, it just brings me to the homepage of FAB, which, what a fucking release if thats the case. cant even make a proper redirect 😆

If anyone has anything to help me out, thatd be awesome :>

I honestly just "acquired" as many Adobe products as I needed via the GenP Reddit. I honestly dont know why Epic is also becoming a bit scummy on the "Fab"sets and not just letting us use the old ones that WERE compatible. Companys just need to stop improving something that works and keep with it. Maybe improve bugs, or ease of use, but not CONSOLIDATING 🙄

@Jemish1728
Copy link

Leave a comment

Markdown is supported

Thanks a lot for informing that. it's working.

@mousedoc
Copy link

Thanx!

@RecessEmpire
Copy link

Thanx Jamiephan..

@inf1111
Copy link

inf1111 commented Jan 1, 2025

2025, it still works!

@ViperFangs
Copy link

Still worked today! Thank you :D

@RecessEmpire
Copy link

RecessEmpire commented Jan 4, 2025

I did the code thing in December, then later added assets on my Fab.com account using my Epic games login. Right now I have 18871 assets that are downloadable. Sorry to you guys that missed this. 😞

@ChuanShuoJiPinQiong
Copy link

Still works!

@JTMG314
Copy link

JTMG314 commented Jan 15, 2025

It still works! NO KIDDING
I used the code on the newest safari-version. All worked perfectly. Can't believe I could claim all items after the 31th of 2024 <3

SCR-20250115-kmqs

@rotode
Copy link

rotode commented Jan 18, 2025

It still works! NO KIDDING I used the code on the newest safari-version. All worked perfectly. Can't believe I could claim all items after the 31th of 2024 <3

SCR-20250115-kmqs

Hi! How did you manage to get this to work? I get an error for each asset (ERR: 400). Did you have an active (free) quixel plan on your account? Because I don't, and I'm wondering if that's the issue

@JTMG314
Copy link

JTMG314 commented Jan 18, 2025

It still works! NO KIDDING I used the code on the newest safari-version. All worked perfectly. Can't believe I could claim all items after the 31th of 2024 <3
SCR-20250115-kmqs

Hi! How did you manage to get this to work? I get an error for each asset (ERR: 400). Did you have an active (free) quixel plan on your account? Because I don't, and I'm wondering if that's the issue

I signed in through epicgames and in my account settings it says: "Unreal Unlimited"

@tfhydyx
Copy link

tfhydyx commented Feb 6, 2025

@JTMG314 Can you share your Eid with me I don't have money to buy textures and assets please

@tfhydyx
Copy link

tfhydyx commented Feb 6, 2025

Hi

@selvamoarrefi
Copy link

hi friends has any one can help me to have just for 2 days his/her account to download the assets. it's very important for me.
i promise just maximum 2 days I use that after that you can change your password i know it's maybe not logical asking

@selvamoarrefi
Copy link

I did the code thing in December, then later added assets on my Fab.com account using my Epic games login. Right now I have 18871 assets that are downloadable. Sorry to you guys that missed this. 😞

bro can you help me to download the assets?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment