WebhookProxy online

WebhookProxy

A Discord webhook proxy, primarily for Roblox games.

DevForum
unique webhooks served
requests proxied

Why use WebhookProxy?

Discord blocked Roblox from posting to webhooks directly. This works around that.

Easy to integrate

Swap discord.com for webhook.zoeycochrane.com in your webhook URL when sending. That's it.

Tried and tested

Proudly served some amount of unique webhooks and a lot of requests.

Kept up

The proxy stays online even if Discord brings webhooks back for Roblox. Your code will not break on a whim.

Complies with ToS

Built to comply with the Discord terms of service by enforcing ratelimits itself and adding other anti-abuse measures. Discord staff have previously stated this sort of thing is okay.

Optional ratelimit handling

Using POST /api/webhooks/:id/:token/queue you can stop writing ratelimit code by hand. With a generous soft ratelimit of 10/1s, your messages are guaranteed to send even if you exceed Discord's ratelimit.

Please respect Discord ratelimits

If you do not respect ratelimits your webhooks will be slowed down (which can cause long yield times) or blocked completely. The limit is 5 requests per 2 seconds.

Ratelimits are enforced by the proxy itself so it won't spam Discord, but that is not an excuse to spam the proxy. Respect ratelimits in your code.

Invalid data (anything Discord would answer with a 400) triggers a harsher ratelimit. Validate your data before sending.

Getting started

You're probably starting with some code like this:

local httpService = game:GetService("HttpService")

httpService:PostAsync("https://discord.com/api/webhooks/{WEBHOOK_ID}/{WEBHOOK_TOKEN}",
	httpService:JSONEncode({
		content = "Hello, world!"
	})
)

Converting it is simple. Swap discord.com for webhook.zoeycochrane.com.

local httpService = game:GetService("HttpService")

httpService:PostAsync("https://webhook.zoeycochrane.com/api/webhooks/{WEBHOOK_ID}/{WEBHOOK_TOKEN}",
	httpService:JSONEncode({
		content = "Hello, world!"
	})
)

And in no time at all, your webhooks are working again.

If you're sending many requests a second, consider switching to the queue system:

local httpService = game:GetService("HttpService")

httpService:PostAsync("https://webhook.zoeycochrane.com/api/webhooks/{WEBHOOK_ID}/{WEBHOOK_TOKEN}/queue",
	httpService:JSONEncode({
		content = "Hello, world!"
	})
)

This makes sure all of your messages reach Discord eventually, no matter what.