RoProxy.com - A free, rotating proxy for Roblox APIs

I have made another PR updating the Deploy on Railway button. It would be great if you could review it @okfalse.

How do I make it as efficient as this game PLS DONATE 💸 - Roblox?

The way the gamepasses and clothes loaded is lightning fast and it’s probably to do with how they coded their proxy server but idk how web codes work

1 Like

I coded their proxy for them :ok_hand:

Their secret, however, is that they start loading your shirts and gamepasses as soon as you start holding down the claim button. That way, they’re already loaded once you claim the booth.

6 Likes

This is pretty cool @okfalse, and I want to use a proxy, but not this. I am going to run a game that requires tons of requests, and I don’t want roproxy to randomly fail. Any way you could teach me to make a proxy?

1 Like

hey @okfalse im trying to send a request to https://games.roproxy.com/v1/games/9230434873/servers/Public?limit=10 and I keep getting this error:

but when I go to the actual roblox site I get an actual response.

idk if Im doing something wrong, but hopefully we can find a fix :slight_smile:

also this proxy doesn’t seem to support the Premium features api

When I send to roproxy(url) it says that it’s not found.

But when I do to the Roblox Api it works:

1 Like

The /v1/games/…/servers/… endpoints have been disabled as they were being used for tools like RoSearcher. I have no intention of re-enabling them at this time, but feel free to host your own instance of RoProxy Lite

1 Like

dang that sucks. I remember those working a few months ago. Really sad how a few people can ruin everything for everyone :confused:

also one thing I’d like to mention is that the premuim features API doesn’t work with roproxy. If you go here you get an error. But when you go there on the actual roblox site it’ll actually function.

will fix that endpoint shortly :ok_hand:

1 Like

games.roproxy.com is returning with a cloudflare block on roblox.

Link: Access denied (roproxy.com)

See above.

1 Like

How to fix the rate limit for Roproxy Lite?

RoProxy Lite (usually, depending on where you’re hosting it) uses a single IP. You can increase ratelimits a bit by providing a cookie with requests, but if that’s still not enough feel free to contact me and we can discuss something purpose-built.

image

Also just to add more information to my last comment, this is what happens if there’s too many people in my game.

I think what happens is that I Immediately load player’s gamepasses on spawn and the error appears.

I could just load player’s gamepasses when they claim a stand
but I still can’t figure out how to make it efficient if there’s 1k player’s playing in my game.

this is the script I got from someone’s community server and made my script based on.

local clothingUrl = "https://catalog.roproxy.com/v1/search/items/details?Category=3&CreatorTargetId=%s&CreatorType=%s&Limit=30&Cursor=%s"
local gamepassesUrl = "https://games.roproxy.com/v1/games/%s/game-passes?sortOrder=Asc&limit=100&cursor=%s"
local gamesUrl = "https://games.roproxy.com/v2/%s/%s/games?sortOrder=Asc&limit=50&cursor=%s"

local function getClothing(targetId, targetType, cursor, clothing)
	cursor = cursor or ""
	clothing = clothing or {}

	local requestUrl = clothingUrl:format(targetId, targetType, cursor)
	local success, result = pcall(getAsync, HTTPService, requestUrl)
	if success then
		if result then
			local success2, result2 = pcall(jsonDecode, HTTPService, result)
			if success2 then
				if result2 then
					for _, clothingItem in ipairs(result2.data) do
						if not table.find(clothing, clothingItem.id) then
							table.insert(clothing, clothingItem.id)
						end
					end

					cursor = result2.nextPageCursor
					if cursor then
						return getClothing(targetId, targetType, cursor, clothing)
					else
						return clothing
					end
				end
			else
				warn(result2)
				task.wait(1)
				return getClothing(targetId, targetType, cursor, clothing)
			end
		end
	else
		warn(result)
		task.wait(1)
		return getClothing(targetId, targetType, cursor, clothing)
	end
end

local function getGamepassesRecursive(gameId, cursor, gamepasses)
	cursor = cursor or ""
	gamepasses = gamepasses or {}

	local requestUrl = gamepassesUrl:format(gameId, cursor)
	local success, result = pcall(getAsync, HTTPService, requestUrl)
	if success then
		if result then
			local success2, result2 = pcall(jsonDecode, HTTPService, result)
			if success2 then
				if result2 then
					for _, gamepassItem in ipairs(result2.data) do
						if not table.find(gamepasses, gamepassItem.id) then
							table.insert(gamepasses, gamepassItem.id)
						end
					end

					cursor = result2.nextPageCursor
					if cursor then
						return getGamepassesRecursive(gameId, cursor, gamepasses)
					else
						return gamepasses
					end
				end
			else
				warn(result2)
				task.wait(1)
				return getGamepassesRecursive(gameId, cursor, gamepasses)
			end
		end
	else
		warn(result)
		task.wait(1)
		return getGamepassesRecursive(gameId, cursor, gamepasses)
	end
end


local function getGroupsRecursive(userId)
	local userGroups = {}

	local success, result = pcall(getGroupsAsync, groups, userId)
	if success then
		if result then
			for _, groupItem in ipairs(result) do
				if groupItem.Rank == 255 then
					if not table.find(userGroups, groupItem.id) then
						table.insert(userGroups, groupItem.Id)
					end
				end
			end

			return userGroups
		end
	else
		warn(result)
		task.wait(1)
		return getGroupsRecursive(userId)
	end
end

local function getGames(targetId, targetType, cursor, games)
	cursor = cursor or ""
	games = games or {}

	local requestUrl = gamesUrl:format(targetType, targetId, cursor)
	local success, result = pcall(getAsync, HTTPService, requestUrl)

	if success then
		if result then
			local success2, result2 = pcall(jsonDecode, HTTPService, result)
			if success2 then
				if result2 then
					for _, gameItem in ipairs(result2.data) do
						table.insert(games, gameItem.id)
					end 

					cursor = result2.nextPageCursor
					if cursor then
						return getGames(targetId, targetType, cursor, games)
					else
						return games
					end
				end
			else
				warn(result2)
				task.wait(1)
				return getGames(targetId, targetType, cursor, games)
			end
		end
	else
		warn(result)
		task.wait(1)
		return getGames(targetId, targetType, cursor, games)
	end
end

local function getAssets(userId)
	local sellableAssets = {}	
	local userClothing = getClothing(userId, 1)
	local userGames = getGames(userId, "users")
	local userGamepasses = {}

	for _, userGameId in ipairs(userGames) do
		local userGameGamepasses = getGamepassesRecursive(userGameId)
		for _, userGameGamepass in ipairs(userGameGamepasses) do
			table.insert(userGamepasses, userGameGamepass)
		end
	end

	local userGroups = getGroupsRecursive(userId)
	local groupsClothing = {}
	local groupsGamepasses = {}

	for _, groupId in ipairs(userGroups) do
		local groupClothing = getClothing(groupId, 2)
		for _, groupClothingId in ipairs(groupClothing) do
			table.insert(groupsClothing, groupClothingId)
		end

		local groupGames = getGames(groupId, "groups")
		for _, groupGameId in ipairs(groupGames) do
			local groupGameGamepasses = getGamepassesRecursive(groupGameId)
			for _, groupGameGamepass in ipairs(groupGameGamepasses) do
				table.insert(groupsGamepasses, groupGameGamepass)
			end
		end
	end

	for _, userClothingId in ipairs(userClothing) do
		table.insert(sellableAssets, userClothingId)
	end

	for _, groupsClothingId in ipairs(groupsClothing) do
		table.insert(sellableAssets, groupsClothingId)
	end

	for _, groupsGamepassesId in ipairs(groupsGamepasses) do
		table.insert(userGamepasses, groupsGamepassesId)
	end

	return sellableAssets, userGamepasses
end

1 Like

You shouldn’t be sending that many requests from your game in the first place. Recursively fetching games, groups, group games, gamepasses, group clothing etc. is sure to make you hit Roblox’s 500/min HTTPService limits. You’ll want an external service fetching all that data and sending it back in a single request.

Even then you certainly won’t be able to handle anywhere near 1000 players with a single IP, you’ll want to set up some form of proxies.

1 Like

I really don’t know a lot about proxy servers but basically, I need to make multiple proxies, convert the script then put it in a proxy server and make a script that requests the proxy server using only the player’s userid?

Not really understanding your reply - I’m suggesting you create an API that does what your script is doing. You might be sending few enough requests to just send it through Cloudflare workers and use their small pool of IPs, otherwise you’ll want to write something utilizing a proxy provider like webshare.

1 Like

okay so how do we get around that and make it so we can access that info

Host an instance of RoProxy Lite and provide a cookie with requests.