Skip to main content
Instead of asking the API what changed every few seconds, the server can send events to a URL of yours. The server owner sets this up in the console under API → Webhook. There are two kinds of webhook URL:
  • A Discord webhook link. Events arrive as tidy embeds. You don’t need to write any code.
  • Your own HTTPS endpoint. Events arrive as signed JSON.

Events

The owner picks which events to send. Each webhook gets the ones it’s subscribed to.

Payload

Events are batched. One request can carry up to 50, oldest first.
id goes up by one for each event on a server. Use it to drop duplicates. It’s the same id you see in the events feed.

Event data

A player is { "id": <user ID>, "name": "<username>" }.

Verify the signature

When the owner saves a non-Discord webhook, the console shows a signing secret (whsec_...) once. Each request is signed with it:
Check it against the raw body before you parse anything, and refuse requests older than 5 minutes.
Discord webhooks aren’t signed: Discord checks its own link.

Delivery

  • Reply with any 2xx within 5 seconds. Do the slow work after replying.
  • A failed delivery is retried after about 5 seconds, 30 seconds, 2 minutes, then 10 minutes, then dropped. A 4xx reply other than 408 or 429 isn’t retried.
  • Redirects aren’t followed.
  • After 25 failures in a row the webhook is paused, so a dead endpoint isn’t hammered. The console shows it as paused. Saving the webhook again turns it back on.
  • Events usually reach you within 3 to 10 seconds. They come in batches with each sync, not one request per event.
  • If more than 200 batches are waiting, the oldest are dropped. The events feed still has everything from the last 7 days.

Rules for the URL

  • Must be https:// on port 443, with no username or password in it.
  • No IP addresses, localhost or internal hostnames, and no eraus.gg addresses.
  • One webhook per server. Saving a new one replaces it. The URL is never shown back in the console, only its host name.