[{"data":1,"prerenderedAt":874},["ShallowReactive",2],{"content-query-2ROLEUiGU4":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"layout":10,"author":11,"tags":12,"categories":17,"date":19,"image":20,"faq":21,"body":34,"_type":867,"_id":868,"_source":869,"_file":870,"_stem":871,"_extension":872,"sitemap":873},"/blog/twilio-webhooks-guide","blog",false,"","Twilio Webhooks: Setup, Payloads, Signature Validation & Testing","A complete guide to Twilio webhooks — how they work, how to configure them for SMS and voice, the form-encoded payload, validating the X-Twilio-Signature header, retry behavior, and how to test Twilio webhooks on localhost.","post","Karolis Rusenas",[13,14,15,16],"twilio","webhooks","sms","guide",[18],"guides","2026-07-19 10:00:00","/images/generic/webhooks.png",[22,25,28,31],{"q":23,"a":24},"How do Twilio webhooks work?","When an event happens — an incoming SMS, a call, or a status change — Twilio makes an HTTP request (POST by default) to the URL you configured for that number, Messaging Service or API call. The body is form-encoded (application/x-www-form-urlencoded), not JSON. For messaging and voice you reply with TwiML; for status callbacks you just return 2xx.",{"q":26,"a":27},"Are Twilio webhooks JSON?","No. Twilio sends webhooks as application/x-www-form-urlencoded form parameters — fields like From, To, Body, MessageSid and MessageStatus — not a JSON body. Parse them as form data. (Some newer Event Streams / Voice Insights payloads differ; check the specific product's docs.)",{"q":29,"a":30},"How do I verify a Twilio webhook signature?","Twilio signs each request with an X-Twilio-Signature header — an HMAC-SHA1 of the full request URL plus the sorted POST parameters, keyed with your Auth Token. Recompute it (or use Twilio's RequestValidator) and compare. The URL must exactly match the public URL Twilio called, including query string, or the signature won't match.",{"q":32,"a":33},"How can I test Twilio webhooks locally?","Point your Twilio number's webhook URL at a stable Webhook Relay URL and forward it to your machine with the relay agent — Twilio reaches localhost with no public IP. You can also inspect the raw form-encoded request in a free Webhook Bin first to see exactly what Twilio sends.",{"type":35,"children":36,"toc":855},"root",[37,61,68,115,120,209,215,220,293,299,304,362,442,449,454,495,514,520,572,607,613,642,648,653,691,731,743,749,789,795,828,849],{"type":38,"tag":39,"props":40,"children":41},"element","p",{},[42,45,50,52,59],{"type":43,"value":44},"text","Twilio uses ",{"type":38,"tag":46,"props":47,"children":48},"strong",{},[49],{"type":43,"value":14},{"type":43,"value":51}," for almost everything reactive: an incoming SMS or MMS, an inbound call, and status updates as your messages and calls move through the network. This guide covers how Twilio webhooks work, how to configure and secure them, and how to test them without deploying. (New to webhooks generally? Start with ",{"type":38,"tag":53,"props":54,"children":56},"a",{"href":55},"/blog/what-is-webhook",[57],{"type":43,"value":58},"what is a webhook",{"type":43,"value":60},".)",{"type":38,"tag":62,"props":63,"children":65},"h2",{"id":64},"how-twilio-webhooks-work",[66],{"type":43,"value":67},"How Twilio webhooks work",{"type":38,"tag":39,"props":69,"children":70},{},[71,73,78,80,87,89,98,100,105,107,113],{"type":43,"value":72},"When something happens, Twilio makes an ",{"type":38,"tag":46,"props":74,"children":75},{},[76],{"type":43,"value":77},"HTTP request to a URL you control",{"type":43,"value":79},". By default it's a ",{"type":38,"tag":81,"props":82,"children":84},"code",{"className":83},[],[85],{"type":43,"value":86},"POST",{"type":43,"value":88},", and — importantly — the body is ",{"type":38,"tag":46,"props":90,"children":91},{},[92],{"type":38,"tag":81,"props":93,"children":95},{"className":94},[],[96],{"type":43,"value":97},"application/x-www-form-urlencoded",{"type":43,"value":99},", not JSON. Twilio expects a quick response: ",{"type":38,"tag":46,"props":101,"children":102},{},[103],{"type":43,"value":104},"TwiML",{"type":43,"value":106}," (XML) for messaging and voice so it knows what to do next, or a plain ",{"type":38,"tag":81,"props":108,"children":110},{"className":109},[],[111],{"type":43,"value":112},"2xx",{"type":43,"value":114}," for status callbacks.",{"type":38,"tag":39,"props":116,"children":117},{},[118],{"type":43,"value":119},"There are three broad categories:",{"type":38,"tag":121,"props":122,"children":123},"ul",{},[124,143,160],{"type":38,"tag":125,"props":126,"children":127},"li",{},[128,133,135,141],{"type":38,"tag":46,"props":129,"children":130},{},[131],{"type":43,"value":132},"Incoming messages",{"type":43,"value":134}," — someone texts your Twilio number; Twilio POSTs the message to your ",{"type":38,"tag":136,"props":137,"children":138},"em",{},[139],{"type":43,"value":140},"Messaging",{"type":43,"value":142}," webhook and uses your TwiML reply to respond.",{"type":38,"tag":125,"props":144,"children":145},{},[146,151,153,158],{"type":38,"tag":46,"props":147,"children":148},{},[149],{"type":43,"value":150},"Incoming voice",{"type":43,"value":152}," — an inbound call hits your number; Twilio fetches TwiML from your ",{"type":38,"tag":136,"props":154,"children":155},{},[156],{"type":43,"value":157},"Voice",{"type":43,"value":159}," webhook.",{"type":38,"tag":125,"props":161,"children":162},{},[163,168,170,176,178,184,185,191,193,199,201,207],{"type":38,"tag":46,"props":164,"children":165},{},[166],{"type":43,"value":167},"Status callbacks",{"type":43,"value":169}," — as a message or call changes state (",{"type":38,"tag":81,"props":171,"children":173},{"className":172},[],[174],{"type":43,"value":175},"queued",{"type":43,"value":177}," → ",{"type":38,"tag":81,"props":179,"children":181},{"className":180},[],[182],{"type":43,"value":183},"sent",{"type":43,"value":177},{"type":38,"tag":81,"props":186,"children":188},{"className":187},[],[189],{"type":43,"value":190},"delivered",{"type":43,"value":192},"/",{"type":38,"tag":81,"props":194,"children":196},{"className":195},[],[197],{"type":43,"value":198},"failed",{"type":43,"value":200},"), Twilio POSTs updates to the ",{"type":38,"tag":81,"props":202,"children":204},{"className":203},[],[205],{"type":43,"value":206},"StatusCallback",{"type":43,"value":208}," URL you set.",{"type":38,"tag":62,"props":210,"children":212},{"id":211},"configuring-a-twilio-webhook",[213],{"type":43,"value":214},"Configuring a Twilio webhook",{"type":38,"tag":39,"props":216,"children":217},{},[218],{"type":43,"value":219},"You set webhook URLs in a few places depending on the product:",{"type":38,"tag":221,"props":222,"children":223},"ol",{},[224,253,276],{"type":38,"tag":125,"props":225,"children":226},{},[227,232,234,239,241,245,247,251],{"type":38,"tag":46,"props":228,"children":229},{},[230],{"type":43,"value":231},"Per phone number",{"type":43,"value":233}," — Console → ",{"type":38,"tag":46,"props":235,"children":236},{},[237],{"type":43,"value":238},"Phone Numbers → Manage → Active numbers",{"type":43,"value":240}," → your number → ",{"type":38,"tag":136,"props":242,"children":243},{},[244],{"type":43,"value":140},{"type":43,"value":246}," / ",{"type":38,"tag":136,"props":248,"children":249},{},[250],{"type":43,"value":157},{"type":43,"value":252}," \"A message/call comes in\" webhook.",{"type":38,"tag":125,"props":254,"children":255},{},[256,261,262,267,269,274],{"type":38,"tag":46,"props":257,"children":258},{},[259],{"type":43,"value":260},"Messaging Service",{"type":43,"value":233},{"type":38,"tag":46,"props":263,"children":264},{},[265],{"type":43,"value":266},"Messaging → Services",{"type":43,"value":268}," → your service → ",{"type":38,"tag":136,"props":270,"children":271},{},[272],{"type":43,"value":273},"Integration",{"type":43,"value":275},".",{"type":38,"tag":125,"props":277,"children":278},{},[279,284,286,291],{"type":38,"tag":46,"props":280,"children":281},{},[282],{"type":43,"value":283},"Per API request",{"type":43,"value":285}," — pass a ",{"type":38,"tag":81,"props":287,"children":289},{"className":288},[],[290],{"type":43,"value":206},{"type":43,"value":292}," URL when you create a message or call to receive delivery status.",{"type":38,"tag":62,"props":294,"children":296},{"id":295},"the-twilio-webhook-payload",[297],{"type":43,"value":298},"The Twilio webhook payload",{"type":38,"tag":39,"props":300,"children":301},{},[302],{"type":43,"value":303},"Because it's form-encoded, you parse parameters, not JSON. A typical inbound SMS looks like:",{"type":38,"tag":305,"props":306,"children":310},"pre",{"className":307,"code":308,"language":309,"meta":7,"style":7},"language-http shiki shiki-themes github-dark","POST /twilio HTTP/1.1\nContent-Type: application/x-www-form-urlencoded\nX-Twilio-Signature: hZ8...=\n\nMessageSid=SM123&From=%2B14155551212&To=%2B14155557890&Body=Hello&NumMedia=0\n","http",[311],{"type":38,"tag":81,"props":312,"children":313},{"__ignoreMap":7},[314,325,334,343,353],{"type":38,"tag":315,"props":316,"children":319},"span",{"class":317,"line":318},"line",1,[320],{"type":38,"tag":315,"props":321,"children":322},{},[323],{"type":43,"value":324},"POST /twilio HTTP/1.1\n",{"type":38,"tag":315,"props":326,"children":328},{"class":317,"line":327},2,[329],{"type":38,"tag":315,"props":330,"children":331},{},[332],{"type":43,"value":333},"Content-Type: application/x-www-form-urlencoded\n",{"type":38,"tag":315,"props":335,"children":337},{"class":317,"line":336},3,[338],{"type":38,"tag":315,"props":339,"children":340},{},[341],{"type":43,"value":342},"X-Twilio-Signature: hZ8...=\n",{"type":38,"tag":315,"props":344,"children":346},{"class":317,"line":345},4,[347],{"type":38,"tag":315,"props":348,"children":350},{"emptyLinePlaceholder":349},true,[351],{"type":43,"value":352},"\n",{"type":38,"tag":315,"props":354,"children":356},{"class":317,"line":355},5,[357],{"type":38,"tag":315,"props":358,"children":359},{},[360],{"type":43,"value":361},"MessageSid=SM123&From=%2B14155551212&To=%2B14155557890&Body=Hello&NumMedia=0\n",{"type":38,"tag":39,"props":363,"children":364},{},[365,367,373,375,381,382,388,389,395,396,402,404,410,411,417,418,424,426,432,434,440],{"type":43,"value":366},"Common fields include ",{"type":38,"tag":81,"props":368,"children":370},{"className":369},[],[371],{"type":43,"value":372},"MessageSid",{"type":43,"value":374},", ",{"type":38,"tag":81,"props":376,"children":378},{"className":377},[],[379],{"type":43,"value":380},"From",{"type":43,"value":374},{"type":38,"tag":81,"props":383,"children":385},{"className":384},[],[386],{"type":43,"value":387},"To",{"type":43,"value":374},{"type":38,"tag":81,"props":390,"children":392},{"className":391},[],[393],{"type":43,"value":394},"Body",{"type":43,"value":374},{"type":38,"tag":81,"props":397,"children":399},{"className":398},[],[400],{"type":43,"value":401},"NumMedia",{"type":43,"value":403}," (messaging) and ",{"type":38,"tag":81,"props":405,"children":407},{"className":406},[],[408],{"type":43,"value":409},"CallSid",{"type":43,"value":374},{"type":38,"tag":81,"props":412,"children":414},{"className":413},[],[415],{"type":43,"value":416},"CallStatus",{"type":43,"value":374},{"type":38,"tag":81,"props":419,"children":421},{"className":420},[],[422],{"type":43,"value":423},"MessageStatus",{"type":43,"value":425}," (voice / status callbacks). Parse the body with your framework's URL-encoded form parser — for example ",{"type":38,"tag":81,"props":427,"children":429},{"className":428},[],[430],{"type":43,"value":431},"express.urlencoded()",{"type":43,"value":433}," in Node or ",{"type":38,"tag":81,"props":435,"children":437},{"className":436},[],[438],{"type":43,"value":439},"request.form",{"type":43,"value":441}," in Flask.",{"type":38,"tag":443,"props":444,"children":446},"h3",{"id":445},"responding-with-twiml",[447],{"type":43,"value":448},"Responding with TwiML",{"type":38,"tag":39,"props":450,"children":451},{},[452],{"type":43,"value":453},"For messaging and voice, reply with TwiML telling Twilio what to do:",{"type":38,"tag":305,"props":455,"children":459},{"className":456,"code":457,"language":458,"meta":7,"style":7},"language-xml shiki shiki-themes github-dark","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003CResponse>\n  \u003CMessage>Thanks, we got your text!\u003C/Message>\n\u003C/Response>\n","xml",[460],{"type":38,"tag":81,"props":461,"children":462},{"__ignoreMap":7},[463,471,479,487],{"type":38,"tag":315,"props":464,"children":465},{"class":317,"line":318},[466],{"type":38,"tag":315,"props":467,"children":468},{},[469],{"type":43,"value":470},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",{"type":38,"tag":315,"props":472,"children":473},{"class":317,"line":327},[474],{"type":38,"tag":315,"props":475,"children":476},{},[477],{"type":43,"value":478},"\u003CResponse>\n",{"type":38,"tag":315,"props":480,"children":481},{"class":317,"line":336},[482],{"type":38,"tag":315,"props":483,"children":484},{},[485],{"type":43,"value":486},"  \u003CMessage>Thanks, we got your text!\u003C/Message>\n",{"type":38,"tag":315,"props":488,"children":489},{"class":317,"line":345},[490],{"type":38,"tag":315,"props":491,"children":492},{},[493],{"type":43,"value":494},"\u003C/Response>\n",{"type":38,"tag":39,"props":496,"children":497},{},[498,500,506,507,513],{"type":43,"value":499},"For status callbacks there's nothing to instruct, so just return ",{"type":38,"tag":81,"props":501,"children":503},{"className":502},[],[504],{"type":43,"value":505},"204",{"type":43,"value":192},{"type":38,"tag":81,"props":508,"children":510},{"className":509},[],[511],{"type":43,"value":512},"200",{"type":43,"value":275},{"type":38,"tag":62,"props":515,"children":517},{"id":516},"validating-the-x-twilio-signature",[518],{"type":43,"value":519},"Validating the X-Twilio-Signature",{"type":38,"tag":39,"props":521,"children":522},{},[523,525,534,536,541,543,548,550,555,557,562,564,570],{"type":43,"value":524},"Every Twilio request carries an ",{"type":38,"tag":46,"props":526,"children":527},{},[528],{"type":38,"tag":81,"props":529,"children":531},{"className":530},[],[532],{"type":43,"value":533},"X-Twilio-Signature",{"type":43,"value":535}," header so you can confirm it really came from Twilio. It's an ",{"type":38,"tag":46,"props":537,"children":538},{},[539],{"type":43,"value":540},"HMAC-SHA1",{"type":43,"value":542}," of the ",{"type":38,"tag":46,"props":544,"children":545},{},[546],{"type":43,"value":547},"full request URL",{"type":43,"value":549}," plus the ",{"type":38,"tag":46,"props":551,"children":552},{},[553],{"type":43,"value":554},"alphabetically sorted POST parameters",{"type":43,"value":556},", keyed with your ",{"type":38,"tag":46,"props":558,"children":559},{},[560],{"type":43,"value":561},"Auth Token",{"type":43,"value":563},", then Base64-encoded. Recompute it and compare — most people use Twilio's ",{"type":38,"tag":81,"props":565,"children":567},{"className":566},[],[568],{"type":43,"value":569},"RequestValidator",{"type":43,"value":571}," helper.",{"type":38,"tag":39,"props":573,"children":574},{},[575,577,582,584,590,592,598,600,606],{"type":43,"value":576},"The classic gotcha: the URL you validate against must be the ",{"type":38,"tag":46,"props":578,"children":579},{},[580],{"type":43,"value":581},"exact public URL Twilio called",{"type":43,"value":583}," (scheme, host, path and query string). Behind a proxy or tunnel, the host your app sees may differ from the public host — validate against the public one. See ",{"type":38,"tag":53,"props":585,"children":587},{"href":586},"/blog/verify-webhook-signature",[588],{"type":43,"value":589},"how to verify a webhook signature",{"type":43,"value":591},", try the ",{"type":38,"tag":53,"props":593,"children":595},{"href":594},"/verify-twilio-webhook-signature",[596],{"type":43,"value":597},"Twilio signature verifier",{"type":43,"value":599},", or use the free ",{"type":38,"tag":53,"props":601,"children":603},{"href":602},"/hmac-verification",[604],{"type":43,"value":605},"HMAC verifier",{"type":43,"value":275},{"type":38,"tag":62,"props":608,"children":610},{"id":609},"retries-and-reliability",[611],{"type":43,"value":612},"Retries and reliability",{"type":38,"tag":39,"props":614,"children":615},{},[616,618,624,626,632,634,640],{"type":43,"value":617},"Twilio's retry behavior varies by product and is generally limited — if your endpoint is slow or returns an error, you can lose the notification (verify Twilio's current behavior for your specific webhook type). For anything business-critical, put a ",{"type":38,"tag":53,"props":619,"children":621},{"href":620},"/webhook-gateway",[622],{"type":43,"value":623},"webhook gateway",{"type":43,"value":625}," in front of your handler: it verifies the signature, persists each event and applies ",{"type":38,"tag":53,"props":627,"children":629},{"href":628},"/features/durable-retries",[630],{"type":43,"value":631},"durable retries",{"type":43,"value":633}," so a deploy or a brief outage doesn't drop a delivery, and it keeps ",{"type":38,"tag":53,"props":635,"children":637},{"href":636},"/features/webhook-logs",[638],{"type":43,"value":639},"delivery logs",{"type":43,"value":641}," you can inspect and replay.",{"type":38,"tag":62,"props":643,"children":645},{"id":644},"testing-twilio-webhooks-locally",[646],{"type":43,"value":647},"Testing Twilio webhooks locally",{"type":38,"tag":39,"props":649,"children":650},{},[651],{"type":43,"value":652},"You don't want to deploy just to see what Twilio sends. Two options:",{"type":38,"tag":221,"props":654,"children":655},{},[656,681],{"type":38,"tag":125,"props":657,"children":658},{},[659,664,666,672,674,680],{"type":38,"tag":46,"props":660,"children":661},{},[662],{"type":43,"value":663},"Inspect first (no install):",{"type":43,"value":665}," open a free ",{"type":38,"tag":53,"props":667,"children":669},{"href":668},"/webhook-bin",[670],{"type":43,"value":671},"Webhook Bin",{"type":43,"value":673},", paste its URL into your Twilio number's webhook field, and text the number — you'll see the exact form-encoded request and headers. See the ",{"type":38,"tag":53,"props":675,"children":677},{"href":676},"/blog/twilio-webhook-tester",[678],{"type":43,"value":679},"Twilio webhook tester",{"type":43,"value":275},{"type":38,"tag":125,"props":682,"children":683},{},[684,689],{"type":38,"tag":46,"props":685,"children":686},{},[687],{"type":43,"value":688},"Forward to localhost:",{"type":43,"value":690}," point Twilio at a stable Webhook Relay URL and run the agent so requests reach your machine with no public IP:",{"type":38,"tag":305,"props":692,"children":696},{"className":693,"code":694,"language":695,"meta":7,"style":7},"language-bash shiki shiki-themes github-dark","relay forward --bucket twilio-dev http://localhost:3000/twilio\n","bash",[697],{"type":38,"tag":81,"props":698,"children":699},{"__ignoreMap":7},[700],{"type":38,"tag":315,"props":701,"children":702},{"class":317,"line":318},[703,709,715,721,726],{"type":38,"tag":315,"props":704,"children":706},{"style":705},"--shiki-default:#B392F0",[707],{"type":43,"value":708},"relay",{"type":38,"tag":315,"props":710,"children":712},{"style":711},"--shiki-default:#9ECBFF",[713],{"type":43,"value":714}," forward",{"type":38,"tag":315,"props":716,"children":718},{"style":717},"--shiki-default:#79B8FF",[719],{"type":43,"value":720}," --bucket",{"type":38,"tag":315,"props":722,"children":723},{"style":711},[724],{"type":43,"value":725}," twilio-dev",{"type":38,"tag":315,"props":727,"children":728},{"style":711},[729],{"type":43,"value":730}," http://localhost:3000/twilio\n",{"type":38,"tag":39,"props":732,"children":733},{},[734,736,742],{"type":43,"value":735},"Full walkthrough: ",{"type":38,"tag":53,"props":737,"children":739},{"href":738},"/blog/receive-twilio-webhooks-locally",[740],{"type":43,"value":741},"receive Twilio webhooks on localhost",{"type":43,"value":275},{"type":38,"tag":62,"props":744,"children":746},{"id":745},"common-issues",[747],{"type":43,"value":748},"Common issues",{"type":38,"tag":121,"props":750,"children":751},{},[752,769,779],{"type":38,"tag":125,"props":753,"children":754},{},[755,760,762,767],{"type":38,"tag":46,"props":756,"children":757},{},[758],{"type":43,"value":759},"Empty body / can't read fields",{"type":43,"value":761}," — you're parsing JSON; Twilio sends ",{"type":38,"tag":46,"props":763,"children":764},{},[765],{"type":43,"value":766},"form-encoded",{"type":43,"value":768}," data. Use a URL-encoded parser.",{"type":38,"tag":125,"props":770,"children":771},{},[772,777],{"type":38,"tag":46,"props":773,"children":774},{},[775],{"type":43,"value":776},"Signature always fails",{"type":43,"value":778}," — the URL you validate doesn't match the public URL Twilio called (often a proxy/tunnel host or a missing query string).",{"type":38,"tag":125,"props":780,"children":781},{},[782,787],{"type":38,"tag":46,"props":783,"children":784},{},[785],{"type":43,"value":786},"Twilio shows an 11200 error",{"type":43,"value":788}," — your endpoint didn't return a valid response (or valid TwiML) quickly enough; acknowledge fast and do heavy work asynchronously.",{"type":38,"tag":62,"props":790,"children":792},{"id":791},"next-steps",[793],{"type":43,"value":794},"Next steps",{"type":38,"tag":121,"props":796,"children":797},{},[798,807,817],{"type":38,"tag":125,"props":799,"children":800},{},[801,805],{"type":38,"tag":53,"props":802,"children":803},{"href":676},[804],{"type":43,"value":679},{"type":43,"value":806}," — inspect a real request in your browser.",{"type":38,"tag":125,"props":808,"children":809},{},[810,815],{"type":38,"tag":53,"props":811,"children":812},{"href":738},[813],{"type":43,"value":814},"Receive Twilio webhooks on localhost",{"type":43,"value":816}," — drive your local handler with real events.",{"type":38,"tag":125,"props":818,"children":819},{},[820,826],{"type":38,"tag":53,"props":821,"children":823},{"href":822},"/blog/webhook-security",[824],{"type":43,"value":825},"Webhook security best practices",{"type":43,"value":827}," — verification, idempotency and more.",{"type":38,"tag":39,"props":829,"children":830},{},[831,833,838,840,848],{"type":43,"value":832},"Ready to see your first Twilio webhook? ",{"type":38,"tag":53,"props":834,"children":835},{"href":668},[836],{"type":43,"value":837},"Open a free Webhook Bin",{"type":43,"value":839}," or ",{"type":38,"tag":53,"props":841,"children":845},{"href":842,"rel":843},"https://my.webhookrelay.com/register",[844],"nofollow",[846],{"type":43,"value":847},"start forwarding to localhost for free",{"type":43,"value":275},{"type":38,"tag":850,"props":851,"children":852},"style",{},[853],{"type":43,"value":854},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":336,"depth":336,"links":856},[857,858,859,862,863,864,865,866],{"id":64,"depth":327,"text":67},{"id":211,"depth":327,"text":214},{"id":295,"depth":327,"text":298,"children":860},[861],{"id":445,"depth":336,"text":448},{"id":516,"depth":327,"text":519},{"id":609,"depth":327,"text":612},{"id":644,"depth":327,"text":647},{"id":745,"depth":327,"text":748},{"id":791,"depth":327,"text":794},"markdown","content:blog:twilio-webhooks-guide.md","content","blog/twilio-webhooks-guide.md","blog/twilio-webhooks-guide","md",{"loc":4},1784458897054]