[{"data":1,"prerenderedAt":1895},["ShallowReactive",2],{"doc-features\u002Fserverless-functions":3,"content-query-VMSkHQgs1D":4},null,{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":8,"sidebar_position":10,"body":11,"_type":1889,"_id":1890,"_source":1891,"_file":1892,"_stem":1893,"_extension":1894},"\u002Fdocs\u002Ffeatures\u002Fserverless-functions","features",false,"","Serverless Functions & Webhooks",4,{"type":12,"children":13,"toc":1879},"root",[14,22,39,45,52,57,77,82,229,235,240,245,600,606,611,658,663,694,707,837,864,870,875,889,894,1033,1039,1044,1049,1593,1599,1604,1651,1656,1732,1741,1747,1832,1838,1873],{"type":15,"tag":16,"props":17,"children":19},"element","h1",{"id":18},"serverless-functions-webhooks",[20],{"type":21,"value":9},"text",{"type":15,"tag":23,"props":24,"children":29},"div",{"className":25,"ariaHidden":28},[26,27],"docs-page-hero","docs-page-hero--sage","true",[30,32],{"type":21,"value":31},"\n  ",{"type":15,"tag":33,"props":34,"children":38},"img",{"src":35,"alt":8,"width":36,"height":37},"\u002Fimages\u002Fdocs-illustrations\u002Ffunctions-webhooks.svg",128,72,[],{"type":15,"tag":40,"props":41,"children":42},"p",{},[43],{"type":21,"value":44},"Functions and webhooks let users automate work around their data. Functions run custom backend logic. Webhooks notify external systems when something important happens.",{"type":15,"tag":46,"props":47,"children":49},"h2",{"id":48},"functions",[50],{"type":21,"value":51},"Functions",{"type":15,"tag":40,"props":53,"children":54},{},[55],{"type":21,"value":56},"Functions are managed per cluster from:",{"type":15,"tag":58,"props":59,"children":62},"pre",{"className":60,"code":61,"language":21,"meta":8,"style":8},"language-text shiki shiki-themes github-dark","\u002Ffunctions\u002F{clusterId}\n",[63],{"type":15,"tag":64,"props":65,"children":66},"code",{"__ignoreMap":8},[67],{"type":15,"tag":68,"props":69,"children":72},"span",{"class":70,"line":71},"line",1,[73],{"type":15,"tag":68,"props":74,"children":75},{},[76],{"type":21,"value":61},{"type":15,"tag":40,"props":78,"children":79},{},[80],{"type":21,"value":81},"The page calls these backend routes:",{"type":15,"tag":83,"props":84,"children":85},"table",{},[86,105],{"type":15,"tag":87,"props":88,"children":89},"thead",{},[90],{"type":15,"tag":91,"props":92,"children":93},"tr",{},[94,100],{"type":15,"tag":95,"props":96,"children":97},"th",{},[98],{"type":21,"value":99},"Task",{"type":15,"tag":95,"props":101,"children":102},{},[103],{"type":21,"value":104},"Backend route",{"type":15,"tag":106,"props":107,"children":108},"tbody",{},[109,127,144,161,178,195,212],{"type":15,"tag":91,"props":110,"children":111},{},[112,118],{"type":15,"tag":113,"props":114,"children":115},"td",{},[116],{"type":21,"value":117},"List functions",{"type":15,"tag":113,"props":119,"children":120},{},[121],{"type":15,"tag":64,"props":122,"children":124},{"className":123},[],[125],{"type":21,"value":126},"GET \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions",{"type":15,"tag":91,"props":128,"children":129},{},[130,135],{"type":15,"tag":113,"props":131,"children":132},{},[133],{"type":21,"value":134},"Create function",{"type":15,"tag":113,"props":136,"children":137},{},[138],{"type":15,"tag":64,"props":139,"children":141},{"className":140},[],[142],{"type":21,"value":143},"POST \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions",{"type":15,"tag":91,"props":145,"children":146},{},[147,152],{"type":15,"tag":113,"props":148,"children":149},{},[150],{"type":21,"value":151},"Update function",{"type":15,"tag":113,"props":153,"children":154},{},[155],{"type":15,"tag":64,"props":156,"children":158},{"className":157},[],[159],{"type":21,"value":160},"PUT \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}",{"type":15,"tag":91,"props":162,"children":163},{},[164,169],{"type":15,"tag":113,"props":165,"children":166},{},[167],{"type":21,"value":168},"Delete function",{"type":15,"tag":113,"props":170,"children":171},{},[172],{"type":15,"tag":64,"props":173,"children":175},{"className":174},[],[176],{"type":21,"value":177},"DELETE \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}",{"type":15,"tag":91,"props":179,"children":180},{},[181,186],{"type":15,"tag":113,"props":182,"children":183},{},[184],{"type":21,"value":185},"Test function",{"type":15,"tag":113,"props":187,"children":188},{},[189],{"type":15,"tag":64,"props":190,"children":192},{"className":191},[],[193],{"type":21,"value":194},"POST \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}\u002Ftest",{"type":15,"tag":91,"props":196,"children":197},{},[198,203],{"type":15,"tag":113,"props":199,"children":200},{},[201],{"type":21,"value":202},"Execute function",{"type":15,"tag":113,"props":204,"children":205},{},[206],{"type":15,"tag":64,"props":207,"children":209},{"className":208},[],[210],{"type":21,"value":211},"POST \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}\u002Fexecute",{"type":15,"tag":91,"props":213,"children":214},{},[215,220],{"type":15,"tag":113,"props":216,"children":217},{},[218],{"type":21,"value":219},"View logs",{"type":15,"tag":113,"props":221,"children":222},{},[223],{"type":15,"tag":64,"props":224,"children":226},{"className":225},[],[227],{"type":21,"value":228},"GET \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}\u002Flogs",{"type":15,"tag":46,"props":230,"children":232},{"id":231},"function-shape",[233],{"type":21,"value":234},"Function Shape",{"type":15,"tag":40,"props":236,"children":237},{},[238],{"type":21,"value":239},"A function should be written as small, predictable backend logic. Use it for validation, enrichment, notifications, data transformations, or controlled integrations.",{"type":15,"tag":40,"props":241,"children":242},{},[243],{"type":21,"value":244},"Example:",{"type":15,"tag":58,"props":246,"children":250},{"className":247,"code":248,"language":249,"meta":8,"style":8},"language-javascript shiki shiki-themes github-dark","export default async function handler(context) {\n  const { db, input, user } = context;\n\n  const customer = await db.collection(\"customers\").findOne({\n    email: input.email,\n  });\n\n  if (!customer) {\n    return { ok: false, reason: \"customer_not_found\" };\n  }\n\n  return {\n    ok: true,\n    customerId: customer._id,\n    plan: customer.plan,\n    requestedBy: user.email,\n  };\n}\n","javascript",[251],{"type":15,"tag":64,"props":252,"children":253},{"__ignoreMap":8},[254,301,355,365,422,431,440,448,472,506,515,523,537,555,564,573,582,591],{"type":15,"tag":68,"props":255,"children":256},{"class":70,"line":71},[257,263,268,273,278,284,290,296],{"type":15,"tag":68,"props":258,"children":260},{"style":259},"--shiki-default:#F97583",[261],{"type":21,"value":262},"export",{"type":15,"tag":68,"props":264,"children":265},{"style":259},[266],{"type":21,"value":267}," default",{"type":15,"tag":68,"props":269,"children":270},{"style":259},[271],{"type":21,"value":272}," async",{"type":15,"tag":68,"props":274,"children":275},{"style":259},[276],{"type":21,"value":277}," function",{"type":15,"tag":68,"props":279,"children":281},{"style":280},"--shiki-default:#B392F0",[282],{"type":21,"value":283}," handler",{"type":15,"tag":68,"props":285,"children":287},{"style":286},"--shiki-default:#E1E4E8",[288],{"type":21,"value":289},"(",{"type":15,"tag":68,"props":291,"children":293},{"style":292},"--shiki-default:#FFAB70",[294],{"type":21,"value":295},"context",{"type":15,"tag":68,"props":297,"children":298},{"style":286},[299],{"type":21,"value":300},") {\n",{"type":15,"tag":68,"props":302,"children":304},{"class":70,"line":303},2,[305,310,315,321,326,331,335,340,345,350],{"type":15,"tag":68,"props":306,"children":307},{"style":259},[308],{"type":21,"value":309},"  const",{"type":15,"tag":68,"props":311,"children":312},{"style":286},[313],{"type":21,"value":314}," { ",{"type":15,"tag":68,"props":316,"children":318},{"style":317},"--shiki-default:#79B8FF",[319],{"type":21,"value":320},"db",{"type":15,"tag":68,"props":322,"children":323},{"style":286},[324],{"type":21,"value":325},", ",{"type":15,"tag":68,"props":327,"children":328},{"style":317},[329],{"type":21,"value":330},"input",{"type":15,"tag":68,"props":332,"children":333},{"style":286},[334],{"type":21,"value":325},{"type":15,"tag":68,"props":336,"children":337},{"style":317},[338],{"type":21,"value":339},"user",{"type":15,"tag":68,"props":341,"children":342},{"style":286},[343],{"type":21,"value":344}," } ",{"type":15,"tag":68,"props":346,"children":347},{"style":259},[348],{"type":21,"value":349},"=",{"type":15,"tag":68,"props":351,"children":352},{"style":286},[353],{"type":21,"value":354}," context;\n",{"type":15,"tag":68,"props":356,"children":358},{"class":70,"line":357},3,[359],{"type":15,"tag":68,"props":360,"children":362},{"emptyLinePlaceholder":361},true,[363],{"type":21,"value":364},"\n",{"type":15,"tag":68,"props":366,"children":367},{"class":70,"line":10},[368,372,377,382,387,392,397,401,407,412,417],{"type":15,"tag":68,"props":369,"children":370},{"style":259},[371],{"type":21,"value":309},{"type":15,"tag":68,"props":373,"children":374},{"style":317},[375],{"type":21,"value":376}," customer",{"type":15,"tag":68,"props":378,"children":379},{"style":259},[380],{"type":21,"value":381}," =",{"type":15,"tag":68,"props":383,"children":384},{"style":259},[385],{"type":21,"value":386}," await",{"type":15,"tag":68,"props":388,"children":389},{"style":286},[390],{"type":21,"value":391}," db.",{"type":15,"tag":68,"props":393,"children":394},{"style":280},[395],{"type":21,"value":396},"collection",{"type":15,"tag":68,"props":398,"children":399},{"style":286},[400],{"type":21,"value":289},{"type":15,"tag":68,"props":402,"children":404},{"style":403},"--shiki-default:#9ECBFF",[405],{"type":21,"value":406},"\"customers\"",{"type":15,"tag":68,"props":408,"children":409},{"style":286},[410],{"type":21,"value":411},").",{"type":15,"tag":68,"props":413,"children":414},{"style":280},[415],{"type":21,"value":416},"findOne",{"type":15,"tag":68,"props":418,"children":419},{"style":286},[420],{"type":21,"value":421},"({\n",{"type":15,"tag":68,"props":423,"children":425},{"class":70,"line":424},5,[426],{"type":15,"tag":68,"props":427,"children":428},{"style":286},[429],{"type":21,"value":430},"    email: input.email,\n",{"type":15,"tag":68,"props":432,"children":434},{"class":70,"line":433},6,[435],{"type":15,"tag":68,"props":436,"children":437},{"style":286},[438],{"type":21,"value":439},"  });\n",{"type":15,"tag":68,"props":441,"children":443},{"class":70,"line":442},7,[444],{"type":15,"tag":68,"props":445,"children":446},{"emptyLinePlaceholder":361},[447],{"type":21,"value":364},{"type":15,"tag":68,"props":449,"children":451},{"class":70,"line":450},8,[452,457,462,467],{"type":15,"tag":68,"props":453,"children":454},{"style":259},[455],{"type":21,"value":456},"  if",{"type":15,"tag":68,"props":458,"children":459},{"style":286},[460],{"type":21,"value":461}," (",{"type":15,"tag":68,"props":463,"children":464},{"style":259},[465],{"type":21,"value":466},"!",{"type":15,"tag":68,"props":468,"children":469},{"style":286},[470],{"type":21,"value":471},"customer) {\n",{"type":15,"tag":68,"props":473,"children":475},{"class":70,"line":474},9,[476,481,486,491,496,501],{"type":15,"tag":68,"props":477,"children":478},{"style":259},[479],{"type":21,"value":480},"    return",{"type":15,"tag":68,"props":482,"children":483},{"style":286},[484],{"type":21,"value":485}," { ok: ",{"type":15,"tag":68,"props":487,"children":488},{"style":317},[489],{"type":21,"value":490},"false",{"type":15,"tag":68,"props":492,"children":493},{"style":286},[494],{"type":21,"value":495},", reason: ",{"type":15,"tag":68,"props":497,"children":498},{"style":403},[499],{"type":21,"value":500},"\"customer_not_found\"",{"type":15,"tag":68,"props":502,"children":503},{"style":286},[504],{"type":21,"value":505}," };\n",{"type":15,"tag":68,"props":507,"children":509},{"class":70,"line":508},10,[510],{"type":15,"tag":68,"props":511,"children":512},{"style":286},[513],{"type":21,"value":514},"  }\n",{"type":15,"tag":68,"props":516,"children":518},{"class":70,"line":517},11,[519],{"type":15,"tag":68,"props":520,"children":521},{"emptyLinePlaceholder":361},[522],{"type":21,"value":364},{"type":15,"tag":68,"props":524,"children":526},{"class":70,"line":525},12,[527,532],{"type":15,"tag":68,"props":528,"children":529},{"style":259},[530],{"type":21,"value":531},"  return",{"type":15,"tag":68,"props":533,"children":534},{"style":286},[535],{"type":21,"value":536}," {\n",{"type":15,"tag":68,"props":538,"children":540},{"class":70,"line":539},13,[541,546,550],{"type":15,"tag":68,"props":542,"children":543},{"style":286},[544],{"type":21,"value":545},"    ok: ",{"type":15,"tag":68,"props":547,"children":548},{"style":317},[549],{"type":21,"value":28},{"type":15,"tag":68,"props":551,"children":552},{"style":286},[553],{"type":21,"value":554},",\n",{"type":15,"tag":68,"props":556,"children":558},{"class":70,"line":557},14,[559],{"type":15,"tag":68,"props":560,"children":561},{"style":286},[562],{"type":21,"value":563},"    customerId: customer._id,\n",{"type":15,"tag":68,"props":565,"children":567},{"class":70,"line":566},15,[568],{"type":15,"tag":68,"props":569,"children":570},{"style":286},[571],{"type":21,"value":572},"    plan: customer.plan,\n",{"type":15,"tag":68,"props":574,"children":576},{"class":70,"line":575},16,[577],{"type":15,"tag":68,"props":578,"children":579},{"style":286},[580],{"type":21,"value":581},"    requestedBy: user.email,\n",{"type":15,"tag":68,"props":583,"children":585},{"class":70,"line":584},17,[586],{"type":15,"tag":68,"props":587,"children":588},{"style":286},[589],{"type":21,"value":590},"  };\n",{"type":15,"tag":68,"props":592,"children":594},{"class":70,"line":593},18,[595],{"type":15,"tag":68,"props":596,"children":597},{"style":286},[598],{"type":21,"value":599},"}\n",{"type":15,"tag":46,"props":601,"children":603},{"id":602},"test-a-function",[604],{"type":21,"value":605},"Test A Function",{"type":15,"tag":40,"props":607,"children":608},{},[609],{"type":21,"value":610},"From the dashboard:",{"type":15,"tag":58,"props":612,"children":614},{"className":60,"code":613,"language":21,"meta":8,"style":8},"1. Open \u002Fcluster\u002F{clusterId}\n2. Click Functions\n3. Create or edit a function\n4. Use Test\n5. Open Logs for the function\n",[615],{"type":15,"tag":64,"props":616,"children":617},{"__ignoreMap":8},[618,626,634,642,650],{"type":15,"tag":68,"props":619,"children":620},{"class":70,"line":71},[621],{"type":15,"tag":68,"props":622,"children":623},{},[624],{"type":21,"value":625},"1. Open \u002Fcluster\u002F{clusterId}\n",{"type":15,"tag":68,"props":627,"children":628},{"class":70,"line":303},[629],{"type":15,"tag":68,"props":630,"children":631},{},[632],{"type":21,"value":633},"2. Click Functions\n",{"type":15,"tag":68,"props":635,"children":636},{"class":70,"line":357},[637],{"type":15,"tag":68,"props":638,"children":639},{},[640],{"type":21,"value":641},"3. Create or edit a function\n",{"type":15,"tag":68,"props":643,"children":644},{"class":70,"line":10},[645],{"type":15,"tag":68,"props":646,"children":647},{},[648],{"type":21,"value":649},"4. Use Test\n",{"type":15,"tag":68,"props":651,"children":652},{"class":70,"line":424},[653],{"type":15,"tag":68,"props":654,"children":655},{},[656],{"type":21,"value":657},"5. Open Logs for the function\n",{"type":15,"tag":40,"props":659,"children":660},{},[661],{"type":21,"value":662},"From the API explorer:",{"type":15,"tag":58,"props":664,"children":666},{"className":60,"code":665,"language":21,"meta":8,"style":8},"Open \u002Fapi-docs\nAuthorize\nTry POST \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}\u002Ftest\n",[667],{"type":15,"tag":64,"props":668,"children":669},{"__ignoreMap":8},[670,678,686],{"type":15,"tag":68,"props":671,"children":672},{"class":70,"line":71},[673],{"type":15,"tag":68,"props":674,"children":675},{},[676],{"type":21,"value":677},"Open \u002Fapi-docs\n",{"type":15,"tag":68,"props":679,"children":680},{"class":70,"line":303},[681],{"type":15,"tag":68,"props":682,"children":683},{},[684],{"type":21,"value":685},"Authorize\n",{"type":15,"tag":68,"props":687,"children":688},{"class":70,"line":357},[689],{"type":15,"tag":68,"props":690,"children":691},{},[692],{"type":21,"value":693},"Try POST \u002Fapi\u002Fclusters\u002F{clusterId}\u002Ffunctions\u002F{functionId}\u002Ftest\n",{"type":15,"tag":40,"props":695,"children":696},{},[697,699,705],{"type":21,"value":698},"From ",{"type":15,"tag":64,"props":700,"children":702},{"className":701},[],[703],{"type":21,"value":704},"curl",{"type":21,"value":706},":",{"type":15,"tag":58,"props":708,"children":713},{"className":709,"code":710,"language":711,"meta":712,"style":8},"language-bash shiki shiki-themes github-dark","curl -X POST https:\u002F\u002Fcredvault.net\u002Fapi\u002Fclusters\u002F\u003CclusterId>\u002Ffunctions\u002F\u003CfunctionId>\u002Ftest \\\n  -H \"Authorization: Bearer \u003Cyour-session-token>\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"email\":\"ada@example.com\"}'\n","bash","testable",[714],{"type":15,"tag":64,"props":715,"children":716},{"__ignoreMap":8},[717,791,808,824],{"type":15,"tag":68,"props":718,"children":719},{"class":70,"line":71},[720,724,729,734,739,744,749,754,759,764,768,773,777,781,786],{"type":15,"tag":68,"props":721,"children":722},{"style":280},[723],{"type":21,"value":704},{"type":15,"tag":68,"props":725,"children":726},{"style":317},[727],{"type":21,"value":728}," -X",{"type":15,"tag":68,"props":730,"children":731},{"style":403},[732],{"type":21,"value":733}," POST",{"type":15,"tag":68,"props":735,"children":736},{"style":403},[737],{"type":21,"value":738}," https:\u002F\u002Fcredvault.net\u002Fapi\u002Fclusters\u002F",{"type":15,"tag":68,"props":740,"children":741},{"style":259},[742],{"type":21,"value":743},"\u003C",{"type":15,"tag":68,"props":745,"children":746},{"style":403},[747],{"type":21,"value":748},"clusterI",{"type":15,"tag":68,"props":750,"children":751},{"style":286},[752],{"type":21,"value":753},"d",{"type":15,"tag":68,"props":755,"children":756},{"style":259},[757],{"type":21,"value":758},">",{"type":15,"tag":68,"props":760,"children":761},{"style":403},[762],{"type":21,"value":763},"\u002Ffunctions\u002F",{"type":15,"tag":68,"props":765,"children":766},{"style":259},[767],{"type":21,"value":743},{"type":15,"tag":68,"props":769,"children":770},{"style":403},[771],{"type":21,"value":772},"functionI",{"type":15,"tag":68,"props":774,"children":775},{"style":286},[776],{"type":21,"value":753},{"type":15,"tag":68,"props":778,"children":779},{"style":259},[780],{"type":21,"value":758},{"type":15,"tag":68,"props":782,"children":783},{"style":403},[784],{"type":21,"value":785},"\u002Ftest",{"type":15,"tag":68,"props":787,"children":788},{"style":317},[789],{"type":21,"value":790}," \\\n",{"type":15,"tag":68,"props":792,"children":793},{"class":70,"line":303},[794,799,804],{"type":15,"tag":68,"props":795,"children":796},{"style":317},[797],{"type":21,"value":798},"  -H",{"type":15,"tag":68,"props":800,"children":801},{"style":403},[802],{"type":21,"value":803}," \"Authorization: Bearer \u003Cyour-session-token>\"",{"type":15,"tag":68,"props":805,"children":806},{"style":317},[807],{"type":21,"value":790},{"type":15,"tag":68,"props":809,"children":810},{"class":70,"line":357},[811,815,820],{"type":15,"tag":68,"props":812,"children":813},{"style":317},[814],{"type":21,"value":798},{"type":15,"tag":68,"props":816,"children":817},{"style":403},[818],{"type":21,"value":819}," \"Content-Type: application\u002Fjson\"",{"type":15,"tag":68,"props":821,"children":822},{"style":317},[823],{"type":21,"value":790},{"type":15,"tag":68,"props":825,"children":826},{"class":70,"line":10},[827,832],{"type":15,"tag":68,"props":828,"children":829},{"style":317},[830],{"type":21,"value":831},"  -d",{"type":15,"tag":68,"props":833,"children":834},{"style":403},[835],{"type":21,"value":836}," '{\"email\":\"ada@example.com\"}'\n",{"type":15,"tag":40,"props":838,"children":839},{},[840,846,848,854,856,862],{"type":15,"tag":841,"props":842,"children":843},"strong",{},[844],{"type":21,"value":845},"What you should see:",{"type":21,"value":847}," the function result as JSON, plus a log entry for the test run. For the example above, a found customer returns ",{"type":15,"tag":64,"props":849,"children":851},{"className":850},[],[852],{"type":21,"value":853},"ok: true",{"type":21,"value":855},"; a missing customer returns ",{"type":15,"tag":64,"props":857,"children":859},{"className":858},[],[860],{"type":21,"value":861},"ok: false",{"type":21,"value":863}," with a reason.",{"type":15,"tag":46,"props":865,"children":867},{"id":866},"webhooks",[868],{"type":21,"value":869},"Webhooks",{"type":15,"tag":40,"props":871,"children":872},{},[873],{"type":21,"value":874},"Webhooks are managed from:",{"type":15,"tag":58,"props":876,"children":878},{"className":60,"code":877,"language":21,"meta":8,"style":8},"\u002Fwebhooks\u002F{clusterId}\n",[879],{"type":15,"tag":64,"props":880,"children":881},{"__ignoreMap":8},[882],{"type":15,"tag":68,"props":883,"children":884},{"class":70,"line":71},[885],{"type":15,"tag":68,"props":886,"children":887},{},[888],{"type":21,"value":877},{"type":15,"tag":40,"props":890,"children":891},{},[892],{"type":21,"value":893},"The page calls:",{"type":15,"tag":83,"props":895,"children":896},{},[897,911],{"type":15,"tag":87,"props":898,"children":899},{},[900],{"type":15,"tag":91,"props":901,"children":902},{},[903,907],{"type":15,"tag":95,"props":904,"children":905},{},[906],{"type":21,"value":99},{"type":15,"tag":95,"props":908,"children":909},{},[910],{"type":21,"value":104},{"type":15,"tag":106,"props":912,"children":913},{},[914,931,948,965,982,999,1016],{"type":15,"tag":91,"props":915,"children":916},{},[917,922],{"type":15,"tag":113,"props":918,"children":919},{},[920],{"type":21,"value":921},"List webhooks",{"type":15,"tag":113,"props":923,"children":924},{},[925],{"type":15,"tag":64,"props":926,"children":928},{"className":927},[],[929],{"type":21,"value":930},"GET \u002Fapi\u002Fwebhooks",{"type":15,"tag":91,"props":932,"children":933},{},[934,939],{"type":15,"tag":113,"props":935,"children":936},{},[937],{"type":21,"value":938},"Create webhook",{"type":15,"tag":113,"props":940,"children":941},{},[942],{"type":15,"tag":64,"props":943,"children":945},{"className":944},[],[946],{"type":21,"value":947},"POST \u002Fapi\u002Fwebhooks",{"type":15,"tag":91,"props":949,"children":950},{},[951,956],{"type":15,"tag":113,"props":952,"children":953},{},[954],{"type":21,"value":955},"Update webhook",{"type":15,"tag":113,"props":957,"children":958},{},[959],{"type":15,"tag":64,"props":960,"children":962},{"className":961},[],[963],{"type":21,"value":964},"PUT \u002Fapi\u002Fwebhooks\u002F{webhookId}",{"type":15,"tag":91,"props":966,"children":967},{},[968,973],{"type":15,"tag":113,"props":969,"children":970},{},[971],{"type":21,"value":972},"Delete webhook",{"type":15,"tag":113,"props":974,"children":975},{},[976],{"type":15,"tag":64,"props":977,"children":979},{"className":978},[],[980],{"type":21,"value":981},"DELETE \u002Fapi\u002Fwebhooks\u002F{webhookId}",{"type":15,"tag":91,"props":983,"children":984},{},[985,990],{"type":15,"tag":113,"props":986,"children":987},{},[988],{"type":21,"value":989},"Test webhook",{"type":15,"tag":113,"props":991,"children":992},{},[993],{"type":15,"tag":64,"props":994,"children":996},{"className":995},[],[997],{"type":21,"value":998},"POST \u002Fapi\u002Fwebhooks\u002F{webhookId}\u002Ftest",{"type":15,"tag":91,"props":1000,"children":1001},{},[1002,1007],{"type":15,"tag":113,"props":1003,"children":1004},{},[1005],{"type":21,"value":1006},"View deliveries",{"type":15,"tag":113,"props":1008,"children":1009},{},[1010],{"type":15,"tag":64,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":21,"value":1015},"GET \u002Fapi\u002Fwebhooks\u002F{webhookId}\u002Fdeliveries",{"type":15,"tag":91,"props":1017,"children":1018},{},[1019,1024],{"type":15,"tag":113,"props":1020,"children":1021},{},[1022],{"type":21,"value":1023},"Regenerate secret",{"type":15,"tag":113,"props":1025,"children":1026},{},[1027],{"type":15,"tag":64,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":21,"value":1032},"POST \u002Fapi\u002Fwebhooks\u002F{webhookId}\u002Fregenerate-secret",{"type":15,"tag":46,"props":1034,"children":1036},{"id":1035},"webhook-payload",[1037],{"type":21,"value":1038},"Webhook Payload",{"type":15,"tag":40,"props":1040,"children":1041},{},[1042],{"type":21,"value":1043},"A webhook delivery should be treated like an external API call. Verify the signature before trusting the body.",{"type":15,"tag":40,"props":1045,"children":1046},{},[1047],{"type":21,"value":1048},"Example receiver:",{"type":15,"tag":58,"props":1050,"children":1052},{"className":247,"code":1051,"language":249,"meta":8,"style":8},"import crypto from \"node:crypto\";\nimport express from \"express\";\n\nconst app = express();\napp.use(express.raw({ type: \"application\u002Fjson\" }));\n\napp.post(\"\u002Fcredvault\u002Fwebhook\", (req, res) => {\n  const signature = req.header(\"X-CredVault-Signature\");\n  const expected = crypto\n    .createHmac(\"sha256\", process.env.CREDVAULT_WEBHOOK_SECRET)\n    .update(req.body)\n    .digest(\"hex\");\n\n  if (signature !== expected) {\n    return res.status(401).json({ error: \"invalid_signature\" });\n  }\n\n  const event = JSON.parse(req.body.toString(\"utf8\"));\n  console.log(\"CredVault event:\", event.type);\n  res.json({ received: true });\n});\n",[1053],{"type":15,"tag":64,"props":1054,"children":1055},{"__ignoreMap":8},[1056,1084,1109,1116,1143,1181,1188,1242,1282,1303,1340,1357,1382,1389,1411,1461,1468,1475,1530,1558,1584],{"type":15,"tag":68,"props":1057,"children":1058},{"class":70,"line":71},[1059,1064,1069,1074,1079],{"type":15,"tag":68,"props":1060,"children":1061},{"style":259},[1062],{"type":21,"value":1063},"import",{"type":15,"tag":68,"props":1065,"children":1066},{"style":286},[1067],{"type":21,"value":1068}," crypto ",{"type":15,"tag":68,"props":1070,"children":1071},{"style":259},[1072],{"type":21,"value":1073},"from",{"type":15,"tag":68,"props":1075,"children":1076},{"style":403},[1077],{"type":21,"value":1078}," \"node:crypto\"",{"type":15,"tag":68,"props":1080,"children":1081},{"style":286},[1082],{"type":21,"value":1083},";\n",{"type":15,"tag":68,"props":1085,"children":1086},{"class":70,"line":303},[1087,1091,1096,1100,1105],{"type":15,"tag":68,"props":1088,"children":1089},{"style":259},[1090],{"type":21,"value":1063},{"type":15,"tag":68,"props":1092,"children":1093},{"style":286},[1094],{"type":21,"value":1095}," express ",{"type":15,"tag":68,"props":1097,"children":1098},{"style":259},[1099],{"type":21,"value":1073},{"type":15,"tag":68,"props":1101,"children":1102},{"style":403},[1103],{"type":21,"value":1104}," \"express\"",{"type":15,"tag":68,"props":1106,"children":1107},{"style":286},[1108],{"type":21,"value":1083},{"type":15,"tag":68,"props":1110,"children":1111},{"class":70,"line":357},[1112],{"type":15,"tag":68,"props":1113,"children":1114},{"emptyLinePlaceholder":361},[1115],{"type":21,"value":364},{"type":15,"tag":68,"props":1117,"children":1118},{"class":70,"line":10},[1119,1124,1129,1133,1138],{"type":15,"tag":68,"props":1120,"children":1121},{"style":259},[1122],{"type":21,"value":1123},"const",{"type":15,"tag":68,"props":1125,"children":1126},{"style":317},[1127],{"type":21,"value":1128}," app",{"type":15,"tag":68,"props":1130,"children":1131},{"style":259},[1132],{"type":21,"value":381},{"type":15,"tag":68,"props":1134,"children":1135},{"style":280},[1136],{"type":21,"value":1137}," express",{"type":15,"tag":68,"props":1139,"children":1140},{"style":286},[1141],{"type":21,"value":1142},"();\n",{"type":15,"tag":68,"props":1144,"children":1145},{"class":70,"line":424},[1146,1151,1156,1161,1166,1171,1176],{"type":15,"tag":68,"props":1147,"children":1148},{"style":286},[1149],{"type":21,"value":1150},"app.",{"type":15,"tag":68,"props":1152,"children":1153},{"style":280},[1154],{"type":21,"value":1155},"use",{"type":15,"tag":68,"props":1157,"children":1158},{"style":286},[1159],{"type":21,"value":1160},"(express.",{"type":15,"tag":68,"props":1162,"children":1163},{"style":280},[1164],{"type":21,"value":1165},"raw",{"type":15,"tag":68,"props":1167,"children":1168},{"style":286},[1169],{"type":21,"value":1170},"({ type: ",{"type":15,"tag":68,"props":1172,"children":1173},{"style":403},[1174],{"type":21,"value":1175},"\"application\u002Fjson\"",{"type":15,"tag":68,"props":1177,"children":1178},{"style":286},[1179],{"type":21,"value":1180}," }));\n",{"type":15,"tag":68,"props":1182,"children":1183},{"class":70,"line":433},[1184],{"type":15,"tag":68,"props":1185,"children":1186},{"emptyLinePlaceholder":361},[1187],{"type":21,"value":364},{"type":15,"tag":68,"props":1189,"children":1190},{"class":70,"line":442},[1191,1195,1200,1204,1209,1214,1219,1223,1228,1233,1238],{"type":15,"tag":68,"props":1192,"children":1193},{"style":286},[1194],{"type":21,"value":1150},{"type":15,"tag":68,"props":1196,"children":1197},{"style":280},[1198],{"type":21,"value":1199},"post",{"type":15,"tag":68,"props":1201,"children":1202},{"style":286},[1203],{"type":21,"value":289},{"type":15,"tag":68,"props":1205,"children":1206},{"style":403},[1207],{"type":21,"value":1208},"\"\u002Fcredvault\u002Fwebhook\"",{"type":15,"tag":68,"props":1210,"children":1211},{"style":286},[1212],{"type":21,"value":1213},", (",{"type":15,"tag":68,"props":1215,"children":1216},{"style":292},[1217],{"type":21,"value":1218},"req",{"type":15,"tag":68,"props":1220,"children":1221},{"style":286},[1222],{"type":21,"value":325},{"type":15,"tag":68,"props":1224,"children":1225},{"style":292},[1226],{"type":21,"value":1227},"res",{"type":15,"tag":68,"props":1229,"children":1230},{"style":286},[1231],{"type":21,"value":1232},") ",{"type":15,"tag":68,"props":1234,"children":1235},{"style":259},[1236],{"type":21,"value":1237},"=>",{"type":15,"tag":68,"props":1239,"children":1240},{"style":286},[1241],{"type":21,"value":536},{"type":15,"tag":68,"props":1243,"children":1244},{"class":70,"line":450},[1245,1249,1254,1258,1263,1268,1272,1277],{"type":15,"tag":68,"props":1246,"children":1247},{"style":259},[1248],{"type":21,"value":309},{"type":15,"tag":68,"props":1250,"children":1251},{"style":317},[1252],{"type":21,"value":1253}," signature",{"type":15,"tag":68,"props":1255,"children":1256},{"style":259},[1257],{"type":21,"value":381},{"type":15,"tag":68,"props":1259,"children":1260},{"style":286},[1261],{"type":21,"value":1262}," req.",{"type":15,"tag":68,"props":1264,"children":1265},{"style":280},[1266],{"type":21,"value":1267},"header",{"type":15,"tag":68,"props":1269,"children":1270},{"style":286},[1271],{"type":21,"value":289},{"type":15,"tag":68,"props":1273,"children":1274},{"style":403},[1275],{"type":21,"value":1276},"\"X-CredVault-Signature\"",{"type":15,"tag":68,"props":1278,"children":1279},{"style":286},[1280],{"type":21,"value":1281},");\n",{"type":15,"tag":68,"props":1283,"children":1284},{"class":70,"line":474},[1285,1289,1294,1298],{"type":15,"tag":68,"props":1286,"children":1287},{"style":259},[1288],{"type":21,"value":309},{"type":15,"tag":68,"props":1290,"children":1291},{"style":317},[1292],{"type":21,"value":1293}," expected",{"type":15,"tag":68,"props":1295,"children":1296},{"style":259},[1297],{"type":21,"value":381},{"type":15,"tag":68,"props":1299,"children":1300},{"style":286},[1301],{"type":21,"value":1302}," crypto\n",{"type":15,"tag":68,"props":1304,"children":1305},{"class":70,"line":508},[1306,1311,1316,1320,1325,1330,1335],{"type":15,"tag":68,"props":1307,"children":1308},{"style":286},[1309],{"type":21,"value":1310},"    .",{"type":15,"tag":68,"props":1312,"children":1313},{"style":280},[1314],{"type":21,"value":1315},"createHmac",{"type":15,"tag":68,"props":1317,"children":1318},{"style":286},[1319],{"type":21,"value":289},{"type":15,"tag":68,"props":1321,"children":1322},{"style":403},[1323],{"type":21,"value":1324},"\"sha256\"",{"type":15,"tag":68,"props":1326,"children":1327},{"style":286},[1328],{"type":21,"value":1329},", process.env.",{"type":15,"tag":68,"props":1331,"children":1332},{"style":317},[1333],{"type":21,"value":1334},"CREDVAULT_WEBHOOK_SECRET",{"type":15,"tag":68,"props":1336,"children":1337},{"style":286},[1338],{"type":21,"value":1339},")\n",{"type":15,"tag":68,"props":1341,"children":1342},{"class":70,"line":517},[1343,1347,1352],{"type":15,"tag":68,"props":1344,"children":1345},{"style":286},[1346],{"type":21,"value":1310},{"type":15,"tag":68,"props":1348,"children":1349},{"style":280},[1350],{"type":21,"value":1351},"update",{"type":15,"tag":68,"props":1353,"children":1354},{"style":286},[1355],{"type":21,"value":1356},"(req.body)\n",{"type":15,"tag":68,"props":1358,"children":1359},{"class":70,"line":525},[1360,1364,1369,1373,1378],{"type":15,"tag":68,"props":1361,"children":1362},{"style":286},[1363],{"type":21,"value":1310},{"type":15,"tag":68,"props":1365,"children":1366},{"style":280},[1367],{"type":21,"value":1368},"digest",{"type":15,"tag":68,"props":1370,"children":1371},{"style":286},[1372],{"type":21,"value":289},{"type":15,"tag":68,"props":1374,"children":1375},{"style":403},[1376],{"type":21,"value":1377},"\"hex\"",{"type":15,"tag":68,"props":1379,"children":1380},{"style":286},[1381],{"type":21,"value":1281},{"type":15,"tag":68,"props":1383,"children":1384},{"class":70,"line":539},[1385],{"type":15,"tag":68,"props":1386,"children":1387},{"emptyLinePlaceholder":361},[1388],{"type":21,"value":364},{"type":15,"tag":68,"props":1390,"children":1391},{"class":70,"line":557},[1392,1396,1401,1406],{"type":15,"tag":68,"props":1393,"children":1394},{"style":259},[1395],{"type":21,"value":456},{"type":15,"tag":68,"props":1397,"children":1398},{"style":286},[1399],{"type":21,"value":1400}," (signature ",{"type":15,"tag":68,"props":1402,"children":1403},{"style":259},[1404],{"type":21,"value":1405},"!==",{"type":15,"tag":68,"props":1407,"children":1408},{"style":286},[1409],{"type":21,"value":1410}," expected) {\n",{"type":15,"tag":68,"props":1412,"children":1413},{"class":70,"line":566},[1414,1418,1423,1428,1432,1437,1441,1446,1451,1456],{"type":15,"tag":68,"props":1415,"children":1416},{"style":259},[1417],{"type":21,"value":480},{"type":15,"tag":68,"props":1419,"children":1420},{"style":286},[1421],{"type":21,"value":1422}," res.",{"type":15,"tag":68,"props":1424,"children":1425},{"style":280},[1426],{"type":21,"value":1427},"status",{"type":15,"tag":68,"props":1429,"children":1430},{"style":286},[1431],{"type":21,"value":289},{"type":15,"tag":68,"props":1433,"children":1434},{"style":317},[1435],{"type":21,"value":1436},"401",{"type":15,"tag":68,"props":1438,"children":1439},{"style":286},[1440],{"type":21,"value":411},{"type":15,"tag":68,"props":1442,"children":1443},{"style":280},[1444],{"type":21,"value":1445},"json",{"type":15,"tag":68,"props":1447,"children":1448},{"style":286},[1449],{"type":21,"value":1450},"({ error: ",{"type":15,"tag":68,"props":1452,"children":1453},{"style":403},[1454],{"type":21,"value":1455},"\"invalid_signature\"",{"type":15,"tag":68,"props":1457,"children":1458},{"style":286},[1459],{"type":21,"value":1460}," });\n",{"type":15,"tag":68,"props":1462,"children":1463},{"class":70,"line":575},[1464],{"type":15,"tag":68,"props":1465,"children":1466},{"style":286},[1467],{"type":21,"value":514},{"type":15,"tag":68,"props":1469,"children":1470},{"class":70,"line":584},[1471],{"type":15,"tag":68,"props":1472,"children":1473},{"emptyLinePlaceholder":361},[1474],{"type":21,"value":364},{"type":15,"tag":68,"props":1476,"children":1477},{"class":70,"line":593},[1478,1482,1487,1491,1496,1501,1506,1511,1516,1520,1525],{"type":15,"tag":68,"props":1479,"children":1480},{"style":259},[1481],{"type":21,"value":309},{"type":15,"tag":68,"props":1483,"children":1484},{"style":317},[1485],{"type":21,"value":1486}," event",{"type":15,"tag":68,"props":1488,"children":1489},{"style":259},[1490],{"type":21,"value":381},{"type":15,"tag":68,"props":1492,"children":1493},{"style":317},[1494],{"type":21,"value":1495}," JSON",{"type":15,"tag":68,"props":1497,"children":1498},{"style":286},[1499],{"type":21,"value":1500},".",{"type":15,"tag":68,"props":1502,"children":1503},{"style":280},[1504],{"type":21,"value":1505},"parse",{"type":15,"tag":68,"props":1507,"children":1508},{"style":286},[1509],{"type":21,"value":1510},"(req.body.",{"type":15,"tag":68,"props":1512,"children":1513},{"style":280},[1514],{"type":21,"value":1515},"toString",{"type":15,"tag":68,"props":1517,"children":1518},{"style":286},[1519],{"type":21,"value":289},{"type":15,"tag":68,"props":1521,"children":1522},{"style":403},[1523],{"type":21,"value":1524},"\"utf8\"",{"type":15,"tag":68,"props":1526,"children":1527},{"style":286},[1528],{"type":21,"value":1529},"));\n",{"type":15,"tag":68,"props":1531,"children":1533},{"class":70,"line":1532},19,[1534,1539,1544,1548,1553],{"type":15,"tag":68,"props":1535,"children":1536},{"style":286},[1537],{"type":21,"value":1538},"  console.",{"type":15,"tag":68,"props":1540,"children":1541},{"style":280},[1542],{"type":21,"value":1543},"log",{"type":15,"tag":68,"props":1545,"children":1546},{"style":286},[1547],{"type":21,"value":289},{"type":15,"tag":68,"props":1549,"children":1550},{"style":403},[1551],{"type":21,"value":1552},"\"CredVault event:\"",{"type":15,"tag":68,"props":1554,"children":1555},{"style":286},[1556],{"type":21,"value":1557},", event.type);\n",{"type":15,"tag":68,"props":1559,"children":1561},{"class":70,"line":1560},20,[1562,1567,1571,1576,1580],{"type":15,"tag":68,"props":1563,"children":1564},{"style":286},[1565],{"type":21,"value":1566},"  res.",{"type":15,"tag":68,"props":1568,"children":1569},{"style":280},[1570],{"type":21,"value":1445},{"type":15,"tag":68,"props":1572,"children":1573},{"style":286},[1574],{"type":21,"value":1575},"({ received: ",{"type":15,"tag":68,"props":1577,"children":1578},{"style":317},[1579],{"type":21,"value":28},{"type":15,"tag":68,"props":1581,"children":1582},{"style":286},[1583],{"type":21,"value":1460},{"type":15,"tag":68,"props":1585,"children":1587},{"class":70,"line":1586},21,[1588],{"type":15,"tag":68,"props":1589,"children":1590},{"style":286},[1591],{"type":21,"value":1592},"});\n",{"type":15,"tag":46,"props":1594,"children":1596},{"id":1595},"test-a-webhook",[1597],{"type":21,"value":1598},"Test A Webhook",{"type":15,"tag":40,"props":1600,"children":1601},{},[1602],{"type":21,"value":1603},"Use the dashboard:",{"type":15,"tag":58,"props":1605,"children":1607},{"className":60,"code":1606,"language":21,"meta":8,"style":8},"1. Open \u002Fwebhooks\u002F{clusterId}\n2. Create a webhook with a public HTTPS URL\n3. Select events\n4. Press Test\n5. Open Deliveries to inspect status and response time\n",[1608],{"type":15,"tag":64,"props":1609,"children":1610},{"__ignoreMap":8},[1611,1619,1627,1635,1643],{"type":15,"tag":68,"props":1612,"children":1613},{"class":70,"line":71},[1614],{"type":15,"tag":68,"props":1615,"children":1616},{},[1617],{"type":21,"value":1618},"1. Open \u002Fwebhooks\u002F{clusterId}\n",{"type":15,"tag":68,"props":1620,"children":1621},{"class":70,"line":303},[1622],{"type":15,"tag":68,"props":1623,"children":1624},{},[1625],{"type":21,"value":1626},"2. Create a webhook with a public HTTPS URL\n",{"type":15,"tag":68,"props":1628,"children":1629},{"class":70,"line":357},[1630],{"type":15,"tag":68,"props":1631,"children":1632},{},[1633],{"type":21,"value":1634},"3. Select events\n",{"type":15,"tag":68,"props":1636,"children":1637},{"class":70,"line":10},[1638],{"type":15,"tag":68,"props":1639,"children":1640},{},[1641],{"type":21,"value":1642},"4. Press Test\n",{"type":15,"tag":68,"props":1644,"children":1645},{"class":70,"line":424},[1646],{"type":15,"tag":68,"props":1647,"children":1648},{},[1649],{"type":21,"value":1650},"5. Open Deliveries to inspect status and response time\n",{"type":15,"tag":40,"props":1652,"children":1653},{},[1654],{"type":21,"value":1655},"Use the CLI:",{"type":15,"tag":58,"props":1657,"children":1659},{"className":709,"code":1658,"language":711,"meta":8,"style":8},"cie webhooks list\ncie webhooks create\ncie webhooks test \u003Cwebhook-id>\n",[1660],{"type":15,"tag":64,"props":1661,"children":1662},{"__ignoreMap":8},[1663,1681,1697],{"type":15,"tag":68,"props":1664,"children":1665},{"class":70,"line":71},[1666,1671,1676],{"type":15,"tag":68,"props":1667,"children":1668},{"style":280},[1669],{"type":21,"value":1670},"cie",{"type":15,"tag":68,"props":1672,"children":1673},{"style":403},[1674],{"type":21,"value":1675}," webhooks",{"type":15,"tag":68,"props":1677,"children":1678},{"style":403},[1679],{"type":21,"value":1680}," list\n",{"type":15,"tag":68,"props":1682,"children":1683},{"class":70,"line":303},[1684,1688,1692],{"type":15,"tag":68,"props":1685,"children":1686},{"style":280},[1687],{"type":21,"value":1670},{"type":15,"tag":68,"props":1689,"children":1690},{"style":403},[1691],{"type":21,"value":1675},{"type":15,"tag":68,"props":1693,"children":1694},{"style":403},[1695],{"type":21,"value":1696}," create\n",{"type":15,"tag":68,"props":1698,"children":1699},{"class":70,"line":357},[1700,1704,1708,1713,1718,1723,1727],{"type":15,"tag":68,"props":1701,"children":1702},{"style":280},[1703],{"type":21,"value":1670},{"type":15,"tag":68,"props":1705,"children":1706},{"style":403},[1707],{"type":21,"value":1675},{"type":15,"tag":68,"props":1709,"children":1710},{"style":403},[1711],{"type":21,"value":1712}," test",{"type":15,"tag":68,"props":1714,"children":1715},{"style":259},[1716],{"type":21,"value":1717}," \u003C",{"type":15,"tag":68,"props":1719,"children":1720},{"style":403},[1721],{"type":21,"value":1722},"webhook-i",{"type":15,"tag":68,"props":1724,"children":1725},{"style":286},[1726],{"type":21,"value":753},{"type":15,"tag":68,"props":1728,"children":1729},{"style":259},[1730],{"type":21,"value":1731},">\n",{"type":15,"tag":40,"props":1733,"children":1734},{},[1735,1739],{"type":15,"tag":841,"props":1736,"children":1737},{},[1738],{"type":21,"value":845},{"type":21,"value":1740}," the CLI should print the webhook ID, delivery status, HTTP response code, and response time. In the dashboard, the same delivery should appear under webhook deliveries.",{"type":15,"tag":46,"props":1742,"children":1744},{"id":1743},"when-to-use-each",[1745],{"type":21,"value":1746},"When To Use Each",{"type":15,"tag":83,"props":1748,"children":1749},{},[1750,1766],{"type":15,"tag":87,"props":1751,"children":1752},{},[1753],{"type":15,"tag":91,"props":1754,"children":1755},{},[1756,1761],{"type":15,"tag":95,"props":1757,"children":1758},{},[1759],{"type":21,"value":1760},"Need",{"type":15,"tag":95,"props":1762,"children":1763},{},[1764],{"type":21,"value":1765},"Use",{"type":15,"tag":106,"props":1767,"children":1768},{},[1769,1782,1795,1808,1820],{"type":15,"tag":91,"props":1770,"children":1771},{},[1772,1777],{"type":15,"tag":113,"props":1773,"children":1774},{},[1775],{"type":21,"value":1776},"Run custom logic inside CredVault",{"type":15,"tag":113,"props":1778,"children":1779},{},[1780],{"type":21,"value":1781},"Function",{"type":15,"tag":91,"props":1783,"children":1784},{},[1785,1790],{"type":15,"tag":113,"props":1786,"children":1787},{},[1788],{"type":21,"value":1789},"Notify another product",{"type":15,"tag":113,"props":1791,"children":1792},{},[1793],{"type":21,"value":1794},"Webhook",{"type":15,"tag":91,"props":1796,"children":1797},{},[1798,1803],{"type":15,"tag":113,"props":1799,"children":1800},{},[1801],{"type":21,"value":1802},"Transform data on a schedule",{"type":15,"tag":113,"props":1804,"children":1805},{},[1806],{"type":21,"value":1807},"Pipeline or function",{"type":15,"tag":91,"props":1809,"children":1810},{},[1811,1816],{"type":15,"tag":113,"props":1812,"children":1813},{},[1814],{"type":21,"value":1815},"Connect to Slack, CRM, billing, or warehouse",{"type":15,"tag":113,"props":1817,"children":1818},{},[1819],{"type":21,"value":1794},{"type":15,"tag":91,"props":1821,"children":1822},{},[1823,1828],{"type":15,"tag":113,"props":1824,"children":1825},{},[1826],{"type":21,"value":1827},"Validate or enrich a document before downstream use",{"type":15,"tag":113,"props":1829,"children":1830},{},[1831],{"type":21,"value":1781},{"type":15,"tag":46,"props":1833,"children":1835},{"id":1834},"security-rules",[1836],{"type":21,"value":1837},"Security Rules",{"type":15,"tag":1839,"props":1840,"children":1841},"ul",{},[1842,1848,1853,1858,1863,1868],{"type":15,"tag":1843,"props":1844,"children":1845},"li",{},[1846],{"type":21,"value":1847},"Use HTTPS webhook URLs.",{"type":15,"tag":1843,"props":1849,"children":1850},{},[1851],{"type":21,"value":1852},"Store webhook secrets in environment variables.",{"type":15,"tag":1843,"props":1854,"children":1855},{},[1856],{"type":21,"value":1857},"Rotate webhook secrets after sharing or incident response.",{"type":15,"tag":1843,"props":1859,"children":1860},{},[1861],{"type":21,"value":1862},"Keep functions small and idempotent.",{"type":15,"tag":1843,"props":1864,"children":1865},{},[1866],{"type":21,"value":1867},"Do not log secrets or payment data.",{"type":15,"tag":1843,"props":1869,"children":1870},{},[1871],{"type":21,"value":1872},"Use activity logs to audit creation, update, test, and delete actions.",{"type":15,"tag":1874,"props":1875,"children":1876},"style",{},[1877],{"type":21,"value":1878},"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);}",{"title":8,"searchDepth":303,"depth":303,"links":1880},[1881,1882,1883,1884,1885,1886,1887,1888],{"id":48,"depth":303,"text":51},{"id":231,"depth":303,"text":234},{"id":602,"depth":303,"text":605},{"id":866,"depth":303,"text":869},{"id":1035,"depth":303,"text":1038},{"id":1595,"depth":303,"text":1598},{"id":1743,"depth":303,"text":1746},{"id":1834,"depth":303,"text":1837},"markdown","content:docs:features:serverless-functions.md","content","docs\u002Ffeatures\u002Fserverless-functions.md","docs\u002Ffeatures\u002Fserverless-functions","md",1794695980433]