[{"data":1,"prerenderedAt":881},["ShallowReactive",2],{"blog-article-introducing-blazelock-beta":3},{"id":4,"title":5,"author":6,"body":7,"category":866,"date":867,"description":868,"extension":869,"meta":870,"navigation":169,"path":871,"readingTime":872,"seo":877,"sitemap":878,"stem":879,"__hash__":880},"blog\u002Fblog\u002Fintroducing-blazelock-beta.md","Blazelock Beta Is Now Available","tobias-schnittger",{"type":8,"value":9,"toc":856},"minimark",[10,18,21,24,27,32,35,38,41,57,68,72,80,83,86,97,101,104,110,116,120,123,126,131,134,606,613,617,620,836,839,843,846,849,852],[11,12,13],"p",{},[14,15],"img",{"alt":16,"src":17},"Blazelock beta launch visual","\u002Fassets\u002Fblog\u002F2026\u002Fintroducing-blazelock-beta\u002Fheader.webp",[11,19,20],{},"Today we are opening beta access to Blazelock. Our malware scanning API for applications, file uploads, and secure product workflows.",[11,22,23],{},"Blazelock is built for teams that need to accept files without turning malware scanning into another infrastructure project. Instead of running and maintaining your own scanning layer, you send files to the Blazelock API, receive structured scan results, and keep your upload flow moving with clear security signals.",[11,25,26],{},"The beta is free until our public release, currently planned for Q4 2026. It is also the best time to try Blazelock early and help shape what we build next.",[28,29,31],"h2",{"id":30},"what-blazelock-does","What Blazelock Does",[11,33,34],{},"Modern products accept files everywhere: onboarding forms, support portals, document workflows, internal tools, customer uploads, and automated background jobs. Every one of those entry points can become a security risk if files are stored, processed, or shared before they are checked.",[11,36,37],{},"Blazelock adds malware scanning to those workflows through a simple REST API. You can submit files, retrieve scan results, connect webhooks, and build malware detection into your own systems without operating scan engines yourself.",[11,39,40],{},"Blazelock is designed around a few practical principles:",[42,43,44,48,51,54],"ul",{},[45,46,47],"li",{},"Fast integration through a clear API.",[45,49,50],{},"Flexible scan modes for both background workflows and request-response flows.",[45,52,53],{},"European infrastructure with servers located in Germany.",[45,55,56],{},"Scan engines from market-leading providers that we continuously evaluate for detection quality, false-positive behavior, and performance.",[11,58,59,60,67],{},"You can explore the API, endpoint reference, authentication model, and integration guides in the ",[61,62,66],"a",{"href":63,"rel":64},"https:\u002F\u002Fdocs.blazelock.com",[65],"nofollow","Blazelock documentation",".",[28,69,71],{"id":70},"join-the-blazelock-beta","Join the Blazelock Beta",[11,73,74,75,79],{},"Registration is currently limited to approved beta users. Join the waitlist on ",[61,76,78],{"href":77},"\u002F","blazelock.com",", and we will send your personal invite shortly so you can start using Blazelock and share feedback early.",[11,81,82],{},"During the beta, Blazelock is free to use. You can create your account, generate API keys, and start testing real file scan workflows.",[11,84,85],{},"Beta access means:",[42,87,88,91,94],{},[45,89,90],{},"You can use Blazelock without paying during the beta period.",[45,92,93],{},"Your feedback directly influences the product, documentation, and pricing model.",[45,95,96],{},"You get early access to new dashboard and API improvements as they become available.",[28,98,100],{"id":99},"a-first-look-at-the-dashboard","A First Look at the Dashboard",[11,102,103],{},"The Blazelock Dashboard is the control center for your account. It helps you manage integrations, configure API keys, review scan activity, and keep your setup understandable as your product grows.",[11,105,106],{},[14,107],{"alt":108,"src":109},"Blazelock Dashboard overview with scan activity, recent results, integration health, and key security statistics","\u002Fassets\u002Fblog\u002F2026\u002Fintroducing-blazelock-beta\u002Fdashboard.webp",[11,111,112],{},[14,113],{"alt":114,"src":115},"Blazelock API integration details with API keys","\u002Fassets\u002Fblog\u002F2026\u002Fintroducing-blazelock-beta\u002Fapi-keys.webp",[28,117,119],{"id":118},"using-the-api","Using the API",[11,121,122],{},"Blazelock supports two scan modes. In most production integrations, asynchronous scans are the better default because your application can continue working while the scan runs. For flows that need an immediate result inside the same request-response cycle, synchronous scans are available too.",[11,124,125],{},"Both JavaScript examples use an API key created in the Blazelock Dashboard. Keep API keys server-side and send them as bearer tokens.",[127,128,130],"h3",{"id":129},"asynchronous-scan-example","Asynchronous Scan Example",[11,132,133],{},"Use the asynchronous endpoint when your application can track the result later through webhooks or status polling.",[135,136,141],"pre",{"className":137,"code":138,"language":139,"meta":140,"style":140},"language-js shiki shiki-themes github-light github-light","import { readFile } from 'node:fs\u002Fpromises'\n\n\u002F\u002F Build the multipart upload payload.\nconst form = new FormData()\nconst attributes = { file_name: 'invoice.pdf' }\nform.append('attributes', new Blob([JSON.stringify(attributes)], { type: 'application\u002Fjson' }))\nform.append('file', new Blob([await readFile('.\u002Finvoice.pdf')]))\n\n\u002F\u002F Submit the file for asynchronous scanning.\nconst submitResponse = await fetch('https:\u002F\u002Fapi.blazelock.com\u002Fv1\u002Ffile-scans', {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${process.env.BLAZELOCK_API_KEY}`,\n  },\n  body: form,\n})\n\nlet scan = await submitResponse.json()\n\n\u002F\u002F Poll until Blazelock returns a terminal status.\nwhile (scan.status === 'processing') {\n  await new Promise(resolve => setTimeout(resolve, 2000))\n\n  const statusResponse = await fetch(`https:\u002F\u002Fapi.blazelock.com\u002Fv1\u002Ffile-scans\u002F${scan.id}`, {\n    headers: {\n      Authorization: `Bearer ${process.env.BLAZELOCK_API_KEY}`,\n    },\n  })\n\n  scan = await statusResponse.json()\n}\n\nconsole.log(scan.id, scan.status)\n","js","",[142,143,144,164,171,178,201,220,264,298,303,309,333,345,351,378,384,390,396,401,423,428,434,452,484,489,521,527,549,555,561,566,583,589,594],"code",{"__ignoreMap":140},[145,146,149,153,157,160],"span",{"class":147,"line":148},"line",1,[145,150,152],{"class":151},"sCydW","import",[145,154,156],{"class":155},"sKWpL"," { readFile } ",[145,158,159],{"class":151},"from",[145,161,163],{"class":162},"sOTlB"," 'node:fs\u002Fpromises'\n",[145,165,167],{"class":147,"line":166},2,[145,168,170],{"emptyLinePlaceholder":169},true,"\n",[145,172,174],{"class":147,"line":173},3,[145,175,177],{"class":176},"sJ8bj","\u002F\u002F Build the multipart upload payload.\n",[145,179,181,184,188,191,194,198],{"class":147,"line":180},4,[145,182,183],{"class":151},"const",[145,185,187],{"class":186},"sMN4m"," form",[145,189,190],{"class":151}," =",[145,192,193],{"class":151}," new",[145,195,197],{"class":196},"se37E"," FormData",[145,199,200],{"class":155},"()\n",[145,202,204,206,209,211,214,217],{"class":147,"line":203},5,[145,205,183],{"class":151},[145,207,208],{"class":186}," attributes",[145,210,190],{"class":151},[145,212,213],{"class":155}," { file_name: ",[145,215,216],{"class":162},"'invoice.pdf'",[145,218,219],{"class":155}," }\n",[145,221,223,226,229,232,235,238,241,244,247,250,252,255,258,261],{"class":147,"line":222},6,[145,224,225],{"class":155},"form.",[145,227,228],{"class":196},"append",[145,230,231],{"class":155},"(",[145,233,234],{"class":162},"'attributes'",[145,236,237],{"class":155},", ",[145,239,240],{"class":151},"new",[145,242,243],{"class":196}," Blob",[145,245,246],{"class":155},"([",[145,248,249],{"class":186},"JSON",[145,251,67],{"class":155},[145,253,254],{"class":196},"stringify",[145,256,257],{"class":155},"(attributes)], { type: ",[145,259,260],{"class":162},"'application\u002Fjson'",[145,262,263],{"class":155}," }))\n",[145,265,267,269,271,273,276,278,280,282,284,287,290,292,295],{"class":147,"line":266},7,[145,268,225],{"class":155},[145,270,228],{"class":196},[145,272,231],{"class":155},[145,274,275],{"class":162},"'file'",[145,277,237],{"class":155},[145,279,240],{"class":151},[145,281,243],{"class":196},[145,283,246],{"class":155},[145,285,286],{"class":151},"await",[145,288,289],{"class":196}," readFile",[145,291,231],{"class":155},[145,293,294],{"class":162},"'.\u002Finvoice.pdf'",[145,296,297],{"class":155},")]))\n",[145,299,301],{"class":147,"line":300},8,[145,302,170],{"emptyLinePlaceholder":169},[145,304,306],{"class":147,"line":305},9,[145,307,308],{"class":176},"\u002F\u002F Submit the file for asynchronous scanning.\n",[145,310,312,314,317,319,322,325,327,330],{"class":147,"line":311},10,[145,313,183],{"class":151},[145,315,316],{"class":186}," submitResponse",[145,318,190],{"class":151},[145,320,321],{"class":151}," await",[145,323,324],{"class":196}," fetch",[145,326,231],{"class":155},[145,328,329],{"class":162},"'https:\u002F\u002Fapi.blazelock.com\u002Fv1\u002Ffile-scans'",[145,331,332],{"class":155},", {\n",[145,334,336,339,342],{"class":147,"line":335},11,[145,337,338],{"class":155},"  method: ",[145,340,341],{"class":162},"'POST'",[145,343,344],{"class":155},",\n",[145,346,348],{"class":147,"line":347},12,[145,349,350],{"class":155},"  headers: {\n",[145,352,354,357,360,363,365,368,370,373,376],{"class":147,"line":353},13,[145,355,356],{"class":155},"    Authorization: ",[145,358,359],{"class":162},"`Bearer ${",[145,361,362],{"class":155},"process",[145,364,67],{"class":162},[145,366,367],{"class":155},"env",[145,369,67],{"class":162},[145,371,372],{"class":186},"BLAZELOCK_API_KEY",[145,374,375],{"class":162},"}`",[145,377,344],{"class":155},[145,379,381],{"class":147,"line":380},14,[145,382,383],{"class":155},"  },\n",[145,385,387],{"class":147,"line":386},15,[145,388,389],{"class":155},"  body: form,\n",[145,391,393],{"class":147,"line":392},16,[145,394,395],{"class":155},"})\n",[145,397,399],{"class":147,"line":398},17,[145,400,170],{"emptyLinePlaceholder":169},[145,402,404,407,410,413,415,418,421],{"class":147,"line":403},18,[145,405,406],{"class":151},"let",[145,408,409],{"class":155}," scan ",[145,411,412],{"class":151},"=",[145,414,321],{"class":151},[145,416,417],{"class":155}," submitResponse.",[145,419,420],{"class":196},"json",[145,422,200],{"class":155},[145,424,426],{"class":147,"line":425},19,[145,427,170],{"emptyLinePlaceholder":169},[145,429,431],{"class":147,"line":430},20,[145,432,433],{"class":176},"\u002F\u002F Poll until Blazelock returns a terminal status.\n",[145,435,437,440,443,446,449],{"class":147,"line":436},21,[145,438,439],{"class":151},"while",[145,441,442],{"class":155}," (scan.status ",[145,444,445],{"class":151},"===",[145,447,448],{"class":162}," 'processing'",[145,450,451],{"class":155},") {\n",[145,453,455,458,460,463,465,469,472,475,478,481],{"class":147,"line":454},22,[145,456,457],{"class":151},"  await",[145,459,193],{"class":151},[145,461,462],{"class":186}," Promise",[145,464,231],{"class":155},[145,466,468],{"class":467},"sj_tP","resolve",[145,470,471],{"class":151}," =>",[145,473,474],{"class":196}," setTimeout",[145,476,477],{"class":155},"(resolve, ",[145,479,480],{"class":186},"2000",[145,482,483],{"class":155},"))\n",[145,485,487],{"class":147,"line":486},23,[145,488,170],{"emptyLinePlaceholder":169},[145,490,492,495,498,500,502,504,506,509,512,514,517,519],{"class":147,"line":491},24,[145,493,494],{"class":151},"  const",[145,496,497],{"class":186}," statusResponse",[145,499,190],{"class":151},[145,501,321],{"class":151},[145,503,324],{"class":196},[145,505,231],{"class":155},[145,507,508],{"class":162},"`https:\u002F\u002Fapi.blazelock.com\u002Fv1\u002Ffile-scans\u002F${",[145,510,511],{"class":155},"scan",[145,513,67],{"class":162},[145,515,516],{"class":155},"id",[145,518,375],{"class":162},[145,520,332],{"class":155},[145,522,524],{"class":147,"line":523},25,[145,525,526],{"class":155},"    headers: {\n",[145,528,530,533,535,537,539,541,543,545,547],{"class":147,"line":529},26,[145,531,532],{"class":155},"      Authorization: ",[145,534,359],{"class":162},[145,536,362],{"class":155},[145,538,67],{"class":162},[145,540,367],{"class":155},[145,542,67],{"class":162},[145,544,372],{"class":186},[145,546,375],{"class":162},[145,548,344],{"class":155},[145,550,552],{"class":147,"line":551},27,[145,553,554],{"class":155},"    },\n",[145,556,558],{"class":147,"line":557},28,[145,559,560],{"class":155},"  })\n",[145,562,564],{"class":147,"line":563},29,[145,565,170],{"emptyLinePlaceholder":169},[145,567,569,572,574,576,579,581],{"class":147,"line":568},30,[145,570,571],{"class":155},"  scan ",[145,573,412],{"class":151},[145,575,321],{"class":151},[145,577,578],{"class":155}," statusResponse.",[145,580,420],{"class":196},[145,582,200],{"class":155},[145,584,586],{"class":147,"line":585},31,[145,587,588],{"class":155},"}\n",[145,590,592],{"class":147,"line":591},32,[145,593,170],{"emptyLinePlaceholder":169},[145,595,597,600,603],{"class":147,"line":596},33,[145,598,599],{"class":155},"console.",[145,601,602],{"class":196},"log",[145,604,605],{"class":155},"(scan.id, scan.status)\n",[11,607,608,609,612],{},"The response returns the created scan in ",[142,610,611],{},"processing"," state together with its scan ID. Your application can continue immediately and react when Blazelock sends a webhook event or when your backend checks the scan status.",[127,614,616],{"id":615},"synchronous-scan-example","Synchronous Scan Example",[11,618,619],{},"Use the synchronous endpoint when the caller needs a terminal result during the same request.",[135,621,623],{"className":137,"code":622,"language":139,"meta":140,"style":140},"import { readFile } from 'node:fs\u002Fpromises'\n\n\u002F\u002F Build the multipart upload payload.\nconst form = new FormData()\nconst attributes = { file_name: 'invoice.pdf' }\nform.append('attributes', new Blob([JSON.stringify(attributes)], { type: 'application\u002Fjson' }))\nform.append('file', new Blob([await readFile('.\u002Finvoice.pdf')]))\n\n\u002F\u002F Submit the file and wait for a terminal scan result.\nconst response = await fetch('https:\u002F\u002Fapi.blazelock.com\u002Fv1\u002Ffile-scans\u002Fsync', {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${process.env.BLAZELOCK_API_KEY}`,\n  },\n  body: form,\n})\n\nconst scan = await response.json()\n\nconsole.log(scan.id, scan.status)\n",[142,624,625,635,639,643,657,671,701,729,733,738,758,766,770,790,794,798,802,806,824,828],{"__ignoreMap":140},[145,626,627,629,631,633],{"class":147,"line":148},[145,628,152],{"class":151},[145,630,156],{"class":155},[145,632,159],{"class":151},[145,634,163],{"class":162},[145,636,637],{"class":147,"line":166},[145,638,170],{"emptyLinePlaceholder":169},[145,640,641],{"class":147,"line":173},[145,642,177],{"class":176},[145,644,645,647,649,651,653,655],{"class":147,"line":180},[145,646,183],{"class":151},[145,648,187],{"class":186},[145,650,190],{"class":151},[145,652,193],{"class":151},[145,654,197],{"class":196},[145,656,200],{"class":155},[145,658,659,661,663,665,667,669],{"class":147,"line":203},[145,660,183],{"class":151},[145,662,208],{"class":186},[145,664,190],{"class":151},[145,666,213],{"class":155},[145,668,216],{"class":162},[145,670,219],{"class":155},[145,672,673,675,677,679,681,683,685,687,689,691,693,695,697,699],{"class":147,"line":222},[145,674,225],{"class":155},[145,676,228],{"class":196},[145,678,231],{"class":155},[145,680,234],{"class":162},[145,682,237],{"class":155},[145,684,240],{"class":151},[145,686,243],{"class":196},[145,688,246],{"class":155},[145,690,249],{"class":186},[145,692,67],{"class":155},[145,694,254],{"class":196},[145,696,257],{"class":155},[145,698,260],{"class":162},[145,700,263],{"class":155},[145,702,703,705,707,709,711,713,715,717,719,721,723,725,727],{"class":147,"line":266},[145,704,225],{"class":155},[145,706,228],{"class":196},[145,708,231],{"class":155},[145,710,275],{"class":162},[145,712,237],{"class":155},[145,714,240],{"class":151},[145,716,243],{"class":196},[145,718,246],{"class":155},[145,720,286],{"class":151},[145,722,289],{"class":196},[145,724,231],{"class":155},[145,726,294],{"class":162},[145,728,297],{"class":155},[145,730,731],{"class":147,"line":300},[145,732,170],{"emptyLinePlaceholder":169},[145,734,735],{"class":147,"line":305},[145,736,737],{"class":176},"\u002F\u002F Submit the file and wait for a terminal scan result.\n",[145,739,740,742,745,747,749,751,753,756],{"class":147,"line":311},[145,741,183],{"class":151},[145,743,744],{"class":186}," response",[145,746,190],{"class":151},[145,748,321],{"class":151},[145,750,324],{"class":196},[145,752,231],{"class":155},[145,754,755],{"class":162},"'https:\u002F\u002Fapi.blazelock.com\u002Fv1\u002Ffile-scans\u002Fsync'",[145,757,332],{"class":155},[145,759,760,762,764],{"class":147,"line":335},[145,761,338],{"class":155},[145,763,341],{"class":162},[145,765,344],{"class":155},[145,767,768],{"class":147,"line":347},[145,769,350],{"class":155},[145,771,772,774,776,778,780,782,784,786,788],{"class":147,"line":353},[145,773,356],{"class":155},[145,775,359],{"class":162},[145,777,362],{"class":155},[145,779,67],{"class":162},[145,781,367],{"class":155},[145,783,67],{"class":162},[145,785,372],{"class":186},[145,787,375],{"class":162},[145,789,344],{"class":155},[145,791,792],{"class":147,"line":380},[145,793,383],{"class":155},[145,795,796],{"class":147,"line":386},[145,797,389],{"class":155},[145,799,800],{"class":147,"line":392},[145,801,395],{"class":155},[145,803,804],{"class":147,"line":398},[145,805,170],{"emptyLinePlaceholder":169},[145,807,808,810,813,815,817,820,822],{"class":147,"line":403},[145,809,183],{"class":151},[145,811,812],{"class":186}," scan",[145,814,190],{"class":151},[145,816,321],{"class":151},[145,818,819],{"class":155}," response.",[145,821,420],{"class":196},[145,823,200],{"class":155},[145,825,826],{"class":147,"line":425},[145,827,170],{"emptyLinePlaceholder":169},[145,829,830,832,834],{"class":147,"line":430},[145,831,599],{"class":155},[145,833,602],{"class":196},[145,835,605],{"class":155},[11,837,838],{},"Synchronous scans are useful when the user experience depends on an immediate answer. The endpoint waits for the scan result and returns it in the same request when available.",[28,840,842],{"id":841},"what-comes-next","What Comes Next",[11,844,845],{},"The beta is where we validate Blazelock with real teams and real workflows. Over the coming months, we will keep improving the dashboard, expanding integration guidance, and tuning the product around practical developer feedback.",[11,847,848],{},"Our public release is currently scheduled for Q4 2026. Beta users will receive a special discount at public release as a thank-you for their early trust and feedback.",[11,850,851],{},"If malware scanning is part of your upload flow, product security roadmap, or internal operations work, now is the right time to try Blazelock. Join the beta, connect your first integration, and help us build a faster, cleaner way to keep harmful files out of applications.",[853,854,855],"style",{},"html pre.shiki code .sCydW, html code.shiki .sCydW{--shiki-default:#D73A49;--shiki-dark:#D73A49}html pre.shiki code .sKWpL, html code.shiki .sKWpL{--shiki-default:#24292E;--shiki-dark:#24292E}html pre.shiki code .sOTlB, html code.shiki .sOTlB{--shiki-default:#032F62;--shiki-dark:#032F62}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sMN4m, html code.shiki .sMN4m{--shiki-default:#005CC5;--shiki-dark:#005CC5}html pre.shiki code .se37E, html code.shiki .se37E{--shiki-default:#6F42C1;--shiki-dark:#6F42C1}html pre.shiki code .sj_tP, html code.shiki .sj_tP{--shiki-default:#E36209;--shiki-dark:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":140,"searchDepth":166,"depth":166,"links":857},[858,859,860,861,865],{"id":30,"depth":166,"text":31},{"id":70,"depth":166,"text":71},{"id":99,"depth":166,"text":100},{"id":118,"depth":166,"text":119,"children":862},[863,864],{"id":129,"depth":173,"text":130},{"id":615,"depth":173,"text":616},{"id":841,"depth":166,"text":842},"product-updates","2026-06-01","Announcing the Blazelock beta, a free early-access release of our malware scanning API for secure file uploads and product workflows.","md",{},"\u002Fblog\u002Fintroducing-blazelock-beta",{"text":873,"minutes":874,"time":875,"words":876},"4 min read",3.935,236100,787,{"title":5,"description":868},{"loc":871},"blog\u002Fintroducing-blazelock-beta","eNxxxunlnHQl2SlIqYWtlZdfyeWsoxOkvXRiM_G6Ov8",1780306892541]