[{"data":1,"prerenderedAt":1385},["ShallowReactive",2],{"navigation_docs":3,"-api-outbound-webhooks":54,"-api-outbound-webhooks-surround":1382},[4,18,40],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,10,14],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Console Tour","\u002Fgetting-started\u002Fconsole-tour","1.getting-started\u002F2.console-tour",{"title":15,"path":16,"stem":17},"The Free Audit","\u002Fgetting-started\u002Ffree-audit","1.getting-started\u002F3.free-audit",{"title":19,"path":20,"stem":21,"children":22},"MCP Server","\u002Fmcp","2.mcp\u002F1.index",[23,24,28,32,36],{"title":19,"path":20,"stem":21},{"title":25,"path":26,"stem":27},"Setup","\u002Fmcp\u002Fsetup","2.mcp\u002F2.setup",{"title":29,"path":30,"stem":31},"Available Tools","\u002Fmcp\u002Favailable-tools","2.mcp\u002F3.available-tools",{"title":33,"path":34,"stem":35},"Authentication","\u002Fmcp\u002Fauthentication","2.mcp\u002F4.authentication",{"title":37,"path":38,"stem":39},"Troubleshooting","\u002Fmcp\u002Ftroubleshooting","2.mcp\u002F5.troubleshooting",{"title":41,"path":42,"stem":43,"children":44},"API Reference","\u002Fapi","3.api\u002F1.index",[45,46,50],{"title":41,"path":42,"stem":43},{"title":47,"path":48,"stem":49},"Bulk CSV","\u002Fapi\u002Fbulk-csv","3.api\u002F2.bulk-csv",{"title":51,"path":52,"stem":53},"Outbound Webhooks","\u002Fapi\u002Foutbound-webhooks","3.api\u002F3.outbound-webhooks",{"id":55,"title":51,"body":56,"description":1376,"extension":1377,"links":1378,"meta":1379,"navigation":648,"path":52,"seo":1380,"stem":53,"__hash__":1381},"docs\u002F3.api\u002F3.outbound-webhooks.md",{"type":57,"value":58,"toc":1366},"minimark",[59,63,76,81,91,115,122,129,133,250,259,263,266,502,520,524,527,593,597,604,1105,1115,1118,1151,1161,1165,1175,1320,1323,1327,1362],[60,61,62],"p",{},"PlaceOptimizer can POST events to your own HTTPS endpoints when things happen\ninside the console — an audit completes, a post is published. Every delivery is\nsigned so you can verify it really came from us, retried once on failure, and\nnever blocked: your receiver's latency cannot slow down the console.",[60,64,65,66,70,71,75],{},"Webhooks are managed in the operator console at ",[67,68,69],"strong",{},"Dashboard → Webhooks","\n(",[72,73,74],"code",{},"\u002Fdashboard\u002Fwebhooks",").",[77,78,80],"h2",{"id":79},"registering-an-endpoint","Registering an endpoint",[60,82,83,84,86,87,90],{},"In ",[67,85,69],{},", click ",[67,88,89],{},"Add endpoint",":",[92,93,94,109],"ol",{},[95,96,97,100,101,104,105,108],"li",{},[67,98,99],{},"Endpoint URL"," — the ",[72,102,103],{},"https:\u002F\u002F"," URL PlaceOptimizer will POST to. Plain\n",[72,106,107],{},"http:\u002F\u002F"," is refused.",[95,110,111,114],{},[67,112,113],{},"Events"," — the event types this endpoint subscribes to (at least one).",[60,116,117,118,121],{},"On creation you receive a ",[67,119,120],{},"signing secret"," exactly once — copy it and store\nit with the receiver. It is masked everywhere afterwards. Every delivery to\nthat endpoint is signed with this secret, and you can rotate it by deleting and\nrecreating the endpoint.",[60,123,124,125,128],{},"An endpoint can be paused with the ",[67,126,127],{},"enabled"," toggle without deleting it, and\nits URL or subscribed events can be edited afterwards.",[77,130,132],{"id":131},"event-types","Event types",[134,135,136,152],"table",{},[137,138,139],"thead",{},[140,141,142,146,149],"tr",{},[143,144,145],"th",{},"Event",[143,147,148],{},"Fires when",[143,150,151],{},"Payload highlights",[153,154,155,187,203,221,236],"tbody",{},[140,156,157,163,166],{},[158,159,160],"td",{},[72,161,162],{},"audit.completed",[158,164,165],{},"An audit run finishes",[158,167,168,171,172,171,175,171,178,171,181,171,184],{},[72,169,170],{},"runId",", ",[72,173,174],{},"score",[72,176,177],{},"businessName",[72,179,180],{},"locationCount",[72,182,183],{},"duplicates",[72,185,186],{},"cached",[140,188,189,194,197],{},[158,190,191],{},[72,192,193],{},"location.updated",[158,195,196],{},"A managed location changes",[158,198,199],{},[200,201,202],"em",{},"reserved — not yet emitted",[140,204,205,210,213],{},[158,206,207],{},[72,208,209],{},"post.created",[158,211,212],{},"A Google Business Profile local post is published",[158,214,215,171,218],{},[72,216,217],{},"locationRef",[72,219,220],{},"post",[140,222,223,228,231],{},[158,224,225],{},[72,226,227],{},"alert.created",[158,229,230],{},"A monitoring rule fires",[158,232,233],{},[200,234,235],{},"emitted once the alerts engine lands",[140,237,238,243,246],{},[158,239,240],{},[72,241,242],{},"schedule.sent",[158,244,245],{},"A scheduled report email is delivered",[158,247,248],{},[200,249,202],{},[60,251,252,253,255,256,258],{},"The list is the closed set of subscribable events. Emitted events are\n",[72,254,162],{}," and ",[72,257,209],{}," today; the remaining types are emitted as\ntheir features ship — subscribing to them now is safe and they will simply not\nfire until then.",[77,260,262],{"id":261},"payload-shape","Payload shape",[60,264,265],{},"Every delivery is a single JSON object:",[267,268,273],"pre",{"className":269,"code":270,"language":271,"meta":272,"style":272},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"event\": \"audit.completed\",\n  \"data\": {\n    \"runId\": \"audit:peps-mattress:2026-07-22\",\n    \"cached\": false,\n    \"businessName\": \"Peps Mattress\",\n    \"date\": \"2026-07-22\",\n    \"locationCount\": 5,\n    \"score\": 78,\n    \"duplicates\": 1\n  },\n  \"deliveryId\": \"01KZXRX9RKXPQ7YER2HR2WTAK5\",\n  \"timestamp\": \"2026-08-13T14:37:37.939Z\"\n}\n","json","",[72,274,275,284,310,325,347,361,381,402,419,435,449,455,476,496],{"__ignoreMap":272},[276,277,280],"span",{"class":278,"line":279},"line",1,[276,281,283],{"class":282},"sMK4o","{\n",[276,285,287,290,294,297,299,302,305,307],{"class":278,"line":286},2,[276,288,289],{"class":282},"  \"",[276,291,293],{"class":292},"spNyl","event",[276,295,296],{"class":282},"\"",[276,298,90],{"class":282},[276,300,301],{"class":282}," \"",[276,303,162],{"class":304},"sfazB",[276,306,296],{"class":282},[276,308,309],{"class":282},",\n",[276,311,313,315,318,320,322],{"class":278,"line":312},3,[276,314,289],{"class":282},[276,316,317],{"class":292},"data",[276,319,296],{"class":282},[276,321,90],{"class":282},[276,323,324],{"class":282}," {\n",[276,326,328,331,334,336,338,340,343,345],{"class":278,"line":327},4,[276,329,330],{"class":282},"    \"",[276,332,170],{"class":333},"sBMFI",[276,335,296],{"class":282},[276,337,90],{"class":282},[276,339,301],{"class":282},[276,341,342],{"class":304},"audit:peps-mattress:2026-07-22",[276,344,296],{"class":282},[276,346,309],{"class":282},[276,348,350,352,354,356,358],{"class":278,"line":349},5,[276,351,330],{"class":282},[276,353,186],{"class":333},[276,355,296],{"class":282},[276,357,90],{"class":282},[276,359,360],{"class":282}," false,\n",[276,362,364,366,368,370,372,374,377,379],{"class":278,"line":363},6,[276,365,330],{"class":282},[276,367,177],{"class":333},[276,369,296],{"class":282},[276,371,90],{"class":282},[276,373,301],{"class":282},[276,375,376],{"class":304},"Peps Mattress",[276,378,296],{"class":282},[276,380,309],{"class":282},[276,382,384,386,389,391,393,395,398,400],{"class":278,"line":383},7,[276,385,330],{"class":282},[276,387,388],{"class":333},"date",[276,390,296],{"class":282},[276,392,90],{"class":282},[276,394,301],{"class":282},[276,396,397],{"class":304},"2026-07-22",[276,399,296],{"class":282},[276,401,309],{"class":282},[276,403,405,407,409,411,413,417],{"class":278,"line":404},8,[276,406,330],{"class":282},[276,408,180],{"class":333},[276,410,296],{"class":282},[276,412,90],{"class":282},[276,414,416],{"class":415},"sbssI"," 5",[276,418,309],{"class":282},[276,420,422,424,426,428,430,433],{"class":278,"line":421},9,[276,423,330],{"class":282},[276,425,174],{"class":333},[276,427,296],{"class":282},[276,429,90],{"class":282},[276,431,432],{"class":415}," 78",[276,434,309],{"class":282},[276,436,438,440,442,444,446],{"class":278,"line":437},10,[276,439,330],{"class":282},[276,441,183],{"class":333},[276,443,296],{"class":282},[276,445,90],{"class":282},[276,447,448],{"class":415}," 1\n",[276,450,452],{"class":278,"line":451},11,[276,453,454],{"class":282},"  },\n",[276,456,458,460,463,465,467,469,472,474],{"class":278,"line":457},12,[276,459,289],{"class":282},[276,461,462],{"class":292},"deliveryId",[276,464,296],{"class":282},[276,466,90],{"class":282},[276,468,301],{"class":282},[276,470,471],{"class":304},"01KZXRX9RKXPQ7YER2HR2WTAK5",[276,473,296],{"class":282},[276,475,309],{"class":282},[276,477,479,481,484,486,488,490,493],{"class":278,"line":478},13,[276,480,289],{"class":282},[276,482,483],{"class":292},"timestamp",[276,485,296],{"class":282},[276,487,90],{"class":282},[276,489,301],{"class":282},[276,491,492],{"class":304},"2026-08-13T14:37:37.939Z",[276,494,495],{"class":282},"\"\n",[276,497,499],{"class":278,"line":498},14,[276,500,501],{"class":282},"}\n",[503,504,505,515],"ul",{},[95,506,507,509,510,75],{},[72,508,462],{}," is unique per delivery attempt — use it for idempotency; a\nsingle logical event is delivered at most twice (see ",[511,512,514],"a",{"href":513},"#retry-behavior","Retry behavior",[95,516,517,519],{},[72,518,483],{}," is the ISO-8601 time the envelope was built.",[77,521,523],{"id":522},"request-headers","Request headers",[60,525,526],{},"Each POST carries four headers:",[134,528,529,539],{},[137,530,531],{},[140,532,533,536],{},[143,534,535],{},"Header",[143,537,538],{},"Value",[153,540,541,553,566,579],{},[140,542,543,548],{},[158,544,545],{},[72,546,547],{},"content-type",[158,549,550],{},[72,551,552],{},"application\u002Fjson",[140,554,555,560],{},[158,556,557],{},[72,558,559],{},"x-placeoptimizer-event",[158,561,562,563,565],{},"the event type (",[72,564,162],{},", …)",[140,567,568,573],{},[158,569,570],{},[72,571,572],{},"x-placeoptimizer-delivery",[158,574,575,576,578],{},"the delivery id (same as ",[72,577,462],{}," in the body)",[140,580,581,586],{},[158,582,583],{},[72,584,585],{},"x-placeoptimizer-signature",[158,587,588,589,592],{},"HMAC-SHA256 hex of the ",[67,590,591],{},"raw request body"," using the endpoint secret",[77,594,596],{"id":595},"verifying-the-signature","Verifying the signature",[60,598,599,600,603],{},"The signature is an HMAC-SHA256 of the ",[67,601,602],{},"exact raw body bytes"," you received —\nnever a re-stringified object. Verify it before trusting the payload, and\nreject any request whose signature does not match.",[267,605,609],{"className":606,"code":607,"language":608,"meta":272,"style":272},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const crypto = require('node:crypto');\n\n\u002F\u002F The secret shown once when you created the endpoint.\nconst SECRET = 'whr_…';\n\nasync function handler(req, res) {\n  const chunks = [];\n  for await (const chunk of req) chunks.push(chunk);\n  const rawBody = Buffer.concat(chunks); \u002F\u002F keep the raw bytes!\n  const signature = req.headers['x-placeoptimizer-signature'];\n\n  const expected = crypto\n    .createHmac('sha256', SECRET)\n    .update(rawBody)\n    .digest('hex');\n\n  if (signature !== expected) {\n    res.statusCode = 401;\n    res.end('invalid signature');\n    return;\n  }\n\n  const event = JSON.parse(rawBody.toString('utf8'));\n\n  \u002F\u002F Respond 2xx fast — PlaceOptimizer treats any 2xx as delivered.\n  res.statusCode = 200;\n  res.end('ok');\n\n  processEvent(event); \u002F\u002F do the real work after acknowledging\n}\n","js",[72,610,611,644,650,656,675,679,706,723,767,796,826,830,842,867,881,902,907,927,945,968,976,982,987,1028,1033,1039,1056,1078,1083,1100],{"__ignoreMap":272},[276,612,613,616,620,623,627,630,633,636,638,641],{"class":278,"line":279},[276,614,615],{"class":292},"const",[276,617,619],{"class":618},"sTEyZ"," crypto ",[276,621,622],{"class":282},"=",[276,624,626],{"class":625},"s2Zo4"," require",[276,628,629],{"class":618},"(",[276,631,632],{"class":282},"'",[276,634,635],{"class":304},"node:crypto",[276,637,632],{"class":282},[276,639,640],{"class":618},")",[276,642,643],{"class":282},";\n",[276,645,646],{"class":278,"line":286},[276,647,649],{"emptyLinePlaceholder":648},true,"\n",[276,651,652],{"class":278,"line":312},[276,653,655],{"class":654},"sHwdD","\u002F\u002F The secret shown once when you created the endpoint.\n",[276,657,658,660,663,665,668,671,673],{"class":278,"line":327},[276,659,615],{"class":292},[276,661,662],{"class":618}," SECRET ",[276,664,622],{"class":282},[276,666,667],{"class":282}," '",[276,669,670],{"class":304},"whr_…",[276,672,632],{"class":282},[276,674,643],{"class":282},[276,676,677],{"class":278,"line":349},[276,678,649],{"emptyLinePlaceholder":648},[276,680,681,684,687,690,692,696,699,702,704],{"class":278,"line":363},[276,682,683],{"class":292},"async",[276,685,686],{"class":292}," function",[276,688,689],{"class":625}," handler",[276,691,629],{"class":282},[276,693,695],{"class":694},"sHdIc","req",[276,697,698],{"class":282},",",[276,700,701],{"class":694}," res",[276,703,640],{"class":282},[276,705,324],{"class":282},[276,707,708,711,714,717,721],{"class":278,"line":383},[276,709,710],{"class":292},"  const",[276,712,713],{"class":618}," chunks",[276,715,716],{"class":282}," =",[276,718,720],{"class":719},"swJcz"," []",[276,722,643],{"class":282},[276,724,725,729,732,735,737,740,743,746,749,752,755,758,760,763,765],{"class":278,"line":404},[276,726,728],{"class":727},"s7zQu","  for",[276,730,731],{"class":727}," await",[276,733,734],{"class":719}," (",[276,736,615],{"class":292},[276,738,739],{"class":618}," chunk",[276,741,742],{"class":282}," of",[276,744,745],{"class":618}," req",[276,747,748],{"class":719},") ",[276,750,751],{"class":618},"chunks",[276,753,754],{"class":282},".",[276,756,757],{"class":625},"push",[276,759,629],{"class":719},[276,761,762],{"class":618},"chunk",[276,764,640],{"class":719},[276,766,643],{"class":282},[276,768,769,771,774,776,779,781,784,786,788,790,793],{"class":278,"line":421},[276,770,710],{"class":292},[276,772,773],{"class":618}," rawBody",[276,775,716],{"class":282},[276,777,778],{"class":618}," Buffer",[276,780,754],{"class":282},[276,782,783],{"class":625},"concat",[276,785,629],{"class":719},[276,787,751],{"class":618},[276,789,640],{"class":719},[276,791,792],{"class":282},";",[276,794,795],{"class":654}," \u002F\u002F keep the raw bytes!\n",[276,797,798,800,803,805,807,809,812,815,817,819,821,824],{"class":278,"line":437},[276,799,710],{"class":292},[276,801,802],{"class":618}," signature",[276,804,716],{"class":282},[276,806,745],{"class":618},[276,808,754],{"class":282},[276,810,811],{"class":618},"headers",[276,813,814],{"class":719},"[",[276,816,632],{"class":282},[276,818,585],{"class":304},[276,820,632],{"class":282},[276,822,823],{"class":719},"]",[276,825,643],{"class":282},[276,827,828],{"class":278,"line":451},[276,829,649],{"emptyLinePlaceholder":648},[276,831,832,834,837,839],{"class":278,"line":457},[276,833,710],{"class":292},[276,835,836],{"class":618}," expected",[276,838,716],{"class":282},[276,840,841],{"class":618}," crypto\n",[276,843,844,847,850,852,854,857,859,861,864],{"class":278,"line":478},[276,845,846],{"class":282},"    .",[276,848,849],{"class":625},"createHmac",[276,851,629],{"class":719},[276,853,632],{"class":282},[276,855,856],{"class":304},"sha256",[276,858,632],{"class":282},[276,860,698],{"class":282},[276,862,863],{"class":618}," SECRET",[276,865,866],{"class":719},")\n",[276,868,869,871,874,876,879],{"class":278,"line":498},[276,870,846],{"class":282},[276,872,873],{"class":625},"update",[276,875,629],{"class":719},[276,877,878],{"class":618},"rawBody",[276,880,866],{"class":719},[276,882,884,886,889,891,893,896,898,900],{"class":278,"line":883},15,[276,885,846],{"class":282},[276,887,888],{"class":625},"digest",[276,890,629],{"class":719},[276,892,632],{"class":282},[276,894,895],{"class":304},"hex",[276,897,632],{"class":282},[276,899,640],{"class":719},[276,901,643],{"class":282},[276,903,905],{"class":278,"line":904},16,[276,906,649],{"emptyLinePlaceholder":648},[276,908,910,913,915,918,921,923,925],{"class":278,"line":909},17,[276,911,912],{"class":727},"  if",[276,914,734],{"class":719},[276,916,917],{"class":618},"signature",[276,919,920],{"class":282}," !==",[276,922,836],{"class":618},[276,924,748],{"class":719},[276,926,283],{"class":282},[276,928,930,933,935,938,940,943],{"class":278,"line":929},18,[276,931,932],{"class":618},"    res",[276,934,754],{"class":282},[276,936,937],{"class":618},"statusCode",[276,939,716],{"class":282},[276,941,942],{"class":415}," 401",[276,944,643],{"class":282},[276,946,948,950,952,955,957,959,962,964,966],{"class":278,"line":947},19,[276,949,932],{"class":618},[276,951,754],{"class":282},[276,953,954],{"class":625},"end",[276,956,629],{"class":719},[276,958,632],{"class":282},[276,960,961],{"class":304},"invalid signature",[276,963,632],{"class":282},[276,965,640],{"class":719},[276,967,643],{"class":282},[276,969,971,974],{"class":278,"line":970},20,[276,972,973],{"class":727},"    return",[276,975,643],{"class":282},[276,977,979],{"class":278,"line":978},21,[276,980,981],{"class":282},"  }\n",[276,983,985],{"class":278,"line":984},22,[276,986,649],{"emptyLinePlaceholder":648},[276,988,990,992,995,997,1000,1002,1005,1007,1009,1011,1014,1016,1018,1021,1023,1026],{"class":278,"line":989},23,[276,991,710],{"class":292},[276,993,994],{"class":618}," event",[276,996,716],{"class":282},[276,998,999],{"class":618}," JSON",[276,1001,754],{"class":282},[276,1003,1004],{"class":625},"parse",[276,1006,629],{"class":719},[276,1008,878],{"class":618},[276,1010,754],{"class":282},[276,1012,1013],{"class":625},"toString",[276,1015,629],{"class":719},[276,1017,632],{"class":282},[276,1019,1020],{"class":304},"utf8",[276,1022,632],{"class":282},[276,1024,1025],{"class":719},"))",[276,1027,643],{"class":282},[276,1029,1031],{"class":278,"line":1030},24,[276,1032,649],{"emptyLinePlaceholder":648},[276,1034,1036],{"class":278,"line":1035},25,[276,1037,1038],{"class":654},"  \u002F\u002F Respond 2xx fast — PlaceOptimizer treats any 2xx as delivered.\n",[276,1040,1042,1045,1047,1049,1051,1054],{"class":278,"line":1041},26,[276,1043,1044],{"class":618},"  res",[276,1046,754],{"class":282},[276,1048,937],{"class":618},[276,1050,716],{"class":282},[276,1052,1053],{"class":415}," 200",[276,1055,643],{"class":282},[276,1057,1059,1061,1063,1065,1067,1069,1072,1074,1076],{"class":278,"line":1058},27,[276,1060,1044],{"class":618},[276,1062,754],{"class":282},[276,1064,954],{"class":625},[276,1066,629],{"class":719},[276,1068,632],{"class":282},[276,1070,1071],{"class":304},"ok",[276,1073,632],{"class":282},[276,1075,640],{"class":719},[276,1077,643],{"class":282},[276,1079,1081],{"class":278,"line":1080},28,[276,1082,649],{"emptyLinePlaceholder":648},[276,1084,1086,1089,1091,1093,1095,1097],{"class":278,"line":1085},29,[276,1087,1088],{"class":625},"  processEvent",[276,1090,629],{"class":719},[276,1092,293],{"class":618},[276,1094,640],{"class":719},[276,1096,792],{"class":282},[276,1098,1099],{"class":654}," \u002F\u002F do the real work after acknowledging\n",[276,1101,1103],{"class":278,"line":1102},30,[276,1104,501],{"class":282},[60,1106,1107,1108,734,1111,1114],{},"Use a ",[67,1109,1110],{},"constant-time comparison",[72,1112,1113],{},"crypto.timingSafeEqual"," on the hex\nbuffers) in production. If you have not received your secret (it is only shown\nat creation), delete and recreate the endpoint.",[77,1116,514],{"id":1117},"retry-behavior",[503,1119,1120,1126,1133],{},[95,1121,1122,1123,754],{},"Each endpoint is delivered with a ",[67,1124,1125],{},"10 second timeout",[95,1127,1128,1129,1132],{},"On any failure (non-2xx response, network error, timeout) PlaceOptimizer\nretries ",[67,1130,1131],{},"exactly once, immediately",", then records the outcome.",[95,1134,1135,1136,1139,1140,1143,1144,1147,1148,1150],{},"The ",[67,1137,1138],{},"Last delivery"," column on the endpoint row shows the outcome\n(",[72,1141,1142],{},"Delivered"," \u002F ",[72,1145,1146],{},"Failed",") and time of the most recent attempt. There is no\nopen-ended retry queue — a persistently failing endpoint stays ",[72,1149,1146],{}," so\nyou notice and fix it.",[60,1152,1153,1154,1157,1158,1160],{},"Because of the single retry, always make your receiver ",[67,1155,1156],{},"idempotent"," by\n",[72,1159,462],{},": the same event may arrive twice.",[77,1162,1164],{"id":1163},"testing-an-endpoint","Testing an endpoint",[60,1166,1135,1167,1170,1171,1174],{},[67,1168,1169],{},"Test"," button on each endpoint row sends a real ",[72,1172,1173],{},"ping"," event\nsynchronously and reports the actual result — it never fakes success:",[267,1176,1178],{"className":269,"code":1177,"language":271,"meta":272,"style":272},"{\n  \"event\": \"ping\",\n  \"data\": {\n    \"endpointId\": \"01J…\",\n    \"url\": \"https:\u002F\u002F…\",\n    \"events\": [\"audit.completed\"]\n  },\n  \"deliveryId\": \"01K…\",\n  \"timestamp\": \"2026-08-13T14:37:37.939Z\"\n}\n",[72,1179,1180,1184,1202,1214,1234,1254,1277,1281,1300,1316],{"__ignoreMap":272},[276,1181,1182],{"class":278,"line":279},[276,1183,283],{"class":282},[276,1185,1186,1188,1190,1192,1194,1196,1198,1200],{"class":278,"line":286},[276,1187,289],{"class":282},[276,1189,293],{"class":292},[276,1191,296],{"class":282},[276,1193,90],{"class":282},[276,1195,301],{"class":282},[276,1197,1173],{"class":304},[276,1199,296],{"class":282},[276,1201,309],{"class":282},[276,1203,1204,1206,1208,1210,1212],{"class":278,"line":312},[276,1205,289],{"class":282},[276,1207,317],{"class":292},[276,1209,296],{"class":282},[276,1211,90],{"class":282},[276,1213,324],{"class":282},[276,1215,1216,1218,1221,1223,1225,1227,1230,1232],{"class":278,"line":327},[276,1217,330],{"class":282},[276,1219,1220],{"class":333},"endpointId",[276,1222,296],{"class":282},[276,1224,90],{"class":282},[276,1226,301],{"class":282},[276,1228,1229],{"class":304},"01J…",[276,1231,296],{"class":282},[276,1233,309],{"class":282},[276,1235,1236,1238,1241,1243,1245,1247,1250,1252],{"class":278,"line":349},[276,1237,330],{"class":282},[276,1239,1240],{"class":333},"url",[276,1242,296],{"class":282},[276,1244,90],{"class":282},[276,1246,301],{"class":282},[276,1248,1249],{"class":304},"https:\u002F\u002F…",[276,1251,296],{"class":282},[276,1253,309],{"class":282},[276,1255,1256,1258,1261,1263,1265,1268,1270,1272,1274],{"class":278,"line":363},[276,1257,330],{"class":282},[276,1259,1260],{"class":333},"events",[276,1262,296],{"class":282},[276,1264,90],{"class":282},[276,1266,1267],{"class":282}," [",[276,1269,296],{"class":282},[276,1271,162],{"class":304},[276,1273,296],{"class":282},[276,1275,1276],{"class":282},"]\n",[276,1278,1279],{"class":278,"line":383},[276,1280,454],{"class":282},[276,1282,1283,1285,1287,1289,1291,1293,1296,1298],{"class":278,"line":404},[276,1284,289],{"class":282},[276,1286,462],{"class":292},[276,1288,296],{"class":282},[276,1290,90],{"class":282},[276,1292,301],{"class":282},[276,1294,1295],{"class":304},"01K…",[276,1297,296],{"class":282},[276,1299,309],{"class":282},[276,1301,1302,1304,1306,1308,1310,1312,1314],{"class":278,"line":421},[276,1303,289],{"class":282},[276,1305,483],{"class":292},[276,1307,296],{"class":282},[276,1309,90],{"class":282},[276,1311,301],{"class":282},[276,1313,492],{"class":304},[276,1315,495],{"class":282},[276,1317,1318],{"class":278,"line":437},[276,1319,501],{"class":282},[60,1321,1322],{},"A test delivery is signed exactly like a real one, so you can verify your\nsignature-checking code end to end. Test traffic does not update the endpoint's\ndelivery ledger.",[77,1324,1326],{"id":1325},"best-practices","Best practices",[503,1328,1329,1335,1341,1350,1356],{},[95,1330,1331,1334],{},[67,1332,1333],{},"Verify the signature"," on every delivery before acting on the payload.",[95,1336,1337,1340],{},[67,1338,1339],{},"Return 2xx quickly"," — PlaceOptimizer only cares about the status code;\nlong-running work belongs after the response.",[95,1342,1343,1346,1347,1349],{},[67,1344,1345],{},"Idempotent receivers only",": dedupe on ",[72,1348,462],{},"; the immediate retry\ncan deliver the same event twice.",[95,1351,1352,1355],{},[67,1353,1354],{},"Use the test button"," after registering, and after changing your receiver,\nto confirm the whole path (including signature verification) works.",[95,1357,1358,1361],{},[67,1359,1360],{},"Treat the secret as a credential"," — it is shown once, and anyone holding\nit can forge deliveries your receiver will accept.",[1363,1364,1365],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .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}",{"title":272,"searchDepth":312,"depth":312,"links":1367},[1368,1369,1370,1371,1372,1373,1374,1375],{"id":79,"depth":286,"text":80},{"id":131,"depth":286,"text":132},{"id":261,"depth":286,"text":262},{"id":522,"depth":286,"text":523},{"id":595,"depth":286,"text":596},{"id":1117,"depth":286,"text":514},{"id":1163,"depth":286,"text":1164},{"id":1325,"depth":286,"text":1326},"Receive PlaceOptimizer events in your own services — endpoint registration, event types, payload shape, HMAC signature verification, retry behavior, and the test endpoint.","md",null,{},{"title":51,"description":1376},"2aKDBEtGm2kCv6560IV_2wpTNeiRLsqV41q14OIfFNE",[1383,1378],{"title":47,"path":48,"stem":49,"description":1384,"children":-1},"The 16-column bulk CSV format for PlaceOptimizer location edits — column reference, validation rules, and the diff-and-apply flow.",1786649635795]