[{"data":1,"prerenderedAt":1246},["ShallowReactive",2],{"navigation_docs":3,"-guides-webhooks":195,"-guides-webhooks-surround":1241},[4,23,65,87,133,155,173],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Guides","i-lucide-compass","\u002Fguides","2.guides",[29,33,37,41,45,49,53,57,61],{"title":30,"path":31,"stem":32},"Authenticate","\u002Fguides\u002Fauthentication","2.guides\u002F1.authentication",{"title":34,"path":35,"stem":36},"Work with several forges","\u002Fguides\u002Fmultiple-forges","2.guides\u002F2.multiple-forges",{"title":38,"path":39,"stem":40},"Configure from the environment","\u002Fguides\u002Fenvironment","2.guides\u002F3.environment",{"title":42,"path":43,"stem":44},"Receive webhooks","\u002Fguides\u002Fwebhooks","2.guides\u002F4.webhooks",{"title":46,"path":47,"stem":48},"Check what a forge supports","\u002Fguides\u002Fcapabilities","2.guides\u002F5.capabilities",{"title":50,"path":51,"stem":52},"Handle errors and rate limits","\u002Fguides\u002Ferrors","2.guides\u002F6.errors",{"title":54,"path":55,"stem":56},"Page through results","\u002Fguides\u002Fpagination","2.guides\u002F7.pagination",{"title":58,"path":59,"stem":60},"Browser bundles","\u002Fguides\u002Fbundling","2.guides\u002F8.bundling",{"title":62,"path":63,"stem":64},"Test your code","\u002Fguides\u002Ftesting","2.guides\u002F9.testing",{"title":66,"icon":67,"path":68,"stem":69,"children":70,"page":22},"Concepts","i-lucide-lightbulb","\u002Fconcepts","3.concepts",[71,75,79,83],{"title":72,"path":73,"stem":74},"Data model","\u002Fconcepts\u002Fdata-model","3.concepts\u002F1.data-model",{"title":76,"path":77,"stem":78},"Capabilities","\u002Fconcepts\u002Fcapabilities","3.concepts\u002F2.capabilities",{"title":80,"path":81,"stem":82},"Providers and factories","\u002Fconcepts\u002Fproviders","3.concepts\u002F3.providers",{"title":84,"path":85,"stem":86},"Events","\u002Fconcepts\u002Fevents","3.concepts\u002F4.events",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Providers","i-lucide-server","\u002Fproviders","4.providers",[93,97,101,105,109,113,117,121,125,129],{"title":94,"path":95,"stem":96},"Azure DevOps","\u002Fproviders\u002Fazure-devops","4.providers\u002Fazure-devops",{"title":98,"path":99,"stem":100},"Bitbucket Cloud","\u002Fproviders\u002Fbitbucket","4.providers\u002Fbitbucket",{"title":102,"path":103,"stem":104},"Cursor Origin","\u002Fproviders\u002Fcursor-origin","4.providers\u002Fcursor-origin",{"title":106,"path":107,"stem":108},"Forgejo and Codeberg","\u002Fproviders\u002Fforgejo","4.providers\u002Fforgejo",{"title":110,"path":111,"stem":112},"Gitea","\u002Fproviders\u002Fgitea","4.providers\u002Fgitea",{"title":114,"path":115,"stem":116},"Gitee","\u002Fproviders\u002Fgitee","4.providers\u002Fgitee",{"title":118,"path":119,"stem":120},"GitHub","\u002Fproviders\u002Fgithub","4.providers\u002Fgithub",{"title":122,"path":123,"stem":124},"GitLab","\u002Fproviders\u002Fgitlab","4.providers\u002Fgitlab",{"title":126,"path":127,"stem":128},"pushin.eu","\u002Fproviders\u002Fpushin","4.providers\u002Fpushin",{"title":130,"path":131,"stem":132},"Tangled","\u002Fproviders\u002Ftangled","4.providers\u002Ftangled",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":22},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[139,143,147,151],{"title":140,"path":141,"stem":142},"Provider API","\u002Freference\u002Fprovider-api","5.reference\u002F1.provider-api",{"title":144,"path":145,"stem":146},"Capability matrix","\u002Freference\u002Fcapability-matrix","5.reference\u002F2.capability-matrix",{"title":148,"path":149,"stem":150},"Errors","\u002Freference\u002Ferrors","5.reference\u002F3.errors",{"title":152,"path":153,"stem":154},"JSON Schemas","\u002Freference\u002Fjson-schemas","5.reference\u002F5.json-schemas",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":22},"Examples","i-lucide-boxes","\u002Fexamples","6.examples",[161,165,169],{"title":162,"path":163,"stem":164},"Inbox CLI","\u002Fexamples\u002Finbox-cli","6.examples\u002F1.inbox-cli",{"title":166,"path":167,"stem":168},"Label bot","\u002Fexamples\u002Flabel-bot","6.examples\u002F2.label-bot",{"title":170,"path":171,"stem":172},"Release digest","\u002Fexamples\u002Frelease-digest","6.examples\u002F3.release-digest",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":22},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","7.contributing",[179,183,187,191],{"title":180,"path":181,"stem":182},"Contribution guide","\u002Fcontributing\u002Fguidelines","7.contributing\u002F1.guidelines",{"title":184,"path":185,"stem":186},"Write a provider","\u002Fcontributing\u002Fwrite-a-provider","7.contributing\u002F2.write-a-provider",{"title":188,"path":189,"stem":190},"Record fixtures","\u002Fcontributing\u002Frecord-fixtures","7.contributing\u002F3.record-fixtures",{"title":192,"path":193,"stem":194},"Contributors","\u002Fcontributing\u002Fcontributors","7.contributing\u002F4.contributors",{"id":196,"title":42,"body":197,"description":1234,"extension":1235,"links":1236,"meta":1237,"navigation":296,"path":43,"seo":1239,"stem":44,"__hash__":1240},"docs\u002F2.guides\u002F4.webhooks.md",{"type":198,"value":199,"toc":1227},"minimark",[200,220,225,228,696,703,720,724,736,836,840,881,1031,1040,1044,1047,1178,1192,1196,1216,1223],[201,202,203,207,208,211,212,215,216,219],"p",{},[204,205,206],"code",{},"webhooks.ingest()"," verifies a delivery against ",[204,209,210],{},"webhookSecret"," and translates it into ",[204,213,214],{},"ForgeEvent"," objects. If the signature doesn't match, it throws ",[204,217,218],{},"WebhookVerificationError",".",[221,222,224],"h2",{"id":223},"write-a-handler","Write a handler",[201,226,227],{},"The forge signs the exact bytes it sends, so pass the raw body. Don't parse and re-serialise it:",[229,230,235],"pre",{"className":231,"code":232,"language":233,"meta":234,"style":234},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { WebhookVerificationError } from 'forges'\nimport { github } from 'forges\u002Fgithub'\n\nconst forge = github({\n  webhookSecret: process.env.GITHUB_WEBHOOK_SECRET,\n}).create()\n\nexport default async function handler(request: Request) {\n  try {\n    const events = await forge.webhooks.ingest({\n      headers: request.headers,\n      body: await request.text(),\n    })\n    for (const event of events) {\n      console.log(event.kind, event.action, event.summary)\n    }\n    return new Response(null, { status: 204 })\n  }\n  catch (error) {\n    if (error instanceof WebhookVerificationError) {\n      return new Response('Invalid signature', { status: 401 })\n    }\n    throw error\n  }\n}\n","ts","",[204,236,237,270,291,298,320,346,363,368,403,411,443,461,483,492,516,558,564,596,602,617,636,671,676,685,690],{"__ignoreMap":234},[238,239,242,246,250,254,257,260,263,267],"span",{"class":240,"line":241},"line",1,[238,243,245],{"class":244},"s7zQu","import",[238,247,249],{"class":248},"sMK4o"," {",[238,251,253],{"class":252},"sTEyZ"," WebhookVerificationError",[238,255,256],{"class":248}," }",[238,258,259],{"class":244}," from",[238,261,262],{"class":248}," '",[238,264,266],{"class":265},"sfazB","forges",[238,268,269],{"class":248},"'\n",[238,271,273,275,277,280,282,284,286,289],{"class":240,"line":272},2,[238,274,245],{"class":244},[238,276,249],{"class":248},[238,278,279],{"class":252}," github",[238,281,256],{"class":248},[238,283,259],{"class":244},[238,285,262],{"class":248},[238,287,288],{"class":265},"forges\u002Fgithub",[238,290,269],{"class":248},[238,292,294],{"class":240,"line":293},3,[238,295,297],{"emptyLinePlaceholder":296},true,"\n",[238,299,301,305,308,311,314,317],{"class":240,"line":300},4,[238,302,304],{"class":303},"spNyl","const",[238,306,307],{"class":252}," forge ",[238,309,310],{"class":248},"=",[238,312,279],{"class":313},"s2Zo4",[238,315,316],{"class":252},"(",[238,318,319],{"class":248},"{\n",[238,321,323,327,330,333,335,338,340,343],{"class":240,"line":322},5,[238,324,326],{"class":325},"swJcz","  webhookSecret",[238,328,329],{"class":248},":",[238,331,332],{"class":252}," process",[238,334,219],{"class":248},[238,336,337],{"class":252},"env",[238,339,219],{"class":248},[238,341,342],{"class":252},"GITHUB_WEBHOOK_SECRET",[238,344,345],{"class":248},",\n",[238,347,349,352,355,357,360],{"class":240,"line":348},6,[238,350,351],{"class":248},"}",[238,353,354],{"class":252},")",[238,356,219],{"class":248},[238,358,359],{"class":313},"create",[238,361,362],{"class":252},"()\n",[238,364,366],{"class":240,"line":365},7,[238,367,297],{"emptyLinePlaceholder":296},[238,369,371,374,377,380,383,386,388,392,394,398,400],{"class":240,"line":370},8,[238,372,373],{"class":244},"export",[238,375,376],{"class":244}," default",[238,378,379],{"class":303}," async",[238,381,382],{"class":303}," function",[238,384,385],{"class":313}," handler",[238,387,316],{"class":248},[238,389,391],{"class":390},"sHdIc","request",[238,393,329],{"class":248},[238,395,397],{"class":396},"sBMFI"," Request",[238,399,354],{"class":248},[238,401,402],{"class":248}," {\n",[238,404,406,409],{"class":240,"line":405},9,[238,407,408],{"class":244},"  try",[238,410,402],{"class":248},[238,412,414,417,420,423,426,429,431,434,436,439,441],{"class":240,"line":413},10,[238,415,416],{"class":303},"    const",[238,418,419],{"class":252}," events",[238,421,422],{"class":248}," =",[238,424,425],{"class":244}," await",[238,427,428],{"class":252}," forge",[238,430,219],{"class":248},[238,432,433],{"class":252},"webhooks",[238,435,219],{"class":248},[238,437,438],{"class":313},"ingest",[238,440,316],{"class":325},[238,442,319],{"class":248},[238,444,446,449,451,454,456,459],{"class":240,"line":445},11,[238,447,448],{"class":325},"      headers",[238,450,329],{"class":248},[238,452,453],{"class":252}," request",[238,455,219],{"class":248},[238,457,458],{"class":252},"headers",[238,460,345],{"class":248},[238,462,464,467,469,471,473,475,478,481],{"class":240,"line":463},12,[238,465,466],{"class":325},"      body",[238,468,329],{"class":248},[238,470,425],{"class":244},[238,472,453],{"class":252},[238,474,219],{"class":248},[238,476,477],{"class":313},"text",[238,479,480],{"class":325},"()",[238,482,345],{"class":248},[238,484,486,489],{"class":240,"line":485},13,[238,487,488],{"class":248},"    }",[238,490,491],{"class":325},")\n",[238,493,495,498,501,503,506,509,511,514],{"class":240,"line":494},14,[238,496,497],{"class":244},"    for",[238,499,500],{"class":325}," (",[238,502,304],{"class":303},[238,504,505],{"class":252}," event",[238,507,508],{"class":248}," of",[238,510,419],{"class":252},[238,512,513],{"class":325},") ",[238,515,319],{"class":248},[238,517,519,522,524,527,529,532,534,537,540,542,544,547,549,551,553,556],{"class":240,"line":518},15,[238,520,521],{"class":252},"      console",[238,523,219],{"class":248},[238,525,526],{"class":313},"log",[238,528,316],{"class":325},[238,530,531],{"class":252},"event",[238,533,219],{"class":248},[238,535,536],{"class":252},"kind",[238,538,539],{"class":248},",",[238,541,505],{"class":252},[238,543,219],{"class":248},[238,545,546],{"class":252},"action",[238,548,539],{"class":248},[238,550,505],{"class":252},[238,552,219],{"class":248},[238,554,555],{"class":252},"summary",[238,557,491],{"class":325},[238,559,561],{"class":240,"line":560},16,[238,562,563],{"class":248},"    }\n",[238,565,567,570,573,576,578,581,583,586,588,592,594],{"class":240,"line":566},17,[238,568,569],{"class":244},"    return",[238,571,572],{"class":248}," new",[238,574,575],{"class":313}," Response",[238,577,316],{"class":325},[238,579,580],{"class":248},"null,",[238,582,249],{"class":248},[238,584,585],{"class":325}," status",[238,587,329],{"class":248},[238,589,591],{"class":590},"sbssI"," 204",[238,593,256],{"class":248},[238,595,491],{"class":325},[238,597,599],{"class":240,"line":598},18,[238,600,601],{"class":248},"  }\n",[238,603,605,608,610,613,615],{"class":240,"line":604},19,[238,606,607],{"class":244},"  catch",[238,609,500],{"class":325},[238,611,612],{"class":252},"error",[238,614,513],{"class":325},[238,616,319],{"class":248},[238,618,620,623,625,627,630,632,634],{"class":240,"line":619},20,[238,621,622],{"class":244},"    if",[238,624,500],{"class":325},[238,626,612],{"class":252},[238,628,629],{"class":248}," instanceof",[238,631,253],{"class":396},[238,633,513],{"class":325},[238,635,319],{"class":248},[238,637,639,642,644,646,648,651,654,656,658,660,662,664,667,669],{"class":240,"line":638},21,[238,640,641],{"class":244},"      return",[238,643,572],{"class":248},[238,645,575],{"class":313},[238,647,316],{"class":325},[238,649,650],{"class":248},"'",[238,652,653],{"class":265},"Invalid signature",[238,655,650],{"class":248},[238,657,539],{"class":248},[238,659,249],{"class":248},[238,661,585],{"class":325},[238,663,329],{"class":248},[238,665,666],{"class":590}," 401",[238,668,256],{"class":248},[238,670,491],{"class":325},[238,672,674],{"class":240,"line":673},22,[238,675,563],{"class":248},[238,677,679,682],{"class":240,"line":678},23,[238,680,681],{"class":244},"    throw",[238,683,684],{"class":252}," error\n",[238,686,688],{"class":240,"line":687},24,[238,689,601],{"class":248},[238,691,693],{"class":240,"line":692},25,[238,694,695],{"class":248},"}\n",[201,697,698,699,702],{},"The handler uses the Fetch API, so it runs on any runtime that supports it. A delivery can produce more than one event, which is why ",[204,700,701],{},"ingest()"," returns an array.",[201,704,705,706,709,710,713,714,716,717,219],{},"To check the signature without translating the delivery, call ",[204,707,708],{},"webhooks.verify()",". To use a secret for one delivery only, pass ",[204,711,712],{},"secret"," next to ",[204,715,458],{}," and ",[204,718,719],{},"body",[221,721,723],{"id":722},"handle-one-forge-or-many","Handle one forge or many",[201,725,726,727,731,732,735],{},"With several forges, register them all and pick the provider from the route. The ",[728,729,730],"a",{"href":167},"label bot"," serves ",[204,733,734],{},"\u002Fwebhooks\u002F\u003Cforge>"," this way:",[229,737,739],{"className":231,"code":738,"language":233,"meta":234,"style":234},"const provider = forges.get('gitlab')\nconst events = await provider?.webhooks.ingest({\n  headers: request.headers,\n  body: await request.text(),\n})\n",[204,740,741,769,796,811,830],{"__ignoreMap":234},[238,742,743,745,748,750,753,755,758,760,762,765,767],{"class":240,"line":241},[238,744,304],{"class":303},[238,746,747],{"class":252}," provider ",[238,749,310],{"class":248},[238,751,752],{"class":252}," forges",[238,754,219],{"class":248},[238,756,757],{"class":313},"get",[238,759,316],{"class":252},[238,761,650],{"class":248},[238,763,764],{"class":265},"gitlab",[238,766,650],{"class":248},[238,768,491],{"class":252},[238,770,771,773,776,778,780,783,786,788,790,792,794],{"class":240,"line":272},[238,772,304],{"class":303},[238,774,775],{"class":252}," events ",[238,777,310],{"class":248},[238,779,425],{"class":244},[238,781,782],{"class":252}," provider",[238,784,785],{"class":248},"?.",[238,787,433],{"class":252},[238,789,219],{"class":248},[238,791,438],{"class":313},[238,793,316],{"class":252},[238,795,319],{"class":248},[238,797,798,801,803,805,807,809],{"class":240,"line":293},[238,799,800],{"class":325},"  headers",[238,802,329],{"class":248},[238,804,453],{"class":252},[238,806,219],{"class":248},[238,808,458],{"class":252},[238,810,345],{"class":248},[238,812,813,816,818,820,822,824,826,828],{"class":240,"line":300},[238,814,815],{"class":325},"  body",[238,817,329],{"class":248},[238,819,425],{"class":244},[238,821,453],{"class":252},[238,823,219],{"class":248},[238,825,477],{"class":313},[238,827,480],{"class":252},[238,829,345],{"class":248},[238,831,832,834],{"class":240,"line":322},[238,833,351],{"class":248},[238,835,491],{"class":252},[221,837,839],{"id":838},"act-on-events","Act on events",[201,841,842,843,845,846,849,850,853,854,857,858,845,860,849,863,853,866,869,870,716,873,876,877,880],{},"Every event has a ",[204,844,536],{},", such as ",[204,847,848],{},"comment",", ",[204,851,852],{},"review"," or ",[204,855,856],{},"push",", and an ",[204,859,546],{},[204,861,862],{},"created",[204,864,865],{},"closed",[204,867,868],{},"merged",". ",[204,871,872],{},"thread",[204,874,875],{},"repo"," hold refs when the event concerns one, and ",[204,878,879],{},"detail"," has typed fields for the kind:",[229,882,884],{"className":231,"code":883,"language":233,"meta":234,"style":234},"for (const event of events) {\n  if (\n    event.kind === 'comment'\n    && event.detail?.type === 'comment'\n    && event.thread\n  ) {\n    console.log(`${event.actor?.login} commented: ${event.detail.body}`)\n  }\n}\n",[204,885,886,906,914,932,956,967,974,1023,1027],{"__ignoreMap":234},[238,887,888,891,893,895,898,901,904],{"class":240,"line":241},[238,889,890],{"class":244},"for",[238,892,500],{"class":252},[238,894,304],{"class":303},[238,896,897],{"class":252}," event ",[238,899,900],{"class":248},"of",[238,902,903],{"class":252}," events) ",[238,905,319],{"class":248},[238,907,908,911],{"class":240,"line":272},[238,909,910],{"class":244},"  if",[238,912,913],{"class":325}," (\n",[238,915,916,919,921,923,926,928,930],{"class":240,"line":293},[238,917,918],{"class":252},"    event",[238,920,219],{"class":248},[238,922,536],{"class":252},[238,924,925],{"class":248}," ===",[238,927,262],{"class":248},[238,929,848],{"class":265},[238,931,269],{"class":248},[238,933,934,937,939,941,943,945,948,950,952,954],{"class":240,"line":300},[238,935,936],{"class":248},"    &&",[238,938,505],{"class":252},[238,940,219],{"class":248},[238,942,879],{"class":252},[238,944,785],{"class":248},[238,946,947],{"class":252},"type",[238,949,925],{"class":248},[238,951,262],{"class":248},[238,953,848],{"class":265},[238,955,269],{"class":248},[238,957,958,960,962,964],{"class":240,"line":322},[238,959,936],{"class":248},[238,961,505],{"class":252},[238,963,219],{"class":248},[238,965,966],{"class":252},"thread\n",[238,968,969,972],{"class":240,"line":348},[238,970,971],{"class":325},"  ) ",[238,973,319],{"class":248},[238,975,976,979,981,983,985,988,990,992,995,997,1000,1002,1005,1008,1010,1012,1014,1016,1018,1021],{"class":240,"line":365},[238,977,978],{"class":252},"    console",[238,980,219],{"class":248},[238,982,526],{"class":313},[238,984,316],{"class":325},[238,986,987],{"class":248},"`${",[238,989,531],{"class":252},[238,991,219],{"class":248},[238,993,994],{"class":252},"actor",[238,996,785],{"class":248},[238,998,999],{"class":252},"login",[238,1001,351],{"class":248},[238,1003,1004],{"class":265}," commented: ",[238,1006,1007],{"class":248},"${",[238,1009,531],{"class":252},[238,1011,219],{"class":248},[238,1013,879],{"class":252},[238,1015,219],{"class":248},[238,1017,719],{"class":252},[238,1019,1020],{"class":248},"}`",[238,1022,491],{"class":325},[238,1024,1025],{"class":240,"line":370},[238,1026,601],{"class":248},[238,1028,1029],{"class":240,"line":405},[238,1030,695],{"class":248},[201,1032,1033,1036,1037,1039],{},[204,1034,1035],{},"event.payload"," keeps the unnormalised delivery. See ",[728,1038,84],{"href":85}," for the full model.",[221,1041,1043],{"id":1042},"register-a-webhook","Register a webhook",[201,1045,1046],{},"If the provider supports it, you can create the hook from code. Pass a repository ref, or a namespace ref to hook an organisation:",[229,1048,1050],{"className":231,"code":1049,"language":233,"meta":234,"style":234},"if (forge.can('webhooks.create')) {\n  await forge.webhooks.create(repo, {\n    url: 'https:\u002F\u002Fexample.com\u002Fwebhooks\u002Fgithub',\n    events: ['comment', 'state_change'],\n    secret: process.env.GITHUB_WEBHOOK_SECRET,\n  })\n}\n",[204,1051,1052,1079,1102,1118,1148,1167,1174],{"__ignoreMap":234},[238,1053,1054,1057,1060,1062,1065,1067,1069,1072,1074,1077],{"class":240,"line":241},[238,1055,1056],{"class":244},"if",[238,1058,1059],{"class":252}," (forge",[238,1061,219],{"class":248},[238,1063,1064],{"class":313},"can",[238,1066,316],{"class":252},[238,1068,650],{"class":248},[238,1070,1071],{"class":265},"webhooks.create",[238,1073,650],{"class":248},[238,1075,1076],{"class":252},")) ",[238,1078,319],{"class":248},[238,1080,1081,1084,1086,1088,1090,1092,1094,1096,1098,1100],{"class":240,"line":272},[238,1082,1083],{"class":244},"  await",[238,1085,428],{"class":252},[238,1087,219],{"class":248},[238,1089,433],{"class":252},[238,1091,219],{"class":248},[238,1093,359],{"class":313},[238,1095,316],{"class":325},[238,1097,875],{"class":252},[238,1099,539],{"class":248},[238,1101,402],{"class":248},[238,1103,1104,1107,1109,1111,1114,1116],{"class":240,"line":293},[238,1105,1106],{"class":325},"    url",[238,1108,329],{"class":248},[238,1110,262],{"class":248},[238,1112,1113],{"class":265},"https:\u002F\u002Fexample.com\u002Fwebhooks\u002Fgithub",[238,1115,650],{"class":248},[238,1117,345],{"class":248},[238,1119,1120,1123,1125,1128,1130,1132,1134,1136,1138,1141,1143,1146],{"class":240,"line":300},[238,1121,1122],{"class":325},"    events",[238,1124,329],{"class":248},[238,1126,1127],{"class":325}," [",[238,1129,650],{"class":248},[238,1131,848],{"class":265},[238,1133,650],{"class":248},[238,1135,539],{"class":248},[238,1137,262],{"class":248},[238,1139,1140],{"class":265},"state_change",[238,1142,650],{"class":248},[238,1144,1145],{"class":325},"]",[238,1147,345],{"class":248},[238,1149,1150,1153,1155,1157,1159,1161,1163,1165],{"class":240,"line":322},[238,1151,1152],{"class":325},"    secret",[238,1154,329],{"class":248},[238,1156,332],{"class":252},[238,1158,219],{"class":248},[238,1160,337],{"class":252},[238,1162,219],{"class":248},[238,1164,342],{"class":252},[238,1166,345],{"class":248},[238,1168,1169,1172],{"class":240,"line":348},[238,1170,1171],{"class":248},"  }",[238,1173,491],{"class":325},[238,1175,1176],{"class":240,"line":365},[238,1177,695],{"class":248},[201,1179,1180,1183,1184,1187,1188,1191],{},[204,1181,1182],{},"events"," takes normalised kinds. ",[204,1185,1186],{},"nativeEvents"," takes the forge's own event names and merges with them. ",[204,1189,1190],{},"forge.webhooks.events"," lists the kinds and actions a provider can deliver.",[221,1193,1195],{"id":1194},"manage-webhooks-from-a-browser","Manage webhooks from a browser",[201,1197,1198,1199,1202,1203,1206,1207,716,1210,1213,1214,219],{},"A browser doesn't receive deliveries, so a Lite provider has no webhook ingestion, and its ",[204,1200,1201],{},"capabilities.sources.webhook"," is ",[204,1204,1205],{},"false",". Webhook management with ",[204,1208,1209],{},"create()",[204,1211,1212],{},"list()"," still works. See ",[728,1215,58],{"href":59},[201,1217,1218,1219,1222],{},"Each ",[728,1220,1221],{"href":90},"provider page"," lists the headers that forge sends and how it signs a delivery.",[1224,1225,1226],"style",{},"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 .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 pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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);}",{"title":234,"searchDepth":272,"depth":272,"links":1228},[1229,1230,1231,1232,1233],{"id":223,"depth":272,"text":224},{"id":722,"depth":272,"text":723},{"id":838,"depth":272,"text":839},{"id":1042,"depth":272,"text":1043},{"id":1194,"depth":272,"text":1195},"Verify a delivery and turn it into normalised events.","md",null,{"icon":1238},"i-lucide-webhook",{"title":42,"description":1234},"wdJJ7QL1yQxql_yI0iYhYzp74e1NIp8X9-5KWFL_hOA",[1242,1244],{"title":38,"path":39,"stem":40,"description":1243,"children":-1},"Create providers from FORGES_* environment variables.",{"title":46,"path":47,"stem":48,"description":1245,"children":-1},"Ask a provider whether it supports an operation before you call it.",1791294003829]