Guides / Automation
Automation · about 15 min
Send decisions to your own system
Deliver a signed JSON payload to your order system, risk system or automation tool (Zapier, Make, n8n) whenever a rule fires.
- An https endpoint that accepts a JSON POST and is reachable from the internet.
- Admin role here (to add a connection).
Add a webhook connection
Settings → Connections → Webhook, name it
my-oms, paste your URL, optionally add headers (for exampleAuthorization), then Add connection. Copy the signing secret shown once and store it with your service.Describe the body you want
The
bodyis your JSON, with placeholders. A value that is only a placeholder keeps its type, so"{{drop5}}"arrives as a number.{ "model": "ora1", "state": { "symbol": "TSLA" }, "questions": { "up_week": { "type": "yes_no", "instructions": "Will the stock be higher in a week?" }, "drop5": { "type": "yes_no", "instructions": "Will it drop at least 5% at some point in the next month?" } }, "actions": [ { "id": "to_oms", "when": "drop5 >= 0.6", "do": "webhook", "connection": "my-oms", "body": { "symbol": "{{symbol}}", "signal": "reduce", "p_drawdown": "{{drop5}}", "p_up_week": "{{up_week}}", "as_of": "{{as_of}}" } } ], "dry_run": true }Open this in the PlaygroundPreview with a dry run
Run with Dry run ticked: the response shows the exact body that would be sent.
Verify the signature on your side
Every delivery has
X-Jev-Signature: t=<unix>,v1=<hex>, an HMAC-SHA256 of"<t>.<raw body>"with the signing secret, andX-Jev-Delivery(unique per delivery, use it to ignore duplicates).import hmac, hashlib, time def verify(secret: str, header: str, raw_body: bytes, tolerance=300) -> bool: parts = dict(p.split("=", 1) for p in header.split(",")) t = int(parts["t"]) if abs(time.time() - t) > tolerance: return False want = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest() return hmac.compare_digest(want, parts["v1"])Reply quickly
Return any 2xx within 5 seconds and do the work afterwards.
429and5xxare retried after 30 s, 2 min and 10 min; other 4xx are final. Each attempt is listed under Actions.Go live
Untick Dry run (or send
"dry_run": falsefrom code). For Microsoft Teams or Discord incoming webhooks, shape the body as they expect:{"text": "…"}or{"content": "…"}.