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