TradingView to Discord webhook JSON
Discord posts a webhook only when the body is JSON with content or embeds, so one unquoted placeholder stops the alert. Build the message, check it as you type, and see the text Discord will post.
Updated 23 October 2026. Runs in your browser; nothing you type is uploaded.
Send to
Alert from
Placeholders for any alert
Strategy alerts only
Text placeholders go in quotes; a placeholder added outside a string comes with them.
Discord, strategy alert
Valid JSON: TradingView sends it as application/json
Nothing to fix. This is the Discord preset for a strategy.
What Discord receives
Content-Type: application/json, with sample values in place of the placeholders.
{
"username": "TradingView alerts",
"content": "NQ1!: buy 2 at 18342.25, now long"
}Where it goes
- Webhook URL
https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKENCopy the webhook URL Discord gives you for the channel.- The secret
- In the URL: its last part is the webhook's token, and anyone holding the URL can post to the channel.
- A message needs at least one of content or embeds; content takes up to 2,000 characters and embeds up to 10.
- Discord wants a JSON, form or multipart Content-Type and answers anything else with error 50035, Invalid form body; so a message that is not valid JSON, which TradingView sends as text/plain, does not post.
From Discord's docs, read 23 October 2026: execute webhook, Content-Type rules.
Or build it in Pine, so the JSON is never inside other JSON
In the alert: Order fills only, and nothing but {{strategy.order.alert_message}} in the Message box. Each order passes the whole message as alert_message, with its own buy or sell.
//@version=6
strategy("Webhook message", overlay = true)
// Your own rules go here; this example crosses two averages.
fast = ta.sma(close, 10)
slow = ta.sma(close, 30)
qty = 1
// The whole message, built here. In the alert: Order fills only, and nothing but
// {{strategy.order.alert_message}} in the Message box.
webhookMessage(string action, string id, string position) =>
string m = '{'
m += '"username": "TradingView alerts",'
m += '"content": "' + syminfo.ticker + ': ' + action + ' ' + str.tostring(qty) + ' at ' + str.tostring(close) + ', now ' + position + '"'
m += '}'
m
if ta.crossover(fast, slow)
strategy.entry("Long", strategy.long, qty, alert_message = webhookMessage("buy", "Long", "long"))
if ta.crossunder(fast, slow)
strategy.entry("Short", strategy.short, qty, alert_message = webhookMessage("sell", "Short", "short"))
The code for every preset compiles on TradingView with no errors or warnings. Put your own entry rules in place of the two averages, then check the script for repaint risks.
What Discord reads
- Format
- JSON; it needs at least one of "content", "embeds".
- Webhook URL
https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKENCopy the webhook URL Discord gives you for the channel.- The secret
- In the URL: its last part is the webhook's token, and anyone holding the URL can post to the channel.
- A message needs at least one of content or embeds; content takes up to 2,000 characters and embeds up to 10.
- Discord wants a JSON, form or multipart Content-Type and answers anything else with error 50035, Invalid form body; so a message that is not valid JSON, which TradingView sends as text/plain, does not post.
The two starting messages
{
"username": "TradingView alerts",
"content": "{{ticker}}: {{strategy.order.action}} {{strategy.order.contracts}} at {{strategy.order.price}}, now {{strategy.market_position}}"
}{
"username": "TradingView alerts",
"content": "{{ticker}} closed at {{close}} on the {{interval}} chart ({{timenow}})"
}From Discord's own docs, read 23 October 2026: execute webhook, Content-Type rules.
TradingView's side of a webhook
- Plan and 2FA
- Webhook notifications are on Essential, Plus, Premium, Ultimate, not on the free Basic plan (pricing table), and webhook alerts are allowed only with two-factor authentication turned on.
- Content-Type
- application/json when the message is valid JSON, text/plain otherwise. TradingView sends a POST with the message as the body.
- IP addresses to allowlist
52.89.214.238,34.212.75.30,54.218.53.128,52.32.178.7. Over HTTPS TradingView also sends a client certificate for webhook-server@tradingview.com (webhook authentication).- Ports, IPv6 and time
- Ports 80 and 443 only; no IPv6; no localhost or private addresses. A request your server takes more than three seconds to answer is cancelled, and a 500 to 599 answer other than 504 is sent again after 5 seconds, up to 3 times (resubmission).
- Message length
- 4,000 characters in the alert's Message box; 40,960 from alert() or alert_message. The body has the same limits, and an emoji counts as several characters (size limits).
- Secrets
- TradingView asks you not to put login credentials or passwords in the webhook URL or message (credentials for webhooks).
From TradingView's How to configure webhook alerts and the pages linked above, read 23 October 2026.
Other receivers
- TradingView to TradersPost webhook JSON JSON with ticker and action; the password is in the webhook URL.
- TradingView to PineConnector alert message Comma-separated text, not JSON; the License ID leads the message.
- TradingView to CrossTrade webhook JSON Flat JSON or key=value; text; the Secret Key goes in the message.
- TradingView to 3Commas Signal Bot JSON v2 Signal Bot JSON; the v1 secret and bot_uuid format is retired.
- TradingView to Telegram webhook JSON JSON with chat_id and text; the bot token is in the URL.
- Custom JSON for your own server and TradingView's placeholders in full.
Common questions
What JSON does a Discord webhook need?
At least one of content, embeds, components, file or poll. content takes up to 2,000 characters and embeds is an array of up to 10. The shortest useful message is {"content": "{{ticker}} closed at {{close}}"}.
Why does my TradingView alert not post to Discord?
Most often the message is not valid JSON, so TradingView sends it as text/plain, and Discord's API answers a Content-Type other than JSON, form or multipart with error 50035, Invalid form body. A text placeholder outside quotes, a curly quote or a trailing comma is enough.
Is a Discord webhook URL secret?
Yes. Its last part is the webhook's token, and a Discord webhook needs no other authentication, so anyone holding the URL can post to the channel.
Alerts that already send the message
- Signal Desk Premium A Pine v6 desk whose alerts write the message for you, as ticket text, JSON, TradersPost or PineConnector, with a Discord and Telegram relay. $49 once.
- Pine Fixer An AI skill pack for 45 compiler-verified Pine v6 failure classes, with a repaint clinic. $9.99 once.