Roblox Discord Webhook Proxy Server



Webhooks are

{ "embeds":[
{ embed content }, { second embed content }
], "content":"Test"}

In your case, just do

local HookData = {
    ["embeds"] = {options},
    ["content"] = "Test"


The proxy server just forwards your POST payload to Discord, the only thing I change is your headers (which shouldn’t matter).

Seems like something on Discord’s end changed. Does @Semaphorism’s advice fix your problem?


Ah, yeah, I see the problem. I was using [“embeds”] = {options} before, but I changed it because, while trying to find the problem, an embed visualizer stated that it should be “embed” not embeds. And when I did that, it would send (just not the embed). Changing it like @Semaphorism suggested still wouldn’t work in game, however a POST request using the JSON string I posted above would post just fine. Which I really should have tested first.

What I didn’t realize is that problem came about from the function I used to generate the timestamp, and that’s why it never posted. I must have done a bad job debugging it, because I completely missed that was the original problem.

Timestamp function
local function getCurrentTime()
	local currentTime ="!*t")

	local hour = currentTime.hour
	local minute = currentTime.min
	local second = currentTime.sec

	local day =
	local month = currentTime.month
	local year = currentTime.year

	-- ISO8601 support
	if hour <= 10 then
		hour = 0 .. hour
	if minute <= 10 then
		minute = 0 .. minute
	if second <= 10 then
		second = 0 .. second
	if day <= 10 then
		day = 0 .. day
	if month <= 10 then
		month = 0 .. month
	if year <= 10 then
		year = 0 .. year

	return ("%s-%s-%sT%s:%s:%sZ"):format(year, month, day, hour, minute, second)

If you look you can probably see the problem. If the day was <= 10, then it’d add a leading zero. Well, today is the 10th, so it gave an incorrect timestamp format (“2018-08-010T00:00:00Z”) lol.

Sorry for the trouble! And thanks for the help and quick responses @Osyris and @Semaphorism


string.format supports padding like this example:

print(string.format("%012i", 300)) --> 000000000300

Flags and Width

Flag Description
- Left-justify the given field width. Right justification is the default (see “width” below).
+ Forces to precede by a + or - sign, even if the number is positive. The default only shows the - sign in front of a negative number.
(space) A blank space is inserted before the value.
# Used with o and x/X, writes a 0 (octal) or 0x/0X (hex) before the values for values other than zero. Used with e/E and f, it forces the written output to contain a decimal point even if no digits would follow. By default, if no digits follow, no decimal point is written. Used with g or G the result is the same as with e or E but trailing zeros are not removed.
0 Left-pads the number with 0s instead of empty spaces (see “width” below).
width Description
(number) Minimum number of characters to return. If the number of characters to be formatted is less than this number, then the result is padded with blank spaces. Otherwise, nothing happens.


What is the limit? I got blocked. Oof.


Jeez what are you sending? I find it really hard to reach the limit with good use (never gotten close to it). You should make your system for it more efficient.


I didn’t receive an error about being block???, but my web-hook stopped sending information regarding server information. I ensured that whatever I am receiving on Discord is in a Embed utilizing the fields and wrapped it into a pcall. It doesn’t throw an error but my discord channel isn’t receiving the information.


Can you show us your code minus the URL?


I was using a teleporter that would teleport players to my game from someone else’s slightly more popular game, and the teleporter would read back the following:
“(PlayerName) has been teleported to NASCAR '18 from (GameID) at (Time) on (Date)”

Did like 4000 teleports in 2 days

My new method is the following scripts:

 -- Teleport Script
function onTouched(hit)
    local player = game.Players:GetPlayerFromCharacter(hit.Parent)
	script.Disabled = true
    if player then
			script.Parent.NumPlayers.Value = script.Parent.NumPlayers.Value + 1

	script.Disabled = false
-- DataPost Script
local http = game:GetService("HttpService")
local playernum = script.Parent.Teleporter.NumPlayers

while true do
if playernum.Value > 0 then
local date ="!*t")
local Data = {['content'] = tostring(playernum.Value).."players has been teleported to NASCAR '18 from ".. game.PlaceId .. " at "":" .. " on " .. date.month.."/""/"}
		Data = http:JSONEncode(Data)
			http:PostAsync(url, Data)
playernum.Value = 0

Think that should keep me from hitting the limit.


Yeah the multitude of requests is what exceeded the limit.


But do you know what the multitude of requests is? Like I just made a bug logger through the proxy and it got banned with 15 minutes for what seemed like much less things being posted.



That link explains a rate limit. It doesn’t say what the limit is though.


Rate limits are applied on a per-route basis (meaning they can be different for each route called), with the exception of an additional global rate limit spanning across the entire API.

However from looking around on the Discordapp GitHub I found this:

  1. A global 50/10 rate limit (meaning, this is the maximum # of messages a bot can send currently across all of discord every 10 seconds.)
  2. A 5/5 per server rate limit. (meaning you can carry out 5 actions per every 5 seconds)
  3. A 5/5 global DM rate limit (meaning you can carry out 5 DM actions per every 5 seconds)

The rate limit applies to message creation and editing.

So in this case if you are sending more than 5 messages per 5 seconds I would think about slowing down that rate of sending by using a different approach to whatever you are doing.


I sent 8 across 4 minutes and it banned my webhook. Not to mention, it banned my webhook like 20 minutes after it stopped posting stuff. Idk dood.


I would suggest monitoring your requests being sent in ROBLOX, maybe add a print every time one is sent, to ensure you aren’t sending a mass of them unintentionally. If this guarantees you are not sending too many, you need to contact Osyris, or if they are being blocked on Discord’s side, Discord support.


Idk. Kinda considering just trying to slam like 30 seconds of bugs into one post. That’d fix it right cuz I’d only be posting every 30 seconds?


I’m theory yes, may I ask what you are using the webhook for?


My game runs into extremely rare random bugs so as a bug logger.


If I’d like to run my own copy, how do I go about changing ‘’ to something like ‘