कॉन्टेंट पर जाएँ
दस्तावेज़ · वेबहुक

वेबहुक

किसी एनवायरनमेंट में जो कुछ होता है, Usher उसी समय आपके सर्वर को बता सकता है: कोई जुड़ता है, साइन इन करता है, अपनी जानकारी बदलता है या छोड़कर जाता है। हर इवेंट आपके चुने पते पर एक साइन किया हुआ POST होता है, और अगर आपका सर्वर जवाब न दे, तो उसे फिर से भेजा जाता है।

एंडपॉइंट जोड़ें

Usher Console में एनवायरनमेंट खोलें, फिर वेबहुक → नया एंडपॉइंट पर जाएँ। अपना एक https:// पता दें और चुनें कि उसे किन इवेंट की ख़बर मिलनी चाहिए। Console एंडपॉइंट का साइनिंग सीक्रेट (whsec_…) एक बार दिखाता है: इसे अपने सर्वर के बाक़ी सीक्रेट के साथ रखें।

इवेंटकब
user.createdकिसी ने खाता बनाया
user.updatedकोई खाता बदला: ईमेल, नाम, सत्यापन या बैन (आपके संगठन की डायरेक्टरी का SCIM से लगाया गया बैन भी)
user.deletedकोई खाता डिलीट किया गया
session.createdकिसी ने साइन इन किया
session.endedकोई सेशन ख़त्म हुआ: साइन आउट हुआ, रद्द हुआ या समय से पहले ख़त्म हो गया

टेस्ट भेजें उस एंडपॉइंट पर एक webhook.test इवेंट भेजता है, सिर्फ़ उसी पर, चाहे उसने किसी भी इवेंट को सब्सक्राइब किया हो।

क्या पहुँचता है

अनुरोध
POST /usher/webhooks HTTP/1.1
content-type: application/json
user-agent: Usher-Webhooks/1
webhook-id: msg_2fk7x…
webhook-timestamp: 1793643116
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=
बॉडी
{
  "type": "user.created",
  "timestamp": "2026-11-02T18:11:56.412Z",
  "data": {
    "user": {
      "id": "Qz3m…",
      "email": "lena@acme.com",
      "emailVerified": false,
      "name": "Lena Live",
      "image": null,
      "banned": false,
      "createdAt": "2026-11-02T18:11:56.380Z",
      "updatedAt": "2026-11-02T18:11:56.380Z"
    }
  }
}

इवेंट लोगों और सेशन के बारे में बताते हैं, सीक्रेट के बारे में कभी नहीं: न टोकन, न पासवर्ड हैश, न भूमिकाएँ, और न यह कि किसी को बैन क्यों किया गया।

हर डिलीवरी जाँचें

Usher Standard Webhooks स्पेसिफ़िकेशन के अनुसार साइन करता है, इसलिए उसकी कोई भी लाइब्रेरी आपके लिए सिग्नेचर जाँच लेती है। जो वेरिफ़ाई न हो, उसे अस्वीकार करें। ये लाइब्रेरी पाँच मिनट से ज़्यादा आगे-पीछे के टाइमस्टैम्प को भी अस्वीकार करती हैं, ताकि कोई पुरानी डिलीवरी दोबारा न चलाई जा सके।

app/usher/webhooks/route.ts
// a route that receives Usher's webhooks (Node, the standardwebhooks package)
import { Webhook } from 'standardwebhooks'

const wh = new Webhook(process.env.USHER_WEBHOOK_SECRET!) // whsec_…, from Usher Console

export async function POST(request: Request) {
  const body = await request.text() // the raw body: the signature covers it byte for byte
  let event: { type: string; timestamp: string; data: Record<string, unknown> }
  try {
    event = wh.verify(body, Object.fromEntries(request.headers)) as typeof event
  } catch {
    return new Response('bad signature', { status: 400 })
  }
  // webhook-id is the same on every attempt: skip one you have handled already
  if (await alreadyHandled(request.headers.get('webhook-id')!)) return new Response(null, { status: 204 })
  await queue(event) // answer quickly; do the work afterwards
  return new Response(null, { status: 204 })
}
  • 15 सेकंड के अंदर जवाब दें, किसी भी 2xx से। इसके अलावा कुछ भी, रीडायरेक्ट समेत, नाकामी गिना जाता है।
  • दोहराव की उम्मीद रखें। हर कोशिश में मैसेज का webhook-id वही रहता है; जिसे आप सँभाल चुके हैं, उसे छोड़ दें।
  • क्रम पर भरोसा न करें। दोबारा भेजे गए मैसेज नए इवेंट के बाद पहुँच सकते हैं।

जब आपका सर्वर जवाब न दे

Usher 5 सेकंड, 5 मिनट, 30 मिनट, 2 घंटे, 5 घंटे, 10 घंटे और 10 घंटे बाद फिर से कोशिश करता है (कुल मिलाकर लगभग डेढ़ दिन), फिर छोड़ देता है। Console का डिलीवरी लॉग हर मैसेज की कोशिशें और आपके सर्वर का आख़िरी जवाब दिखाता है, और फिर से भेजें डिलीवरी को नए सिरे से शुरू करता है।

नया सीक्रेट

Console में नया सीक्रेट एक और सीक्रेट बनाता है और उसे एक बार दिखाता है। अगले 24 घंटों तक हर डिलीवरी में दो सिग्नेचर होते हैं, हर सीक्रेट का एक, ताकि आप बिना कुछ छोड़े नया सीक्रेट डिप्लॉय कर सकें। उसके बाद सिर्फ़ नया सीक्रेट साइन करता है।

डिलीवरी कहाँ से आती हैं

वेबहुक Usher से उसकी ईग्रेस प्रॉक्सी के रास्ते बाहर जाते हैं, जो प्राइवेट या आंतरिक पतों से कनेक्ट नहीं करती। एंडपॉइंट किसी सार्वजनिक नाम पर एक https:// पता होना चाहिए: कोई IP पता, प्राइवेट नाम, या Usher के अपने डोमेन का कोई पता नहीं।