[{"data":1,"prerenderedAt":985},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fjavascript-quickstart":3,"docs-nav":967},{"id":4,"title":5,"body":6,"description":959,"extension":960,"meta":961,"navigation":195,"order":220,"path":962,"section":963,"seo":964,"stem":965,"__hash__":966},"docs\u002Fdocs\u002Fjavascript-quickstart.md","JavaScript SDK – Quick Start",{"type":7,"value":8,"toc":951},"minimark",[9,14,18,22,25,89,158,162,404,422,426,483,487,915,934,938,947],[10,11,13],"h2",{"id":12},"overview","Overview",[15,16,17],"p",{},"The BlockBots JavaScript SDK runs in the browser and detects bots from canvas fingerprints, user agent, automation signals, pointer activity and IP address. It talks to the BlockBots API and tells you whether the visitor is a human or a bot.",[10,19,21],{"id":20},"installation","Installation",[15,23,24],{},"The SDK ships in two builds:",[26,27,28,44],"table",{},[29,30,31],"thead",{},[32,33,34,38,41],"tr",{},[35,36,37],"th",{},"Build",[35,39,40],{},"File",[35,42,43],{},"Usage",[45,46,47,69],"tbody",{},[32,48,49,53,59],{},[50,51,52],"td",{},"ES module",[50,54,55],{},[56,57,58],"code",{},"blockbots.esm.js",[50,60,61,64,65,68],{},[56,62,63],{},"import"," inside ",[56,66,67],{},"\u003Cscript type=\"module\">"," or a bundler",[32,70,71,74,79],{},[50,72,73],{},"IIFE",[50,75,76],{},[56,77,78],{},"blockbots.min.js",[50,80,81,82,85,86],{},"classic ",[56,83,84],{},"\u003Cscript>"," tag, exposes the global ",[56,87,88],{},"BlockBots",[90,91,96],"pre",{"className":92,"code":93,"language":94,"meta":95,"style":95},"language-html shiki shiki-themes github-light github-dark","\u003C!-- ES module -->\n\u003Cscript type=\"module\">\n  import { BlockBots } from 'https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fblockbots-org\u002Fblockbots-js@latest\u002Fblockbots.esm.js'\n\u003C\u002Fscript>\n","html","",[56,97,98,107,132,148],{"__ignoreMap":95},[99,100,103],"span",{"class":101,"line":102},"line",1,[99,104,106],{"class":105},"sJ8bj","\u003C!-- ES module -->\n",[99,108,110,114,118,122,125,129],{"class":101,"line":109},2,[99,111,113],{"class":112},"sVt8B","\u003C",[99,115,117],{"class":116},"s9eBZ","script",[99,119,121],{"class":120},"sScJk"," type",[99,123,124],{"class":112},"=",[99,126,128],{"class":127},"sZZnC","\"module\"",[99,130,131],{"class":112},">\n",[99,133,135,139,142,145],{"class":101,"line":134},3,[99,136,138],{"class":137},"szBVR","  import",[99,140,141],{"class":112}," { BlockBots } ",[99,143,144],{"class":137},"from",[99,146,147],{"class":127}," 'https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fblockbots-org\u002Fblockbots-js@latest\u002Fblockbots.esm.js'\n",[99,149,151,154,156],{"class":101,"line":150},4,[99,152,153],{"class":112},"\u003C\u002F",[99,155,117],{"class":116},[99,157,131],{"class":112},[10,159,161],{"id":160},"basic-usage","Basic usage",[90,163,165],{"className":92,"code":164,"language":94,"meta":95,"style":95},"\u003Cscript type=\"module\">\n  import { BlockBots } from 'https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fblockbots-org\u002Fblockbots-js@latest\u002Fblockbots.esm.js'\n\n  const bb = new BlockBots({\n    apiKey: 'YOUR_API_KEY',\n    retries: 1,\n    delay: 1000,\n    ui: true \u002F\u002F built-in loading \u002F blocked overlay\n  })\n\n  bb.onVerified(() => {\n    \u002F\u002F Human verified — allow the user to proceed\n    console.log('Verified as human')\n  })\n\n  bb.onBlocked((reason) => {\n    \u002F\u002F Bot detected or verification failed\n    console.log('Blocked:', reason)\n  })\n\n  await bb.verify()\n\u003C\u002Fscript>\n",[56,166,167,181,191,197,218,230,241,252,264,270,275,293,299,317,322,327,349,355,370,375,380,395],{"__ignoreMap":95},[99,168,169,171,173,175,177,179],{"class":101,"line":102},[99,170,113],{"class":112},[99,172,117],{"class":116},[99,174,121],{"class":120},[99,176,124],{"class":112},[99,178,128],{"class":127},[99,180,131],{"class":112},[99,182,183,185,187,189],{"class":101,"line":109},[99,184,138],{"class":137},[99,186,141],{"class":112},[99,188,144],{"class":137},[99,190,147],{"class":127},[99,192,193],{"class":101,"line":134},[99,194,196],{"emptyLinePlaceholder":195},true,"\n",[99,198,199,202,206,209,212,215],{"class":101,"line":150},[99,200,201],{"class":137},"  const",[99,203,205],{"class":204},"sj4cs"," bb",[99,207,208],{"class":137}," =",[99,210,211],{"class":137}," new",[99,213,214],{"class":120}," BlockBots",[99,216,217],{"class":112},"({\n",[99,219,221,224,227],{"class":101,"line":220},5,[99,222,223],{"class":112},"    apiKey: ",[99,225,226],{"class":127},"'YOUR_API_KEY'",[99,228,229],{"class":112},",\n",[99,231,233,236,239],{"class":101,"line":232},6,[99,234,235],{"class":112},"    retries: ",[99,237,238],{"class":204},"1",[99,240,229],{"class":112},[99,242,244,247,250],{"class":101,"line":243},7,[99,245,246],{"class":112},"    delay: ",[99,248,249],{"class":204},"1000",[99,251,229],{"class":112},[99,253,255,258,261],{"class":101,"line":254},8,[99,256,257],{"class":112},"    ui: ",[99,259,260],{"class":204},"true",[99,262,263],{"class":105}," \u002F\u002F built-in loading \u002F blocked overlay\n",[99,265,267],{"class":101,"line":266},9,[99,268,269],{"class":112},"  })\n",[99,271,273],{"class":101,"line":272},10,[99,274,196],{"emptyLinePlaceholder":195},[99,276,278,281,284,287,290],{"class":101,"line":277},11,[99,279,280],{"class":112},"  bb.",[99,282,283],{"class":120},"onVerified",[99,285,286],{"class":112},"(() ",[99,288,289],{"class":137},"=>",[99,291,292],{"class":112}," {\n",[99,294,296],{"class":101,"line":295},12,[99,297,298],{"class":105},"    \u002F\u002F Human verified — allow the user to proceed\n",[99,300,302,305,308,311,314],{"class":101,"line":301},13,[99,303,304],{"class":112},"    console.",[99,306,307],{"class":120},"log",[99,309,310],{"class":112},"(",[99,312,313],{"class":127},"'Verified as human'",[99,315,316],{"class":112},")\n",[99,318,320],{"class":101,"line":319},14,[99,321,269],{"class":112},[99,323,325],{"class":101,"line":324},15,[99,326,196],{"emptyLinePlaceholder":195},[99,328,330,332,335,338,342,345,347],{"class":101,"line":329},16,[99,331,280],{"class":112},[99,333,334],{"class":120},"onBlocked",[99,336,337],{"class":112},"((",[99,339,341],{"class":340},"s4XuR","reason",[99,343,344],{"class":112},") ",[99,346,289],{"class":137},[99,348,292],{"class":112},[99,350,352],{"class":101,"line":351},17,[99,353,354],{"class":105},"    \u002F\u002F Bot detected or verification failed\n",[99,356,358,360,362,364,367],{"class":101,"line":357},18,[99,359,304],{"class":112},[99,361,307],{"class":120},[99,363,310],{"class":112},[99,365,366],{"class":127},"'Blocked:'",[99,368,369],{"class":112},", reason)\n",[99,371,373],{"class":101,"line":372},19,[99,374,269],{"class":112},[99,376,378],{"class":101,"line":377},20,[99,379,196],{"emptyLinePlaceholder":195},[99,381,383,386,389,392],{"class":101,"line":382},21,[99,384,385],{"class":137},"  await",[99,387,388],{"class":112}," bb.",[99,390,391],{"class":120},"verify",[99,393,394],{"class":112},"()\n",[99,396,398,400,402],{"class":101,"line":397},22,[99,399,153],{"class":112},[99,401,117],{"class":116},[99,403,131],{"class":112},[405,406,407],"blockquote",{},[15,408,409,413,414,421],{},[410,411,412],"strong",{},"Get your API key"," from the dashboard at ",[415,416,420],"a",{"href":417,"rel":418},"https:\u002F\u002Fpanel.blockbots.org",[419],"nofollow","panel.blockbots.org"," under Settings → API Keys.",[10,423,425],{"id":424},"how-it-works","How it works",[427,428,429,436,443,471,474],"ol",{},[430,431,432,435],"li",{},[56,433,434],{},"bb.verify()"," is called — the SDK collects browser signals",[430,437,438,439,442],{},"Signals are sent to the BlockBots API (",[56,440,441],{},"POST \u002Fv1\u002Fjs",")",[430,444,445,446],{},"The API answers with one of three outcomes:\n",[447,448,449,455,461],"ul",{},[430,450,451,454],{},[410,452,453],{},"pass"," — session cookies are returned and stored in the browser",[430,456,457,460],{},[410,458,459],{},"challenge"," — a captcha is shown (typical for VPN \u002F low-confidence IPs); once solved, the signals are re-submitted with the captcha token",[430,462,463,466,467,470],{},[410,464,465],{},"forbidden"," — confirmed bot, the ",[56,468,469],{},"__bb_decision"," cookie is set",[430,472,473],{},"Cookies are validated against the API",[430,475,476,477,479,480,482],{},"Your ",[56,478,283],{}," or ",[56,481,334],{}," callback fires",[10,484,486],{"id":485},"full-example","Full example",[90,488,490],{"className":92,"code":489,"language":94,"meta":95,"style":95},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n\u003Chead>\n  \u003Cmeta charset=\"UTF-8\" \u002F>\n  \u003Ctitle>My Site\u003C\u002Ftitle>\n\u003C\u002Fhead>\n\u003Cbody>\n\n  \u003Cdiv id=\"app\" style=\"display:none;\">\n    \u003C!-- Protected content here -->\n  \u003C\u002Fdiv>\n\n  \u003Cscript type=\"module\">\n    import { BlockBots } from 'https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fblockbots-org\u002Fblockbots-js@main\u002Fblockbots.esm.js'\n\n    const bb = new BlockBots({\n      apiKey: 'YOUR_API_KEY',\n      retries: 3,\n      delay: 1000,\n      ui: true\n    })\n\n    bb.onVerified(() => {\n      document.getElementById('app').style.display = 'block'\n    })\n\n    bb.onBlocked((reason) => {\n      console.log('Blocked:', reason)\n    })\n\n    bb.onError((error) => {\n      console.error('BlockBots error:', error)\n      \u002F\u002F Fail open — show content even if detection fails\n      document.getElementById('app').style.display = 'block'\n    })\n\n    await bb.verify()\n  \u003C\u002Fscript>\n\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[56,491,492,505,521,530,549,563,571,580,584,609,614,623,627,641,653,657,672,681,691,700,708,713,717,731,753,758,763,780,794,799,804,823,838,844,861,866,871,883,892,897,906],{"__ignoreMap":95},[99,493,494,497,500,503],{"class":101,"line":102},[99,495,496],{"class":112},"\u003C!",[99,498,499],{"class":116},"DOCTYPE",[99,501,502],{"class":120}," html",[99,504,131],{"class":112},[99,506,507,509,511,514,516,519],{"class":101,"line":109},[99,508,113],{"class":112},[99,510,94],{"class":116},[99,512,513],{"class":120}," lang",[99,515,124],{"class":112},[99,517,518],{"class":127},"\"en\"",[99,520,131],{"class":112},[99,522,523,525,528],{"class":101,"line":134},[99,524,113],{"class":112},[99,526,527],{"class":116},"head",[99,529,131],{"class":112},[99,531,532,535,538,541,543,546],{"class":101,"line":150},[99,533,534],{"class":112},"  \u003C",[99,536,537],{"class":116},"meta",[99,539,540],{"class":120}," charset",[99,542,124],{"class":112},[99,544,545],{"class":127},"\"UTF-8\"",[99,547,548],{"class":112}," \u002F>\n",[99,550,551,553,556,559,561],{"class":101,"line":220},[99,552,534],{"class":112},[99,554,555],{"class":116},"title",[99,557,558],{"class":112},">My Site\u003C\u002F",[99,560,555],{"class":116},[99,562,131],{"class":112},[99,564,565,567,569],{"class":101,"line":232},[99,566,153],{"class":112},[99,568,527],{"class":116},[99,570,131],{"class":112},[99,572,573,575,578],{"class":101,"line":243},[99,574,113],{"class":112},[99,576,577],{"class":116},"body",[99,579,131],{"class":112},[99,581,582],{"class":101,"line":254},[99,583,196],{"emptyLinePlaceholder":195},[99,585,586,588,591,594,596,599,602,604,607],{"class":101,"line":266},[99,587,534],{"class":112},[99,589,590],{"class":116},"div",[99,592,593],{"class":120}," id",[99,595,124],{"class":112},[99,597,598],{"class":127},"\"app\"",[99,600,601],{"class":120}," style",[99,603,124],{"class":112},[99,605,606],{"class":127},"\"display:none;\"",[99,608,131],{"class":112},[99,610,611],{"class":101,"line":272},[99,612,613],{"class":105},"    \u003C!-- Protected content here -->\n",[99,615,616,619,621],{"class":101,"line":277},[99,617,618],{"class":112},"  \u003C\u002F",[99,620,590],{"class":116},[99,622,131],{"class":112},[99,624,625],{"class":101,"line":295},[99,626,196],{"emptyLinePlaceholder":195},[99,628,629,631,633,635,637,639],{"class":101,"line":301},[99,630,534],{"class":112},[99,632,117],{"class":116},[99,634,121],{"class":120},[99,636,124],{"class":112},[99,638,128],{"class":127},[99,640,131],{"class":112},[99,642,643,646,648,650],{"class":101,"line":319},[99,644,645],{"class":137},"    import",[99,647,141],{"class":112},[99,649,144],{"class":137},[99,651,652],{"class":127}," 'https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fblockbots-org\u002Fblockbots-js@main\u002Fblockbots.esm.js'\n",[99,654,655],{"class":101,"line":324},[99,656,196],{"emptyLinePlaceholder":195},[99,658,659,662,664,666,668,670],{"class":101,"line":329},[99,660,661],{"class":137},"    const",[99,663,205],{"class":204},[99,665,208],{"class":137},[99,667,211],{"class":137},[99,669,214],{"class":120},[99,671,217],{"class":112},[99,673,674,677,679],{"class":101,"line":351},[99,675,676],{"class":112},"      apiKey: ",[99,678,226],{"class":127},[99,680,229],{"class":112},[99,682,683,686,689],{"class":101,"line":357},[99,684,685],{"class":112},"      retries: ",[99,687,688],{"class":204},"3",[99,690,229],{"class":112},[99,692,693,696,698],{"class":101,"line":372},[99,694,695],{"class":112},"      delay: ",[99,697,249],{"class":204},[99,699,229],{"class":112},[99,701,702,705],{"class":101,"line":377},[99,703,704],{"class":112},"      ui: ",[99,706,707],{"class":204},"true\n",[99,709,710],{"class":101,"line":382},[99,711,712],{"class":112},"    })\n",[99,714,715],{"class":101,"line":397},[99,716,196],{"emptyLinePlaceholder":195},[99,718,720,723,725,727,729],{"class":101,"line":719},23,[99,721,722],{"class":112},"    bb.",[99,724,283],{"class":120},[99,726,286],{"class":112},[99,728,289],{"class":137},[99,730,292],{"class":112},[99,732,734,737,740,742,745,748,750],{"class":101,"line":733},24,[99,735,736],{"class":112},"      document.",[99,738,739],{"class":120},"getElementById",[99,741,310],{"class":112},[99,743,744],{"class":127},"'app'",[99,746,747],{"class":112},").style.display ",[99,749,124],{"class":137},[99,751,752],{"class":127}," 'block'\n",[99,754,756],{"class":101,"line":755},25,[99,757,712],{"class":112},[99,759,761],{"class":101,"line":760},26,[99,762,196],{"emptyLinePlaceholder":195},[99,764,766,768,770,772,774,776,778],{"class":101,"line":765},27,[99,767,722],{"class":112},[99,769,334],{"class":120},[99,771,337],{"class":112},[99,773,341],{"class":340},[99,775,344],{"class":112},[99,777,289],{"class":137},[99,779,292],{"class":112},[99,781,783,786,788,790,792],{"class":101,"line":782},28,[99,784,785],{"class":112},"      console.",[99,787,307],{"class":120},[99,789,310],{"class":112},[99,791,366],{"class":127},[99,793,369],{"class":112},[99,795,797],{"class":101,"line":796},29,[99,798,712],{"class":112},[99,800,802],{"class":101,"line":801},30,[99,803,196],{"emptyLinePlaceholder":195},[99,805,807,809,812,814,817,819,821],{"class":101,"line":806},31,[99,808,722],{"class":112},[99,810,811],{"class":120},"onError",[99,813,337],{"class":112},[99,815,816],{"class":340},"error",[99,818,344],{"class":112},[99,820,289],{"class":137},[99,822,292],{"class":112},[99,824,826,828,830,832,835],{"class":101,"line":825},32,[99,827,785],{"class":112},[99,829,816],{"class":120},[99,831,310],{"class":112},[99,833,834],{"class":127},"'BlockBots error:'",[99,836,837],{"class":112},", error)\n",[99,839,841],{"class":101,"line":840},33,[99,842,843],{"class":105},"      \u002F\u002F Fail open — show content even if detection fails\n",[99,845,847,849,851,853,855,857,859],{"class":101,"line":846},34,[99,848,736],{"class":112},[99,850,739],{"class":120},[99,852,310],{"class":112},[99,854,744],{"class":127},[99,856,747],{"class":112},[99,858,124],{"class":137},[99,860,752],{"class":127},[99,862,864],{"class":101,"line":863},35,[99,865,712],{"class":112},[99,867,869],{"class":101,"line":868},36,[99,870,196],{"emptyLinePlaceholder":195},[99,872,874,877,879,881],{"class":101,"line":873},37,[99,875,876],{"class":137},"    await",[99,878,388],{"class":112},[99,880,391],{"class":120},[99,882,394],{"class":112},[99,884,886,888,890],{"class":101,"line":885},38,[99,887,618],{"class":112},[99,889,117],{"class":116},[99,891,131],{"class":112},[99,893,895],{"class":101,"line":894},39,[99,896,196],{"emptyLinePlaceholder":195},[99,898,900,902,904],{"class":101,"line":899},40,[99,901,153],{"class":112},[99,903,577],{"class":116},[99,905,131],{"class":112},[99,907,909,911,913],{"class":101,"line":908},41,[99,910,153],{"class":112},[99,912,94],{"class":116},[99,914,131],{"class":112},[405,916,917],{},[15,918,919,922,923,925,926,929,930,933],{},[56,920,921],{},"verify()"," never throws — errors are routed to ",[56,924,811],{}," and it resolves to ",[56,927,928],{},"false",". The only exception is a missing ",[56,931,932],{},"apiKey",", which throws from the constructor.",[10,935,937],{"id":936},"next-steps","Next steps",[447,939,940],{},[430,941,942,943],{},"All options, methods and events → ",[415,944,946],{"href":945},"\u002Fdocs\u002Fjavascript-reference","SDK Reference",[948,949,950],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":95,"searchDepth":109,"depth":109,"links":952},[953,954,955,956,957,958],{"id":12,"depth":109,"text":13},{"id":20,"depth":109,"text":21},{"id":160,"depth":109,"text":161},{"id":424,"depth":109,"text":425},{"id":485,"depth":109,"text":486},{"id":936,"depth":109,"text":937},"Integrate BlockBots into any website in under 5 minutes using the JavaScript SDK.","md",{},"\u002Fdocs\u002Fjavascript-quickstart","JavaScript SDK",{"title":5,"description":959},"docs\u002Fjavascript-quickstart","ik1SnvzEZGjGATtcxGTWEnog7Yc_yQJ_9p82nepICqk",[968,972,976,977,979,982],{"title":969,"path":970,"order":102,"section":971},"Getting Started","\u002Fdocs\u002Fgetting-started","Introduction",{"title":973,"path":974,"order":134,"section":975},"PHP – Quick Start","\u002Fdocs\u002Fphp-quickstart","PHP Integration",{"title":5,"path":962,"order":220,"section":963},{"title":978,"path":945,"order":232,"section":963},"JavaScript SDK – Reference",{"title":980,"path":981,"order":243,"section":980},"WordPress Plugin","\u002Fdocs\u002Fwordpress-plugin",{"title":983,"path":984,"order":254,"section":980},"WordPress Plugin – Settings Guide","\u002Fdocs\u002Fwordpress-reference",1790770390587]