Webhooks reference

Receive Tradient alert events as JSON POSTs to a URL you control — for Slack, Discord, Zapier, or your own bot.

6 min readwebhooksintegrationsapi

Email is the default delivery channel for alerts, but Tradient also supports webhooks. Configure a URL on your alert and Tradient will POST a JSON payload to that URL every time the alert fires. This is how you wire Tradient into Slack, Discord, Zapier, or any custom bot or dashboard.

Configuring a webhook

  1. Open the alert in Alerts settings.
  2. Set delivery channel to Webhook.
  3. Paste your URL.
  4. (Optional) Set a shared secret for signature verification.
  5. Click “Send test” to verify reachability.
  6. Save.

From this point on, every alert firing generates a POST to your URL.

The payload

POST /your-webhook-url
Content-Type: application/json
X-Tradient-Signature: sha256=<hmac of body with your shared secret>

{
  "event": "alert.fired",
  "timestamp": "2026-04-07T14:32:11Z",
  "alert": {
    "id": "alt_4b8c...",
    "name": "SPY iron condors 70+ score",
    "frequency": "daily",
    "threshold_kind": "top_score_gte",
    "threshold_value": 70
  },
  "scan": {
    "id": "scn_91ee...",
    "name": "SPY iron condors 70+ score",
    "strategy": "iron_condor"
  },
  "trigger": {
    "result_count": 4,
    "previous_count": 2,
    "top_score": 73.4,
    "previous_top_score": 68.1
  },
  "top_results": [
    {
      "symbol": "SPY",
      "strategy": "iron_condor",
      "score": 73.4,
      "pop": 0.78,
      "credit": 0.92,
      "max_loss": 408,
      "expiration": "2026-05-15",
      "deep_link": "https://tradient.app/radar/scn_91ee..."
    }
  ]
}

Field reference

  • event — always “alert.fired” for now. Future event types will use the same envelope.
  • timestamp — ISO 8601 UTC of when the alert fired.
  • alert — the alert that triggered.
  • scan — the saved scan the alert is attached to.
  • trigger — the diff between the current snapshot and the previous one. Always populated.
  • top_results — up to 5 of the best-scoring results from the snapshot, with deep links back to Radar.

Signature verification

If you set a shared secret, Tradient signs the body with HMAC-SHA256 and includes the signature in the X-Tradient-Signature header. To verify on your side:

# Python
import hmac, hashlib
expected = "sha256=" + hmac.new(
    secret.encode(),
    request.body,
    hashlib.sha256
).hexdigest()
if not hmac.compare_digest(expected, request.headers["X-Tradient-Signature"]):
    abort(401)

Always verify on production endpoints. Anyone who knows your webhook URL could otherwise POST fake events to it.

Use HTTPS only
Tradient will refuse to send to plain http:// URLs in production. Webhook secrets are useless over HTTP because the body is readable in transit.

Retry behavior

  • On non-2xx responses or timeouts, Tradient retries up to 3 times with exponential backoff (10s, 60s, 300s).
  • After 3 failures, the alert is marked “delivery degraded” and you get an email notification. The alert remains active.
  • After 10 consecutive failures, the alert is auto-paused and you get a second email asking you to fix the URL.

Common integrations

Slack

Use a Slack incoming webhook URL. Slack expects a { "text": "..." }body, so you’ll need a small adapter (a Cloudflare Worker or AWS Lambda) to translate Tradient’s payload into Slack’s format. Or use Zapier as a no-code adapter.

Discord

Same story — Discord webhooks accept { "content": "..." } bodies. Use the same adapter pattern.

Custom bot

If you’re building your own automation, point Tradient directly at your bot’s ingest endpoint. The full result payload is in the body — you don’t need to re-fetch from Tradient.

Where to go next