Showing blips to only a few players [ESX]

Hello,
How can I create map blips that are only visible to players with a certain item in their inventory?

I tried this:

-------- CLIENT ----------
ESX						= nil

Citizen.CreateThread(function()
	while ESX == nil do
		TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
		Citizen.Wait(0)
	end
end)

-- Create blips
Citizen.CreateThread(function()
	Citizen.Wait(Config.Relocate * 1000) -- (Default) change position each 20 minutes
	
	local blip = nil
	BlackMarketZone = math.random(1,2)
	
	ESX.TriggerServerCallback('myscript:getItemAmount', function(qtty)
		if qtty > 0 then
			if BlackMarketZone == 1 then
				blip = AddBlipForCoord(Config.Zones.Zone1.Blips.Pos.x, Config.Zones.Zone1.Blips.Pos.y, Config.Zones.Zone1.Blips.Pos.z)
			elseif BlackMarketZone == 2 then
				blip = AddBlipForCoord(Config.Zones.Zone2.Blips.Pos.x, Config.Zones.Zone2.Blips.Pos.y, Config.Zones.Zone2.Blips.Pos.z)
			end
			
			SetBlipSprite(blip, Config.BlipInfo.Sprite)
			SetBlipDisplay(blip, Config.BlipInfo.Display)
			SetBlipScale(blip, Config.BlipInfo.Scale)
			SetBlipColour(blip, Config.BlipInfo.Colour)
			SetBlipAsShortRange(blip, true)

			BeginTextCommandSetBlipName("STRING")
			AddTextComponentString(_U('blip_name'))
			EndTextCommandSetBlipName(blip)
		else
			ESX.ShowNotification(_U('need_chip'))
		end
	end, 'phone')
end)

-------- SERVER ----------
ESX.RegisterServerCallback('myscript:getItemAmount', function(source, cb, item)
	local _source = source
    local xPlayer = ESX.GetPlayerFromId(_source)
    local qtty = xPlayer.getInventoryItem(item).count
    cb(qtty)
end)

But this does not work. It tells me in console that the ESX.TriggerServerCallback-line is trying to index a nil value…