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