[{"data":1,"prerenderedAt":2199},["ShallowReactive",2],{"navigation":3,"/docs/api/webhooks":50,"/docs/api/webhooks-surround":2195},[4,23],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","/docs/getting-started","1.docs/1.getting-started/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-house",{"title":13,"path":14,"stem":15,"icon":16},"Installation","/docs/getting-started/installation","1.docs/1.getting-started/2.installation","i-lucide-download",{"title":18,"path":19,"stem":20,"icon":21},"Usage Guide","/docs/getting-started/usage","1.docs/1.getting-started/3.usage","i-lucide-sliders",false,{"title":24,"path":25,"stem":26,"children":27,"icon":29},"API Overview","/docs/api","1.docs/2.api/1.index",[28,30,35,40,45],{"title":24,"path":25,"stem":26,"icon":29},"i-lucide-server-cog",{"title":31,"path":32,"stem":33,"icon":34},"Agents","/docs/api/agents","1.docs/2.api/2.agents","i-lucide-bot",{"title":36,"path":37,"stem":38,"icon":39},"Messages","/docs/api/messages","1.docs/2.api/3.messages","i-lucide-mail",{"title":41,"path":42,"stem":43,"icon":44},"Threads","/docs/api/threads","1.docs/2.api/4.threads","i-lucide-git-branch",{"title":46,"path":47,"stem":48,"icon":49},"Webhooks","/docs/api/webhooks","1.docs/2.api/5.webhooks","i-lucide-webhook",{"id":51,"title":46,"body":52,"description":2189,"extension":2190,"meta":2191,"navigation":2192,"path":47,"seo":2193,"stem":48,"__hash__":2194},"docs/1.docs/2.api/5.webhooks.md",{"type":53,"value":54,"toc":2161},"minimark",[55,59,108,116,121,148,153,258,332,335,338,341,414,424,431,546,555,559,580,584,603,609,732,741,745,765,771,774,781,785,804,811,815,867,872,1264,1339,1343,1350,1706,1709,1791,1795,1810,1818,1824,1828,2077,2084,2088,2137,2141,2157],[56,57,58],"p",{},"Webhooks are scoped to a single agent. Two events are emitted:",[60,61,62,75],"table",{},[63,64,65],"thead",{},[66,67,68,72],"tr",{},[69,70,71],"th",{},"Event",[69,73,74],{},"Fires when",[76,77,78,94],"tbody",{},[66,79,80,87],{},[81,82,83],"td",{},[84,85,86],"code",{},"message.sent",[81,88,89,90,93],{},"After at least one envelope recipient succeeded on ",[84,91,92],{},"POST /agents/:id/messages/send",".",[66,95,96,101],{},[81,97,98],{},[84,99,100],{},"message.received",[81,102,103,104,107],{},"After an inbound email is parsed, deduplicated by ",[84,105,106],{},"Message-ID",", and persisted.",[56,109,110,111,115],{},"The Worker fans out webhooks ",[112,113,114],"strong",{},"in parallel"," across subscribers. A slow or failing subscriber cannot delay other subscribers on the same event.",[117,118,120],"h2",{"id":119},"create-a-webhook","Create a webhook",[122,123,124,134,142],"ul",{},[125,126,127,130,131],"li",{},[112,128,129],{},"Method:"," ",[84,132,133],{},"POST",[125,135,136,130,139],{},[112,137,138],{},"Path:",[84,140,141],{},"/agents/:id/webhooks",[125,143,144,147],{},[112,145,146],{},"Auth:"," master key, or this agent's own per-agent key",[149,150,152],"h3",{"id":151},"request-body","Request body",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"url\": \"https://your-app.com/sendook/webhook\",\n  \"events\": [\"message.received\", \"message.sent\"],\n  \"secret\": \"optional-32-byte-secret-or-omit-to-generate\"\n}\n","json","",[84,161,162,171,199,232,252],{"__ignoreMap":159},[163,164,167],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"sMK4o","{\n",[163,172,174,177,181,184,187,190,194,196],{"class":165,"line":173},2,[163,175,176],{"class":169},"  \"",[163,178,180],{"class":179},"spNyl","url",[163,182,183],{"class":169},"\"",[163,185,186],{"class":169},":",[163,188,189],{"class":169}," \"",[163,191,193],{"class":192},"sfazB","https://your-app.com/sendook/webhook",[163,195,183],{"class":169},[163,197,198],{"class":169},",\n",[163,200,202,204,207,209,211,214,216,218,220,223,225,227,229],{"class":165,"line":201},3,[163,203,176],{"class":169},[163,205,206],{"class":179},"events",[163,208,183],{"class":169},[163,210,186],{"class":169},[163,212,213],{"class":169}," [",[163,215,183],{"class":169},[163,217,100],{"class":192},[163,219,183],{"class":169},[163,221,222],{"class":169},",",[163,224,189],{"class":169},[163,226,86],{"class":192},[163,228,183],{"class":169},[163,230,231],{"class":169},"],\n",[163,233,235,237,240,242,244,246,249],{"class":165,"line":234},4,[163,236,176],{"class":169},[163,238,239],{"class":179},"secret",[163,241,183],{"class":169},[163,243,186],{"class":169},[163,245,189],{"class":169},[163,247,248],{"class":192},"optional-32-byte-secret-or-omit-to-generate",[163,250,251],{"class":169},"\"\n",[163,253,255],{"class":165,"line":254},5,[163,256,257],{"class":169},"}\n",[60,259,260,276],{},[63,261,262],{},[66,263,264,267,270,273],{},[69,265,266],{},"Field",[69,268,269],{},"Type",[69,271,272],{},"Required",[69,274,275],{},"Description",[76,277,278,298,318],{},[66,279,280,284,287,290],{},[81,281,282],{},[84,283,180],{},[81,285,286],{},"string",[81,288,289],{},"Yes",[81,291,292,293,93],{},"HTTPS URL ≤ 2048 chars. See ",[294,295,297],"a",{"href":296},"#url-restrictions","URL restrictions",[66,299,300,304,308,310],{},[81,301,302],{},[84,303,206],{},[81,305,286,306],{},[163,307],{},[81,309,289],{},[81,311,312,313,315,316,93],{},"1–16 entries from ",[84,314,86],{},", ",[84,317,100],{},[66,319,320,324,326,329],{},[81,321,322],{},[84,323,239],{},[81,325,286],{},[81,327,328],{},"No",[81,330,331],{},"16–256 chars. If omitted, a 32-byte cryptographically-random base64url secret is generated.",[56,333,334],{},"Body cap: 4 KiB UTF-8 bytes.",[149,336,297],{"id":337},"url-restrictions",[56,339,340],{},"The Worker rejects URLs that resolve to:",[122,342,343,378,396],{},[125,344,345,346,349,350,130,353,130,356,359,360,363,364,367,368,315,371,374,375,93],{},"IPv4 loopback ",[84,347,348],{},"127/8",", RFC1918 ",[84,351,352],{},"10/8",[84,354,355],{},"172.16/12",[84,357,358],{},"192.168/16",", link-local + cloud metadata ",[84,361,362],{},"169.254/16",", CGNAT ",[84,365,366],{},"100.64/10",", multicast ",[84,369,370],{},"224/4",[84,372,373],{},"0/8",", reserved ",[84,376,377],{},"240/4",[125,379,380,381,384,385,388,389,367,392,395],{},"IPv6 loopback ",[84,382,383],{},"::1",", link-local ",[84,386,387],{},"fe80::/10",", ULA ",[84,390,391],{},"fc00::/7",[84,393,394],{},"ff::/8",", IPv4-mapped variants of any of the above.",[125,397,398,399,315,402,315,405,315,408,315,411,93],{},"Hostnames ",[84,400,401],{},"localhost",[84,403,404],{},"*.localhost",[84,406,407],{},"*.local",[84,409,410],{},"metadata",[84,412,413],{},"metadata.google.internal",[56,415,416,419,420,423],{},[84,417,418],{},"http://"," is also rejected — only ",[84,421,422],{},"https://",". The same check runs at delivery time so webhooks created before this guard cannot be exploited.",[149,425,427,428],{"id":426},"response-201-created","Response ",[84,429,430],{},"201 Created",[154,432,434],{"className":156,"code":433,"language":158,"meta":159,"style":159},"{\n  \"id\": \"8d7c...uuid\",\n  \"url\": \"https://your-app.com/sendook/webhook\",\n  \"events\": [\"message.received\", \"message.sent\"],\n  \"secret\": \"rA9-...long-base64url\",\n  \"created_at\": 1730000000\n}\n",[84,435,436,440,460,478,506,525,541],{"__ignoreMap":159},[163,437,438],{"class":165,"line":166},[163,439,170],{"class":169},[163,441,442,444,447,449,451,453,456,458],{"class":165,"line":173},[163,443,176],{"class":169},[163,445,446],{"class":179},"id",[163,448,183],{"class":169},[163,450,186],{"class":169},[163,452,189],{"class":169},[163,454,455],{"class":192},"8d7c...uuid",[163,457,183],{"class":169},[163,459,198],{"class":169},[163,461,462,464,466,468,470,472,474,476],{"class":165,"line":201},[163,463,176],{"class":169},[163,465,180],{"class":179},[163,467,183],{"class":169},[163,469,186],{"class":169},[163,471,189],{"class":169},[163,473,193],{"class":192},[163,475,183],{"class":169},[163,477,198],{"class":169},[163,479,480,482,484,486,488,490,492,494,496,498,500,502,504],{"class":165,"line":234},[163,481,176],{"class":169},[163,483,206],{"class":179},[163,485,183],{"class":169},[163,487,186],{"class":169},[163,489,213],{"class":169},[163,491,183],{"class":169},[163,493,100],{"class":192},[163,495,183],{"class":169},[163,497,222],{"class":169},[163,499,189],{"class":169},[163,501,86],{"class":192},[163,503,183],{"class":169},[163,505,231],{"class":169},[163,507,508,510,512,514,516,518,521,523],{"class":165,"line":254},[163,509,176],{"class":169},[163,511,239],{"class":179},[163,513,183],{"class":169},[163,515,186],{"class":169},[163,517,189],{"class":169},[163,519,520],{"class":192},"rA9-...long-base64url",[163,522,183],{"class":169},[163,524,198],{"class":169},[163,526,528,530,533,535,537],{"class":165,"line":527},6,[163,529,176],{"class":169},[163,531,532],{"class":179},"created_at",[163,534,183],{"class":169},[163,536,186],{"class":169},[163,538,540],{"class":539},"sbssI"," 1730000000\n",[163,542,544],{"class":165,"line":543},7,[163,545,257],{"class":169},[56,547,548,550,551,554],{},[84,549,239],{}," is shown ",[112,552,553],{},"exactly once"," (parallel to the per-agent api_key). Treat it like a credential.",[149,556,558],{"id":557},"errors","Errors",[122,560,561,567],{},[125,562,563,566],{},[84,564,565],{},"400"," — invalid JSON, body too large, bad URL (non-https, oversized, or SSRF target), unknown event, secret outside length range.",[125,568,569,572,573,572,576,579],{},[84,570,571],{},"401"," / ",[84,574,575],{},"403",[84,577,578],{},"404"," per the standard auth rules.",[117,581,583],{"id":582},"list-webhooks","List webhooks",[122,585,586,593,599],{},[125,587,588,130,590],{},[112,589,129],{},[84,591,592],{},"GET",[125,594,595,130,597],{},[112,596,138],{},[84,598,141],{},[125,600,601,147],{},[112,602,146],{},[149,604,427,606],{"id":605},"response-200-ok",[84,607,608],{},"200 OK",[154,610,612],{"className":156,"code":611,"language":158,"meta":159,"style":159},"{\n  \"webhooks\": [\n    {\n      \"id\": \"8d7c...uuid\",\n      \"url\": \"https://your-app.com/sendook/webhook\",\n      \"events\": [\"message.received\", \"message.sent\"],\n      \"created_at\": 1730000000\n    }\n  ]\n}\n",[84,613,614,618,632,637,657,675,703,715,721,727],{"__ignoreMap":159},[163,615,616],{"class":165,"line":166},[163,617,170],{"class":169},[163,619,620,622,625,627,629],{"class":165,"line":173},[163,621,176],{"class":169},[163,623,624],{"class":179},"webhooks",[163,626,183],{"class":169},[163,628,186],{"class":169},[163,630,631],{"class":169}," [\n",[163,633,634],{"class":165,"line":201},[163,635,636],{"class":169},"    {\n",[163,638,639,642,645,647,649,651,653,655],{"class":165,"line":234},[163,640,641],{"class":169},"      \"",[163,643,446],{"class":644},"sBMFI",[163,646,183],{"class":169},[163,648,186],{"class":169},[163,650,189],{"class":169},[163,652,455],{"class":192},[163,654,183],{"class":169},[163,656,198],{"class":169},[163,658,659,661,663,665,667,669,671,673],{"class":165,"line":254},[163,660,641],{"class":169},[163,662,180],{"class":644},[163,664,183],{"class":169},[163,666,186],{"class":169},[163,668,189],{"class":169},[163,670,193],{"class":192},[163,672,183],{"class":169},[163,674,198],{"class":169},[163,676,677,679,681,683,685,687,689,691,693,695,697,699,701],{"class":165,"line":527},[163,678,641],{"class":169},[163,680,206],{"class":644},[163,682,183],{"class":169},[163,684,186],{"class":169},[163,686,213],{"class":169},[163,688,183],{"class":169},[163,690,100],{"class":192},[163,692,183],{"class":169},[163,694,222],{"class":169},[163,696,189],{"class":169},[163,698,86],{"class":192},[163,700,183],{"class":169},[163,702,231],{"class":169},[163,704,705,707,709,711,713],{"class":165,"line":543},[163,706,641],{"class":169},[163,708,532],{"class":644},[163,710,183],{"class":169},[163,712,186],{"class":169},[163,714,540],{"class":539},[163,716,718],{"class":165,"line":717},8,[163,719,720],{"class":169},"    }\n",[163,722,724],{"class":165,"line":723},9,[163,725,726],{"class":169},"  ]\n",[163,728,730],{"class":165,"line":729},10,[163,731,257],{"class":169},[56,733,734,736,737,740],{},[84,735,239],{}," is ",[112,738,739],{},"never"," returned by the list endpoint.",[117,742,744],{"id":743},"delete-a-webhook","Delete a webhook",[122,746,747,754,761],{},[125,748,749,130,751],{},[112,750,129],{},[84,752,753],{},"DELETE",[125,755,756,130,758],{},[112,757,138],{},[84,759,760],{},"/agents/:id/webhooks/:webhookId",[125,762,763,147],{},[112,764,146],{},[149,766,427,768],{"id":767},"response-204-no-content",[84,769,770],{},"204 No Content",[149,772,558],{"id":773},"errors-1",[122,775,776],{},[125,777,778,780],{},[84,779,578],{}," — webhook doesn't exist or doesn't belong to the requested agent.",[117,782,784],{"id":783},"list-webhook-attempts","List webhook attempts",[122,786,787,793,800],{},[125,788,789,130,791],{},[112,790,129],{},[84,792,592],{},[125,794,795,130,797],{},[112,796,138],{},[84,798,799],{},"/agents/:id/webhooks/:webhookId/attempts",[125,801,802,147],{},[112,803,146],{},[56,805,806,807,810],{},"Returns up to the last ",[112,808,809],{},"100"," delivery attempts for one webhook. Older rows are evicted on every new insert; older history is not preserved.",[149,812,814],{"id":813},"query-parameters","Query parameters",[60,816,817,831],{},[63,818,819],{},[66,820,821,824,826,829],{},[69,822,823],{},"Parameter",[69,825,269],{},[69,827,828],{},"Default",[69,830,275],{},[76,832,833,852],{},[66,834,835,840,843,846],{},[81,836,837],{},[84,838,839],{},"limit",[81,841,842],{},"integer",[81,844,845],{},"50",[81,847,848,849,93],{},"Clamped to ",[84,850,851],{},"1..100",[66,853,854,859,861,864],{},[81,855,856],{},[84,857,858],{},"offset",[81,860,842],{},[81,862,863],{},"0",[81,865,866],{},"Pagination offset.",[149,868,427,870],{"id":869},"response-200-ok-1",[84,871,608],{},[154,873,875],{"className":156,"code":874,"language":158,"meta":159,"style":159},"{\n  \"attempts\": [\n    {\n      \"id\": \"uuid\",\n      \"webhook_id\": \"8d7c...uuid\",\n      \"event_type\": \"message.received\",\n      \"payload_size\": 1842,\n      \"status_code\": 200,\n      \"ok\": true,\n      \"attempt_count\": 1,\n      \"next_retry_at\": null,\n      \"created_at\": 1730000000\n    },\n    {\n      \"id\": \"uuid-2\",\n      \"webhook_id\": \"8d7c...uuid\",\n      \"event_type\": \"message.received\",\n      \"payload_size\": 1842,\n      \"status_code\": 503,\n      \"ok\": false,\n      \"attempt_count\": 1,\n      \"next_retry_at\": null,\n      \"created_at\": 1729999900\n    }\n  ],\n  \"total\": 2,\n  \"limit\": 50,\n  \"offset\": 0\n}\n",[84,876,877,881,894,898,917,936,955,971,987,1001,1017,1032,1045,1051,1056,1076,1095,1114,1129,1145,1159,1174,1187,1201,1206,1212,1229,1245,1259],{"__ignoreMap":159},[163,878,879],{"class":165,"line":166},[163,880,170],{"class":169},[163,882,883,885,888,890,892],{"class":165,"line":173},[163,884,176],{"class":169},[163,886,887],{"class":179},"attempts",[163,889,183],{"class":169},[163,891,186],{"class":169},[163,893,631],{"class":169},[163,895,896],{"class":165,"line":201},[163,897,636],{"class":169},[163,899,900,902,904,906,908,910,913,915],{"class":165,"line":234},[163,901,641],{"class":169},[163,903,446],{"class":644},[163,905,183],{"class":169},[163,907,186],{"class":169},[163,909,189],{"class":169},[163,911,912],{"class":192},"uuid",[163,914,183],{"class":169},[163,916,198],{"class":169},[163,918,919,921,924,926,928,930,932,934],{"class":165,"line":254},[163,920,641],{"class":169},[163,922,923],{"class":644},"webhook_id",[163,925,183],{"class":169},[163,927,186],{"class":169},[163,929,189],{"class":169},[163,931,455],{"class":192},[163,933,183],{"class":169},[163,935,198],{"class":169},[163,937,938,940,943,945,947,949,951,953],{"class":165,"line":527},[163,939,641],{"class":169},[163,941,942],{"class":644},"event_type",[163,944,183],{"class":169},[163,946,186],{"class":169},[163,948,189],{"class":169},[163,950,100],{"class":192},[163,952,183],{"class":169},[163,954,198],{"class":169},[163,956,957,959,962,964,966,969],{"class":165,"line":543},[163,958,641],{"class":169},[163,960,961],{"class":644},"payload_size",[163,963,183],{"class":169},[163,965,186],{"class":169},[163,967,968],{"class":539}," 1842",[163,970,198],{"class":169},[163,972,973,975,978,980,982,985],{"class":165,"line":717},[163,974,641],{"class":169},[163,976,977],{"class":644},"status_code",[163,979,183],{"class":169},[163,981,186],{"class":169},[163,983,984],{"class":539}," 200",[163,986,198],{"class":169},[163,988,989,991,994,996,998],{"class":165,"line":723},[163,990,641],{"class":169},[163,992,993],{"class":644},"ok",[163,995,183],{"class":169},[163,997,186],{"class":169},[163,999,1000],{"class":169}," true,\n",[163,1002,1003,1005,1008,1010,1012,1015],{"class":165,"line":729},[163,1004,641],{"class":169},[163,1006,1007],{"class":644},"attempt_count",[163,1009,183],{"class":169},[163,1011,186],{"class":169},[163,1013,1014],{"class":539}," 1",[163,1016,198],{"class":169},[163,1018,1020,1022,1025,1027,1029],{"class":165,"line":1019},11,[163,1021,641],{"class":169},[163,1023,1024],{"class":644},"next_retry_at",[163,1026,183],{"class":169},[163,1028,186],{"class":169},[163,1030,1031],{"class":169}," null,\n",[163,1033,1035,1037,1039,1041,1043],{"class":165,"line":1034},12,[163,1036,641],{"class":169},[163,1038,532],{"class":644},[163,1040,183],{"class":169},[163,1042,186],{"class":169},[163,1044,540],{"class":539},[163,1046,1048],{"class":165,"line":1047},13,[163,1049,1050],{"class":169},"    },\n",[163,1052,1054],{"class":165,"line":1053},14,[163,1055,636],{"class":169},[163,1057,1059,1061,1063,1065,1067,1069,1072,1074],{"class":165,"line":1058},15,[163,1060,641],{"class":169},[163,1062,446],{"class":644},[163,1064,183],{"class":169},[163,1066,186],{"class":169},[163,1068,189],{"class":169},[163,1070,1071],{"class":192},"uuid-2",[163,1073,183],{"class":169},[163,1075,198],{"class":169},[163,1077,1079,1081,1083,1085,1087,1089,1091,1093],{"class":165,"line":1078},16,[163,1080,641],{"class":169},[163,1082,923],{"class":644},[163,1084,183],{"class":169},[163,1086,186],{"class":169},[163,1088,189],{"class":169},[163,1090,455],{"class":192},[163,1092,183],{"class":169},[163,1094,198],{"class":169},[163,1096,1098,1100,1102,1104,1106,1108,1110,1112],{"class":165,"line":1097},17,[163,1099,641],{"class":169},[163,1101,942],{"class":644},[163,1103,183],{"class":169},[163,1105,186],{"class":169},[163,1107,189],{"class":169},[163,1109,100],{"class":192},[163,1111,183],{"class":169},[163,1113,198],{"class":169},[163,1115,1117,1119,1121,1123,1125,1127],{"class":165,"line":1116},18,[163,1118,641],{"class":169},[163,1120,961],{"class":644},[163,1122,183],{"class":169},[163,1124,186],{"class":169},[163,1126,968],{"class":539},[163,1128,198],{"class":169},[163,1130,1132,1134,1136,1138,1140,1143],{"class":165,"line":1131},19,[163,1133,641],{"class":169},[163,1135,977],{"class":644},[163,1137,183],{"class":169},[163,1139,186],{"class":169},[163,1141,1142],{"class":539}," 503",[163,1144,198],{"class":169},[163,1146,1148,1150,1152,1154,1156],{"class":165,"line":1147},20,[163,1149,641],{"class":169},[163,1151,993],{"class":644},[163,1153,183],{"class":169},[163,1155,186],{"class":169},[163,1157,1158],{"class":169}," false,\n",[163,1160,1162,1164,1166,1168,1170,1172],{"class":165,"line":1161},21,[163,1163,641],{"class":169},[163,1165,1007],{"class":644},[163,1167,183],{"class":169},[163,1169,186],{"class":169},[163,1171,1014],{"class":539},[163,1173,198],{"class":169},[163,1175,1177,1179,1181,1183,1185],{"class":165,"line":1176},22,[163,1178,641],{"class":169},[163,1180,1024],{"class":644},[163,1182,183],{"class":169},[163,1184,186],{"class":169},[163,1186,1031],{"class":169},[163,1188,1190,1192,1194,1196,1198],{"class":165,"line":1189},23,[163,1191,641],{"class":169},[163,1193,532],{"class":644},[163,1195,183],{"class":169},[163,1197,186],{"class":169},[163,1199,1200],{"class":539}," 1729999900\n",[163,1202,1204],{"class":165,"line":1203},24,[163,1205,720],{"class":169},[163,1207,1209],{"class":165,"line":1208},25,[163,1210,1211],{"class":169},"  ],\n",[163,1213,1215,1217,1220,1222,1224,1227],{"class":165,"line":1214},26,[163,1216,176],{"class":169},[163,1218,1219],{"class":179},"total",[163,1221,183],{"class":169},[163,1223,186],{"class":169},[163,1225,1226],{"class":539}," 2",[163,1228,198],{"class":169},[163,1230,1232,1234,1236,1238,1240,1243],{"class":165,"line":1231},27,[163,1233,176],{"class":169},[163,1235,839],{"class":179},[163,1237,183],{"class":169},[163,1239,186],{"class":169},[163,1241,1242],{"class":539}," 50",[163,1244,198],{"class":169},[163,1246,1248,1250,1252,1254,1256],{"class":165,"line":1247},28,[163,1249,176],{"class":169},[163,1251,858],{"class":179},[163,1253,183],{"class":169},[163,1255,186],{"class":169},[163,1257,1258],{"class":539}," 0\n",[163,1260,1262],{"class":165,"line":1261},29,[163,1263,257],{"class":169},[60,1265,1266,1276],{},[63,1267,1268],{},[66,1269,1270,1272,1274],{},[69,1271,266],{},[69,1273,269],{},[69,1275,275],{},[76,1277,1278,1294,1306,1317,1328],{},[66,1279,1280,1284,1287],{},[81,1281,1282],{},[84,1283,977],{},[81,1285,1286],{},"integer | null",[81,1288,1289,1290,1293],{},"HTTP status from the subscriber, or ",[84,1291,1292],{},"null"," for network failures (DNS, TCP reset, abort).",[66,1295,1296,1300,1303],{},[81,1297,1298],{},[84,1299,993],{},[81,1301,1302],{},"boolean",[81,1304,1305],{},"Whether the subscriber returned 2xx.",[66,1307,1308,1312,1314],{},[81,1309,1310],{},[84,1311,1007],{},[81,1313,842],{},[81,1315,1316],{},"Which retry this row represents (1..5).",[66,1318,1319,1323,1325],{},[81,1320,1321],{},[84,1322,961],{},[81,1324,842],{},[81,1326,1327],{},"UTF-8 byte length of the JSON body.",[66,1329,1330,1334,1336],{},[81,1331,1332],{},[84,1333,532],{},[81,1335,842],{},[81,1337,1338],{},"Unix seconds.",[117,1340,1342],{"id":1341},"webhook-payload-format","Webhook payload format",[56,1344,1345,1346,1349],{},"Every fanout request is ",[84,1347,1348],{},"POST \u003Csubscriber.url>"," with the following JSON body:",[154,1351,1353],{"className":156,"code":1352,"language":158,"meta":159,"style":159},"{\n  \"event\": \"message.received\",\n  \"agent_id\": \"abc123def456\",\n  \"message_id\": \"uuid\",\n  \"message_id_header\": \"\u003Cmsg@external.example>\",\n  \"delivered_at\": 1730000000,\n  \"data\": {\n    \"id\": \"uuid\",\n    \"direction\": \"inbound\",\n    \"from_addr\": \"alice@example.com\",\n    \"to_addr\": \"abc123def456@agents.yourdomain.com\",\n    \"subject\": \"Hi\",\n    \"message_id_header\": \"\u003Cmsg@external.example>\",\n    \"in_reply_to\": null,\n    \"body_text\": \"Plain text body.\",\n    \"body_html\": null,\n    \"raw_size\": 1234,\n    \"status\": \"received\",\n    \"created_at\": 1730000000,\n    \"thread_id\": \"uuid\"\n  }\n}\n",[84,1354,1355,1359,1378,1398,1417,1437,1453,1467,1486,1506,1526,1546,1566,1584,1597,1617,1630,1646,1666,1680,1697,1702],{"__ignoreMap":159},[163,1356,1357],{"class":165,"line":166},[163,1358,170],{"class":169},[163,1360,1361,1363,1366,1368,1370,1372,1374,1376],{"class":165,"line":173},[163,1362,176],{"class":169},[163,1364,1365],{"class":179},"event",[163,1367,183],{"class":169},[163,1369,186],{"class":169},[163,1371,189],{"class":169},[163,1373,100],{"class":192},[163,1375,183],{"class":169},[163,1377,198],{"class":169},[163,1379,1380,1382,1385,1387,1389,1391,1394,1396],{"class":165,"line":201},[163,1381,176],{"class":169},[163,1383,1384],{"class":179},"agent_id",[163,1386,183],{"class":169},[163,1388,186],{"class":169},[163,1390,189],{"class":169},[163,1392,1393],{"class":192},"abc123def456",[163,1395,183],{"class":169},[163,1397,198],{"class":169},[163,1399,1400,1402,1405,1407,1409,1411,1413,1415],{"class":165,"line":234},[163,1401,176],{"class":169},[163,1403,1404],{"class":179},"message_id",[163,1406,183],{"class":169},[163,1408,186],{"class":169},[163,1410,189],{"class":169},[163,1412,912],{"class":192},[163,1414,183],{"class":169},[163,1416,198],{"class":169},[163,1418,1419,1421,1424,1426,1428,1430,1433,1435],{"class":165,"line":254},[163,1420,176],{"class":169},[163,1422,1423],{"class":179},"message_id_header",[163,1425,183],{"class":169},[163,1427,186],{"class":169},[163,1429,189],{"class":169},[163,1431,1432],{"class":192},"\u003Cmsg@external.example>",[163,1434,183],{"class":169},[163,1436,198],{"class":169},[163,1438,1439,1441,1444,1446,1448,1451],{"class":165,"line":527},[163,1440,176],{"class":169},[163,1442,1443],{"class":179},"delivered_at",[163,1445,183],{"class":169},[163,1447,186],{"class":169},[163,1449,1450],{"class":539}," 1730000000",[163,1452,198],{"class":169},[163,1454,1455,1457,1460,1462,1464],{"class":165,"line":543},[163,1456,176],{"class":169},[163,1458,1459],{"class":179},"data",[163,1461,183],{"class":169},[163,1463,186],{"class":169},[163,1465,1466],{"class":169}," {\n",[163,1468,1469,1472,1474,1476,1478,1480,1482,1484],{"class":165,"line":717},[163,1470,1471],{"class":169},"    \"",[163,1473,446],{"class":644},[163,1475,183],{"class":169},[163,1477,186],{"class":169},[163,1479,189],{"class":169},[163,1481,912],{"class":192},[163,1483,183],{"class":169},[163,1485,198],{"class":169},[163,1487,1488,1490,1493,1495,1497,1499,1502,1504],{"class":165,"line":723},[163,1489,1471],{"class":169},[163,1491,1492],{"class":644},"direction",[163,1494,183],{"class":169},[163,1496,186],{"class":169},[163,1498,189],{"class":169},[163,1500,1501],{"class":192},"inbound",[163,1503,183],{"class":169},[163,1505,198],{"class":169},[163,1507,1508,1510,1513,1515,1517,1519,1522,1524],{"class":165,"line":729},[163,1509,1471],{"class":169},[163,1511,1512],{"class":644},"from_addr",[163,1514,183],{"class":169},[163,1516,186],{"class":169},[163,1518,189],{"class":169},[163,1520,1521],{"class":192},"alice@example.com",[163,1523,183],{"class":169},[163,1525,198],{"class":169},[163,1527,1528,1530,1533,1535,1537,1539,1542,1544],{"class":165,"line":1019},[163,1529,1471],{"class":169},[163,1531,1532],{"class":644},"to_addr",[163,1534,183],{"class":169},[163,1536,186],{"class":169},[163,1538,189],{"class":169},[163,1540,1541],{"class":192},"abc123def456@agents.yourdomain.com",[163,1543,183],{"class":169},[163,1545,198],{"class":169},[163,1547,1548,1550,1553,1555,1557,1559,1562,1564],{"class":165,"line":1034},[163,1549,1471],{"class":169},[163,1551,1552],{"class":644},"subject",[163,1554,183],{"class":169},[163,1556,186],{"class":169},[163,1558,189],{"class":169},[163,1560,1561],{"class":192},"Hi",[163,1563,183],{"class":169},[163,1565,198],{"class":169},[163,1567,1568,1570,1572,1574,1576,1578,1580,1582],{"class":165,"line":1047},[163,1569,1471],{"class":169},[163,1571,1423],{"class":644},[163,1573,183],{"class":169},[163,1575,186],{"class":169},[163,1577,189],{"class":169},[163,1579,1432],{"class":192},[163,1581,183],{"class":169},[163,1583,198],{"class":169},[163,1585,1586,1588,1591,1593,1595],{"class":165,"line":1053},[163,1587,1471],{"class":169},[163,1589,1590],{"class":644},"in_reply_to",[163,1592,183],{"class":169},[163,1594,186],{"class":169},[163,1596,1031],{"class":169},[163,1598,1599,1601,1604,1606,1608,1610,1613,1615],{"class":165,"line":1058},[163,1600,1471],{"class":169},[163,1602,1603],{"class":644},"body_text",[163,1605,183],{"class":169},[163,1607,186],{"class":169},[163,1609,189],{"class":169},[163,1611,1612],{"class":192},"Plain text body.",[163,1614,183],{"class":169},[163,1616,198],{"class":169},[163,1618,1619,1621,1624,1626,1628],{"class":165,"line":1078},[163,1620,1471],{"class":169},[163,1622,1623],{"class":644},"body_html",[163,1625,183],{"class":169},[163,1627,186],{"class":169},[163,1629,1031],{"class":169},[163,1631,1632,1634,1637,1639,1641,1644],{"class":165,"line":1097},[163,1633,1471],{"class":169},[163,1635,1636],{"class":644},"raw_size",[163,1638,183],{"class":169},[163,1640,186],{"class":169},[163,1642,1643],{"class":539}," 1234",[163,1645,198],{"class":169},[163,1647,1648,1650,1653,1655,1657,1659,1662,1664],{"class":165,"line":1116},[163,1649,1471],{"class":169},[163,1651,1652],{"class":644},"status",[163,1654,183],{"class":169},[163,1656,186],{"class":169},[163,1658,189],{"class":169},[163,1660,1661],{"class":192},"received",[163,1663,183],{"class":169},[163,1665,198],{"class":169},[163,1667,1668,1670,1672,1674,1676,1678],{"class":165,"line":1131},[163,1669,1471],{"class":169},[163,1671,532],{"class":644},[163,1673,183],{"class":169},[163,1675,186],{"class":169},[163,1677,1450],{"class":539},[163,1679,198],{"class":169},[163,1681,1682,1684,1687,1689,1691,1693,1695],{"class":165,"line":1147},[163,1683,1471],{"class":169},[163,1685,1686],{"class":644},"thread_id",[163,1688,183],{"class":169},[163,1690,186],{"class":169},[163,1692,189],{"class":169},[163,1694,912],{"class":192},[163,1696,251],{"class":169},[163,1698,1699],{"class":165,"line":1161},[163,1700,1701],{"class":169},"  }\n",[163,1703,1704],{"class":165,"line":1176},[163,1705,257],{"class":169},[56,1707,1708],{},"Headers on every fanout request:",[60,1710,1711,1721],{},[63,1712,1713],{},[66,1714,1715,1718],{},[69,1716,1717],{},"Header",[69,1719,1720],{},"Value",[76,1722,1723,1735,1749,1764,1774],{},[66,1724,1725,1730],{},[81,1726,1727],{},[84,1728,1729],{},"Content-Type",[81,1731,1732],{},[84,1733,1734],{},"application/json",[66,1736,1737,1742],{},[81,1738,1739],{},[84,1740,1741],{},"x-sendook-event",[81,1743,1744,1746,1747],{},[84,1745,86],{}," or ",[84,1748,100],{},[66,1750,1751,1756],{},[81,1752,1753],{},[84,1754,1755],{},"x-sendook-signature",[81,1757,1758,1761,1762,93],{},[84,1759,1760],{},"sha256=\u003Chex>"," — HMAC-SHA-256 of the raw JSON body, keyed on the webhook's ",[84,1763,239],{},[66,1765,1766,1771],{},[81,1767,1768],{},[84,1769,1770],{},"x-sendook-webhook-id",[81,1772,1773],{},"The webhook's id.",[66,1775,1776,1781],{},[81,1777,1778],{},[84,1779,1780],{},"x-sendook-attempt",[81,1782,1783,1786,1787,1790],{},[84,1784,1785],{},"1","..",[84,1788,1789],{},"5"," — the attempt number.",[149,1792,1794],{"id":1793},"payload-size-cap","Payload size cap",[56,1796,1797,1798,1801,1802,1805,1806,1809],{},"If ",[84,1799,1800],{},"data.body_text"," and/or ",[84,1803,1804],{},"data.body_html"," would push the JSON payload over ",[112,1807,1808],{},"256 KiB",", both fields are truncated (with a binary-search on UTF-8 byte length so multi-byte chars stay intact) and the truncated value ends with the literal marker:",[154,1811,1816],{"className":1812,"code":1814,"language":1815,"meta":159},[1813],"language-text","...truncated; GET /agents/:id/messages/:id for full body\n","text",[84,1817,1814],{"__ignoreMap":159},[56,1819,1820,1821,93],{},"Consumers that need the full body should refetch via ",[84,1822,1823],{},"GET /agents/:id/threads/:threadId",[117,1825,1827],{"id":1826},"verifying-signatures","Verifying signatures",[154,1829,1833],{"className":1830,"code":1831,"language":1832,"meta":159,"style":159},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createHmac, timingSafeEqual } from \"node:crypto\";\n\nfunction verify(rawBody: string, header: string, secret: string): boolean {\n  const expected = \"sha256=\" +\n    createHmac(\"sha256\", secret).update(rawBody).digest(\"hex\");\n  if (header.length !== expected.length) return false;\n  return timingSafeEqual(Buffer.from(header), Buffer.from(expected));\n}\n","ts",[84,1834,1835,1869,1875,1922,1943,1994,2031,2073],{"__ignoreMap":159},[163,1836,1837,1841,1844,1848,1850,1853,1856,1859,1861,1864,1866],{"class":165,"line":166},[163,1838,1840],{"class":1839},"s7zQu","import",[163,1842,1843],{"class":169}," {",[163,1845,1847],{"class":1846},"sTEyZ"," createHmac",[163,1849,222],{"class":169},[163,1851,1852],{"class":1846}," timingSafeEqual",[163,1854,1855],{"class":169}," }",[163,1857,1858],{"class":1839}," from",[163,1860,189],{"class":169},[163,1862,1863],{"class":192},"node:crypto",[163,1865,183],{"class":169},[163,1867,1868],{"class":169},";\n",[163,1870,1871],{"class":165,"line":173},[163,1872,1874],{"emptyLinePlaceholder":1873},true,"\n",[163,1876,1877,1880,1884,1887,1891,1893,1896,1898,1901,1903,1905,1907,1910,1912,1914,1917,1920],{"class":165,"line":201},[163,1878,1879],{"class":179},"function",[163,1881,1883],{"class":1882},"s2Zo4"," verify",[163,1885,1886],{"class":169},"(",[163,1888,1890],{"class":1889},"sHdIc","rawBody",[163,1892,186],{"class":169},[163,1894,1895],{"class":644}," string",[163,1897,222],{"class":169},[163,1899,1900],{"class":1889}," header",[163,1902,186],{"class":169},[163,1904,1895],{"class":644},[163,1906,222],{"class":169},[163,1908,1909],{"class":1889}," secret",[163,1911,186],{"class":169},[163,1913,1895],{"class":644},[163,1915,1916],{"class":169},"):",[163,1918,1919],{"class":644}," boolean",[163,1921,1466],{"class":169},[163,1923,1924,1927,1930,1933,1935,1938,1940],{"class":165,"line":234},[163,1925,1926],{"class":179},"  const",[163,1928,1929],{"class":1846}," expected",[163,1931,1932],{"class":169}," =",[163,1934,189],{"class":169},[163,1936,1937],{"class":192},"sha256=",[163,1939,183],{"class":169},[163,1941,1942],{"class":169}," +\n",[163,1944,1945,1948,1951,1953,1956,1958,1960,1962,1965,1967,1970,1972,1974,1976,1978,1981,1983,1985,1988,1990,1992],{"class":165,"line":254},[163,1946,1947],{"class":1882},"    createHmac",[163,1949,1886],{"class":1950},"swJcz",[163,1952,183],{"class":169},[163,1954,1955],{"class":192},"sha256",[163,1957,183],{"class":169},[163,1959,222],{"class":169},[163,1961,1909],{"class":1846},[163,1963,1964],{"class":1950},")",[163,1966,93],{"class":169},[163,1968,1969],{"class":1882},"update",[163,1971,1886],{"class":1950},[163,1973,1890],{"class":1846},[163,1975,1964],{"class":1950},[163,1977,93],{"class":169},[163,1979,1980],{"class":1882},"digest",[163,1982,1886],{"class":1950},[163,1984,183],{"class":169},[163,1986,1987],{"class":192},"hex",[163,1989,183],{"class":169},[163,1991,1964],{"class":1950},[163,1993,1868],{"class":169},[163,1995,1996,1999,2002,2005,2007,2010,2013,2015,2017,2019,2022,2025,2029],{"class":165,"line":527},[163,1997,1998],{"class":1839},"  if",[163,2000,2001],{"class":1950}," (",[163,2003,2004],{"class":1846},"header",[163,2006,93],{"class":169},[163,2008,2009],{"class":1846},"length",[163,2011,2012],{"class":169}," !==",[163,2014,1929],{"class":1846},[163,2016,93],{"class":169},[163,2018,2009],{"class":1846},[163,2020,2021],{"class":1950},") ",[163,2023,2024],{"class":1839},"return",[163,2026,2028],{"class":2027},"sfNiH"," false",[163,2030,1868],{"class":169},[163,2032,2033,2036,2038,2040,2043,2045,2048,2050,2052,2054,2056,2059,2061,2063,2065,2068,2071],{"class":165,"line":543},[163,2034,2035],{"class":1839},"  return",[163,2037,1852],{"class":1882},[163,2039,1886],{"class":1950},[163,2041,2042],{"class":1846},"Buffer",[163,2044,93],{"class":169},[163,2046,2047],{"class":1882},"from",[163,2049,1886],{"class":1950},[163,2051,2004],{"class":1846},[163,2053,1964],{"class":1950},[163,2055,222],{"class":169},[163,2057,2058],{"class":1846}," Buffer",[163,2060,93],{"class":169},[163,2062,2047],{"class":1882},[163,2064,1886],{"class":1950},[163,2066,2067],{"class":1846},"expected",[163,2069,2070],{"class":1950},"))",[163,2072,1868],{"class":169},[163,2074,2075],{"class":165,"line":717},[163,2076,257],{"class":169},[56,2078,2079,2080,2083],{},"Use the ",[112,2081,2082],{},"raw request body"," for HMAC input — JSON-parsing then re-stringifying will change byte ordering and break the signature.",[117,2085,2087],{"id":2086},"retry-semantics","Retry semantics",[122,2089,2090,2097,2100,2117,2130],{},[125,2091,2092,2093,2096],{},"Up to ",[112,2094,2095],{},"5 attempts"," per fanout, with exponential backoff (base 500ms, capped at 30s, randomized).",[125,2098,2099],{},"2xx responses end retries immediately.",[125,2101,2102,2103,2106,2107,315,2110,315,2113,2116],{},"Terminal ",[84,2104,2105],{},"4xx"," (everything except ",[84,2108,2109],{},"408",[84,2111,2112],{},"425",[84,2114,2115],{},"429",") ends retries — the row is recorded once and never retried.",[125,2118,2119,315,2121,315,2123,2125,2126,2129],{},[84,2120,2109],{},[84,2122,2112],{},[84,2124,2115],{},", every ",[84,2127,2128],{},"5xx",", and network failures are retried.",[125,2131,2132,2133,2136],{},"Each attempt is bounded by a 10s ",[84,2134,2135],{},"AbortController"," timeout — a hung TCP connection cannot lock up the agent's queue.",[117,2138,2140],{"id":2139},"idempotency","Idempotency",[56,2142,2143,2144,2146,2147,2149,2150,2152,2153,2156],{},"Inbound mail is deduplicated on ",[84,2145,106],{}," per agent, so a Cloudflare Email Routing retry will not produce a second persisted row, a second thread link, or a second ",[84,2148,100],{}," webhook. Outbound ",[84,2151,86],{}," is not deduplicated; client-side retries against ",[84,2154,2155],{},"POST .../messages/send"," will fire one webhook per successful call.",[2158,2159,2160],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":159,"searchDepth":173,"depth":173,"links":2162},[2163,2170,2174,2179,2183,2186,2187,2188],{"id":119,"depth":173,"text":120,"children":2164},[2165,2166,2167,2169],{"id":151,"depth":201,"text":152},{"id":337,"depth":201,"text":297},{"id":426,"depth":201,"text":2168},"Response 201 Created",{"id":557,"depth":201,"text":558},{"id":582,"depth":173,"text":583,"children":2171},[2172],{"id":605,"depth":201,"text":2173},"Response 200 OK",{"id":743,"depth":173,"text":744,"children":2175},[2176,2178],{"id":767,"depth":201,"text":2177},"Response 204 No Content",{"id":773,"depth":201,"text":558},{"id":783,"depth":173,"text":784,"children":2180},[2181,2182],{"id":813,"depth":201,"text":814},{"id":869,"depth":201,"text":2173},{"id":1341,"depth":173,"text":1342,"children":2184},[2185],{"id":1793,"depth":201,"text":1794},{"id":1826,"depth":173,"text":1827},{"id":2086,"depth":173,"text":2087},{"id":2139,"depth":173,"text":2140},"Subscribe to per-agent events; HMAC payload, retry semantics, attempt log.","md",{},{"icon":49},{"title":46,"description":2189},"5SZyeHsnW_xWITxfe3PXm2VAu3rVRicWtPp-I7Jk4OU",[2196,2198],{"title":41,"path":42,"stem":43,"description":2197,"icon":44,"children":-1},"Walk one conversation belonging to an agent.",null,1778700750587]