update, found out how to use cursor with Moralis SDK, this is an example for node js:
const Moralis = require('moralis/node')
const serverUrl = 'https://sadfadfa:2053/server'
const appId = 'fasdfasf'
const contractAddress = '4324234234'
async function getAllOwners() {
await Moralis.start({serverUrl: serverUrl, appId: appId})
let cursor = null
let owners = {}
do {
const response = await Moralis.Web3API.token.getNFTOwners({ address: contractAddress, chain: 'eth', limit: 500, cursor: cursor })
console.log(`Got page ${response.page} of ${Math.ceil(response.total / response.page_size)}, ${response.total} total`)
for (const owner of response.result) {
owners[owner.owner_of] = {amount: owner.amount, owner: owner.owner_of, tokenId: owner.token_id, tokenAddress: owner.token_address}
}
cursor = response.cursor
} while (cursor != '' && cursor != null)
console.log('owners:', owners, 'total owners:', Object.keys(owners).length)
}
getAllOwners()