Watchdog API
Slot ক্যাপাসিটি, নামযুক্ত recipient, alert এবং সাইন করা Webhook।
সর্বশেষ আপডেট: ৩০ সেপ, ২০২৬বর্তমান প্রোডাক্ট, watch type, signal, default এবং ছাড়ের জন্য GET /api/x402/pricing এবং সাবস্ক্রিপশন quote endpoint ব্যবহার করুন। পেইড type নিজস্ব প্রোডাক্ট ক্যাপাসিটি ব্যবহার করে; free type-এর প্রতি-ওয়ালেট সীমা আছে। বিরতিতে থাকা watch-ও গণনা হয়। spend দিয়ে কিনুন; write দিয়ে watch তৈরি বা পরিবর্তন করুন। 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 লাগে। ক্রয়ের আগে বিদ্যমান terms গ্রহণ প্রয়োজন হতে পারে। POST /api/x402/subscriptions/trial-এর মাধ্যমে একটি এককালীন trial উপলব্ধ, যোগ্যতা সাপেক্ষে।
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 action। Config পরিবর্তন monitoring state রিসেট করে। Signal override field-by-field merge হয়; null একটি override রিসেট করে। signalsMode: replace override-গুলো প্রতিস্থাপন করে, আর default merge সহ একটি খালি signals object কিছুই করে না। Secret rotation এবং প্রাথমিক Webhook সেটআপ একটি secret প্রকাশ করে: এটি নিরাপদে সংরক্ষণ করুন। 24-ঘণ্টার idempotency retention-এর মধ্যে একই-key replay এটি পুনরুদ্ধার করতে পারে।
নামযুক্ত recipient একাধিক watch-এ পুনর্ব্যবহার করা যায়। Input channel মেশিন ক্লায়েন্ট তৈরি করতে পারে; linked channel তাদের নিজস্ব যাচাই এবং permission নিয়ম অনুসরণ করে। Discord linking শুধু session-এর মাধ্যমেই সম্ভব। Pending recipient alert বা টেস্ট গ্রহণ করতে পারে না। Legacy channel endpoint তাদের type-এর সবচেয়ে পুরোনো recipient-কে সম্বোধন করে; সুনির্দিষ্ট নিয়ন্ত্রণের জন্য recipient ID ব্যবহার করুন। পড়ার সময় Webhook URL মাস্ক করা থাকে: target বাদ দিলে তা সংরক্ষিত থাকে, ইচ্ছাকৃত empty/null অপসারণ এটি মুছে দেয়। একটি display mask নতুন 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-এর default-কে override করে; default recipient হলো fallback। Account/system event সবসময় bell এবং সুস্পষ্টভাবে default recipient-দের কাছে পৌঁছায়। Signal-alarm-এর bell delivery নিষ্ক্রিয় করা যায়। Quiet hours ব্যক্তিগত channel আটকে রাখে; group, Webhook এবং bell delivery চালিয়ে যায়। একটি watch cooldown একই event-এর পুনরাবৃত্তি দমন করে, ভিন্ন event বা তার 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}'Template-এ title, body এবং appendDetails থাকে। Watch template ওয়ালেট template-কে override করে; null default পুনরুদ্ধার করে। Placeholder আক্ষরিক প্রতিস্থাপন, কখনো executable markup নয়। অনুমোদিত placeholder: {watch}, {type}, {title}, {severity}, {emoji}, {network}, {identity}, {round}, {epoch}, {details}, {time}, {link}। Preview কোনো বার্তা পাঠায় না।
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'History শূন্য-ভিত্তিক page ব্যবহার করে, pageSize সর্বোচ্চ 100। Export একই filter ব্যবহার করে এবং সর্বোচ্চ 5,000টি CSV সারি ফেরত দেয়। Watch এবং account তালিকা এর বদলে limit/cursor ব্যবহার করে। অন্যের watch বা alert ID-র জন্য 404 ফেরত আসে। Watch মুছলে তার alert history মুছে যায় না। Alert মুছে ফেলা একটি সুস্পষ্ট write অপারেশন; selection এবং maxId উদ্দিষ্ট history window রক্ষা করে।
Payload v2 v1 আকৃতিতে payloadVersion: 2, signal এবং group যোগ করে। রেন্ডার করা টেক্সট localized হলেও technical field অপরিবর্তিত রাখুন। v2 schema পড়ুন এবং অতিরিক্ত event data field গ্রহণ করুন। deliveryId দিয়ে deduplicate করুন। নিচের generated event তালিকা ক্যাটালগভুক্ত signal এবং recovery event কভার করে; account বার্তা এবং channel টেস্ট আলাদা system event।
এই সংক্ষিপ্ত v2 উদাহরণ envelope দেখায়; data-তে type-নির্দিষ্ট তথ্য থাকে। v1 schema তিনটি v2 সংযোজন ছাড়া একই core delivery, alert, watch, event, severity, firedAt এবং data field ব্যবহার করে। rendered এবং renderedMessage localized display text দিতে পারে; deduplication-এর জন্য 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 contract-এর জন্য X-Watchdog-Payload-Version পরীক্ষা করুন। Signature এবং freshness যাচাই করার পরেই রেসপন্স দিন। ডুপ্লিকেট delivery ID-কে প্রভাব পুনরাবৃত্তি না করে acknowledge করুন। বৃহত্তর workflow-এর জন্য দেখুন Watchdog ব্যবহারকারী ডকুমেন্টেশন।
- 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