Discord Webhook
Use Discord Webhooks via direct curl calls to send messages to Discord channels without setting up a bot.
Official docs: https://discord.com/developers/docs/resources/webhook
When to Use
Use this skill when you need to:
Send notifications to Discord channels Post alerts from CI/CD pipelines Share updates with rich embeds Upload files to channels Simple integrations without bot complexity Prerequisites In Discord, go to Server Settings → Integrations → Webhooks Click "New Webhook" Choose a name and target channel Click "Copy Webhook URL" export DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/1234567890/abcdefg..."
Security: Never expose webhook URLs publicly - they require no authentication.
Important: When using $VAR in a command that pipes to another command, wrap the command containing $VAR in bash -c '...'. Due to a Claude Code bug, environment variables are silently cleared when pipes are used directly.
bash -c 'curl -s "https://api.example.com" -H "Authorization: Bearer $API_KEY"'
How to Use
All examples below assume you have DISCORD_WEBHOOK_URL set.
- Send Simple Message
Write to /tmp/discord_webhook_request.json:
{ "content": "Hello from webhook!" }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
- Send with Custom Username and Avatar
Write to /tmp/discord_webhook_request.json:
{ "content": "Alert!", "username": "Alert Bot", "avatar_url": "https://i.imgur.com/4M34hi2.png" }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
- Send Rich Embed
Write to /tmp/discord_webhook_request.json:
{ "embeds": [ { "title": "Deployment Complete", "description": "Version 1.2.3 deployed to production", "color": 5763719, "fields": [ { "name": "Environment", "value": "Production", "inline": true }, { "name": "Status", "value": "Success", "inline": true } ], "timestamp": "2025-01-01T12:00:00.000Z" } ] }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
Common colors (decimal):
Green: 5763719 Red: 15548997 Blue: 5793266 Yellow: 16776960 Orange: 16744192 4. Send Error Alert
Write to /tmp/discord_webhook_request.json:
{ "embeds": [ { "title": "Error Alert", "description": "Database connection failed", "color": 15548997, "fields": [ { "name": "Service", "value": "api-server" }, { "name": "Error", "value": "Connection timeout" } ], "footer": { "text": "Monitor" } } ] }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
- Send File Attachment
Write to /tmp/discord_webhook_payload.json:
{ "content": "Screenshot attached" }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -F "file1=@screenshot.png" -F 'payload_json=@/tmp/discord_webhook_payload.json'
- Send Multiple Files
Write to /tmp/discord_webhook_payload.json:
{ "content": "Log files attached" }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -F "file1=@error.log" -F "file2=@debug.log" -F 'payload_json=@/tmp/discord_webhook_payload.json'
- Send Multiple Embeds
Write to /tmp/discord_webhook_request.json:
{ "embeds": [ { "title": "Build Started", "color": 16776960 }, { "title": "Tests Passed", "color": 5763719 }, { "title": "Deployed", "color": 5793266 } ] }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
- Send with Mention
Write to /tmp/discord_webhook_request.json:
{
"content": "<@
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
Replace
- Send Silent Message (No Notification)
Write to /tmp/discord_webhook_request.json:
{ "content": "Silent update", "flags": 4096 }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
- CI/CD Pipeline Notification
Write to /tmp/discord_webhook_request.json:
{ "username": "GitHub Actions", "embeds": [ { "title": "Pipeline Status", "color": 5763719, "fields": [ { "name": "Repository", "value": "myorg/myrepo", "inline": true }, { "name": "Branch", "value": "main", "inline": true }, { "name": "Commit", "value": "abc1234", "inline": true }, { "name": "Status", "value": "Success" } ], "timestamp": "2025-01-01T12:00:00.000Z" } ] }
Then run:
curl -s -X POST "${DISCORD_WEBHOOK_URL}" -H "Content-Type: application/json" -d @/tmp/discord_webhook_request.json
Embed Structure { "title": "Title text", "description": "Description text", "url": "https://example.com", "color": 5763719, "fields": [ {"name": "Field 1", "value": "Value 1", "inline": true} ], "author": {"name": "Author", "icon_url": "https://..."}, "footer": {"text": "Footer text"}, "thumbnail": {"url": "https://..."}, "image": {"url": "https://..."}, "timestamp": "2025-01-01T12:00:00.000Z" }
Guidelines Rate limits: 30 requests per 60 seconds per webhook Message limit: 2000 characters for content Embed limits: Max 10 embeds, 6000 total characters File limits: Max 8MB per file (50MB with Nitro boost) Security: Treat webhook URLs like passwords