[{"data":1,"prerenderedAt":2122},["ShallowReactive",2],{"h1266460966":3,"h3760484027":1251,"h2112064358":2113},{"id":4,"title":5,"body":6,"description":28,"extension":1243,"meta":1244,"navigation":370,"path":1247,"seo":1248,"stem":1249,"__hash__":1250},"docs\u002Fen\u002Ftips\u002F2026\u002F10\u002F01\u002Fmessaging-api-bot-cloudflare-hono.md","Running a Messaging API bot with Cloudflare + Hono",{"type":7,"value":8,"toc":1220},"minimark",[9],[10,11,12,20,25,29,46,55,58,63,66,129,133,136,167,170,208,211,238,257,298,302,309,312,959,963,966,1005,1018,1024,1128,1132,1135,1152,1158,1162,1181,1190,1193,1200,1203,1207,1210,1214],"Tips",{},[13,14,17],"h1",{"id":15,"class":16},"","!mb-4",[18,19],"page-title",{},[21,22],"display-date",{"date":23,"class":24},"2026\u002F10\u002F01","!mb-20",[26,27,28],"p",{},"Hello! I'm Zenigami, a technical writer in charge of managing the LINE Developers site. What kind of environment do you use to run your Messaging API bots?",[26,30,31,32,39,40,45],{},"One of the popular setups recently is ",[33,34,38],"a",{"href":35,"rel":36},"https:\u002F\u002Fwww.cloudflare.com\u002F",[37],"nofollow","Cloudflare"," + ",[33,41,44],{"href":42,"rel":43},"https:\u002F\u002Fhono.dev\u002F",[37],"Hono",", and you can absolutely run a bot with this architecture. In this article, I will introduce the minimum steps required to run a bot using Cloudflare + Hono.",[26,47,48,49,54],{},"Cloudflare Workers offers a ",[33,50,53],{"href":51,"rel":52},"https:\u002F\u002Fwww.cloudflare.com\u002Fplans\u002Fdeveloper-platform\u002F#workers",[37],"free tier",", so you can try all the steps in this tip for free.",[56,57],"toc",{},[59,60,62],"h2",{"id":61},"environment","Environment",[26,64,65],{},"I have confirmed that the contents of this article work in the following environment:",[67,68,69,82],"table",{},[70,71,72],"thead",{},[73,74,75,79],"tr",{},[76,77,78],"th",{},"Name",[76,80,81],{},"Version",[83,84,85,94,102,109,117],"tbody",{},[73,86,87,91],{},[88,89,90],"td",{},"Node.js",[88,92,93],{},"v26.8.1",[73,95,96,99],{},[88,97,98],{},"create-hono",[88,100,101],{},"0.19.5",[73,103,104,106],{},[88,105,44],{},[88,107,108],{},"4.13.9",[73,110,111,114],{},[88,112,113],{},"Wrangler",[88,115,116],{},"4.144.0",[73,118,119,126],{},[88,120,121],{},[33,122,125],{"href":123,"rel":124},"https:\u002F\u002Fgithub.com\u002Fline\u002Fline-bot-sdk-nodejs",[37],"LINE Messaging API SDK for Node.js",[88,127,128],{},"11.2.0",[59,130,132],{"id":131},"create-project","Create a project",[26,134,135],{},"First, initialize the project using a template provided by the Hono web framework. Run the following command to initialize the project:",[137,138,142],"pre",{"className":139,"code":140,"language":141,"meta":15,"style":15},"language-bash shiki shiki-themes github-dark-default","$ npm create hono@latest my-line-bot\n","bash",[143,144,145],"code",{"__ignoreMap":15},[146,147,150,154,158,161,164],"span",{"class":148,"line":149},"line",1,[146,151,153],{"class":152},"sQhOw","$",[146,155,157],{"class":156},"s9uIt"," npm",[146,159,160],{"class":156}," create",[146,162,163],{"class":156}," hono@latest",[146,165,166],{"class":156}," my-line-bot\n",[26,168,169],{},"When you run the command, you will be asked a few questions. Answer them as follows:",[67,171,172,182],{},[70,173,174],{},[73,175,176,179],{},[76,177,178],{},"Question",[76,180,181],{},"Answer",[83,183,184,192,200],{},[73,185,186,189],{},[88,187,188],{},"Which template do you want to use?",[88,190,191],{},"cloudflare-workers",[73,193,194,197],{},[88,195,196],{},"Do you want to install project dependencies?",[88,198,199],{},"Yes",[73,201,202,205],{},[88,203,204],{},"Which package manager do you want to use?",[88,206,207],{},"npm",[26,209,210],{},"Next, install the LINE Messaging API SDK for Node.js. Using this SDK makes it easy to verify signatures and send messages.",[137,212,214],{"className":139,"code":213,"language":141,"meta":15,"style":15},"$ cd my-line-bot\n$ npm install @line\u002Fbot-sdk\n",[143,215,216,225],{"__ignoreMap":15},[146,217,218,220,223],{"class":148,"line":149},[146,219,153],{"class":152},[146,221,222],{"class":156}," cd",[146,224,166],{"class":156},[146,226,228,230,232,235],{"class":148,"line":227},2,[146,229,153],{"class":152},[146,231,157],{"class":156},[146,233,234],{"class":156}," install",[146,236,237],{"class":156}," @line\u002Fbot-sdk\n",[26,239,240,241,244,245,248,249,252,253,256],{},"Then, open the generated ",[143,242,243],{},"wrangler.jsonc",". Add a comma at the end of ",[143,246,247],{},"compatibility_date"," and uncomment ",[143,250,251],{},"compatibility_flags",". Since the SDK uses the Node.js ",[143,254,255],{},"crypto"," module for signature verification, we need to uncomment this to enable Node.js compatibility mode.",[137,258,262],{"className":259,"code":260,"language":261,"meta":15,"style":15},"language-jsonc shiki shiki-themes github-dark-default","\u002F\u002F Add a comma at the end\n\"compatibility_date\": \"2026-09-30\",\n\u002F\u002F Uncomment the following line\n\"compatibility_flags\": [\n  \"nodejs_compat\"\n],\n","jsonc",[143,263,264,269,274,280,286,292],{"__ignoreMap":15},[146,265,266],{"class":148,"line":149},[146,267,268],{},"\u002F\u002F Add a comma at the end\n",[146,270,271],{"class":148,"line":227},[146,272,273],{},"\"compatibility_date\": \"2026-09-30\",\n",[146,275,277],{"class":148,"line":276},3,[146,278,279],{},"\u002F\u002F Uncomment the following line\n",[146,281,283],{"class":148,"line":282},4,[146,284,285],{},"\"compatibility_flags\": [\n",[146,287,289],{"class":148,"line":288},5,[146,290,291],{},"  \"nodejs_compat\"\n",[146,293,295],{"class":148,"line":294},6,[146,296,297],{},"],\n",[59,299,301],{"id":300},"implement-application","Implement the application",[26,303,304,305,308],{},"Now, let's implement the application. Open ",[143,306,307],{},"src\u002Findex.ts"," and replace its contents with the following code.",[26,310,311],{},"In this application, when a user sends a message to the LINE Official Account, the bot echoes 🦜 the exact same content back to them.",[137,313,317],{"className":314,"code":315,"language":316,"meta":15,"style":15},"language-ts shiki shiki-themes github-dark-default","import { Hono } from \"hono\";\nimport { HTTPException } from \"hono\u002Fhttp-exception\";\nimport { messagingApi, validateSignature, webhook } from \"@line\u002Fbot-sdk\";\n\ntype Bindings = {\n  CHANNEL_ACCESS_TOKEN: string;\n  CHANNEL_SECRET: string;\n};\n\nconst app = new Hono\u003C{ Bindings: Bindings }>();\n\napp.post(\"\u002Fwebhook\", async (c) => {\n  const body = await c.req.text();\n  const signature = c.req.header(\"x-line-signature\");\n\n  \u002F\u002F Verify the signature\n  if (!signature || !validateSignature(body, c.env.CHANNEL_SECRET, signature)) {\n    throw new HTTPException(401, { message: \"Unauthorized\" });\n  }\n\n  const client = new messagingApi.MessagingApiClient({\n    channelAccessToken: c.env.CHANNEL_ACCESS_TOKEN,\n  });\n\n  const data: webhook.CallbackRequest = JSON.parse(body);\n\n  for (const event of data.events) {\n    if (\n      event.type === \"message\" &&\n      event.message.type === \"text\" &&\n      event.replyToken\n    ) {\n      try {\n        await client.replyMessage({\n          replyToken: event.replyToken,\n          messages: [\n            {\n              type: \"text\",\n              text: event.message.text,\n            },\n          ],\n        });\n      } catch (error) {\n        throw new HTTPException(500, {\n          message: \"Reply API Error\",\n          cause: error,\n        });\n      }\n    }\n  }\n\n  return c.text(\"OK\");\n});\n\nexport default app;\n","ts",[143,318,319,338,352,366,372,386,400,412,418,423,454,459,494,517,540,545,552,584,609,615,620,641,653,659,664,696,701,720,729,744,757,763,769,777,791,797,803,809,820,826,832,838,844,856,874,885,891,896,902,908,913,918,936,942,947],{"__ignoreMap":15},[146,320,321,325,329,332,335],{"class":148,"line":149},[146,322,324],{"class":323},"suJrU","import",[146,326,328],{"class":327},"sZEs4"," { Hono } ",[146,330,331],{"class":323},"from",[146,333,334],{"class":156}," \"hono\"",[146,336,337],{"class":327},";\n",[146,339,340,342,345,347,350],{"class":148,"line":227},[146,341,324],{"class":323},[146,343,344],{"class":327}," { HTTPException } ",[146,346,331],{"class":323},[146,348,349],{"class":156}," \"hono\u002Fhttp-exception\"",[146,351,337],{"class":327},[146,353,354,356,359,361,364],{"class":148,"line":276},[146,355,324],{"class":323},[146,357,358],{"class":327}," { messagingApi, validateSignature, webhook } ",[146,360,331],{"class":323},[146,362,363],{"class":156}," \"@line\u002Fbot-sdk\"",[146,365,337],{"class":327},[146,367,368],{"class":148,"line":282},[146,369,371],{"emptyLinePlaceholder":370},true,"\n",[146,373,374,377,380,383],{"class":148,"line":288},[146,375,376],{"class":323},"type",[146,378,379],{"class":152}," Bindings",[146,381,382],{"class":323}," =",[146,384,385],{"class":327}," {\n",[146,387,388,391,394,398],{"class":148,"line":294},[146,389,390],{"class":152},"  CHANNEL_ACCESS_TOKEN",[146,392,393],{"class":323},":",[146,395,397],{"class":396},"sFSAA"," string",[146,399,337],{"class":327},[146,401,403,406,408,410],{"class":148,"line":402},7,[146,404,405],{"class":152},"  CHANNEL_SECRET",[146,407,393],{"class":323},[146,409,397],{"class":396},[146,411,337],{"class":327},[146,413,415],{"class":148,"line":414},8,[146,416,417],{"class":327},"};\n",[146,419,421],{"class":148,"line":420},9,[146,422,371],{"emptyLinePlaceholder":370},[146,424,426,429,432,434,437,441,444,447,449,451],{"class":148,"line":425},10,[146,427,428],{"class":323},"const",[146,430,431],{"class":396}," app",[146,433,382],{"class":323},[146,435,436],{"class":323}," new",[146,438,440],{"class":439},"sc3cj"," Hono",[146,442,443],{"class":327},"\u003C{ ",[146,445,446],{"class":152},"Bindings",[146,448,393],{"class":323},[146,450,379],{"class":152},[146,452,453],{"class":327}," }>();\n",[146,455,457],{"class":148,"line":456},11,[146,458,371],{"emptyLinePlaceholder":370},[146,460,462,465,468,471,474,477,480,483,486,489,492],{"class":148,"line":461},12,[146,463,464],{"class":327},"app.",[146,466,467],{"class":439},"post",[146,469,470],{"class":327},"(",[146,472,473],{"class":156},"\"\u002Fwebhook\"",[146,475,476],{"class":327},", ",[146,478,479],{"class":323},"async",[146,481,482],{"class":327}," (",[146,484,485],{"class":152},"c",[146,487,488],{"class":327},") ",[146,490,491],{"class":323},"=>",[146,493,385],{"class":327},[146,495,497,500,503,505,508,511,514],{"class":148,"line":496},13,[146,498,499],{"class":323},"  const",[146,501,502],{"class":396}," body",[146,504,382],{"class":323},[146,506,507],{"class":323}," await",[146,509,510],{"class":327}," c.req.",[146,512,513],{"class":439},"text",[146,515,516],{"class":327},"();\n",[146,518,520,522,525,527,529,532,534,537],{"class":148,"line":519},14,[146,521,499],{"class":323},[146,523,524],{"class":396}," signature",[146,526,382],{"class":323},[146,528,510],{"class":327},[146,530,531],{"class":439},"header",[146,533,470],{"class":327},[146,535,536],{"class":156},"\"x-line-signature\"",[146,538,539],{"class":327},");\n",[146,541,543],{"class":148,"line":542},15,[146,544,371],{"emptyLinePlaceholder":370},[146,546,548],{"class":148,"line":547},16,[146,549,551],{"class":550},"sH3jZ","  \u002F\u002F Verify the signature\n",[146,553,555,558,560,563,566,569,572,575,578,581],{"class":148,"line":554},17,[146,556,557],{"class":323},"  if",[146,559,482],{"class":327},[146,561,562],{"class":323},"!",[146,564,565],{"class":327},"signature ",[146,567,568],{"class":323},"||",[146,570,571],{"class":323}," !",[146,573,574],{"class":439},"validateSignature",[146,576,577],{"class":327},"(body, c.env.",[146,579,580],{"class":396},"CHANNEL_SECRET",[146,582,583],{"class":327},", signature)) {\n",[146,585,587,590,592,595,597,600,603,606],{"class":148,"line":586},18,[146,588,589],{"class":323},"    throw",[146,591,436],{"class":323},[146,593,594],{"class":439}," HTTPException",[146,596,470],{"class":327},[146,598,599],{"class":396},"401",[146,601,602],{"class":327},", { message: ",[146,604,605],{"class":156},"\"Unauthorized\"",[146,607,608],{"class":327}," });\n",[146,610,612],{"class":148,"line":611},19,[146,613,614],{"class":327},"  }\n",[146,616,618],{"class":148,"line":617},20,[146,619,371],{"emptyLinePlaceholder":370},[146,621,623,625,628,630,632,635,638],{"class":148,"line":622},21,[146,624,499],{"class":323},[146,626,627],{"class":396}," client",[146,629,382],{"class":323},[146,631,436],{"class":323},[146,633,634],{"class":327}," messagingApi.",[146,636,637],{"class":439},"MessagingApiClient",[146,639,640],{"class":327},"({\n",[146,642,644,647,650],{"class":148,"line":643},22,[146,645,646],{"class":327},"    channelAccessToken: c.env.",[146,648,649],{"class":396},"CHANNEL_ACCESS_TOKEN",[146,651,652],{"class":327},",\n",[146,654,656],{"class":148,"line":655},23,[146,657,658],{"class":327},"  });\n",[146,660,662],{"class":148,"line":661},24,[146,663,371],{"emptyLinePlaceholder":370},[146,665,667,669,672,674,677,680,683,685,688,690,693],{"class":148,"line":666},25,[146,668,499],{"class":323},[146,670,671],{"class":396}," data",[146,673,393],{"class":323},[146,675,676],{"class":152}," webhook",[146,678,679],{"class":327},".",[146,681,682],{"class":152},"CallbackRequest",[146,684,382],{"class":323},[146,686,687],{"class":396}," JSON",[146,689,679],{"class":327},[146,691,692],{"class":439},"parse",[146,694,695],{"class":327},"(body);\n",[146,697,699],{"class":148,"line":698},26,[146,700,371],{"emptyLinePlaceholder":370},[146,702,704,707,709,711,714,717],{"class":148,"line":703},27,[146,705,706],{"class":323},"  for",[146,708,482],{"class":327},[146,710,428],{"class":323},[146,712,713],{"class":396}," event",[146,715,716],{"class":323}," of",[146,718,719],{"class":327}," data.events) {\n",[146,721,723,726],{"class":148,"line":722},28,[146,724,725],{"class":323},"    if",[146,727,728],{"class":327}," (\n",[146,730,732,735,738,741],{"class":148,"line":731},29,[146,733,734],{"class":327},"      event.type ",[146,736,737],{"class":323},"===",[146,739,740],{"class":156}," \"message\"",[146,742,743],{"class":323}," &&\n",[146,745,747,750,752,755],{"class":148,"line":746},30,[146,748,749],{"class":327},"      event.message.type ",[146,751,737],{"class":323},[146,753,754],{"class":156}," \"text\"",[146,756,743],{"class":323},[146,758,760],{"class":148,"line":759},31,[146,761,762],{"class":327},"      event.replyToken\n",[146,764,766],{"class":148,"line":765},32,[146,767,768],{"class":327},"    ) {\n",[146,770,772,775],{"class":148,"line":771},33,[146,773,774],{"class":323},"      try",[146,776,385],{"class":327},[146,778,780,783,786,789],{"class":148,"line":779},34,[146,781,782],{"class":323},"        await",[146,784,785],{"class":327}," client.",[146,787,788],{"class":439},"replyMessage",[146,790,640],{"class":327},[146,792,794],{"class":148,"line":793},35,[146,795,796],{"class":327},"          replyToken: event.replyToken,\n",[146,798,800],{"class":148,"line":799},36,[146,801,802],{"class":327},"          messages: [\n",[146,804,806],{"class":148,"line":805},37,[146,807,808],{"class":327},"            {\n",[146,810,812,815,818],{"class":148,"line":811},38,[146,813,814],{"class":327},"              type: ",[146,816,817],{"class":156},"\"text\"",[146,819,652],{"class":327},[146,821,823],{"class":148,"line":822},39,[146,824,825],{"class":327},"              text: event.message.text,\n",[146,827,829],{"class":148,"line":828},40,[146,830,831],{"class":327},"            },\n",[146,833,835],{"class":148,"line":834},41,[146,836,837],{"class":327},"          ],\n",[146,839,841],{"class":148,"line":840},42,[146,842,843],{"class":327},"        });\n",[146,845,847,850,853],{"class":148,"line":846},43,[146,848,849],{"class":327},"      } ",[146,851,852],{"class":323},"catch",[146,854,855],{"class":327}," (error) {\n",[146,857,859,862,864,866,868,871],{"class":148,"line":858},44,[146,860,861],{"class":323},"        throw",[146,863,436],{"class":323},[146,865,594],{"class":439},[146,867,470],{"class":327},[146,869,870],{"class":396},"500",[146,872,873],{"class":327},", {\n",[146,875,877,880,883],{"class":148,"line":876},45,[146,878,879],{"class":327},"          message: ",[146,881,882],{"class":156},"\"Reply API Error\"",[146,884,652],{"class":327},[146,886,888],{"class":148,"line":887},46,[146,889,890],{"class":327},"          cause: error,\n",[146,892,894],{"class":148,"line":893},47,[146,895,843],{"class":327},[146,897,899],{"class":148,"line":898},48,[146,900,901],{"class":327},"      }\n",[146,903,905],{"class":148,"line":904},49,[146,906,907],{"class":327},"    }\n",[146,909,911],{"class":148,"line":910},50,[146,912,614],{"class":327},[146,914,916],{"class":148,"line":915},51,[146,917,371],{"emptyLinePlaceholder":370},[146,919,921,924,927,929,931,934],{"class":148,"line":920},52,[146,922,923],{"class":323},"  return",[146,925,926],{"class":327}," c.",[146,928,513],{"class":439},[146,930,470],{"class":327},[146,932,933],{"class":156},"\"OK\"",[146,935,539],{"class":327},[146,937,939],{"class":148,"line":938},53,[146,940,941],{"class":327},"});\n",[146,943,945],{"class":148,"line":944},54,[146,946,371],{"emptyLinePlaceholder":370},[146,948,950,953,956],{"class":148,"line":949},55,[146,951,952],{"class":323},"export",[146,954,955],{"class":323}," default",[146,957,958],{"class":327}," app;\n",[59,960,962],{"id":961},"set-environment-variables","Set environment variables",[26,964,965],{},"Once the application is implemented, it is time to deploy it. But before you do, set the environment variables using the following commands. If prompted to log in to Cloudflare when running these commands, please do so to continue.",[137,967,969],{"className":139,"code":968,"language":141,"meta":15,"style":15},"$ npx wrangler secret put CHANNEL_ACCESS_TOKEN\n$ npx wrangler secret put CHANNEL_SECRET\n",[143,970,971,990],{"__ignoreMap":15},[146,972,973,975,978,981,984,987],{"class":148,"line":149},[146,974,153],{"class":152},[146,976,977],{"class":156}," npx",[146,979,980],{"class":156}," wrangler",[146,982,983],{"class":156}," secret",[146,985,986],{"class":156}," put",[146,988,989],{"class":156}," CHANNEL_ACCESS_TOKEN\n",[146,991,992,994,996,998,1000,1002],{"class":148,"line":227},[146,993,153],{"class":152},[146,995,977],{"class":156},[146,997,980],{"class":156},[146,999,983],{"class":156},[146,1001,986],{"class":156},[146,1003,1004],{"class":156}," CHANNEL_SECRET\n",[26,1006,1007,1008,1012,1013,1017],{},"You can check your channel access token and channel secret in your Messaging API channel on the ",[33,1009,1011],{"href":1010},"\u002Fconsole\u002F","LINE Developers Console",". If you haven't created a Messaging API channel yet, see ",[33,1014,1016],{"href":1015},"\u002Fdocs\u002Fmessaging-api\u002Fgetting-started\u002F","Getting started with the Messaging API"," to create one.",[26,1019,1020,1021,1023],{},"For example, when setting ",[143,1022,649],{},", it will look like this. Since there is no Worker on Cloudflare at the time you run the command, you will also be asked whether to create a Worker:",[137,1025,1027],{"className":139,"code":1026,"language":141,"meta":15,"style":15},"$ npx wrangler secret put CHANNEL_ACCESS_TOKEN\n\n ⛅️ wrangler 4.144.0\n───────────────────────────────────────────────\n✔ Enter a secret value: … ****\n🌀 Creating the secret for the Worker \"my-line-bot\"\n✔ There doesn't seem to be a Worker called \"my-line-bot\". Do you want to create a new Worker with that name and add secrets to it? … yes\n🌀 Creating new Worker \"my-line-bot\"...\n✨ Success! Uploaded secret CHANNEL_ACCESS_TOKEN\n",[143,1028,1029,1043,1047,1057,1062,1084,1108,1118,1123],{"__ignoreMap":15},[146,1030,1031,1033,1035,1037,1039,1041],{"class":148,"line":149},[146,1032,153],{"class":152},[146,1034,977],{"class":156},[146,1036,980],{"class":156},[146,1038,983],{"class":156},[146,1040,986],{"class":156},[146,1042,989],{"class":156},[146,1044,1045],{"class":148,"line":227},[146,1046,371],{"emptyLinePlaceholder":370},[146,1048,1049,1052,1054],{"class":148,"line":276},[146,1050,1051],{"class":152}," ⛅️",[146,1053,980],{"class":156},[146,1055,1056],{"class":396}," 4.144.0\n",[146,1058,1059],{"class":148,"line":282},[146,1060,1061],{"class":152},"───────────────────────────────────────────────\n",[146,1063,1064,1067,1070,1073,1075,1078,1081],{"class":148,"line":288},[146,1065,1066],{"class":152},"✔",[146,1068,1069],{"class":156}," Enter",[146,1071,1072],{"class":156}," a",[146,1074,983],{"class":156},[146,1076,1077],{"class":156}," value:",[146,1079,1080],{"class":156}," …",[146,1082,1083],{"class":396}," ****\n",[146,1085,1086,1089,1092,1095,1097,1100,1102,1105],{"class":148,"line":294},[146,1087,1088],{"class":152},"🌀",[146,1090,1091],{"class":156}," Creating",[146,1093,1094],{"class":156}," the",[146,1096,983],{"class":156},[146,1098,1099],{"class":156}," for",[146,1101,1094],{"class":156},[146,1103,1104],{"class":156}," Worker",[146,1106,1107],{"class":156}," \"my-line-bot\"\n",[146,1109,1110,1112,1115],{"class":148,"line":402},[146,1111,1066],{"class":152},[146,1113,1114],{"class":156}," There",[146,1116,1117],{"class":156}," doesn't seem to be a Worker called \"my-line-bot\". Do you want to create a new Worker with that name and add secrets to it? … yes\n",[146,1119,1120],{"class":148,"line":414},[146,1121,1122],{"class":156},"🌀 Creating new Worker \"my-line-bot\"...\n",[146,1124,1125],{"class":148,"line":420},[146,1126,1127],{"class":156},"✨ Success! Uploaded secret CHANNEL_ACCESS_TOKEN\n",[59,1129,1131],{"id":1130},"deploy","Deploy",[26,1133,1134],{},"After setting up the environment variables, deploy the application. You can deploy it using the following command:",[137,1136,1138],{"className":139,"code":1137,"language":141,"meta":15,"style":15},"$ npm run deploy\n",[143,1139,1140],{"__ignoreMap":15},[146,1141,1142,1144,1146,1149],{"class":148,"line":149},[146,1143,153],{"class":152},[146,1145,157],{"class":156},[146,1147,1148],{"class":156}," run",[146,1150,1151],{"class":156}," deploy\n",[26,1153,1154,1155,679],{},"When the deployment is complete, the deployment destination URL will be displayed in the command output, looking something like ",[143,1156,1157],{},"https:\u002F\u002Fmy-line-bot.\u003CYOUR_SUBDOMAIN>.workers.dev",[59,1159,1161],{"id":1160},"check-behavior","Check the behavior",[26,1163,1164,1165,1168,1169,1173,1174,1177,1178,679],{},"After deploying the application, take the deployment destination URL, append ",[143,1166,1167],{},"\u002Fwebhook"," to it, and register this URL in the LINE Developers Console. Open your Messaging API channel, and enter the URL into the ",[1170,1171,1172],"strong",{},"Webhook URL"," field on the ",[1170,1175,1176],{},"Messaging API"," tab, and then enable ",[1170,1179,1180],{},"Use webhook",[26,1182,1183],{},[1184,1185],"img",{"alt":15,"className":1186,"src":1189},[1187,1188],"border","w-fix-480","\u002Fmedia\u002Ftips\u002F2026\u002Fcloudflare-hono-webhook-url-en.png",[26,1191,1192],{},"At this point, the setup is complete. Open your LINE Official Account and try sending some random text.",[26,1194,1195],{},[1184,1196],{"alt":15,"className":1197,"src":1199},[1187,1198],"w-fix-320","\u002Fmedia\u002Ftips\u002F2026\u002Fcloudflare-hono-oa.png",[26,1201,1202],{},"If the exact same text you sent comes back from the LINE Official Account like this, it's a success!",[59,1204,1206],{"id":1205},"conclusion","Conclusion",[26,1208,1209],{},"As described above, by using Cloudflare and Hono, you can easily get the Messaging API up and running. If you are ever wondering where to host your bot, please give this setup a try.",[1211,1212,1213],"style",{},"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 pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}",[1215,1216],"tags",{"tags":1217,"lang":1218,"section":1219},"messaging-api","en","tips",{"title":15,"searchDepth":282,"depth":288,"links":1221},[1222,1225,1228,1231,1234,1237,1240],{"id":1223,"depth":227,"text":1224},"environment-environment","Environment {#environment}",{"id":1226,"depth":227,"text":1227},"create-a-project-create-project","Create a project {#create-project}",{"id":1229,"depth":227,"text":1230},"implement-the-application-implement-application","Implement the application {#implement-application}",{"id":1232,"depth":227,"text":1233},"set-environment-variables-set-environment-variables","Set environment variables {#set-environment-variables}",{"id":1235,"depth":227,"text":1236},"deploy-deploy","Deploy {#deploy}",{"id":1238,"depth":227,"text":1239},"check-the-behavior-check-behavior","Check the behavior {#check-behavior}",{"id":1241,"depth":227,"text":1242},"conclusion-conclusion","Conclusion {#conclusion}","md",{"date":1245,"tags":1217,"locale":1218,"sidebar":1246},"2026-10-01 00:00 UTC",false,"\u002Fen\u002Ftips\u002F2026\u002F10\u002F01\u002Fmessaging-api-bot-cloudflare-hono",{"title":5,"description":28},"en\u002Ftips\u002F2026\u002F10\u002F01\u002Fmessaging-api-bot-cloudflare-hono","qKOzbEmDwhA1p_0bS5JWNPlhmyxNVbna05kmOufSvrQ",{"id":4,"title":5,"body":1252,"description":28,"extension":1243,"meta":2111,"navigation":370,"path":1247,"seo":2112,"stem":1249,"__hash__":1250},{"type":7,"value":1253,"toc":2102},[1254],[10,1255,1256,1260,1262,1264,1272,1277,1279,1281,1283,1328,1330,1332,1348,1350,1380,1382,1404,1414,1442,1444,1448,1450,1916,1918,1920,1952,1958,1962,2046,2048,2050,2064,2068,2070,2080,2085,2087,2092,2094,2096,2098,2100],{},[13,1257,1258],{"id":15,"class":16},[18,1259],{},[21,1261],{"date":23,"class":24},[26,1263,28],{},[26,1265,31,1266,39,1269,45],{},[33,1267,38],{"href":35,"rel":1268},[37],[33,1270,44],{"href":42,"rel":1271},[37],[26,1273,48,1274,54],{},[33,1275,53],{"href":51,"rel":1276},[37],[56,1278],{},[59,1280,62],{"id":61},[26,1282,65],{},[67,1284,1285,1293],{},[70,1286,1287],{},[73,1288,1289,1291],{},[76,1290,78],{},[76,1292,81],{},[83,1294,1295,1301,1307,1313,1319],{},[73,1296,1297,1299],{},[88,1298,90],{},[88,1300,93],{},[73,1302,1303,1305],{},[88,1304,98],{},[88,1306,101],{},[73,1308,1309,1311],{},[88,1310,44],{},[88,1312,108],{},[73,1314,1315,1317],{},[88,1316,113],{},[88,1318,116],{},[73,1320,1321,1326],{},[88,1322,1323],{},[33,1324,125],{"href":123,"rel":1325},[37],[88,1327,128],{},[59,1329,132],{"id":131},[26,1331,135],{},[137,1333,1334],{"className":139,"code":140,"language":141,"meta":15,"style":15},[143,1335,1336],{"__ignoreMap":15},[146,1337,1338,1340,1342,1344,1346],{"class":148,"line":149},[146,1339,153],{"class":152},[146,1341,157],{"class":156},[146,1343,160],{"class":156},[146,1345,163],{"class":156},[146,1347,166],{"class":156},[26,1349,169],{},[67,1351,1352,1360],{},[70,1353,1354],{},[73,1355,1356,1358],{},[76,1357,178],{},[76,1359,181],{},[83,1361,1362,1368,1374],{},[73,1363,1364,1366],{},[88,1365,188],{},[88,1367,191],{},[73,1369,1370,1372],{},[88,1371,196],{},[88,1373,199],{},[73,1375,1376,1378],{},[88,1377,204],{},[88,1379,207],{},[26,1381,210],{},[137,1383,1384],{"className":139,"code":213,"language":141,"meta":15,"style":15},[143,1385,1386,1394],{"__ignoreMap":15},[146,1387,1388,1390,1392],{"class":148,"line":149},[146,1389,153],{"class":152},[146,1391,222],{"class":156},[146,1393,166],{"class":156},[146,1395,1396,1398,1400,1402],{"class":148,"line":227},[146,1397,153],{"class":152},[146,1399,157],{"class":156},[146,1401,234],{"class":156},[146,1403,237],{"class":156},[26,1405,240,1406,244,1408,248,1410,252,1412,256],{},[143,1407,243],{},[143,1409,247],{},[143,1411,251],{},[143,1413,255],{},[137,1415,1416],{"className":259,"code":260,"language":261,"meta":15,"style":15},[143,1417,1418,1422,1426,1430,1434,1438],{"__ignoreMap":15},[146,1419,1420],{"class":148,"line":149},[146,1421,268],{},[146,1423,1424],{"class":148,"line":227},[146,1425,273],{},[146,1427,1428],{"class":148,"line":276},[146,1429,279],{},[146,1431,1432],{"class":148,"line":282},[146,1433,285],{},[146,1435,1436],{"class":148,"line":288},[146,1437,291],{},[146,1439,1440],{"class":148,"line":294},[146,1441,297],{},[59,1443,301],{"id":300},[26,1445,304,1446,308],{},[143,1447,307],{},[26,1449,311],{},[137,1451,1452],{"className":314,"code":315,"language":316,"meta":15,"style":15},[143,1453,1454,1466,1478,1490,1494,1504,1514,1524,1528,1532,1554,1558,1582,1598,1616,1620,1624,1646,1664,1668,1672,1688,1696,1700,1704,1728,1732,1746,1752,1762,1772,1776,1780,1786,1796,1800,1804,1808,1816,1820,1824,1828,1832,1840,1854,1862,1866,1870,1874,1878,1882,1886,1900,1904,1908],{"__ignoreMap":15},[146,1455,1456,1458,1460,1462,1464],{"class":148,"line":149},[146,1457,324],{"class":323},[146,1459,328],{"class":327},[146,1461,331],{"class":323},[146,1463,334],{"class":156},[146,1465,337],{"class":327},[146,1467,1468,1470,1472,1474,1476],{"class":148,"line":227},[146,1469,324],{"class":323},[146,1471,344],{"class":327},[146,1473,331],{"class":323},[146,1475,349],{"class":156},[146,1477,337],{"class":327},[146,1479,1480,1482,1484,1486,1488],{"class":148,"line":276},[146,1481,324],{"class":323},[146,1483,358],{"class":327},[146,1485,331],{"class":323},[146,1487,363],{"class":156},[146,1489,337],{"class":327},[146,1491,1492],{"class":148,"line":282},[146,1493,371],{"emptyLinePlaceholder":370},[146,1495,1496,1498,1500,1502],{"class":148,"line":288},[146,1497,376],{"class":323},[146,1499,379],{"class":152},[146,1501,382],{"class":323},[146,1503,385],{"class":327},[146,1505,1506,1508,1510,1512],{"class":148,"line":294},[146,1507,390],{"class":152},[146,1509,393],{"class":323},[146,1511,397],{"class":396},[146,1513,337],{"class":327},[146,1515,1516,1518,1520,1522],{"class":148,"line":402},[146,1517,405],{"class":152},[146,1519,393],{"class":323},[146,1521,397],{"class":396},[146,1523,337],{"class":327},[146,1525,1526],{"class":148,"line":414},[146,1527,417],{"class":327},[146,1529,1530],{"class":148,"line":420},[146,1531,371],{"emptyLinePlaceholder":370},[146,1533,1534,1536,1538,1540,1542,1544,1546,1548,1550,1552],{"class":148,"line":425},[146,1535,428],{"class":323},[146,1537,431],{"class":396},[146,1539,382],{"class":323},[146,1541,436],{"class":323},[146,1543,440],{"class":439},[146,1545,443],{"class":327},[146,1547,446],{"class":152},[146,1549,393],{"class":323},[146,1551,379],{"class":152},[146,1553,453],{"class":327},[146,1555,1556],{"class":148,"line":456},[146,1557,371],{"emptyLinePlaceholder":370},[146,1559,1560,1562,1564,1566,1568,1570,1572,1574,1576,1578,1580],{"class":148,"line":461},[146,1561,464],{"class":327},[146,1563,467],{"class":439},[146,1565,470],{"class":327},[146,1567,473],{"class":156},[146,1569,476],{"class":327},[146,1571,479],{"class":323},[146,1573,482],{"class":327},[146,1575,485],{"class":152},[146,1577,488],{"class":327},[146,1579,491],{"class":323},[146,1581,385],{"class":327},[146,1583,1584,1586,1588,1590,1592,1594,1596],{"class":148,"line":496},[146,1585,499],{"class":323},[146,1587,502],{"class":396},[146,1589,382],{"class":323},[146,1591,507],{"class":323},[146,1593,510],{"class":327},[146,1595,513],{"class":439},[146,1597,516],{"class":327},[146,1599,1600,1602,1604,1606,1608,1610,1612,1614],{"class":148,"line":519},[146,1601,499],{"class":323},[146,1603,524],{"class":396},[146,1605,382],{"class":323},[146,1607,510],{"class":327},[146,1609,531],{"class":439},[146,1611,470],{"class":327},[146,1613,536],{"class":156},[146,1615,539],{"class":327},[146,1617,1618],{"class":148,"line":542},[146,1619,371],{"emptyLinePlaceholder":370},[146,1621,1622],{"class":148,"line":547},[146,1623,551],{"class":550},[146,1625,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644],{"class":148,"line":554},[146,1627,557],{"class":323},[146,1629,482],{"class":327},[146,1631,562],{"class":323},[146,1633,565],{"class":327},[146,1635,568],{"class":323},[146,1637,571],{"class":323},[146,1639,574],{"class":439},[146,1641,577],{"class":327},[146,1643,580],{"class":396},[146,1645,583],{"class":327},[146,1647,1648,1650,1652,1654,1656,1658,1660,1662],{"class":148,"line":586},[146,1649,589],{"class":323},[146,1651,436],{"class":323},[146,1653,594],{"class":439},[146,1655,470],{"class":327},[146,1657,599],{"class":396},[146,1659,602],{"class":327},[146,1661,605],{"class":156},[146,1663,608],{"class":327},[146,1665,1666],{"class":148,"line":611},[146,1667,614],{"class":327},[146,1669,1670],{"class":148,"line":617},[146,1671,371],{"emptyLinePlaceholder":370},[146,1673,1674,1676,1678,1680,1682,1684,1686],{"class":148,"line":622},[146,1675,499],{"class":323},[146,1677,627],{"class":396},[146,1679,382],{"class":323},[146,1681,436],{"class":323},[146,1683,634],{"class":327},[146,1685,637],{"class":439},[146,1687,640],{"class":327},[146,1689,1690,1692,1694],{"class":148,"line":643},[146,1691,646],{"class":327},[146,1693,649],{"class":396},[146,1695,652],{"class":327},[146,1697,1698],{"class":148,"line":655},[146,1699,658],{"class":327},[146,1701,1702],{"class":148,"line":661},[146,1703,371],{"emptyLinePlaceholder":370},[146,1705,1706,1708,1710,1712,1714,1716,1718,1720,1722,1724,1726],{"class":148,"line":666},[146,1707,499],{"class":323},[146,1709,671],{"class":396},[146,1711,393],{"class":323},[146,1713,676],{"class":152},[146,1715,679],{"class":327},[146,1717,682],{"class":152},[146,1719,382],{"class":323},[146,1721,687],{"class":396},[146,1723,679],{"class":327},[146,1725,692],{"class":439},[146,1727,695],{"class":327},[146,1729,1730],{"class":148,"line":698},[146,1731,371],{"emptyLinePlaceholder":370},[146,1733,1734,1736,1738,1740,1742,1744],{"class":148,"line":703},[146,1735,706],{"class":323},[146,1737,482],{"class":327},[146,1739,428],{"class":323},[146,1741,713],{"class":396},[146,1743,716],{"class":323},[146,1745,719],{"class":327},[146,1747,1748,1750],{"class":148,"line":722},[146,1749,725],{"class":323},[146,1751,728],{"class":327},[146,1753,1754,1756,1758,1760],{"class":148,"line":731},[146,1755,734],{"class":327},[146,1757,737],{"class":323},[146,1759,740],{"class":156},[146,1761,743],{"class":323},[146,1763,1764,1766,1768,1770],{"class":148,"line":746},[146,1765,749],{"class":327},[146,1767,737],{"class":323},[146,1769,754],{"class":156},[146,1771,743],{"class":323},[146,1773,1774],{"class":148,"line":759},[146,1775,762],{"class":327},[146,1777,1778],{"class":148,"line":765},[146,1779,768],{"class":327},[146,1781,1782,1784],{"class":148,"line":771},[146,1783,774],{"class":323},[146,1785,385],{"class":327},[146,1787,1788,1790,1792,1794],{"class":148,"line":779},[146,1789,782],{"class":323},[146,1791,785],{"class":327},[146,1793,788],{"class":439},[146,1795,640],{"class":327},[146,1797,1798],{"class":148,"line":793},[146,1799,796],{"class":327},[146,1801,1802],{"class":148,"line":799},[146,1803,802],{"class":327},[146,1805,1806],{"class":148,"line":805},[146,1807,808],{"class":327},[146,1809,1810,1812,1814],{"class":148,"line":811},[146,1811,814],{"class":327},[146,1813,817],{"class":156},[146,1815,652],{"class":327},[146,1817,1818],{"class":148,"line":822},[146,1819,825],{"class":327},[146,1821,1822],{"class":148,"line":828},[146,1823,831],{"class":327},[146,1825,1826],{"class":148,"line":834},[146,1827,837],{"class":327},[146,1829,1830],{"class":148,"line":840},[146,1831,843],{"class":327},[146,1833,1834,1836,1838],{"class":148,"line":846},[146,1835,849],{"class":327},[146,1837,852],{"class":323},[146,1839,855],{"class":327},[146,1841,1842,1844,1846,1848,1850,1852],{"class":148,"line":858},[146,1843,861],{"class":323},[146,1845,436],{"class":323},[146,1847,594],{"class":439},[146,1849,470],{"class":327},[146,1851,870],{"class":396},[146,1853,873],{"class":327},[146,1855,1856,1858,1860],{"class":148,"line":876},[146,1857,879],{"class":327},[146,1859,882],{"class":156},[146,1861,652],{"class":327},[146,1863,1864],{"class":148,"line":887},[146,1865,890],{"class":327},[146,1867,1868],{"class":148,"line":893},[146,1869,843],{"class":327},[146,1871,1872],{"class":148,"line":898},[146,1873,901],{"class":327},[146,1875,1876],{"class":148,"line":904},[146,1877,907],{"class":327},[146,1879,1880],{"class":148,"line":910},[146,1881,614],{"class":327},[146,1883,1884],{"class":148,"line":915},[146,1885,371],{"emptyLinePlaceholder":370},[146,1887,1888,1890,1892,1894,1896,1898],{"class":148,"line":920},[146,1889,923],{"class":323},[146,1891,926],{"class":327},[146,1893,513],{"class":439},[146,1895,470],{"class":327},[146,1897,933],{"class":156},[146,1899,539],{"class":327},[146,1901,1902],{"class":148,"line":938},[146,1903,941],{"class":327},[146,1905,1906],{"class":148,"line":944},[146,1907,371],{"emptyLinePlaceholder":370},[146,1909,1910,1912,1914],{"class":148,"line":949},[146,1911,952],{"class":323},[146,1913,955],{"class":323},[146,1915,958],{"class":327},[59,1917,962],{"id":961},[26,1919,965],{},[137,1921,1922],{"className":139,"code":968,"language":141,"meta":15,"style":15},[143,1923,1924,1938],{"__ignoreMap":15},[146,1925,1926,1928,1930,1932,1934,1936],{"class":148,"line":149},[146,1927,153],{"class":152},[146,1929,977],{"class":156},[146,1931,980],{"class":156},[146,1933,983],{"class":156},[146,1935,986],{"class":156},[146,1937,989],{"class":156},[146,1939,1940,1942,1944,1946,1948,1950],{"class":148,"line":227},[146,1941,153],{"class":152},[146,1943,977],{"class":156},[146,1945,980],{"class":156},[146,1947,983],{"class":156},[146,1949,986],{"class":156},[146,1951,1004],{"class":156},[26,1953,1007,1954,1012,1956,1017],{},[33,1955,1011],{"href":1010},[33,1957,1016],{"href":1015},[26,1959,1020,1960,1023],{},[143,1961,649],{},[137,1963,1964],{"className":139,"code":1026,"language":141,"meta":15,"style":15},[143,1965,1966,1980,1984,1992,1996,2012,2030,2038,2042],{"__ignoreMap":15},[146,1967,1968,1970,1972,1974,1976,1978],{"class":148,"line":149},[146,1969,153],{"class":152},[146,1971,977],{"class":156},[146,1973,980],{"class":156},[146,1975,983],{"class":156},[146,1977,986],{"class":156},[146,1979,989],{"class":156},[146,1981,1982],{"class":148,"line":227},[146,1983,371],{"emptyLinePlaceholder":370},[146,1985,1986,1988,1990],{"class":148,"line":276},[146,1987,1051],{"class":152},[146,1989,980],{"class":156},[146,1991,1056],{"class":396},[146,1993,1994],{"class":148,"line":282},[146,1995,1061],{"class":152},[146,1997,1998,2000,2002,2004,2006,2008,2010],{"class":148,"line":288},[146,1999,1066],{"class":152},[146,2001,1069],{"class":156},[146,2003,1072],{"class":156},[146,2005,983],{"class":156},[146,2007,1077],{"class":156},[146,2009,1080],{"class":156},[146,2011,1083],{"class":396},[146,2013,2014,2016,2018,2020,2022,2024,2026,2028],{"class":148,"line":294},[146,2015,1088],{"class":152},[146,2017,1091],{"class":156},[146,2019,1094],{"class":156},[146,2021,983],{"class":156},[146,2023,1099],{"class":156},[146,2025,1094],{"class":156},[146,2027,1104],{"class":156},[146,2029,1107],{"class":156},[146,2031,2032,2034,2036],{"class":148,"line":402},[146,2033,1066],{"class":152},[146,2035,1114],{"class":156},[146,2037,1117],{"class":156},[146,2039,2040],{"class":148,"line":414},[146,2041,1122],{"class":156},[146,2043,2044],{"class":148,"line":420},[146,2045,1127],{"class":156},[59,2047,1131],{"id":1130},[26,2049,1134],{},[137,2051,2052],{"className":139,"code":1137,"language":141,"meta":15,"style":15},[143,2053,2054],{"__ignoreMap":15},[146,2055,2056,2058,2060,2062],{"class":148,"line":149},[146,2057,153],{"class":152},[146,2059,157],{"class":156},[146,2061,1148],{"class":156},[146,2063,1151],{"class":156},[26,2065,1154,2066,679],{},[143,2067,1157],{},[59,2069,1161],{"id":1160},[26,2071,1164,2072,1168,2074,1173,2076,1177,2078,679],{},[143,2073,1167],{},[1170,2075,1172],{},[1170,2077,1176],{},[1170,2079,1180],{},[26,2081,2082],{},[1184,2083],{"alt":15,"className":2084,"src":1189},[1187,1188],[26,2086,1192],{},[26,2088,2089],{},[1184,2090],{"alt":15,"className":2091,"src":1199},[1187,1198],[26,2093,1202],{},[59,2095,1206],{"id":1205},[26,2097,1209],{},[1211,2099,1213],{},[1215,2101],{"tags":1217,"lang":1218,"section":1219},{"title":15,"searchDepth":282,"depth":288,"links":2103},[2104,2105,2106,2107,2108,2109,2110],{"id":1223,"depth":227,"text":1224},{"id":1226,"depth":227,"text":1227},{"id":1229,"depth":227,"text":1230},{"id":1232,"depth":227,"text":1233},{"id":1235,"depth":227,"text":1236},{"id":1238,"depth":227,"text":1239},{"id":1241,"depth":227,"text":1242},{"date":1245,"tags":1217,"locale":1218,"sidebar":1246},{"title":5,"description":28},{"toc":2114,"fullToc":2114},[2115,2116,2117,2118,2119,2120,2121],{"id":61,"depth":227,"text":62},{"id":131,"depth":227,"text":132},{"id":300,"depth":227,"text":301},{"id":961,"depth":227,"text":962},{"id":1130,"depth":227,"text":1131},{"id":1160,"depth":227,"text":1161},{"id":1205,"depth":227,"text":1206},1791946076946]