Skip to content

Event catalogue

Subscribe a webhook endpoint to one or more of these events on the Webhooks dashboard. The payload shape under data is documented per event below; the outer envelope (id, type, created_at, guild_id, livemode) is the same for every event — see Webhooks.

Moderation

case.created

A moderation case (warn, kick, ban, timeout, mute, note) was opened.

json
{
  "case_id": 12345,
  "case_number": 87,
  "type": "warn",
  "user_id": "234567890123456789",
  "moderator_id": "345678901234567890",
  "reason": "Posting referral spam",
  "source": "dashboard"
}

source is one of dashboard, api, bot, sync (cross-server replicator).

case.updated

A case was edited (notes added, expiry changed, reason updated).

case.deleted

A case was deleted.

case.appealed

A user submitted an appeal via the public appeal portal.

json
{
  "case_id": 12345,
  "appeal_id": 9876,
  "user_id": "234567890123456789",
  "message": "I'm really sorry, can you give me another chance…"
}

case.appeal_decided

Staff approved or denied an appeal.

Member lifecycle

member.joined

A member joined the guild.

json
{
  "user_id": "234567890123456789",
  "username": "alice",
  "account_age_days": 712,
  "is_bot": false,
  "invite_code": "abc123"
}

member.left

A member left or was kicked.

member.banned

A member was banned. Fired in addition to case.created when the ban was actioned by Phantom; fired alone when an out-of-band native Discord ban was detected by audit log.

member.unbanned

A ban was lifted.

Tickets

ticket.opened

A new ticket was opened.

json
{
  "ticket_id": 4242,
  "number": 318,
  "opener_id": "234567890123456789",
  "ticket_type_id": 5,
  "subject": "Refund request",
  "channel_id": "456…"
}

ticket.message

A new message was added to a ticket (either by the opener or by staff).

ticket.claimed

A staff member claimed a ticket.

ticket.closed

A ticket was closed.

json
{
  "ticket_id": 4242,
  "closed_by_id": "345678901234567890",
  "close_reason": "Refund processed via Stripe",
  "close_source": "staff_command",
  "duration_seconds": 1843
}

ticket.reopened

A closed ticket was reopened.

Levelling

xp.level_up

A member crossed a level boundary.

json
{
  "user_id": "234567890123456789",
  "old_level": 9,
  "new_level": 10,
  "total_xp": 6850
}

Economy

economy.balance_changed

A wallet balance changed. Fires for every delta — message earnings, daily claims, transfers, admin adjustments, casino bets/payouts.

json
{
  "user_id": "234567890123456789",
  "delta": 500,
  "balance": 12300,
  "reason": "Tournament prize",
  "source": "api"
}

source: message_earn | voice_earn | daily | transfer | casino | admin | api.

Engagement

giveaway.created

A giveaway was scheduled.

giveaway.ended

A giveaway ended and winners were drawn.

json
{
  "giveaway_id": 1234,
  "winner_ids": ["234…", "345…", "456…"],
  "entry_count": 482
}

giveaway.rerolled

A giveaway was rerolled (winners re-drawn).

Security

security.raid_detected

The anti-raid module flagged a coordinated join event.

json
{
  "raid_id": 88,
  "joins_in_window": 23,
  "window_seconds": 30,
  "action_taken": "quarantine"
}

security.scam_detected

The anti-scam vision scan flagged a message as a phishing image.

security.nuke_detected

The anti-nuke module flagged a mass-destruction event.

security.audit_entry

A security audit entry was recorded (permission changes, settings changes, security-sensitive admin actions).

network.hit

A Phantom Network hit fired against a member who joined or is already in your guild.

json
{
  "user_id": "234567890123456789",
  "trust_score": 12,
  "approved_report_count": 7,
  "top_category": "scams",
  "top_severity": "high",
  "summary": "Repeated nitro scam DMs across 5 servers."
}

Automod

automod.triggered

An automod rule matched a message.

json
{
  "rule_id": 18,
  "category": "links",
  "user_id": "234567890123456789",
  "channel_id": "456…",
  "message_id": "789…",
  "action_taken": "delete_and_warn"
}

Testing

test.ping

Fired by the Send test event button on the dashboard. Useful for confirming your receiver is wired up before any real event happens.

json
{
  "message": "Test event from the Phantom dashboard.",
  "sent_by_user_id": "345678901234567890",
  "sent_at": "2026-05-24T11:32:18+00:00"
}

Phantom is a product of Hydra Labs. The bot is run as a managed service; you do not need to host it yourself.