Watchdog API

Slot क्षमता, नामित प्राप्तकर्ता, अलर्ट और साइन किए गए Webhooks।

अंतिम अपडेट: 30 सित॰ 2026

पहले क्षमता खरीदें, फिर Watches बनाएँ

वर्तमान उत्पादों, Watch प्रकारों, सिग्नलों, डिफ़ॉल्ट मानों और छूटों के लिए GET /api/x402/pricing और सब्सक्रिप्शन quote एंडपॉइंट का उपयोग करें। भुगतान वाले प्रकार अपनी उत्पाद क्षमता का उपभोग करते हैं; निःशुल्क प्रकारों की प्रति-वॉलेट सीमाएँ हैं। रोकी गई (paused) Watches भी गिनी जाती हैं। spend से खरीदें; write से Watches बनाएँ या बदलें। Watch बनाना सब्सक्रिप्शन खरीद नहीं है।

curl 'https://ftso.app/api/x402/subscriptions/quote?product=watchdog-slot&quantity=5&periods=12' \
  -H 'authorization: Bearer fbx_READ_TOKEN'
curl -X POST 'https://ftso.app/api/x402/subscriptions' \
  -H 'authorization: Bearer fbx_SPEND_TOKEN' \
  -H 'content-type: application/json' \
  -H 'Idempotency-Key: purchase_20260930_001' \
  -d '{"product":"watchdog-slot","quantity":5,"periods":12,"autoRenew":true}'

Auto-Renew खरीदी गई मात्रा और अवधि को वर्तमान कीमत पर दोहराता है। इसे चालू करने के लिए spend चाहिए; बंद करने के लिए write। खरीद से पहले मौजूदा शर्तों की स्वीकृति आवश्यक हो सकती है। पात्रता के अधीन एक बार का ट्रायल POST /api/x402/subscriptions/trial के माध्यम से उपलब्ध है।

Watch बनाएँ और संपादित करें

curl -X POST 'https://ftso.app/api/x402/watches' \
  -H 'authorization: Bearer fbx_WRITE_TOKEN' \
  -H 'content-type: application/json' \
  -H 'Idempotency-Key: watch_20260930_001' \
  -d '{"type":"feed-move","label":"FLR swing",
       "config":{"chainId":14,"symbol":"FLR","percent":2.5,"windowMinutes":60},
       "signals":{"price-move":{"enabled":true}}}'

curl -X PATCH 'https://ftso.app/api/x402/watches/7' \
  -H 'authorization: Bearer fbx_WRITE_TOKEN' -H 'content-type: application/json' \
  -d '{"action":"pause"}'

PATCH config, signals, routing, label, cooldownSeconds, messageTemplate, webhookUrl, rotateSecret और pause/resume क्रियाओं का समर्थन करता है। Config परिवर्तन मॉनिटरिंग स्थिति को रीसेट करते हैं। Signal overrides फ़ील्ड-दर-फ़ील्ड मर्ज होते हैं; null एक override को रीसेट करता है। signalsMode: replace overrides को बदल देता है, जबकि डिफ़ॉल्ट merge के साथ खाली signals ऑब्जेक्ट कुछ नहीं करता। Secret rotation और प्रारंभिक Webhook सेटअप एक secret प्रकट करते हैं: इसे सुरक्षित रूप से संग्रहीत करें। 24-घंटे की idempotency अवधि के दौरान उसी key का replay इसे पुनः प्राप्त कर सकता है।

प्राप्तकर्ता और रूटिंग

नामित प्राप्तकर्ता कई Watches में पुनः उपयोग किए जा सकते हैं। मशीन क्लाइंट इनपुट चैनल बना सकते हैं; लिंक किए गए चैनल अपने स्वयं के सत्यापन और अनुमति नियमों का पालन करते हैं। Discord लिंकिंग केवल सेशन-आधारित रहती है। लंबित प्राप्तकर्ता अलर्ट या परीक्षण प्राप्त नहीं कर सकते। पुराने (legacy) चैनल एंडपॉइंट अपने प्रकार के सबसे पुराने प्राप्तकर्ता को संबोधित करते हैं; सटीक नियंत्रण के लिए प्राप्तकर्ता IDs को प्राथमिकता दें। Webhook URLs पढ़ने पर मास्क किए जाते हैं: target छोड़ देने से वह बना रहता है, जानबूझकर खाली/null हटाने से वह मिट जाता है। प्रदर्शन मास्क को नए URL के रूप में वापस न लिखें।

curl -X POST 'https://ftso.app/api/x402/recipients' \
  -H 'authorization: Bearer fbx_WRITE_TOKEN' -H 'content-type: application/json' \
  -d '{"name":"Ops","type":"webhook","target":{"url":"https://example.com/hooks/ftsobest"}}'
# Use the returned recipient id in routing.
curl -X PATCH 'https://ftso.app/api/x402/watches/7' \
  -H 'authorization: Bearer fbx_WRITE_TOKEN' -H 'content-type: application/json' \
  -d '{"routing":{"default":["inapp",12],"groups":{"alerts":[12]}}}'

एक signal group route Watch डिफ़ॉल्ट को ओवरराइड करता है; डिफ़ॉल्ट प्राप्तकर्ता fallback हैं। खाता/सिस्टम इवेंट हमेशा घंटी (bell) और स्पष्ट रूप से डिफ़ॉल्ट प्राप्तकर्ताओं तक पहुँचते हैं। Signal-अलार्म की घंटी डिलीवरी बंद की जा सकती है। शांत घंटे (quiet hours) व्यक्तिगत चैनलों को रोकते हैं; समूह, Webhooks और घंटी डिलीवर करते रहते हैं। Watch cooldown उसी इवेंट की पुनरावृत्ति को दबाता है, किसी भिन्न इवेंट या उसकी recovery को नहीं।

संदेश पूर्वावलोकन और शांत घंटे

curl -X PUT 'https://ftso.app/api/x402/settings' \
  -H 'authorization: Bearer fbx_WRITE_TOKEN' -H 'content-type: application/json' \
  -d '{"quietHours":{"start":"22:00","end":"07:00","timezone":"Europe/Berlin"},"notificationLocale":"de"}'
curl -X POST 'https://ftso.app/api/x402/message-preview' \
  -H 'authorization: Bearer fbx_READ_TOKEN' -H 'content-type: application/json' \
  -d '{"watchId":7,"notificationLocale":"de","scope":"wallet","messageTemplate":null}'

टेम्पलेट में title, body और appendDetails होते हैं। Watch टेम्पलेट वॉलेट टेम्पलेट को ओवरराइड करते हैं; null डिफ़ॉल्ट पुनर्स्थापित करता है। Placeholders शाब्दिक प्रतिस्थापन हैं, कभी भी निष्पादन योग्य markup नहीं। अनुमत placeholders: {watch}, {type}, {title}, {severity}, {emoji}, {network}, {identity}, {round}, {epoch}, {details}, {time}, {link}। पूर्वावलोकन कोई संदेश डिलीवर नहीं करता।

अलर्ट इतिहास

curl 'https://ftso.app/api/x402/alerts?page=0&pageSize=20&watchId=7&severity=warning&delivery=failed&sort=time&direction=desc' \
  -H 'authorization: Bearer fbx_READ_TOKEN'
curl 'https://ftso.app/api/x402/alerts/export?watchId=7' \
  -H 'authorization: Bearer fbx_READ_TOKEN'

इतिहास शून्य-आधारित पेज का उपयोग करता है, pageSize अधिकतम 100। Export वही फ़िल्टर उपयोग करता है और अधिकतम 5,000 CSV पंक्तियाँ लौटाता है। Watch और खाता सूचियाँ इसके बजाय limit/cursor उपयोग करती हैं। अन्य वॉलेट की Watch या अलर्ट IDs पर 404 मिलता है। Watch हटाने से उसका अलर्ट इतिहास नहीं मिटता। अलर्ट हटाना एक स्पष्ट write ऑपरेशन है; selection और maxId इच्छित इतिहास विंडो की रक्षा करते हैं।

Webhook payload और सत्यापन

Payload v2 v1 रूप में payloadVersion: 2, signal और group जोड़ता है। रेंडर किया गया टेक्स्ट स्थानीयकृत होने पर भी तकनीकी फ़ील्ड अपरिवर्तित रखें। v2 स्कीमा पढ़ें और अतिरिक्त इवेंट डेटा फ़ील्ड स्वीकार करें। deliveryId के आधार पर डुप्लिकेट हटाएँ। नीचे दी गई जनरेट की गई इवेंट सूची कैटलॉग किए गए signal और recovery इवेंट को कवर करती है; खाता संदेश और चैनल परीक्षण अलग सिस्टम इवेंट हैं।

यह संक्षिप्त v2 उदाहरण envelope दिखाता है; data में प्रकार-विशिष्ट तथ्य होते हैं। v1 स्कीमा तीन v2 परिवर्धनों के बिना वही मूल delivery, alert, watch, event, severity, firedAt और data फ़ील्ड उपयोग करता है। rendered और renderedMessage स्थानीयकृत प्रदर्शन टेक्स्ट दे सकते हैं; डुप्लिकेट हटाने के लिए deliveryId रखें।

{
  "payloadVersion": 2,
  "deliveryId": "unique-delivery-id",
  "alertId": 41,
  "watchId": 7,
  "label": "FLR swing",
  "type": "feed-move",
  "event": "feed-move.threshold",
  "signal": "price-move",
  "group": "alerts",
  "severity": "warning",
  "firedAt": "2026-09-30T12:00:00.000Z",
  "data": {}
}
import { createHmac, timingSafeEqual } from "node:crypto";

// rawBody is the exact request body Buffer, not parsed/re-serialized JSON.
const timestamp = req.headers["x-watchdog-timestamp"];
const signature = req.headers["x-watchdog-signature"];
if (
  typeof timestamp !== "string" ||
  !/^\d+$/.test(timestamp) ||
  typeof signature !== "string" ||
  Math.abs(Date.now() / 1000 - Number(timestamp)) > 300
)
  throw new Error("invalid");
const expected = Buffer.from(
  "sha256=" +
    createHmac("sha256", secret)
      .update(timestamp + ".")
      .update(rawBody)
      .digest("hex"),
);
const received = Buffer.from(signature);
if (received.length !== expected.length || !timingSafeEqual(expected, received))
  throw new Error("invalid");

सत्यापन X-Watchdog-Signature और X-Watchdog-Timestamp का उपयोग करता है; payload अनुबंध के लिए X-Watchdog-Payload-Version देखें। सिग्नेचर और ताज़गी (freshness) सत्यापित करने के बाद ही प्रतिक्रिया दें। डुप्लिकेट delivery IDs को प्रभाव दोहराए बिना स्वीकार करें। व्यापक वर्कफ़्लो के लिए Watchdog उपयोगकर्ता दस्तावेज़ीकरण देखें।

Webhook इवेंट

  • credits.low-balance
  • credits.recovered
  • feed-move.threshold
  • fsp.balance-low
  • fsp.balance-low.recovered
  • fsp.fast-updates
  • fsp.fast-updates.recovered
  • fsp.fdc-bitvote
  • fsp.fdc-bitvote-length
  • fsp.fdc-bitvote-length.recovered
  • fsp.fdc-bitvote.recovered
  • fsp.fdc-consensus
  • fsp.fdc-consensus.recovered
  • fsp.fdc-reveal-offence
  • fsp.fdc-reveal-offence.recovered
  • fsp.fdc-signature
  • fsp.fdc-signature.recovered
  • fsp.fdc-submit1
  • fsp.fdc-submit1.recovered
  • fsp.ftso-commit
  • fsp.ftso-commit.recovered
  • fsp.ftso-reveal
  • fsp.ftso-reveal.recovered
  • fsp.ftso-signature
  • fsp.ftso-signature.recovered
  • fsp.mc-anchor
  • fsp.mc-anchor.recovered
  • fsp.mc-fdc
  • fsp.mc-fdc.recovered
  • fsp.mc-uptime
  • fsp.mc-uptime.recovered
  • fsp.monitoring
  • fsp.monitoring.recovered
  • fsp.not-in-policy
  • fsp.not-in-policy.recovered
  • fsp.registration
  • fsp.registration.recovered
  • fsp.reveal-offence
  • fsp.reveal-offence.recovered
  • fsp.rewards-unclaimed
  • fsp.rewards-unclaimed.recovered
  • fsp.signature-grace
  • fsp.signature-grace.recovered
  • fsp.signature-mismatch
  • fsp.signature-mismatch.recovered
  • fsp.tx-failed
  • fsp.tx-failed.recovered
  • fsp.validator-not-listed
  • fsp.validator-not-listed.recovered
  • provider.eligibility-lost
  • provider.recovered
  • provider.unregistered
  • signing.done
  • signing.missed
  • signing.rewards-open
  • signing.rewards-reminder
  • signing.uptime-open
  • wallet-balance.moved