[{"data":1,"prerenderedAt":1235},["ShallowReactive",2],{"search-de":3,"content-de-api\u002Fwebhook-payloads":4,"surround-de-\u002Fapi\u002Fwebhook-payloads":1226},[],{"id":5,"title":6,"body":7,"description":1218,"extension":1219,"meta":1220,"navigation":1221,"path":1222,"seo":1223,"stem":1224,"__hash__":1225},"content_de\u002F2.api\u002F12.webhook-payloads.md","Webhook-Payloads",{"type":8,"value":9,"toc":1189},"minimark",[10,25,43,48,51,121,151,156,159,233,244,253,259,287,291,294,300,313,372,377,380,411,417,420,450,456,459,502,508,519,574,580,583,613,617,623,630,686,756,760,766,774,870,899,961,966,969,1015,1019,1025,1057,1063,1067,1073,1104,1111,1164,1171,1175,1179,1182,1185],[11,12,13,14,18,19,24],"p",{},"Dies ist der maßgebliche Wire-Contract für die ausgehenden Webhooks, die Owlat an ",[15,16,17],"em",{},"Ihre"," Endpunkte sendet. Um Abonnements zu konfigurieren, Signaturen zu prüfen und das Retry-Verhalten auf höherer Ebene zu verstehen, beginnen Sie mit der ",[20,21,23],"a",{"href":22},"\u002Fapi\u002Fwebhooks","Webhooks","-Referenz; diese Seite dokumentiert die exakte JSON-Struktur jedes Ereignisses.",[26,27,30],"callout",{"title":28,"type":29},"Payload-Version 1 — eingefroren","info",[11,31,32,33,37,38,42],{},"Jedes nachfolgende Payload ist zum Stand ",[34,35,36],"code",{},"payloadVersion"," 1 eingefroren. Ein Feld umzubenennen, einen Typ zu ändern, ein Feld zu entfernen oder ein Pflichtfeld hinzuzufügen, ist für Empfänger ein Breaking Change und erfordert eine Anhebung der Payload-Version. Einen völlig neuen Ereignistyp hinzuzufügen ist ",[39,40,41],"strong",{},"kein"," Breaking Change, sofern Ihr Handler unbekannte Ereignisse ignoriert.",[44,45,47],"h2",{"id":46},"envelope","Envelope",[11,49,50],{},"Jede Zustellung ist die JSON-serialisierte Form dieses Envelopes:",[52,53,58],"pre",{"className":54,"code":55,"language":56,"meta":57,"style":57},"language-json shiki shiki-themes github-light github-dark-dimmed","{\n  \"event\": \"\u003Cevent-name>\",\n  \"timestamp\": \"\u003CISO-8601 UTC>\",\n  \"data\": { \u002F* event-specific, see below *\u002F }\n}\n","json","",[34,59,60,69,86,99,115],{"__ignoreMap":57},[61,62,65],"span",{"class":63,"line":64},"line",1,[61,66,68],{"class":67},"sYgZi","{\n",[61,70,72,76,79,83],{"class":63,"line":71},2,[61,73,75],{"class":74},"snmFh","  \"event\"",[61,77,78],{"class":67},": ",[61,80,82],{"class":81},"s-HuK","\"\u003Cevent-name>\"",[61,84,85],{"class":67},",\n",[61,87,89,92,94,97],{"class":63,"line":88},3,[61,90,91],{"class":74},"  \"timestamp\"",[61,93,78],{"class":67},[61,95,96],{"class":81},"\"\u003CISO-8601 UTC>\"",[61,98,85],{"class":67},[61,100,102,105,108,112],{"class":63,"line":101},4,[61,103,104],{"class":74},"  \"data\"",[61,106,107],{"class":67},": { ",[61,109,111],{"class":110},"sDN9O","\u002F* event-specific, see below *\u002F",[61,113,114],{"class":67}," }\n",[61,116,118],{"class":63,"line":117},5,[61,119,120],{"class":67},"}\n",[122,123,124,135,141],"ul",{},[125,126,127,130,131,134],"li",{},[34,128,129],{},"event"," — das Ereignis-Literal, z. B. ",[34,132,133],{},"email.delivered",".",[125,136,137,140],{},[34,138,139],{},"timestamp"," — Zeitpunkt, zu dem der Envelope erzeugt wurde, als ISO-8601-UTC-String.",[125,142,143,146,147,150],{},[34,144,145],{},"data"," — das ereignisspezifische Payload. Der HTTP-Request-Body ist exakt die Zeichenkette ",[34,148,149],{},"JSON.stringify({ event, timestamp, data })",", und die HMAC-Signatur wird über genau diese Zeichenkette berechnet.",[152,153,155],"h3",{"id":154},"signatur-header","Signatur-Header",[11,157,158],{},"Jede Zustellung trägt diese Header:",[160,161,162,175],"table",{},[163,164,165],"thead",{},[166,167,168,172],"tr",{},[169,170,171],"th",{},"Header",[169,173,174],{},"Wert",[176,177,178,189,199,209,221],"tbody",{},[166,179,180,186],{},[181,182,183],"td",{},[34,184,185],{},"X-Signature",[181,187,188],{},"HMAC-SHA256 des Request-Bodys, hex-kodiert, mit Ihrem Webhook-Secret als Schlüssel",[166,190,191,196],{},[181,192,193],{},[34,194,195],{},"X-Timestamp",[181,197,198],{},"Unix-Sekunden zum Zeitpunkt des Zustellversuchs",[166,200,201,206],{},[181,202,203],{},[34,204,205],{},"X-Webhook-Id",[181,207,208],{},"Convex-ID des Webhook-Abonnements",[166,210,211,216],{},[181,212,213],{},[34,214,215],{},"User-Agent",[181,217,218],{},[34,219,220],{},"Owlat-Webhooks\u002F1.0",[166,222,223,228],{},[181,224,225],{},[34,226,227],{},"Content-Type",[181,229,230],{},[34,231,232],{},"application\u002Fjson",[11,234,235,236,239,240,134],{},"Webhook-Secrets verwenden das Format ",[34,237,238],{},"whsec_..."," und werden beim Anlegen des Webhooks erzeugt. Prüfen Sie die Signatur, indem Sie den HMAC über den rohen Body neu berechnen und in konstanter Zeit vergleichen — siehe das ",[20,241,243],{"href":242},"\u002Fapi\u002Fwebhooks#signature-verification","Verifizierungsbeispiel in der Webhooks-Referenz",[26,245,248],{"title":246,"type":247},"Über den rohen Body signieren, nicht über ein neu serialisiertes Objekt","warning",[11,249,250,252],{},[34,251,185],{}," wird über die wörtlichen Request-Bytes berechnet. Wenn Ihr Framework das JSON parst und neu serialisiert, bevor Sie es hashen, können sich Schlüsselreihenfolge oder Leerzeichen ändern und die Signatur stimmt nicht überein. Lesen Sie zuerst den rohen Body-String, verifizieren Sie ihn und parsen Sie erst danach.",[152,254,256,257],{"id":255},"strukturvorgaben-für-data","Strukturvorgaben für ",[34,258,145],{},[11,260,261,262,264,265,78,268,271,272,271,275,278,279,282,283,286],{},"In Payload-Version 1 ist ",[34,263,145],{}," eine ",[39,266,267],{},"flache Map aus Primitiven",[34,269,270],{},"string",", ",[34,273,274],{},"number",[34,276,277],{},"boolean"," oder ",[34,280,281],{},"null",". Es gibt keine verschachtelten Objekte oder Arrays. Alles Strukturierte wird JSON-kodiert in ein String-Feld gelegt — siehe ",[34,284,285],{},"topic.unsubscribed.listsRemoved"," weiter unten. Eine künftige Payload-Version kann diese Vorgabe lockern.",[44,288,290],{"id":289},"e-mail-ereignisse","E-Mail-Ereignisse",[11,292,293],{},"Diese werden ausgelöst, während eine Kampagnen- oder transaktionale E-Mail Versand, Zustellung und Interaktion durchläuft.",[152,295,297],{"id":296},"emailsent",[34,298,299],{},"email.sent",[11,301,302,303,306,307,310,311,134],{},"Wird ausgelöst, wenn eine Kampagnen- oder transaktionale E-Mail an den Versanddienst übergeben wird. Genau eines von ",[34,304,305],{},"campaignId"," \u002F ",[34,308,309],{},"transactionalEmailId"," ist gesetzt; das jeweils andere ist ",[34,312,281],{},[52,314,316],{"className":54,"code":315,"language":56,"meta":57,"style":57},"{\n  \"email\": \"recipient@example.com\",\n  \"campaignId\": \"\u003CId\u003C'campaigns'> | null>\",\n  \"transactionalEmailId\": \"\u003CId\u003C'transactionalEmails'> | null>\",\n  \"timestamp\": \"\u003CISO-8601>\"\n}\n",[34,317,318,322,334,346,358,367],{"__ignoreMap":57},[61,319,320],{"class":63,"line":64},[61,321,68],{"class":67},[61,323,324,327,329,332],{"class":63,"line":71},[61,325,326],{"class":74},"  \"email\"",[61,328,78],{"class":67},[61,330,331],{"class":81},"\"recipient@example.com\"",[61,333,85],{"class":67},[61,335,336,339,341,344],{"class":63,"line":88},[61,337,338],{"class":74},"  \"campaignId\"",[61,340,78],{"class":67},[61,342,343],{"class":81},"\"\u003CId\u003C'campaigns'> | null>\"",[61,345,85],{"class":67},[61,347,348,351,353,356],{"class":63,"line":101},[61,349,350],{"class":74},"  \"transactionalEmailId\"",[61,352,78],{"class":67},[61,354,355],{"class":81},"\"\u003CId\u003C'transactionalEmails'> | null>\"",[61,357,85],{"class":67},[61,359,360,362,364],{"class":63,"line":117},[61,361,91],{"class":74},[61,363,78],{"class":67},[61,365,366],{"class":81},"\"\u003CISO-8601>\"\n",[61,368,370],{"class":63,"line":369},6,[61,371,120],{"class":67},[152,373,375],{"id":374},"emaildelivered",[34,376,133],{},[11,378,379],{},"Wird ausgelöst, wenn der empfangende Mailserver die Zustellung annimmt.",[52,381,383],{"className":54,"code":382,"language":56,"meta":57,"style":57},"{\n  \"email\": \"recipient@example.com\",\n  \"timestamp\": \"\u003CISO-8601>\"\n}\n",[34,384,385,389,399,407],{"__ignoreMap":57},[61,386,387],{"class":63,"line":64},[61,388,68],{"class":67},[61,390,391,393,395,397],{"class":63,"line":71},[61,392,326],{"class":74},[61,394,78],{"class":67},[61,396,331],{"class":81},[61,398,85],{"class":67},[61,400,401,403,405],{"class":63,"line":88},[61,402,91],{"class":74},[61,404,78],{"class":67},[61,406,366],{"class":81},[61,408,409],{"class":63,"line":101},[61,410,120],{"class":67},[152,412,414],{"id":413},"emailopened",[34,415,416],{},"email.opened",[11,418,419],{},"Wird beim ersten Öffnen ausgelöst, erfasst über ein 1×1-Pixel-Beacon.",[52,421,422],{"className":54,"code":382,"language":56,"meta":57,"style":57},[34,423,424,428,438,446],{"__ignoreMap":57},[61,425,426],{"class":63,"line":64},[61,427,68],{"class":67},[61,429,430,432,434,436],{"class":63,"line":71},[61,431,326],{"class":74},[61,433,78],{"class":67},[61,435,331],{"class":81},[61,437,85],{"class":67},[61,439,440,442,444],{"class":63,"line":88},[61,441,91],{"class":74},[61,443,78],{"class":67},[61,445,366],{"class":81},[61,447,448],{"class":63,"line":101},[61,449,120],{"class":67},[152,451,453],{"id":452},"emailclicked",[34,454,455],{},"email.clicked",[11,457,458],{},"Wird bei jedem Linkklick ausgelöst, über die Weiterleitung der getrackten URL.",[52,460,462],{"className":54,"code":461,"language":56,"meta":57,"style":57},"{\n  \"email\": \"recipient@example.com\",\n  \"url\": \"https:\u002F\u002Fwww.example.com\u002Flanding\",\n  \"timestamp\": \"\u003CISO-8601>\"\n}\n",[34,463,464,468,478,490,498],{"__ignoreMap":57},[61,465,466],{"class":63,"line":64},[61,467,68],{"class":67},[61,469,470,472,474,476],{"class":63,"line":71},[61,471,326],{"class":74},[61,473,78],{"class":67},[61,475,331],{"class":81},[61,477,85],{"class":67},[61,479,480,483,485,488],{"class":63,"line":88},[61,481,482],{"class":74},"  \"url\"",[61,484,78],{"class":67},[61,486,487],{"class":81},"\"https:\u002F\u002Fwww.example.com\u002Flanding\"",[61,489,85],{"class":67},[61,491,492,494,496],{"class":63,"line":101},[61,493,91],{"class":74},[61,495,78],{"class":67},[61,497,366],{"class":81},[61,499,500],{"class":63,"line":117},[61,501,120],{"class":67},[152,503,505],{"id":504},"emailbounced",[34,506,507],{},"email.bounced",[11,509,510,511,514,515,518],{},"Wird bei einem harten oder weichen Bounce ausgelöst, den der Dienst meldet. ",[34,512,513],{},"message"," ist der vom Dienst gelieferte Grund oder ein leerer String ",[34,516,517],{},"\"\"",", wenn keiner angegeben wurde.",[52,520,522],{"className":54,"code":521,"language":56,"meta":57,"style":57},"{\n  \"email\": \"recipient@example.com\",\n  \"bounceType\": \"hard | soft\",\n  \"message\": \"\u003Cprovider reason or ''>\",\n  \"timestamp\": \"\u003CISO-8601>\"\n}\n",[34,523,524,528,538,550,562,570],{"__ignoreMap":57},[61,525,526],{"class":63,"line":64},[61,527,68],{"class":67},[61,529,530,532,534,536],{"class":63,"line":71},[61,531,326],{"class":74},[61,533,78],{"class":67},[61,535,331],{"class":81},[61,537,85],{"class":67},[61,539,540,543,545,548],{"class":63,"line":88},[61,541,542],{"class":74},"  \"bounceType\"",[61,544,78],{"class":67},[61,546,547],{"class":81},"\"hard | soft\"",[61,549,85],{"class":67},[61,551,552,555,557,560],{"class":63,"line":101},[61,553,554],{"class":74},"  \"message\"",[61,556,78],{"class":67},[61,558,559],{"class":81},"\"\u003Cprovider reason or ''>\"",[61,561,85],{"class":67},[61,563,564,566,568],{"class":63,"line":117},[61,565,91],{"class":74},[61,567,78],{"class":67},[61,569,366],{"class":81},[61,571,572],{"class":63,"line":369},[61,573,120],{"class":67},[152,575,577],{"id":576},"emailcomplained",[34,578,579],{},"email.complained",[11,581,582],{},"Wird ausgelöst, wenn der Empfänger die E-Mail als Spam markiert (Feedback-Loop des Dienstes).",[52,584,585],{"className":54,"code":382,"language":56,"meta":57,"style":57},[34,586,587,591,601,609],{"__ignoreMap":57},[61,588,589],{"class":63,"line":64},[61,590,68],{"class":67},[61,592,593,595,597,599],{"class":63,"line":71},[61,594,326],{"class":74},[61,596,78],{"class":67},[61,598,331],{"class":81},[61,600,85],{"class":67},[61,602,603,605,607],{"class":63,"line":88},[61,604,91],{"class":74},[61,606,78],{"class":67},[61,608,366],{"class":81},[61,610,611],{"class":63,"line":101},[61,612,120],{"class":67},[44,614,616],{"id":615},"kontaktereignisse","Kontaktereignisse",[152,618,620],{"id":619},"contactcreated",[34,621,622],{},"contact.created",[11,624,625,626,629],{},"Wird ausgelöst, wenn ein neuer Kontakt hinzugefügt wird. ",[34,627,628],{},"source"," hält fest, wie der Kontakt ins System gelangt ist.",[52,631,633],{"className":54,"code":632,"language":56,"meta":57,"style":57},"{\n  \"contactId\": \"\u003CId\u003C'contacts'>>\",\n  \"email\": \"person@example.com\",\n  \"source\": \"api | import | form | transactional | inbound\",\n  \"timestamp\": \"\u003CISO-8601>\"\n}\n",[34,634,635,639,651,662,674,682],{"__ignoreMap":57},[61,636,637],{"class":63,"line":64},[61,638,68],{"class":67},[61,640,641,644,646,649],{"class":63,"line":71},[61,642,643],{"class":74},"  \"contactId\"",[61,645,78],{"class":67},[61,647,648],{"class":81},"\"\u003CId\u003C'contacts'>>\"",[61,650,85],{"class":67},[61,652,653,655,657,660],{"class":63,"line":88},[61,654,326],{"class":74},[61,656,78],{"class":67},[61,658,659],{"class":81},"\"person@example.com\"",[61,661,85],{"class":67},[61,663,664,667,669,672],{"class":63,"line":101},[61,665,666],{"class":74},"  \"source\"",[61,668,78],{"class":67},[61,670,671],{"class":81},"\"api | import | form | transactional | inbound\"",[61,673,85],{"class":67},[61,675,676,678,680],{"class":63,"line":117},[61,677,91],{"class":74},[61,679,78],{"class":67},[61,681,366],{"class":81},[61,683,684],{"class":63,"line":369},[61,685,120],{"class":67},[160,687,688,699],{},[163,689,690],{},[166,691,692,696],{},[169,693,694],{},[34,695,628],{},[169,697,698],{},"Bedeutung",[176,700,701,716,726,736,746],{},[166,702,703,708],{},[181,704,705],{},[34,706,707],{},"api",[181,709,710,711,715],{},"Über die ",[20,712,714],{"href":713},"\u002Fapi\u002Fcontacts","Kontakte-API"," angelegt",[166,717,718,723],{},[181,719,720],{},[34,721,722],{},"import",[181,724,725],{},"Über einen CSV-Import hinzugefügt",[166,727,728,733],{},[181,729,730],{},[34,731,732],{},"form",[181,734,735],{},"Hat ein gehostetes Formular abgesendet",[166,737,738,743],{},[181,739,740],{},[34,741,742],{},"transactional",[181,744,745],{},"Beim Versand einer transaktionalen E-Mail automatisch angelegt",[166,747,748,753],{},[181,749,750],{},[34,751,752],{},"inbound",[181,754,755],{},"Aus einer eingehenden Nachricht erstellt",[44,757,759],{"id":758},"themen-ereignisse","Themen-Ereignisse",[152,761,763],{"id":762},"topicunsubscribed",[34,764,765],{},"topic.unsubscribed",[11,767,768,769,773],{},"Wird ausgelöst, wenn sich ein Kontakt von einem oder mehreren ",[20,770,772],{"href":771},"\u002Fguide\u002Ftopics","Themen"," abmeldet.",[52,775,777],{"className":54,"code":776,"language":56,"meta":57,"style":57},"{\n  \"contactId\": \"\u003CId\u003C'contacts'>>\",\n  \"email\": \"person@example.com\",\n  \"unsubscribedAt\": 1710505200000,\n  \"listsRemoved\": \"[{\\\"topicId\\\":\\\"...\\\",\\\"topicName\\\":\\\"...\\\"}]\"\n}\n",[34,778,779,783,793,803,816,866],{"__ignoreMap":57},[61,780,781],{"class":63,"line":64},[61,782,68],{"class":67},[61,784,785,787,789,791],{"class":63,"line":71},[61,786,643],{"class":74},[61,788,78],{"class":67},[61,790,648],{"class":81},[61,792,85],{"class":67},[61,794,795,797,799,801],{"class":63,"line":88},[61,796,326],{"class":74},[61,798,78],{"class":67},[61,800,659],{"class":81},[61,802,85],{"class":67},[61,804,805,808,810,814],{"class":63,"line":101},[61,806,807],{"class":74},"  \"unsubscribedAt\"",[61,809,78],{"class":67},[61,811,813],{"class":812},"sviXB","1710505200000",[61,815,85],{"class":67},[61,817,818,821,823,826,830,833,835,838,840,843,845,848,850,853,855,857,859,861,863],{"class":63,"line":117},[61,819,820],{"class":74},"  \"listsRemoved\"",[61,822,78],{"class":67},[61,824,825],{"class":81},"\"[{",[61,827,829],{"class":828},"s74oq","\\\"",[61,831,832],{"class":81},"topicId",[61,834,829],{"class":828},[61,836,837],{"class":81},":",[61,839,829],{"class":828},[61,841,842],{"class":81},"...",[61,844,829],{"class":828},[61,846,847],{"class":81},",",[61,849,829],{"class":828},[61,851,852],{"class":81},"topicName",[61,854,829],{"class":828},[61,856,837],{"class":81},[61,858,829],{"class":828},[61,860,842],{"class":81},[61,862,829],{"class":828},[61,864,865],{"class":81},"}]\"\n",[61,867,868],{"class":63,"line":369},[61,869,120],{"class":67},[26,871,873],{"title":872,"type":247},"listsRemoved ist ein JSON-kodierter String",[11,874,875,876,879,880,883,884,887,888,891,892,895,896,898],{},"Da Payload-Version 1 nur flache Primitive erlaubt, ist ",[34,877,878],{},"listsRemoved"," ein ",[39,881,882],{},"String",", der JSON enthält, und kein Array. Sie müssen ihn mit ",[34,885,886],{},"JSON.parse"," einlesen, um die Einträge zu lesen. Jeder Eintrag hat die Form ",[34,889,890],{},"{ topicId, topicName }",". Beachten Sie außerdem, dass ",[34,893,894],{},"unsubscribedAt"," Epoch-Millisekunden enthält (eine Zahl), anders als das ISO-8601-",[34,897,139],{}," der E-Mail-Ereignisse.",[52,900,904],{"className":901,"code":902,"language":903,"meta":57,"style":57},"language-typescript shiki shiki-themes github-light github-dark-dimmed","const removed: Array\u003C{ topicId: string; topicName: string }> =\n  JSON.parse(data.listsRemoved)\n","typescript",[34,905,906,947],{"__ignoreMap":57},[61,907,908,912,915,917,921,924,927,929,932,935,937,939,941,944],{"class":63,"line":64},[61,909,911],{"class":910},"s7YZ4","const",[61,913,914],{"class":812}," removed",[61,916,837],{"class":910},[61,918,920],{"class":919},"sOLd2"," Array",[61,922,923],{"class":67},"\u003C{ ",[61,925,832],{"class":926},"stnAF",[61,928,837],{"class":910},[61,930,931],{"class":812}," string",[61,933,934],{"class":67},"; ",[61,936,852],{"class":926},[61,938,837],{"class":910},[61,940,931],{"class":812},[61,942,943],{"class":67}," }> ",[61,945,946],{"class":910},"=\n",[61,948,949,952,954,958],{"class":63,"line":71},[61,950,951],{"class":812},"  JSON",[61,953,134],{"class":67},[61,955,957],{"class":956},"sPO5f","parse",[61,959,960],{"class":67},"(data.listsRemoved)\n",[44,962,964],{"id":963},"test",[34,965,963],{},[11,967,968],{},"Nicht abonnierbar — wird nur gesendet, wenn Sie im Webhook-Dashboard den Testauslöser verwenden, um einen Empfänger-Endpunkt zu prüfen. Nutzen Sie ihn, um Erreichbarkeit und Signaturprüfung Ihres Endpunkts zu bestätigen, bevor Sie sich auf Live-Ereignisse verlassen.",[52,970,972],{"className":54,"code":971,"language":56,"meta":57,"style":57},"{\n  \"message\": \"This is a test webhook from Owlat\",\n  \"webhookId\": \"\u003CId\u003C'webhooks'>>\",\n  \"webhookName\": \"\u003Cyour label>\"\n}\n",[34,973,974,978,989,1001,1011],{"__ignoreMap":57},[61,975,976],{"class":63,"line":64},[61,977,68],{"class":67},[61,979,980,982,984,987],{"class":63,"line":71},[61,981,554],{"class":74},[61,983,78],{"class":67},[61,985,986],{"class":81},"\"This is a test webhook from Owlat\"",[61,988,85],{"class":67},[61,990,991,994,996,999],{"class":63,"line":88},[61,992,993],{"class":74},"  \"webhookId\"",[61,995,78],{"class":67},[61,997,998],{"class":81},"\"\u003CId\u003C'webhooks'>>\"",[61,1000,85],{"class":67},[61,1002,1003,1006,1008],{"class":63,"line":101},[61,1004,1005],{"class":74},"  \"webhookName\"",[61,1007,78],{"class":67},[61,1009,1010],{"class":81},"\"\u003Cyour label>\"\n",[61,1012,1013],{"class":63,"line":117},[61,1014,120],{"class":67},[44,1016,1018],{"id":1017},"payload-version-und-vorwärtskompatibilität","Payload-Version und Vorwärtskompatibilität",[11,1020,1021,1022,1024],{},"Der Envelope trägt auf der Leitung kein Versionsfeld, doch jede Zeile im Zustellprotokoll speichert die ",[34,1023,36],{},", mit der sie erzeugt wurde. Schreiben Sie Ihren Empfänger defensiv:",[122,1026,1027,1036,1042],{},[125,1028,1029,1032,1033,1035],{},[39,1030,1031],{},"Unbekannte Ereignisse ignorieren."," Neue Ereignis-Literale können ohne Versionsanhebung hinzukommen; Handler, die unbekannte ",[34,1034,129],{},"-Werte strikt ablehnen, brechen beim Upgrade.",[125,1037,1038,1041],{},[39,1039,1040],{},"Unbekannte Felder ignorieren."," Zusätzliche Felder innerhalb einer Struktur sind möglich; scheitern Sie nicht an Extras.",[125,1043,1044,1047,1048,1050,1051,1053,1054,1056],{},[39,1045,1046],{},"Nach Typ verzweigen, nicht nach Position."," Denken Sie daran: ",[34,1049,139],{}," ist bei E-Mail-\u002FKontaktereignissen ISO-8601, ",[34,1052,894],{}," bei ",[34,1055,765],{}," hingegen Epoch-Millisekunden.",[11,1058,1059,1060,1062],{},"Eine künftige Version 2 kann die Beschränkung auf flache Primitive lockern und verschachtelte Arrays\u002FObjekte zulassen (womit die JSON-String-Kodierung von ",[34,1061,878],{}," entfällt). Wenn es so weit ist, wird die Version angehoben und beide Strukturen werden dokumentiert.",[44,1064,1066],{"id":1065},"retry-verhalten-und-zustellprotokolle","Retry-Verhalten und Zustellprotokolle",[11,1068,1069,1070,837],{},"Owlat behandelt jede Nicht-2xx-Antwort — ebenso wie einen Netzwerkfehler, ein Timeout oder eine URL, die auf ein privates\u002Flokales Netzwerk auflöst — als fehlgeschlagene Zustellung und wiederholt sie mit Backoff auf insgesamt bis zu ",[39,1071,1072],{},"3 Versuche",[1074,1075,1076,1080,1083,1087,1094,1098],"steps",{},[152,1077,1079],{"id":1078},"versuch-1","Versuch 1",[11,1081,1082],{},"Wird sofort zugestellt, wenn das Ereignis ausgelöst wird.",[152,1084,1086],{"id":1085},"versuch-2","Versuch 2",[11,1088,1089,1090,1093],{},"Wiederholung nach ",[39,1091,1092],{},"1 Minute",", falls Versuch 1 fehlgeschlagen ist.",[152,1095,1097],{"id":1096},"versuch-3","Versuch 3",[11,1099,1089,1100,1103],{},[39,1101,1102],{},"5 Minuten",", falls Versuch 2 fehlgeschlagen ist. Nach diesem letzten Versuch wird die Zustellung als fehlgeschlagen markiert und nicht erneut wiederholt.",[11,1105,1106,1107,1110],{},"Jede Anfrage hat ein ",[39,1108,1109],{},"30-Sekunden-Timeout"," und folgt keinen Weiterleitungen. Jeder Versuch wird in einem Zustellprotokoll mit einem dieser Status festgehalten:",[160,1112,1113,1122],{},[163,1114,1115],{},[166,1116,1117,1120],{},[169,1118,1119],{},"Status",[169,1121,698],{},[176,1123,1124,1134,1144,1154],{},[166,1125,1126,1131],{},[181,1127,1128],{},[34,1129,1130],{},"pending",[181,1132,1133],{},"Protokolliert, eingeplant, noch nicht versucht",[166,1135,1136,1141],{},[181,1137,1138],{},[34,1139,1140],{},"retrying",[181,1142,1143],{},"Ein Versuch ist fehlgeschlagen und ein weiterer ist eingeplant",[166,1145,1146,1151],{},[181,1147,1148],{},[34,1149,1150],{},"success",[181,1152,1153],{},"Der Endpunkt hat eine 2xx-Antwort geliefert",[166,1155,1156,1161],{},[181,1157,1158],{},[34,1159,1160],{},"failed",[181,1162,1163],{},"Alle Versuche aufgebraucht oder der Webhook war deaktiviert\u002Fnicht auffindbar",[11,1165,1166,1167,1170],{},"Protokolle erfassen den HTTP-Statuscode, einen gekürzten Response-Body (die ersten 1000 Zeichen), im Fehlerfall eine Fehlermeldung sowie die Dauer je Versuch. Da Owlat bei jeder Nicht-2xx-Antwort wiederholt, sollte Ihr Endpunkt ",[39,1168,1169],{},"mit einem 2xx quittieren, sobald er das Ereignis dauerhaft entgegengenommen hat",", und asynchron verarbeiten — und er sollte idempotent sein, denn ein langsames oder unzuverlässiges 2xx kann dennoch zu einer doppelten Zustellung führen.",[44,1172,1174],{"id":1173},"verwandte-themen","Verwandte Themen",[1176,1177],"link-card",{"description":1178,"title":23,"to":22},"Ausgehende Abonnements konfigurieren, Signaturen prüfen und eingehende Provider-Routen nachschlagen.",[1176,1180],{"description":1181,"title":714,"to":713},"Die Kontakte anlegen und verwalten, die contact.created-Ereignisse auslösen.",[1176,1183],{"description":1184,"title":772,"to":771},"Abonnement-Themen hinter dem Ereignis topic.unsubscribed.",[1186,1187,1188],"style",{},"html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .snmFh, html code.shiki .snmFh{--shiki-default:#005CC5;--shiki-dark:#8DDB8C}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .s74oq, html code.shiki .s74oq{--shiki-default:#005CC5;--shiki-dark:#F47067}html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sOLd2, html code.shiki .sOLd2{--shiki-default:#6F42C1;--shiki-dark:#F69D50}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}",{"title":57,"searchDepth":71,"depth":71,"links":1190},[1191,1196,1204,1207,1210,1211,1212,1217],{"id":46,"depth":71,"text":47,"children":1192},[1193,1194],{"id":154,"depth":88,"text":155},{"id":255,"depth":88,"text":1195},"Strukturvorgaben für data",{"id":289,"depth":71,"text":290,"children":1197},[1198,1199,1200,1201,1202,1203],{"id":296,"depth":88,"text":299},{"id":374,"depth":88,"text":133},{"id":413,"depth":88,"text":416},{"id":452,"depth":88,"text":455},{"id":504,"depth":88,"text":507},{"id":576,"depth":88,"text":579},{"id":615,"depth":71,"text":616,"children":1205},[1206],{"id":619,"depth":88,"text":622},{"id":758,"depth":71,"text":759,"children":1208},[1209],{"id":762,"depth":88,"text":765},{"id":963,"depth":71,"text":963},{"id":1017,"depth":71,"text":1018},{"id":1065,"depth":71,"text":1066,"children":1213},[1214,1215,1216],{"id":1078,"depth":88,"text":1079},{"id":1085,"depth":88,"text":1086},{"id":1096,"depth":88,"text":1097},{"id":1173,"depth":71,"text":1174},"Der maßgebliche Wire-Contract für ausgehende Webhooks: Envelope, Signatur-Header, Datenstrukturen je Ereignis und Payload-Versionierung.","md",{},true,"\u002Fapi\u002Fwebhook-payloads",{"title":6,"description":1218},"2.api\u002F12.webhook-payloads","21pfsrvbPCaJpR7a3YjhGFzvVZAgqKOnNKYowU1Lep0",[1227,1231],{"title":1228,"path":1229,"stem":1230,"children":-1},"Öffentliche Endpunkte","\u002Fapi\u002Fpublic-endpoints","2.api\u002F11.public-endpoints",{"title":1232,"path":1233,"stem":1234,"children":-1},"Webhooks für eingehende Kanäle","\u002Fapi\u002Finbound-channels","2.api\u002F13.inbound-channels",1786915106982]