[{"data":1,"prerenderedAt":985},["ShallowReactive",2],{"content-query-haz09Txang":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,"faq":20,"image":33,"body":34,"_type":978,"_id":979,"_source":980,"_file":981,"_stem":982,"_extension":983,"sitemap":984},"/blog/docusign-connect-webhooks","blog",false,"","DocuSign Connect Webhooks: Events, HMAC and Retry Behavior","A practical guide to DocuSign Connect webhooks: envelope and recipient events, the JSON payload, HMAC signature verification, and what Connect's aggressive retries mean for your listener.","post","Karolis Rusenas",[13,14,15,16],"docusign","webhooks","esignature","guide",[18],"tutorials","2026-07-07 11:00:00",[21,24,27,30],{"q":22,"a":23},"What events can DocuSign Connect send?","Envelope-level events (envelope-sent, envelope-delivered, envelope-completed, envelope-declined, envelope-voided) and recipient-level events (recipient-sent, recipient-delivered, recipient-completed, recipient-declined and more). You choose which to subscribe to per Connect configuration, at account level or per envelope via the eventNotification API.",{"q":25,"a":26},"How do I verify a DocuSign webhook?","Enable HMAC on the Connect configuration, store the generated key, then on each delivery compute Base64(HMAC-SHA256(raw body, key)) and compare it to the X-DocuSign-Signature-1 header in constant time. Multiple active keys arrive as -2, -3 and so on.",{"q":28,"a":29},"How many times does DocuSign retry a failed webhook?","Connect keeps retrying failed deliveries for roughly 24 hours with increasing intervals. In our own traffic we have observed envelopes arriving with retryCount above 20 — long after the original event — so handlers must be idempotent and tolerate stale data.",{"q":31,"a":32},"Why is my DocuSign Connect listener not receiving events?","Check that the Connect configuration is enabled and subscribed to the right events, your endpoint is public HTTPS with a valid certificate, and it answers 2xx within 100 seconds. Then check the Connect logs in the admin UI — DocuSign records each delivery attempt and the response it got, which usually names the problem.","/images/blog/heroes/route.jpg",{"type":35,"children":36,"toc":969},"root",[37,47,86,93,110,135,147,153,158,253,265,271,276,635,640,704,710,722,737,773,779,791,889,895,922,928,963],{"type":38,"tag":39,"props":40,"children":41},"element","p",{},[42],{"type":38,"tag":43,"props":44,"children":46},"img",{"alt":45,"src":33},"DocuSign Connect webhooks",[],{"type":38,"tag":39,"props":48,"children":49},{},[50,53,59,61,66,68,75,77,84],{"type":51,"value":52},"text","When an envelope is signed, declined or completed, ",{"type":38,"tag":54,"props":55,"children":56},"strong",{},[57],{"type":51,"value":58},"DocuSign Connect",{"type":51,"value":60}," is the machinery that tells your application — a webhook POST with the envelope state as JSON. Connect is more configurable than most providers' webhooks (account-wide vs per-envelope, event filtering, includes), and it has one behavior that surprises everyone the first time: ",{"type":38,"tag":54,"props":62,"children":63},{},[64],{"type":51,"value":65},"it retries hard",{"type":51,"value":67},". We run a public ",{"type":38,"tag":69,"props":70,"children":72},"a",{"href":71},"/webhook-bin",[73],{"type":51,"value":74},"webhook bin",{"type":51,"value":76}," and routinely watch DocuSign hitting long-dead endpoints with ",{"type":38,"tag":78,"props":79,"children":81},"code",{"className":80},[],[82],{"type":51,"value":83},"retryCount",{"type":51,"value":85}," in the twenties. This guide covers setup, events, payloads, HMAC verification, and how to build a listener that survives all of that.",{"type":38,"tag":87,"props":88,"children":90},"h2",{"id":89},"two-ways-to-get-events",[91],{"type":51,"value":92},"Two ways to get events",{"type":38,"tag":39,"props":94,"children":95},{},[96,101,103,108],{"type":38,"tag":54,"props":97,"children":98},{},[99],{"type":51,"value":100},"Account-level Connect configuration.",{"type":51,"value":102}," In eSignature admin: ",{"type":38,"tag":54,"props":104,"children":105},{},[106],{"type":51,"value":107},"Settings → Connect → Add configuration",{"type":51,"value":109},". You set the listener URL, pick events, and every matching envelope in the account triggers a delivery. This is the right choice for CRM syncs, archives, and anything ongoing.",{"type":38,"tag":39,"props":111,"children":112},{},[113,126,128,133],{"type":38,"tag":54,"props":114,"children":115},{},[116,118,124],{"type":51,"value":117},"Per-envelope ",{"type":38,"tag":78,"props":119,"children":121},{"className":120},[],[122],{"type":51,"value":123},"eventNotification",{"type":51,"value":125},".",{"type":51,"value":127}," When creating an envelope via the API, attach an ",{"type":38,"tag":78,"props":129,"children":131},{"className":130},[],[132],{"type":51,"value":123},{"type":51,"value":134}," object with your URL and the events you want — scoped to that envelope only. Right for multi-tenant apps where each envelope may notify a different customer system.",{"type":38,"tag":39,"props":136,"children":137},{},[138,140,145],{"type":51,"value":139},"Both deliver the same JSON format (use the modern ",{"type":38,"tag":54,"props":141,"children":142},{},[143],{"type":51,"value":144},"JSON (REST v2.1)",{"type":51,"value":146}," format; the legacy XML format still exists in old configurations).",{"type":38,"tag":87,"props":148,"children":150},{"id":149},"the-events",[151],{"type":51,"value":152},"The events",{"type":38,"tag":39,"props":154,"children":155},{},[156],{"type":51,"value":157},"The two families you will subscribe to:",{"type":38,"tag":159,"props":160,"children":161},"ul",{},[162,208],{"type":38,"tag":163,"props":164,"children":165},"li",{},[166,171,173,179,181,187,188,194,195,201,202],{"type":38,"tag":54,"props":167,"children":168},{},[169],{"type":51,"value":170},"Envelope events",{"type":51,"value":172},": ",{"type":38,"tag":78,"props":174,"children":176},{"className":175},[],[177],{"type":51,"value":178},"envelope-sent",{"type":51,"value":180},", ",{"type":38,"tag":78,"props":182,"children":184},{"className":183},[],[185],{"type":51,"value":186},"envelope-delivered",{"type":51,"value":180},{"type":38,"tag":78,"props":189,"children":191},{"className":190},[],[192],{"type":51,"value":193},"envelope-completed",{"type":51,"value":180},{"type":38,"tag":78,"props":196,"children":198},{"className":197},[],[199],{"type":51,"value":200},"envelope-declined",{"type":51,"value":180},{"type":38,"tag":78,"props":203,"children":205},{"className":204},[],[206],{"type":51,"value":207},"envelope-voided",{"type":38,"tag":163,"props":209,"children":210},{},[211,216,217,223,224,230,231,237,238,244,245,251],{"type":38,"tag":54,"props":212,"children":213},{},[214],{"type":51,"value":215},"Recipient events",{"type":51,"value":172},{"type":38,"tag":78,"props":218,"children":220},{"className":219},[],[221],{"type":51,"value":222},"recipient-sent",{"type":51,"value":180},{"type":38,"tag":78,"props":225,"children":227},{"className":226},[],[228],{"type":51,"value":229},"recipient-delivered",{"type":51,"value":180},{"type":38,"tag":78,"props":232,"children":234},{"className":233},[],[235],{"type":51,"value":236},"recipient-completed",{"type":51,"value":180},{"type":38,"tag":78,"props":239,"children":241},{"className":240},[],[242],{"type":51,"value":243},"recipient-declined",{"type":51,"value":180},{"type":38,"tag":78,"props":246,"children":248},{"className":247},[],[249],{"type":51,"value":250},"recipient-authenticationfailed",{"type":51,"value":252},", and more",{"type":38,"tag":39,"props":254,"children":255},{},[256,258,263],{"type":51,"value":257},"For a typical \"do something when the document is fully signed\" integration, ",{"type":38,"tag":78,"props":259,"children":261},{"className":260},[],[262],{"type":51,"value":193},{"type":51,"value":264}," alone is enough — recipient events are for tracking individual signers through the flow.",{"type":38,"tag":87,"props":266,"children":268},{"id":267},"the-payload",[269],{"type":51,"value":270},"The payload",{"type":38,"tag":39,"props":272,"children":273},{},[274],{"type":51,"value":275},"A JSON delivery looks like this (trimmed):",{"type":38,"tag":277,"props":278,"children":282},"pre",{"className":279,"code":280,"language":281,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n  \"event\": \"envelope-completed\",\n  \"apiVersion\": \"v2.1\",\n  \"uri\": \"/restapi/v2.1/accounts/{accountId}/envelopes/{envelopeId}\",\n  \"retryCount\": 0,\n  \"configurationId\": 10000001,\n  \"generatedDateTime\": \"2026-01-15T10:30:00.0000000Z\",\n  \"data\": {\n    \"accountId\": \"a1b2c3d4-…\",\n    \"envelopeId\": \"e5f6a7b8-…\",\n    \"envelopeSummary\": {\n      \"status\": \"completed\",\n      \"emailSubject\": \"Please sign: Services Agreement\",\n      \"recipients\": { \"signers\": [{ \"name\": \"Alex Doe\", \"status\": \"completed\" }] }\n    }\n  }\n}\n","json",[283],{"type":38,"tag":78,"props":284,"children":285},{"__ignoreMap":7},[286,298,323,345,367,389,411,433,447,469,491,504,526,548,608,617,626],{"type":38,"tag":287,"props":288,"children":291},"span",{"class":289,"line":290},"line",1,[292],{"type":38,"tag":287,"props":293,"children":295},{"style":294},"--shiki-default:#E1E4E8",[296],{"type":51,"value":297},"{\n",{"type":38,"tag":287,"props":299,"children":301},{"class":289,"line":300},2,[302,308,312,318],{"type":38,"tag":287,"props":303,"children":305},{"style":304},"--shiki-default:#79B8FF",[306],{"type":51,"value":307},"  \"event\"",{"type":38,"tag":287,"props":309,"children":310},{"style":294},[311],{"type":51,"value":172},{"type":38,"tag":287,"props":313,"children":315},{"style":314},"--shiki-default:#9ECBFF",[316],{"type":51,"value":317},"\"envelope-completed\"",{"type":38,"tag":287,"props":319,"children":320},{"style":294},[321],{"type":51,"value":322},",\n",{"type":38,"tag":287,"props":324,"children":326},{"class":289,"line":325},3,[327,332,336,341],{"type":38,"tag":287,"props":328,"children":329},{"style":304},[330],{"type":51,"value":331},"  \"apiVersion\"",{"type":38,"tag":287,"props":333,"children":334},{"style":294},[335],{"type":51,"value":172},{"type":38,"tag":287,"props":337,"children":338},{"style":314},[339],{"type":51,"value":340},"\"v2.1\"",{"type":38,"tag":287,"props":342,"children":343},{"style":294},[344],{"type":51,"value":322},{"type":38,"tag":287,"props":346,"children":348},{"class":289,"line":347},4,[349,354,358,363],{"type":38,"tag":287,"props":350,"children":351},{"style":304},[352],{"type":51,"value":353},"  \"uri\"",{"type":38,"tag":287,"props":355,"children":356},{"style":294},[357],{"type":51,"value":172},{"type":38,"tag":287,"props":359,"children":360},{"style":314},[361],{"type":51,"value":362},"\"/restapi/v2.1/accounts/{accountId}/envelopes/{envelopeId}\"",{"type":38,"tag":287,"props":364,"children":365},{"style":294},[366],{"type":51,"value":322},{"type":38,"tag":287,"props":368,"children":370},{"class":289,"line":369},5,[371,376,380,385],{"type":38,"tag":287,"props":372,"children":373},{"style":304},[374],{"type":51,"value":375},"  \"retryCount\"",{"type":38,"tag":287,"props":377,"children":378},{"style":294},[379],{"type":51,"value":172},{"type":38,"tag":287,"props":381,"children":382},{"style":304},[383],{"type":51,"value":384},"0",{"type":38,"tag":287,"props":386,"children":387},{"style":294},[388],{"type":51,"value":322},{"type":38,"tag":287,"props":390,"children":392},{"class":289,"line":391},6,[393,398,402,407],{"type":38,"tag":287,"props":394,"children":395},{"style":304},[396],{"type":51,"value":397},"  \"configurationId\"",{"type":38,"tag":287,"props":399,"children":400},{"style":294},[401],{"type":51,"value":172},{"type":38,"tag":287,"props":403,"children":404},{"style":304},[405],{"type":51,"value":406},"10000001",{"type":38,"tag":287,"props":408,"children":409},{"style":294},[410],{"type":51,"value":322},{"type":38,"tag":287,"props":412,"children":414},{"class":289,"line":413},7,[415,420,424,429],{"type":38,"tag":287,"props":416,"children":417},{"style":304},[418],{"type":51,"value":419},"  \"generatedDateTime\"",{"type":38,"tag":287,"props":421,"children":422},{"style":294},[423],{"type":51,"value":172},{"type":38,"tag":287,"props":425,"children":426},{"style":314},[427],{"type":51,"value":428},"\"2026-01-15T10:30:00.0000000Z\"",{"type":38,"tag":287,"props":430,"children":431},{"style":294},[432],{"type":51,"value":322},{"type":38,"tag":287,"props":434,"children":436},{"class":289,"line":435},8,[437,442],{"type":38,"tag":287,"props":438,"children":439},{"style":304},[440],{"type":51,"value":441},"  \"data\"",{"type":38,"tag":287,"props":443,"children":444},{"style":294},[445],{"type":51,"value":446},": {\n",{"type":38,"tag":287,"props":448,"children":450},{"class":289,"line":449},9,[451,456,460,465],{"type":38,"tag":287,"props":452,"children":453},{"style":304},[454],{"type":51,"value":455},"    \"accountId\"",{"type":38,"tag":287,"props":457,"children":458},{"style":294},[459],{"type":51,"value":172},{"type":38,"tag":287,"props":461,"children":462},{"style":314},[463],{"type":51,"value":464},"\"a1b2c3d4-…\"",{"type":38,"tag":287,"props":466,"children":467},{"style":294},[468],{"type":51,"value":322},{"type":38,"tag":287,"props":470,"children":472},{"class":289,"line":471},10,[473,478,482,487],{"type":38,"tag":287,"props":474,"children":475},{"style":304},[476],{"type":51,"value":477},"    \"envelopeId\"",{"type":38,"tag":287,"props":479,"children":480},{"style":294},[481],{"type":51,"value":172},{"type":38,"tag":287,"props":483,"children":484},{"style":314},[485],{"type":51,"value":486},"\"e5f6a7b8-…\"",{"type":38,"tag":287,"props":488,"children":489},{"style":294},[490],{"type":51,"value":322},{"type":38,"tag":287,"props":492,"children":494},{"class":289,"line":493},11,[495,500],{"type":38,"tag":287,"props":496,"children":497},{"style":304},[498],{"type":51,"value":499},"    \"envelopeSummary\"",{"type":38,"tag":287,"props":501,"children":502},{"style":294},[503],{"type":51,"value":446},{"type":38,"tag":287,"props":505,"children":507},{"class":289,"line":506},12,[508,513,517,522],{"type":38,"tag":287,"props":509,"children":510},{"style":304},[511],{"type":51,"value":512},"      \"status\"",{"type":38,"tag":287,"props":514,"children":515},{"style":294},[516],{"type":51,"value":172},{"type":38,"tag":287,"props":518,"children":519},{"style":314},[520],{"type":51,"value":521},"\"completed\"",{"type":38,"tag":287,"props":523,"children":524},{"style":294},[525],{"type":51,"value":322},{"type":38,"tag":287,"props":527,"children":529},{"class":289,"line":528},13,[530,535,539,544],{"type":38,"tag":287,"props":531,"children":532},{"style":304},[533],{"type":51,"value":534},"      \"emailSubject\"",{"type":38,"tag":287,"props":536,"children":537},{"style":294},[538],{"type":51,"value":172},{"type":38,"tag":287,"props":540,"children":541},{"style":314},[542],{"type":51,"value":543},"\"Please sign: Services Agreement\"",{"type":38,"tag":287,"props":545,"children":546},{"style":294},[547],{"type":51,"value":322},{"type":38,"tag":287,"props":549,"children":551},{"class":289,"line":550},14,[552,557,562,567,572,577,581,586,590,595,599,603],{"type":38,"tag":287,"props":553,"children":554},{"style":304},[555],{"type":51,"value":556},"      \"recipients\"",{"type":38,"tag":287,"props":558,"children":559},{"style":294},[560],{"type":51,"value":561},": { ",{"type":38,"tag":287,"props":563,"children":564},{"style":304},[565],{"type":51,"value":566},"\"signers\"",{"type":38,"tag":287,"props":568,"children":569},{"style":294},[570],{"type":51,"value":571},": [{ ",{"type":38,"tag":287,"props":573,"children":574},{"style":304},[575],{"type":51,"value":576},"\"name\"",{"type":38,"tag":287,"props":578,"children":579},{"style":294},[580],{"type":51,"value":172},{"type":38,"tag":287,"props":582,"children":583},{"style":314},[584],{"type":51,"value":585},"\"Alex Doe\"",{"type":38,"tag":287,"props":587,"children":588},{"style":294},[589],{"type":51,"value":180},{"type":38,"tag":287,"props":591,"children":592},{"style":304},[593],{"type":51,"value":594},"\"status\"",{"type":38,"tag":287,"props":596,"children":597},{"style":294},[598],{"type":51,"value":172},{"type":38,"tag":287,"props":600,"children":601},{"style":314},[602],{"type":51,"value":521},{"type":38,"tag":287,"props":604,"children":605},{"style":294},[606],{"type":51,"value":607}," }] }\n",{"type":38,"tag":287,"props":609,"children":611},{"class":289,"line":610},15,[612],{"type":38,"tag":287,"props":613,"children":614},{"style":294},[615],{"type":51,"value":616},"    }\n",{"type":38,"tag":287,"props":618,"children":620},{"class":289,"line":619},16,[621],{"type":38,"tag":287,"props":622,"children":623},{"style":294},[624],{"type":51,"value":625},"  }\n",{"type":38,"tag":287,"props":627,"children":629},{"class":289,"line":628},17,[630],{"type":38,"tag":287,"props":631,"children":632},{"style":294},[633],{"type":51,"value":634},"}\n",{"type":38,"tag":39,"props":636,"children":637},{},[638],{"type":51,"value":639},"Notes from real traffic:",{"type":38,"tag":159,"props":641,"children":642},{},[643,666,678],{"type":38,"tag":163,"props":644,"children":645},{},[646,656,658,664],{"type":38,"tag":54,"props":647,"children":648},{},[649,654],{"type":38,"tag":78,"props":650,"children":652},{"className":651},[],[653],{"type":51,"value":83},{"type":51,"value":655}," is your friend.",{"type":51,"value":657}," Zero means first attempt; anything higher means DocuSign already tried and failed. Use it together with ",{"type":38,"tag":78,"props":659,"children":661},{"className":660},[],[662],{"type":51,"value":663},"data.envelopeId",{"type":51,"value":665}," for idempotency.",{"type":38,"tag":163,"props":667,"children":668},{},[669,671,676],{"type":51,"value":670},"Enable ",{"type":38,"tag":54,"props":672,"children":673},{},[674],{"type":51,"value":675},"include options",{"type":51,"value":677}," (documents, certificate of completion) only if you need them — payloads grow from a few KB to whole signed PDFs base64-encoded inline.",{"type":38,"tag":163,"props":679,"children":680},{},[681,683,688,690,695,697,702],{"type":51,"value":682},"The ",{"type":38,"tag":69,"props":684,"children":685},{"href":71},[686],{"type":51,"value":687},"Webhook Bin sample catalog",{"type":51,"value":689}," includes real-shaped ",{"type":38,"tag":78,"props":691,"children":693},{"className":692},[],[694],{"type":51,"value":229},{"type":51,"value":696}," and ",{"type":38,"tag":78,"props":698,"children":700},{"className":699},[],[701],{"type":51,"value":193},{"type":51,"value":703}," events you can POST at your handler with one click.",{"type":38,"tag":87,"props":705,"children":707},{"id":706},"verify-the-hmac-signature",[708],{"type":51,"value":709},"Verify the HMAC signature",{"type":38,"tag":39,"props":711,"children":712},{},[713,715,720],{"type":51,"value":714},"Connect deliveries are ",{"type":38,"tag":54,"props":716,"children":717},{},[718],{"type":51,"value":719},"unsigned by default",{"type":51,"value":721}," — you must enable HMAC on the configuration and store the generated key (DocuSign shows it once). After that, every delivery carries:",{"type":38,"tag":277,"props":723,"children":726},{"className":724,"code":725,"language":51,"meta":7,"style":7},"language-text shiki shiki-themes github-dark","X-DocuSign-Signature-1: Base64(HMAC-SHA256(raw_body, key))\n",[727],{"type":38,"tag":78,"props":728,"children":729},{"__ignoreMap":7},[730],{"type":38,"tag":287,"props":731,"children":732},{"class":289,"line":290},[733],{"type":38,"tag":287,"props":734,"children":735},{},[736],{"type":51,"value":725},{"type":38,"tag":39,"props":738,"children":739},{},[740,742,748,749,755,757,763,765,771],{"type":51,"value":741},"Additional active keys arrive as ",{"type":38,"tag":78,"props":743,"children":745},{"className":744},[],[746],{"type":51,"value":747},"X-DocuSign-Signature-2",{"type":51,"value":180},{"type":38,"tag":78,"props":750,"children":752},{"className":751},[],[753],{"type":51,"value":754},"-3",{"type":51,"value":756},", … (up to 100), which is how you rotate keys with zero downtime — verify against each active key and accept on any match. Test your implementation interactively with our free ",{"type":38,"tag":69,"props":758,"children":760},{"href":759},"/verify-docusign-webhook-signature",[761],{"type":51,"value":762},"DocuSign webhook signature verifier",{"type":51,"value":764},", and read ",{"type":38,"tag":69,"props":766,"children":768},{"href":767},"/blog/verify-webhook-signature",[769],{"type":51,"value":770},"Verify a webhook signature",{"type":51,"value":772}," for the general pitfalls (raw bytes, constant-time comparison).",{"type":38,"tag":87,"props":774,"children":776},{"id":775},"listener-best-practices-designed-around-the-retries",[777],{"type":51,"value":778},"Listener best practices — designed around the retries",{"type":38,"tag":39,"props":780,"children":781},{},[782,784,789],{"type":51,"value":783},"DocuSign's delivery contract: answer ",{"type":38,"tag":54,"props":785,"children":786},{},[787],{"type":51,"value":788},"2xx within 100 seconds",{"type":51,"value":790}," or the delivery counts as failed and enters the retry queue (roughly 24 hours of attempts at growing intervals). That, plus what we observe in the wild (20+ retries against dead endpoints), dictates the architecture:",{"type":38,"tag":792,"props":793,"children":794},"ol",{},[795,813,839,871],{"type":38,"tag":163,"props":796,"children":797},{},[798,803,805,811],{"type":38,"tag":54,"props":799,"children":800},{},[801],{"type":51,"value":802},"Acknowledge fast, process later.",{"type":51,"value":804}," Persist the raw delivery to a queue and return ",{"type":38,"tag":78,"props":806,"children":808},{"className":807},[],[809],{"type":51,"value":810},"200",{"type":51,"value":812}," immediately. Never do the PDF download or the CRM write inline.",{"type":38,"tag":163,"props":814,"children":815},{},[816,821,823,829,831,837],{"type":38,"tag":54,"props":817,"children":818},{},[819],{"type":51,"value":820},"Be idempotent.",{"type":51,"value":822}," Key on ",{"type":38,"tag":78,"props":824,"children":826},{"className":825},[],[827],{"type":51,"value":828},"envelopeId",{"type":51,"value":830}," + ",{"type":38,"tag":78,"props":832,"children":834},{"className":833},[],[835],{"type":51,"value":836},"event",{"type":51,"value":838}," + status; retries and out-of-order deliveries both happen.",{"type":38,"tag":163,"props":840,"children":841},{},[842,847,849,854,856,861,863,869],{"type":38,"tag":54,"props":843,"children":844},{},[845],{"type":51,"value":846},"Do not trust event ordering.",{"type":51,"value":848}," A ",{"type":38,"tag":78,"props":850,"children":852},{"className":851},[],[853],{"type":51,"value":236},{"type":51,"value":855}," retry can arrive after the ",{"type":38,"tag":78,"props":857,"children":859},{"className":858},[],[860],{"type":51,"value":193},{"type":51,"value":862}," that logically follows it. Treat each event as \"fetch current state if in doubt\" — the ",{"type":38,"tag":78,"props":864,"children":866},{"className":865},[],[867],{"type":51,"value":868},"uri",{"type":51,"value":870}," field gives you the exact API path.",{"type":38,"tag":163,"props":872,"children":873},{},[874,879,881,887],{"type":38,"tag":54,"props":875,"children":876},{},[877],{"type":51,"value":878},"Keep the endpoint stable.",{"type":51,"value":880}," Every URL change re-enters the config UI. A stable relay endpoint in front (with ",{"type":38,"tag":69,"props":882,"children":884},{"href":883},"/features/durable-retries",[885],{"type":51,"value":886},"storage and up to 30 days of retries towards your side",{"type":51,"value":888},") decouples DocuSign's configuration from your infrastructure — deploys and outages on your end stop being delivery failures DocuSign has to retry.",{"type":38,"tag":87,"props":890,"children":892},{"id":891},"local-development",[893],{"type":51,"value":894},"Local development",{"type":38,"tag":39,"props":896,"children":897},{},[898,900,905,907,913,915,921],{"type":51,"value":899},"DocuSign only POSTs to public HTTPS URLs. For the dev loop — inspect the payload in a ",{"type":38,"tag":69,"props":901,"children":902},{"href":71},[903],{"type":51,"value":904},"Webhook Bin",{"type":51,"value":906},", then forward live events to ",{"type":38,"tag":78,"props":908,"children":910},{"className":909},[],[911],{"type":51,"value":912},"localhost",{"type":51,"value":914}," with the relay agent — follow ",{"type":38,"tag":69,"props":916,"children":918},{"href":917},"/blog/receive-docusign-webhooks-locally",[919],{"type":51,"value":920},"Test DocuSign webhooks locally",{"type":51,"value":125},{"type":38,"tag":87,"props":923,"children":925},{"id":924},"related-reading",[926],{"type":51,"value":927},"Related reading",{"type":38,"tag":159,"props":929,"children":930},{},[931,938,947,954],{"type":38,"tag":163,"props":932,"children":933},{},[934],{"type":38,"tag":69,"props":935,"children":936},{"href":917},[937],{"type":51,"value":920},{"type":38,"tag":163,"props":939,"children":940},{},[941,945],{"type":38,"tag":69,"props":942,"children":943},{"href":759},[944],{"type":51,"value":762},{"type":51,"value":946}," — free, in-browser",{"type":38,"tag":163,"props":948,"children":949},{},[950],{"type":38,"tag":69,"props":951,"children":952},{"href":767},[953],{"type":51,"value":770},{"type":38,"tag":163,"props":955,"children":956},{},[957],{"type":38,"tag":69,"props":958,"children":960},{"href":959},"/blog/how-to-test-webhooks",[961],{"type":51,"value":962},"How to test webhooks",{"type":38,"tag":964,"props":965,"children":966},"style",{},[967],{"type":51,"value":968},"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":325,"depth":325,"links":970},[971,972,973,974,975,976,977],{"id":89,"depth":300,"text":92},{"id":149,"depth":300,"text":152},{"id":267,"depth":300,"text":270},{"id":706,"depth":300,"text":709},{"id":775,"depth":300,"text":778},{"id":891,"depth":300,"text":894},{"id":924,"depth":300,"text":927},"markdown","content:blog:docusign-connect-webhooks.md","content","blog/docusign-connect-webhooks.md","blog/docusign-connect-webhooks","md",{"loc":4},1783373261110]