വെബ്ഹുക്കുകളുടെ അവലോകനം
കോൾ സമയത്ത് കാര്യങ്ങൾ സംഭവിക്കുമ്പോൾ — ഇൻബൗണ്ട് കോൾ ആരംഭിക്കുമ്പോൾ, കോൾ അവസാനിക്കുമ്പോൾ, ഗ്രേഡിംഗ് റൺ പൂർത്തിയാകുമ്പോൾ, അലേർട്ട് സജീവമാകുമ്പോൾ തുടങ്ങിയപ്പോൾ — ThunderPhone നിങ്ങളുടെ സെർവറിലേക്ക് HTTP POST അഭ്യർത്ഥനകൾ അയയ്ക്കുന്നു. രണ്ട് ഡെലിവറി മോഡലുകൾ ഉണ്ട്:
ഒന്നിലധികം URL-കൾ, ഓരോ എൻഡ്പോയിന്റിനും പ്രത്യേകം സീക്രട്ടുകൾ, ഓരോ എൻഡ്പോയിന്റിനും ഇവന്റ് ഫിൽട്ടറുകൾ,
സ്വയമേവയുള്ള റീട്രൈകൾ.
GET/POST/PATCH/DELETE /v1/developer/webhook-endpoints വഴി നിയന്ത്രിക്കുക.
ഓരോ ഓർഗനൈസേഷനും ഒരു URL. തടസ്സപ്പെടുത്തുന്ന കോൺഫിഗറേഷൻ എക്സ്ചേഞ്ചുകൾ ഉൾപ്പെടെ
കോൾ-ലൈഫ്സൈക്കിൾ ഇവന്റുകൾ കൈമാറുന്നു. GET/PUT /v1/webhook-ൽ നിയന്ത്രിക്കപ്പെടുന്നു.
ഇവന്റ്സ് കാറ്റലോഗിലെ എല്ലാ പത്ത് ഇവന്റ് തരങ്ങളും വെബ്ഹുക്ക് എൻഡ്പോയിന്റുകളിലൂടെ
ഡെലിവർ ചെയ്യപ്പെടുന്നു. ആറ് കോൾ-ലൈഫ്സൈക്കിൾ ഇവന്റുകൾ
(telephony.incoming, telephony.complete, telephony.tool,
web.incoming, web.complete, web.tool) ലെഗസി ഒറ്റ-URL വെബ്ഹുക്കിലേക്കും കൂടി അയയ്ക്കപ്പെടുന്നു —
നിങ്ങൾക്ക് ലെഗസി URL-ഉം പൊരുത്തപ്പെടുന്ന എൻഡ്പോയിന്റും ഉണ്ടെങ്കിൽ, രണ്ട് പാതകളിലൂടെയും ഇവന്റ് ലഭിക്കും.
തടസ്സപ്പെടുത്തുന്ന പ്രവർത്തനം (telephony.incoming / web.incoming കോൺഫിഗറേഷൻ
എക്സ്ചേഞ്ച്, വെബ്ഹുക്ക്-മോഡ്
ടൂൾ ഡിസ്പാച്ച്) ലെഗസി പാതയിൽ മാത്രമേ ലഭ്യമാകൂ;
എല്ലാ എൻഡ്പോയിന്റ് ഡെലിവറികളും പ്രതികരണം കാത്തിരിക്കാത്ത അറിയിപ്പുകളാണ്.
പേലോഡ് ഫോർമാറ്റ്
എൻഡ്പോയിന്റ് ഡെലിവറികൾ data, event_id, type എന്നിവയുള്ള ഒരു JSON ഒബ്ജക്റ്റാണ്:
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}
ഓരോ പ്രസിദ്ധീകരിക്കപ്പെടുന്ന ഇവന്റിനും event_id അദ്വിതീയമാണ്. റീട്രൈകളിലുടനീളവും
ഇവന്റ് ലഭിക്കുന്ന എല്ലാ എൻഡ്പോയിന്റുകളിലും ഇത് ഒരുപോലെയാണ് — ഇതിനെ അടിസ്ഥാനമാക്കി ഡ്യൂപ്ലിക്കേറ്റുകൾ ഒഴിവാക്കുക.
ലെഗസി ഒറ്റ-URL വെബ്ഹുക്ക് അതേ type, data എന്നിവ അയയ്ക്കുന്നു, പക്ഷേ
event_id ഇല്ലാതെ:
{
"type": "telephony.incoming",
"data": { "call_id": 987654321, "from_number": "+14155550199", "to_number": "+15551234567" }
}
നെറ്റ്വർക്കിലൂടെ അയയ്ക്കുമ്പോൾ, ഓരോ ബോഡിയും കാനോനിക്കലായി സീരിയലൈസ് ചെയ്യപ്പെടുന്നു — കീകൾ അക്ഷരമാലാക്രമത്തിൽ, വൈറ്റ്സ്പേസ് ഇല്ലാതെ, UTF-8-ൽ. ഈ ഡോക്യുമെന്റേഷനിലെ പ്രെറ്റി-പ്രിന്റ് ചെയ്ത ഉദാഹരണങ്ങൾ വായനാസൗകര്യത്തിനായി മാത്രമുള്ളതാണ്.
ഇവന്റ് തരങ്ങളുടെയും പേലോഡ് ഫീൽഡുകളുടെയും പൂർണ്ണ പട്ടികയ്ക്കായി ഇവന്റ്സ് കാറ്റലോഗ് കാണുക.
സിഗ്നേച്ചർ പരിശോധിക്കൽ
ഓരോ റിക്വസ്റ്റും X-ThunderPhone-Signature ഹെഡറിലെ raw request
body-യുടെ HMAC-SHA256 സിഗ്നേച്ചറോടെയാണ് വരുന്നത്. സൈനിംഗ് കീ
endpoint-ന്റെ secret ആണ് (അല്ലെങ്കിൽ പഴയ ഡെലിവറികൾക്കായി നിങ്ങളുടെ org-തല webhook
secret).
ഘട്ടങ്ങൾ
- ഏതെങ്കിലും parsing നടത്തുന്നതിന് മുമ്പ് raw request body വായിക്കുക.
hmac_sha256(secret, body).hexdigest()കണക്കാക്കുക.X-ThunderPhone-Signatureഹെഡറുമായി constant time-ൽ താരതമ്യം ചെയ്യുക.
ഞങ്ങൾ അയയ്ക്കുന്ന ബൈറ്റുകൾ കൃത്യമായി അതേപടി സൈൻ ചെയ്യുന്നു. ആ ബൈറ്റുകൾ canonical JSON serialization ആണ് (sorted keys, compact separators). അതിനാൽ raw body ഉപയോഗിച്ചുള്ള പരിശോധന എപ്പോഴും പ്രവർത്തിക്കും — നിങ്ങളുടെ framework parsed JSON മാത്രം നൽകുന്നുവെങ്കിൽ, sorted keys-ഉം compact separators-ഉം ഉപയോഗിച്ച് അത് വീണ്ടും serialize ചെയ്യുന്നത് ഒരേ ബൈറ്റുകൾ സൃഷ്ടിക്കും. രണ്ട് രീതികളും പരിശോധനാ ഗൈഡിൽ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്.
import hmac
import hashlib
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode("utf-8"),
body,
hashlib.sha256,
).hexdigest()
return hmac.compare_digest(expected, signature or "")
# Example Flask handler
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/thunderphone-webhook")
def handle():
body = request.get_data()
sig = request.headers.get("X-ThunderPhone-Signature", "")
if not verify_signature(body, sig, WEBHOOK_SECRET):
abort(401)
event = request.get_json()
# dispatch on event["type"] …
return "", 204
import crypto from "node:crypto";
import express from "express";
function verifySignature(body, signature, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(body)
.digest("hex");
if (!signature || expected.length !== signature.length) return false;
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
);
}
const app = express();
app.post(
"/thunderphone-webhook",
express.raw({ type: "application/json" }),
(req, res) => {
const sig = req.header("X-ThunderPhone-Signature") || "";
if (!verifySignature(req.body, sig, process.env.WEBHOOK_SECRET)) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString("utf8"));
// dispatch on event.type …
res.sendStatus(204);
},
);
ഡെലിവറി സെമാന്റിക്സ്
ഈ സെമാന്റിക്സ് endpoint ഡെലിവറികൾക്ക് ബാധകമാണ്. ലെഗസി ഒറ്റ-URL webhook-ൽ റീട്രൈകളില്ലാത്ത ഒരൊറ്റ synchronous ശ്രമമാണുള്ളത്.
റീട്രൈകൾ
ഓരോ ഇവന്റും ഉടൻ ഒരിക്കൽ ശ്രമിക്കപ്പെടും. ഏത് 2xx പ്രതികരണവും
ഡെലിവറി അംഗീകരിക്കുന്നു. മറ്റേതെങ്കിലും ഫലത്തിൽ (non-2xx,
കണക്ഷൻ പിശക്, timeout) ആദ്യ ശ്രമത്തിന് ശേഷം 1 m, 5 m, 30 m, 2 h, 6 h,
12 h, 24 h എന്നിങ്ങനെ ഞങ്ങൾ റീട്രൈ ചെയ്യും — 24 മണിക്കൂർ വ്യാപിക്കുന്ന
8 ശ്രമങ്ങൾ. എല്ലാ ശ്രമങ്ങളും പരാജയപ്പെട്ടാൽ, ഡെലിവറി നിർത്തുകയും endpoint-നെ
webhook endpoints-ൽ status="failing" ആയി
അടയാളപ്പെടുത്തുകയും ചെയ്യും. payload സ്ഥിരമായി സ്വീകരിച്ചാലുടൻ 2xx
നൽകുക; asynchronous ആയി പ്രോസസ്സ് ചെയ്യുക.
ക്രമം
ഡെലിവറി ക്രമം പരമാവധി ശ്രമത്തിന്റെ അടിസ്ഥാനത്തിലാണ്. പ്രായോഗികമായി,
ഇവന്റുകൾ പുറപ്പെടുവിക്കുന്ന ക്രമത്തിലാണ് ഞങ്ങൾ ഡെലിവർ ചെയ്യുന്നത്, പക്ഷേ
പരാജയങ്ങളിൽ റീട്രൈകൾ ക്രമം മാറ്റാം. എപ്പോഴും call_id / object id ഉപയോഗിച്ച്
dedup ചെയ്യുകയും പൊരുത്തപ്പെടുത്തുകയും ചെയ്യുക.
ഡ്യൂപ്ലിക്കേറ്റുകൾ
ഡെലിവറി at-least-once ആണ്: ഞങ്ങൾ കാണാത്ത പ്രതികരണത്തിനുശേഷമുള്ള
ഒരു റീട്രൈക്ക് ഇവന്റ് ഡ്യൂപ്ലിക്കേറ്റ് ആക്കാനാകും. ഓരോ റീട്രൈയിലും ഒരേ
event_id ഉണ്ടായിരിക്കും, അതിനാൽ പ്രോസസ്സ് ചെയ്ത id-കൾ സംഭരിച്ച്
ആവർത്തനങ്ങൾ ഒഴിവാക്കുക. event_id endpoint-കളിലുടനീളവും പങ്കിടപ്പെടുന്നു —
ഒരേ ഇവന്റിലേക്ക് subscribe ചെയ്ത രണ്ട് endpoint-കൾക്കും ഒരേ event_id
ലഭിക്കും.
Timeout-കൾ
Endpoint ഡെലിവറികൾക്ക് ഓരോ ശ്രമത്തിനും 30 s timeout ഉണ്ട്. ലെഗസി
പാതയിൽ, ലൈവ് കോൾ പെരുമാറ്റം നിയന്ത്രിക്കുന്ന blocking request-കൾ —
telephony.incoming / web.incoming
കോൺഫിഗറേഷൻ എക്സ്ചേഞ്ച് — 10 s കഴിഞ്ഞാൽ timeout ആകും. എന്നാൽ മന്ദഗതിയിലുള്ള
പ്രതികരണം കോൾ എടുക്കൽ വൈകിപ്പിക്കും, അതിനാൽ ഏതാനും സെക്കൻഡുകൾക്കുള്ളിൽ
മറുപടി നൽകാൻ ലക്ഷ്യമിടുക. Webhook-mode tool dispatch-ന്
20 s അനുവദിക്കുന്നു.
ഉറവിട IP-കൾ
ഔട്ട്ബൗണ്ട് webhook-കൾ ThunderPhone-ന്റെ cloud IP ശ്രേണിയിൽ നിന്നാണ് വരുന്നത്. നിങ്ങളുടെ firewall-ന് ഒരു allowlist ആവശ്യമാണെങ്കിൽ, support-നെ ബന്ധപ്പെടുക; നിലവിലെ ശ്രേണികൾ ഞങ്ങൾ പങ്കിടും.
ലെഗസിയും endpoint-അടിസ്ഥാന webhook-കളും തമ്മിൽ തിരഞ്ഞെടുക്കൽ
| സവിശേഷത | ലെഗസി (/v1/webhook) | Endpoints (/v1/developer/webhook-endpoints) |
|---|---|---|
| URL-കളുടെ എണ്ണം | ഓരോ org-നും 1 | ഓരോ org-നും നിരവധി |
| ഇവന്റ് കവറേജ് | telephony.* / web.* മാത്രം | എല്ലാ 10 ഇവന്റ് തരങ്ങളും |
| ഇവന്റ് ഫിൽറ്റർ | — | ഓരോ endpoint-നും |
| റീട്രൈകൾ | ഇല്ല | 24 h-ൽ 8 ശ്രമങ്ങൾ |
| എൻവലപ്പ് | type + data | type + data + event_id |
| സീക്രട്ട് റൊട്ടേഷൻ | ഒറ്റ സീക്രട്ട് മാറ്റിസ്ഥാപിക്കുന്നു | ഓരോ endpoint-നും സീക്രട്ട് |
| ഇല്ലാതാക്കാതെ ഡിസേബിൾ ചെയ്യുക | — | status=disabled |
| സ്റ്റാറ്റസ് ദൃശ്യപരത | — | active / disabled / failing |
| Blocking കോൺഫിഗറേഷൻ എക്സ്ചേഞ്ച് | ഉണ്ട് (telephony.incoming / web.incoming) | ഒരിക്കലുമില്ല — അറിയിപ്പുകൾ മാത്രം |
| ഏറ്റവും അനുയോജ്യം | ഡൈനാമിക് കോൾ കോൺഫിഗറേഷൻ | പ്രൊഡക്ഷനിലെ ഇവന്റ് ഉപഭോഗം |
പുതിയ ഇന്റഗ്രേഷനുകൾ endpoint-അടിസ്ഥാന webhook-കളിലൂടെ ഇവന്റുകൾ ഉപഭോഗം ചെയ്യണം. കോൾ എടുക്കുന്ന സമയത്ത് ഡൈനാമിക്കായി കോൾ കോൺഫിഗർ ചെയ്യുകയോ webhook-mode tool dispatch ഉപയോഗിക്കുകയോ ചെയ്യുന്നെങ്കിൽ മാത്രം ഒരു ലെഗസി URL നിലനിർത്തുക (അല്ലെങ്കിൽ ചേർക്കുക) — ആ request/response എക്സ്ചേഞ്ചുകൾ ലെഗസി പാതയിൽ മാത്രമേ പ്രവർത്തിക്കൂ.
ബന്ധപ്പെട്ടവ
എല്ലാ ഇവന്റ് തരങ്ങളും അവയുടെ payload-കളും.
ഒന്നിലധികം endpoint-കൾ, ഇവന്റ് ഫിൽറ്ററുകൾ, സീക്രട്ടുകൾ എന്നിവ മാനേജ് ചെയ്യുക.
കോളുകൾ കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളുടെ server മറുപടി നൽകേണ്ട blocking request.
transcript, recording, metrics എന്നിവയുള്ള കോൾ-ശേഷമുള്ള payload.