ax-check.com
by Gauge
A
Arcjet
arcjet.com
ax-check.com
Checked 21 October 2026
A
100/100
Agents need your login
Arcjet's docs, pricing, and setup are clear and fully machine-readable.
All 23 checklist items passed, covering docs, onboarding, pricing and activation. Pricing is stated openly with no gating or interaction needed.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no arcjet.com account. Recorded 21 October 2026 on Pi.
3 recorded · 1m 20s
1m 20s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user wants to create a simple example using Arcjet, and also wants to know about pricing, as well as whether it can be easily managed. I should check the sandbox — maybe network access is restricted. Let me verify the environment and see if I can access Arcjet's documentation.
First, let me check the current directory and network access.
ls /sandbox/repo && node -v && npm -v
v22.23.2
v22.23.2 10.9.8
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-10-21T13:29:17.718Z",
"name": "bash",
"turn": 1,
"input": {
"command": "ls /sandbox/repo && node -v && npm -v"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a2b159889610cc0c",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-10-21T13:29:17.718Z",
"turn": 1,
"output": {
"content": [
{
"text": "v22.23.2\n10.9.8\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a2b159889610cc0c",
"is_error": false,
"tool_kind": "shell"
}curl -sS -m 15 -o /dev/null -w "%{http_code}\n" https://docs.arcjet.com/ 2>&1 | head -5200
200
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-10-21T13:29:17.718Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 15 -o /dev/null -w \"%{http_code}\\n\" https://docs.arcjet.com/ 2>&1 | head -5"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-af3402d0b64e19c2",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 7,
"ts": "2026-10-21T13:29:18.496Z",
"turn": 1,
"output": {
"content": [
{
"text": "200\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-af3402d0b64e19c2",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Network access is normal, and the repository is empty. Let's quickly check the Arcjet documentation for the quickstart and pricing info.
curl -sS -m 20 https://docs.arcjet.com/quick-start -L | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | head -100
404 | Arcjet Docs {"@context":"https://schema.org","@graph":[{"@type":"ImageObject","@id":"https://arcjet.com/#logo","url":"https://arcjet.com/arcjet-logo-ligh
404 | Arcjet Docs {"@context":"https://schema.org","@graph":[{"@type":"ImageObject","@id":"https://arcjet.com/#logo","url":"https://arcjet.com/arcjet-logo-light-essential.svg","contentUrl":"https://arcjet.com/arcjet-logo-light-essential.svg","width":453,"height":157,"caption":"Arcjet"},{"@type":"Organization","@id":"https://arcjet.com/#organization","name":"Arcjet","legalName":"Arcjet Labs, Inc.","url":"https://arcjet.com","description":"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.","logo":{"@id":"https://arcjet.com/#logo"},"image":{"@id":"https://arcjet.com/#logo"},"email":"support@arcjet.com","contactPoint":{"@type":"ContactPoint","contactType":"customer support","email":"support@arcjet.com"},"address":{"@type":"PostalAddress","addressLocality":"San Francisco","addressRegion":"CA","addressCountry":"US"},"sameAs":["https://github.com/arcjet","https://www.linkedin.com/company/arcjet","https://x.com/arcjet","https://www.youtube.com/@arcjethq","https://www.reddit.com/r/arcjet/","https://www.g2.com/sellers/arcjet","https://www.crunchbase.com/organization/arcjet"],"knowsAbout":["AI agent runtime security","Coding agent security","Prompt injection detection","Agent tool-call authorization","Malicious destination and MCP server detection","Sensitive data protection","Bot and API abuse protection","Application security"]},{"@type":"SoftwareApplication","@id":"https://arcjet.com/#software","name":"Arcjet","url":"https://arcjet.com","description":"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.","applicationCategory":"SecurityApplication","publisher":{"@id":"https://arcjet.com/#organization"},"sameAs":["https://www.g2.com/products/arcjet/reviews"],"featureList":["Coding agent security","Prompt injection detection","Agent tool-call authorization","Destination threat analysis for agent requests","SIEM export","Sensitive data detection and redaction","Bot and API abuse protection","Rate limiting"],"softwareHelp":{"@id":"https://docs.arcjet.com/#website"}},{"@type":"WebSite","@id":"https://docs.arcjet.com/#website","name":"Arcjet Docs","url":"https://docs.arcjet.com","description":"Arcjet documentation for the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened.","publisher":{"@id":"https://arcjet.com/#organization"},"about":{"@id":"https://arcjet.com/#software"},"inLanguage":"en"},{"@type":"WebPage","@id":"https://docs.arcjet.com/404/#webpage","url":"https://docs.arcjet.com/404/","name":"404","isPartOf":{"@id":"https://docs.arcjet.com/#website"},"about":{"@id":"https://arcjet.com/#software"},"publisher":{"@id":"https://arcjet.com/#organization"},"inLanguage":"en"}]}
window.StarlightThemeProvider = (() => {
const storedTheme =
typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
const theme =
storedTheme ||
(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
return {
updatePickers(theme = storedTheme || 'auto') {
document.querySelectorAll('starlight-theme-select').forEach((picker) => {
const select = picker.querySelector('select');
if (select) select.value = theme;
/** @type {HTMLTemplateElement | null} */
const tmpl = document.querySelector(`#theme-icons`);
const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
if (newIcon) {
const oldIcon = picker.querySelector('svg.label-icon');
if (oldIcon) {
oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
}
}
});
},
};
})();
@layer starlight.components{:root{--sl-badge-default-border:var(--sl-color-accent);--sl-badge-default-bg:var(--sl-color-accent-low);--sl-badge-default-text:#fff;--sl-badge-note-border:var(--sl-color-blue);--sl-badge-note-bg:var(--sl-color-blue-low);--sl-badge-note-text:#fff;--sl-badge-danger-border:var(--sl-color-red);--sl-badge-danger-bg:var(--sl-color-red-low);--sl-badge-danger-text:#fff;--sl-badge-success-border:var(--sl-color-green);--sl-badge-success-bg:var(--sl-color-green-low);--sl-badge-success-text:#fff;--sl-badge-caution-border:var(--sl-color-orange);--sl-badge-caution-bg:var(--sl-color-orange-low);--sl-badge-caution-text:#fff;--sl-badge-tip-border:var(--sl-color-purple);--sl-badge-tip-bg:var(--sl-color-purple-low);--sl-badge-tip-text:#fff}[data-theme=light]:root{--sl-badge-default-bg:var(--sl-color-accent-high);--sl-badge-note-bg:var(--sl-color-blue-high);--sl-badge-danger-bg:var(--sl-color-red-high);--sl-badge-success-bg:var(--sl-color-green-high);--sl-badge-caution-bg:var(--sl-color-orange-high);--sl-badge-tip-bg:var(--sl-color-purple-high)}.sl-badge:where(.astro-f4zorn72){border:1px solid var(--sl-color-border-badge);font-family:var(--sl-font-system-mono);color:var(--sl-color-text-badge);background-color:var(--sl-color-bg-badge);overflow-wrap:anywhere;border-radius:.25rem;line-height:normal;display:inline-block}.sidebar-content .sl-badge:where(.astro-f4zorn72){line-height:1;font-size:var(--sl-text-xs);padding:.125rem .375rem}.sidebar-content a[aria-current=page]>.sl-badge:where(.astro-f4zorn72){--sl-color-bg-badge:transparent;--sl-color-border-badge:currentColor;color:inherit}.default:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-default-bg);--sl-color-border-badge:var(--sl-badge-default-border);--sl-color-text-badge:var(--sl-badge-default-text)}.note:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-note-bg);--sl-color-border-badge:var(--sl-badge-note-border);--sl-color-text-badge:var(--sl-badge-note-text)}.danger:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-danger-bg);--sl-color-border-badge:var(--sl-badge-danger-border);--sl-color-text-badge:var(--sl-badge-danger-text)}.success:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-success-bg);--sl-color-border-badge:var(--sl-badge-success-border);--sl-color-text-badge:var(--sl-badge-success-text)}.tip:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-tip-bg);--sl-color-border-badge:var(--sl-badge-tip-border);--sl-color-text-badge:var(--sl-badge-tip-text)}.caution:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-caution-bg);--sl-color-border-badge:var(--sl-badge-caution-border);--sl-color-text-badge:var(--sl-badge-caution-text)}.small:where(.astro-f4zorn72){font-size:var(--sl-text-xs);padding:.125rem .25rem}.medium:where(.astro-f4zorn72){font-size:var(--sl-text-sm);padding:.175rem .35rem}.large:where(.astro-f4zorn72){font-size:var(--sl-text-base);padding:.225rem .45rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) .sl-badge:where(.astro-f4zorn72){vertical-align:middle}}
@layer starlight.components{.card-grid:where(.astro-7qmvx3iy){grid-template-columns:100%;gap:1rem;display:grid}.card-grid:where(.astro-7qmvx3iy)>*{margin-top:0!important}@media (width>=50rem){.card-grid:where(.astro-7qmvx3iy){grid-template-columns:1fr 1fr;gap:1.5rem}.stagger:where(.astro-7qmvx3iy){--stagger-height:5rem;padding-bottom:var(--stagger-height)}.stagger:where(.astro-7qmvx3iy)>:nth-child(2n){transform:translateY(var(--stagger-height))}}}
@layer starlight.components{svg:where(.astro-hkc32dio){color:var(--sl-icon-color);font-size:var(--sl-icon-size,1em);width:1em;height:1em}}
@layer starlight.components{starlight-tabs:where(.astro-scn3uvmv){display:block}.tablist-wrapper:where(.astro-scn3uvmv){overflow-x:auto}:where(.astro-scn3uvmv)[role=tablist]{border-bottom:2px solid var(--sl-color-gray-5);padding:0;list-style:none;display:flex}.tab:where(.astro-scn3uvmv){display:flex}.tab:where(.astro-scn3uvmv)>:where(.astro-scn3uvmv)[role=tab]{--sl-tab-color-border:var(--sl-color-gray-5);line-height:var(--sl-line-height-headings);box-shadow:0 2px 0 var(--sl-tab-color-border);color:var(--sl-color-gray-3);outline-offset:var(--sl-outline-offset-inside);overflow-wrap:initial;align-items:center;gap:.5rem;padding:.275rem 1.25rem;text-decoration:none;display:flex}.tab:where(.astro-scn3uvmv) :where(.astro-scn3uvmv)[role=tab][aria-selected=true]{--sl-tab-color-border:var(--sl-color-text-accent);color:var(--sl-color-white);font-weight:600}.tablist-wrapper:where(.astro-scn3uvmv)~[role=tabpanel]{margin-top:1rem}}
@layer starlight.components{.sl-link-card:where(.astro-zaaezwya){border:1px solid var(--sl-color-gray-5);box-shadow:var(--sl-shadow-sm);border-radius:.5rem;grid-template-columns:1fr auto;gap:.5rem;padding:1rem;display:grid;position:relative}a:where(.astro-zaaezwya){line-height:var(--sl-line-height-headings);text-decoration:none}a:where(.astro-zaaezwya):before{content:"";position:absolute;inset:0}.stack:where(.astro-zaaezwya){flex-direction:column;gap:.5rem}.title:where(.astro-zaaezwya){color:var(--sl-color-white);font-weight:600;font-size:var(--sl-text-lg)}.description:where(.astro-zaaezwya){color:var(--sl-color-gray-3);line-height:1.5}.icon:where(.astro-zaaezwya){color:var(--sl-color-gray-3)}.sl-link-card:where(.astro-zaaezwya):hover{background:var(--sl-color-gray-7,var(--sl-color-gray-6));border-color:var(--sl-color-gray-2)}.sl-link-card:where(.astro-zaaezwya):hover .icon:where(.astro-zaaezwya){color:var(--sl-color-white)}}
:root[data-theme=dark] ._Skeleton_xtugx_1{--unstable_wave-bg:rgba(var(--aj-palette-source-neutralRgb-06) / .3)}:root[data-theme=light] ._Skeleton_xtugx_1{--unstable_wave-bg:rgba(var(--aj-palette-source-neutralRgb-10) / .3)}._Skeleton_xtugx_1{min-height:calc(var(--sp) * 16);border-radius:var(--rad);height:auto;display:block;position:relative;overflow:hidden}._Skeleton_xtugx_1._Level1_xtugx_17{background:var(--aj-palette-block-level1-glare), var(--aj-palette-block-level1-bg)}._Skeleton_xtugx_1._Level1_xtugx_17._Fade_xtugx_20:before{z-index:10;background:var(--aj-palette-block-level1-fadeBg)}._Skeleton_xtugx_1._Level2_xtugx_24{background-color:var(--aj-palette-block-level2-bg)}._Skeleton_xtugx_1._Level3_xtugx_27{background:var(--aj-palette-block-level3-glare), var(--aj-palette-block-level3-bg)}._Skeleton_xtugx_1._Inline_xtugx_30{vertical-align:text-bottom;width:60px;min-height:1em;margin:0;display:inline-block}._Skeleton_xtugx_1:before{content:"";width:100%;height:100%;position:absolute}._Skeleton_xtugx_1:after{content:"";z-index:var(--unstable_pseudo-zIndex);background:linear-gradient(90deg, transparent, var(--unstable_wave-bg,#00000014), transparent);animation:1.6s linear .5s infinite _wave_xtugx_1;position:absolute;inset:0;transform:translate(-100%)}@keyframes _wave_xtugx_1{0%{transform:translate(-100%)}50%{transform:translate(100%)}to{transform:translate(100%)}}
@layer starlight.components{.sl-steps{--bullet-size:calc(var(--sl-line-height) * 1rem);--bullet-margin:.375rem;counter-reset:steps-counter var(--sl-steps-start,0);padding-inline-start:0;list-style:none}.sl-steps>li{counter-increment:steps-counter;padding-inline-start:calc(var(--bullet-size) + 1rem);min-height:calc(var(--bullet-size) + var(--bullet-margin));padding-bottom:1px;position:relative}.sl-steps>li+li{margin-top:0}.sl-steps>li:before{content:counter(steps-counter);top:0;width:var(--bullet-size);height:var(--bullet-size);line-height:var(--bullet-size);font-size:var(--sl-text-xs);text-align:center;color:var(--sl-color-white);background-color:var(--sl-color-gray-6);box-shadow:inset 0 0 0 1px var(--sl-color-gray-5);border-radius:99rem;font-weight:600;position:absolute;inset-inline-start:0}.sl-steps>li:after{--guide-width:1px;content:"";top:calc(var(--bullet-size) + var(--bullet-margin));bottom:var(--bullet-margin);width:var(--guide-width);background-color:var(--sl-color-hairline-light);position:absolute;inset-inline-start:calc((var(--bullet-size) - var(--guide-width)) / 2)}}@layer starlight.content{.sl-steps>li>:first-child{--lh:calc(1em * var(--sl-line-height));--shift-y:calc(.5 * (var(--bullet-size) - var(--lh)));transform:translateY(var(--shift-y));margin-bottom:var(--shift-y)}.sl-steps>li>:first-child:where(h1,h2,h3,h4,h5,h6){--lh:calc(1em * var(--sl-line-height-headings))}@supports (--prop:1lh){.sl-steps>li>:first-child{--lh:1lh}}}
Skip to content try{(()=>{function e(e){if(!e)return;let t=e.getAttribute(`tabindex`)!==null,n=e.scrollWidth>e.clientWidth;n&&!t?e.setAttribute(`tabindex`,`0`):!n&&t&&e.removeAttribute(`tabindex`)}var t=window.requestIdleCallback||(e=>setTimeout(e,1)),n=window.cancelIdleCallback||clearTimeout;function r(e){let r=new Set,i,a;return new ResizeObserver(o=>{o.forEach(e=>r.add(e.target)),i&&clearTimeout(i),a&&n(a),i=setTimeout(()=>{a&&n(a),a=t(()=>{r.forEach(t=>e(t)),r.clear()})},250)})}function i(e,t){e.querySelectorAll?.(`.expressive-code pre > code`).forEach(e=>{let n=e.parentElement;n&&t.observe(n)})}var a=r(e);i(document,a),new MutationObserver(e=>e.forEach(e=>e.addedNodes.forEach(e=>{i(e,a)}))).observe(document.body,{childList:!0,subtree:!0}),document.addEventListener(`astro:page-load`,()=>{i(document,a)})})()}catch(e){console.error(`[EC] tabindex-js-module failed:`,e)}try{(()=>{function e(e){let t=document.createElement(`pre`);Object.assign(t.style,{opacity:`0`,pointerEvents:`none`,position:`absolute`,overflow:`hidden`,left:`0`,top:`0`,width:`20px`,height:`20px`,webkitUserSelect:`auto`,userSelect:`all`}),t.ariaHidden=`true`,t.textContent=e,document.body.appendChild(t);let n=document.createRange();n.selectNode(t);let r=getSelection();if(!r)return!1;r.removeAllRanges(),r.addRange(n);let i=!1;try{i=document.execCommand(`copy`)}finally{r.removeAllRanges(),document.body.removeChild(t)}return i}async function t(t){let n=t.currentTarget,r=n.dataset,i=!1,a=r.code.replace(/\u007f/g,`
`);try{await navigator.clipboard.writeText(a),i=!0}catch{i=e(a)}if(!i||n.parentNode?.querySelector(`.feedback`))return;let o=document.createElement(`div`);o.classList.add(`feedback`),o.append(r.copied),n.before(o),o.offsetWidth,requestAnimationFrame(()=>o?.classList.add(`show`));let s=()=>!o||o.classList.remove(`show`),c=()=>{!o||parseFloat(getComputedStyle(o).opacity)>0||(o.remove(),o=void 0)};setTimeout(s,1500),setTimeout(c,2500),n.addEventListener(`blur`,s),o.addEventListener(`transitioncancel`,c),o.addEventListener(`transitionend`,c)}function n(e){e.querySelectorAll?.(`.expressive-code .copy button`).forEach(e=>e.addEventListener(`click`,t))}n(document),new MutationObserver(e=>e.forEach(e=>e.addedNodes.forEach(e=>{n(e)}))).observe(document.body,{childList:!0,subtree:!0}),document.addEventListener(`astro:page-load`,()=>{n(document)})})()}catch(e){console.error(`[EC] copy-js-module failed:`,e)} Arcjet Docs Search Ctrl K Cancel
(() => {
const openBtn = document.querySelector('button[data-open-modal]');
const shortcut = openBtn?.querySelector('kbd');
if (!openBtn || !(shortcut instanceof HTMLElement)) return;
const platformKey = shortcut.querySelector('kbd');
if (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {
platformKey.textContent = '⌘';
openBtn.setAttribute('aria-keyshortcuts', 'Meta+K');
}
shortcut.style.display = '';
})();
GitHub Twitter YouTube Discord Email astro-island,astro-slot,astro-static-slot{display:contents} (()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})(); (()=>{var g=Object.defineProperty;var w=(a,s,c)=>s in a?g(a,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):a[s]=c;var l=(a,s,c)=>w(a,typeof s!="symbol"?s+"":s,c);var E=new Set(["__proto__","constructor","prototype"]);{let a={0:t=>y(t),1:t=>c(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(c(t)),5:t=>new Set(c(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in a?a[p](e):void 0},c=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let r=this.querySelectorAll("astro-slot"),n={},d=this.querySelectorAll("template[data-astro-template]");for(let o of d){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of r){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let i=this.getAttribute("component-url")||" ",v=this.getAttribute("component-export");throw v&&(i+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${i}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),r.disconnect(),this.childrenConnectedCallback()},r=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});r.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let r=new URL(e,document.baseURI);return r.searchParams.set("astro-retry",Date.now().toString()),r.toString()}async importWithRetry(e){try{return await import(e)}catch(r){return await new Promise(n=>setTimeout(n,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let r=this.getAttribute("component-url"),n=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:r}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${r}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),r=this.getAttribute("client");if(Astro[r]===void 0){window.addEventListener(`astro:${r}`,()=>this.start(),{once:!0});return}try{await Astro[r](async()=>{let n=this.getAttribute("renderer-url");try{let[d,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),n?this.importWithRetry(n):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=d;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=d[h]}return this.hydrator=u,this.hydrate}catch(d){return this.handleHydrationError(d),()=>{}}},e,this)}catch(n){this.handleHydrationError(n)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get(Showing the first 20,000 characters. Full output is available in raw details.
Recorded tool call
{
"type": "tool_call",
"seq": 10,
"ts": "2026-10-21T13:29:19.624Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 https://docs.arcjet.com/quick-start -L | sed 's/<[^>]*>/ /g' | tr -s ' \\n' ' \\n' | head -100"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-95d996c1c2c5fa68",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 14,
"ts": "2026-10-21T13:29:20.925Z",
"turn": 1,
"output": {
"content": [
{
"text": " 404 | Arcjet Docs {\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"ImageObject\",\"@id\":\"https://arcjet.com/#logo\",\"url\":\"https://arcjet.com/arcjet-logo-light-essential.svg\",\"contentUrl\":\"https://arcjet.com/arcjet-logo-light-essential.svg\",\"width\":453,\"height\":157,\"caption\":\"Arcjet\"},{\"@type\":\"Organization\",\"@id\":\"https://arcjet.com/#organization\",\"name\":\"Arcjet\",\"legalName\":\"Arcjet Labs, Inc.\",\"url\":\"https://arcjet.com\",\"description\":\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\",\"logo\":{\"@id\":\"https://arcjet.com/#logo\"},\"image\":{\"@id\":\"https://arcjet.com/#logo\"},\"email\":\"support@arcjet.com\",\"contactPoint\":{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@arcjet.com\"},\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"San Francisco\",\"addressRegion\":\"CA\",\"addressCountry\":\"US\"},\"sameAs\":[\"https://github.com/arcjet\",\"https://www.linkedin.com/company/arcjet\",\"https://x.com/arcjet\",\"https://www.youtube.com/@arcjethq\",\"https://www.reddit.com/r/arcjet/\",\"https://www.g2.com/sellers/arcjet\",\"https://www.crunchbase.com/organization/arcjet\"],\"knowsAbout\":[\"AI agent runtime security\",\"Coding agent security\",\"Prompt injection detection\",\"Agent tool-call authorization\",\"Malicious destination and MCP server detection\",\"Sensitive data protection\",\"Bot and API abuse protection\",\"Application security\"]},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://arcjet.com/#software\",\"name\":\"Arcjet\",\"url\":\"https://arcjet.com\",\"description\":\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\",\"applicationCategory\":\"SecurityApplication\",\"publisher\":{\"@id\":\"https://arcjet.com/#organization\"},\"sameAs\":[\"https://www.g2.com/products/arcjet/reviews\"],\"featureList\":[\"Coding agent security\",\"Prompt injection detection\",\"Agent tool-call authorization\",\"Destination threat analysis for agent requests\",\"SIEM export\",\"Sensitive data detection and redaction\",\"Bot and API abuse protection\",\"Rate limiting\"],\"softwareHelp\":{\"@id\":\"https://docs.arcjet.com/#website\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.arcjet.com/#website\",\"name\":\"Arcjet Docs\",\"url\":\"https://docs.arcjet.com\",\"description\":\"Arcjet documentation for the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened.\",\"publisher\":{\"@id\":\"https://arcjet.com/#organization\"},\"about\":{\"@id\":\"https://arcjet.com/#software\"},\"inLanguage\":\"en\"},{\"@type\":\"WebPage\",\"@id\":\"https://docs.arcjet.com/404/#webpage\",\"url\":\"https://docs.arcjet.com/404/\",\"name\":\"404\",\"isPartOf\":{\"@id\":\"https://docs.arcjet.com/#website\"},\"about\":{\"@id\":\"https://arcjet.com/#software\"},\"publisher\":{\"@id\":\"https://arcjet.com/#organization\"},\"inLanguage\":\"en\"}]} \n\twindow.StarlightThemeProvider = (() => {\n\t\tconst storedTheme =\n\t\t\ttypeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');\n\t\tconst theme =\n\t\t\tstoredTheme ||\n\t\t\t(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');\n\t\tdocument.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';\n\t\treturn {\n\t\t\tupdatePickers(theme = storedTheme || 'auto') {\n\t\t\t\tdocument.querySelectorAll('starlight-theme-select').forEach((picker) => {\n\t\t\t\t\tconst select = picker.querySelector('select');\n\t\t\t\t\tif (select) select.value = theme;\n\t\t\t\t\t/** @type {HTMLTemplateElement | null} */\n\t\t\t\t\tconst tmpl = document.querySelector(`#theme-icons`);\n\t\t\t\t\tconst newIcon = tmpl && tmpl.content.querySelector('.' + theme);\n\t\t\t\t\tif (newIcon) {\n\t\t\t\t\t\tconst oldIcon = picker.querySelector('svg.label-icon');\n\t\t\t\t\t\tif (oldIcon) {\n\t\t\t\t\t\t\toldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\t})();\n @layer starlight.components{:root{--sl-badge-default-border:var(--sl-color-accent);--sl-badge-default-bg:var(--sl-color-accent-low);--sl-badge-default-text:#fff;--sl-badge-note-border:var(--sl-color-blue);--sl-badge-note-bg:var(--sl-color-blue-low);--sl-badge-note-text:#fff;--sl-badge-danger-border:var(--sl-color-red);--sl-badge-danger-bg:var(--sl-color-red-low);--sl-badge-danger-text:#fff;--sl-badge-success-border:var(--sl-color-green);--sl-badge-success-bg:var(--sl-color-green-low);--sl-badge-success-text:#fff;--sl-badge-caution-border:var(--sl-color-orange);--sl-badge-caution-bg:var(--sl-color-orange-low);--sl-badge-caution-text:#fff;--sl-badge-tip-border:var(--sl-color-purple);--sl-badge-tip-bg:var(--sl-color-purple-low);--sl-badge-tip-text:#fff}[data-theme=light]:root{--sl-badge-default-bg:var(--sl-color-accent-high);--sl-badge-note-bg:var(--sl-color-blue-high);--sl-badge-danger-bg:var(--sl-color-red-high);--sl-badge-success-bg:var(--sl-color-green-high);--sl-badge-caution-bg:var(--sl-color-orange-high);--sl-badge-tip-bg:var(--sl-color-purple-high)}.sl-badge:where(.astro-f4zorn72){border:1px solid var(--sl-color-border-badge);font-family:var(--sl-font-system-mono);color:var(--sl-color-text-badge);background-color:var(--sl-color-bg-badge);overflow-wrap:anywhere;border-radius:.25rem;line-height:normal;display:inline-block}.sidebar-content .sl-badge:where(.astro-f4zorn72){line-height:1;font-size:var(--sl-text-xs);padding:.125rem .375rem}.sidebar-content a[aria-current=page]>.sl-badge:where(.astro-f4zorn72){--sl-color-bg-badge:transparent;--sl-color-border-badge:currentColor;color:inherit}.default:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-default-bg);--sl-color-border-badge:var(--sl-badge-default-border);--sl-color-text-badge:var(--sl-badge-default-text)}.note:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-note-bg);--sl-color-border-badge:var(--sl-badge-note-border);--sl-color-text-badge:var(--sl-badge-note-text)}.danger:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-danger-bg);--sl-color-border-badge:var(--sl-badge-danger-border);--sl-color-text-badge:var(--sl-badge-danger-text)}.success:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-success-bg);--sl-color-border-badge:var(--sl-badge-success-border);--sl-color-text-badge:var(--sl-badge-success-text)}.tip:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-tip-bg);--sl-color-border-badge:var(--sl-badge-tip-border);--sl-color-text-badge:var(--sl-badge-tip-text)}.caution:where(.astro-f4zorn72){--sl-color-bg-badge:var(--sl-badge-caution-bg);--sl-color-border-badge:var(--sl-badge-caution-border);--sl-color-text-badge:var(--sl-badge-caution-text)}.small:where(.astro-f4zorn72){font-size:var(--sl-text-xs);padding:.125rem .25rem}.medium:where(.astro-f4zorn72){font-size:var(--sl-text-sm);padding:.175rem .35rem}.large:where(.astro-f4zorn72){font-size:var(--sl-text-base);padding:.225rem .45rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) .sl-badge:where(.astro-f4zorn72){vertical-align:middle}}\n@layer starlight.components{.card-grid:where(.astro-7qmvx3iy){grid-template-columns:100%;gap:1rem;display:grid}.card-grid:where(.astro-7qmvx3iy)>*{margin-top:0!important}@media (width>=50rem){.card-grid:where(.astro-7qmvx3iy){grid-template-columns:1fr 1fr;gap:1.5rem}.stagger:where(.astro-7qmvx3iy){--stagger-height:5rem;padding-bottom:var(--stagger-height)}.stagger:where(.astro-7qmvx3iy)>:nth-child(2n){transform:translateY(var(--stagger-height))}}}\n@layer starlight.components{svg:where(.astro-hkc32dio){color:var(--sl-icon-color);font-size:var(--sl-icon-size,1em);width:1em;height:1em}}\n@layer starlight.components{starlight-tabs:where(.astro-scn3uvmv){display:block}.tablist-wrapper:where(.astro-scn3uvmv){overflow-x:auto}:where(.astro-scn3uvmv)[role=tablist]{border-bottom:2px solid var(--sl-color-gray-5);padding:0;list-style:none;display:flex}.tab:where(.astro-scn3uvmv){display:flex}.tab:where(.astro-scn3uvmv)>:where(.astro-scn3uvmv)[role=tab]{--sl-tab-color-border:var(--sl-color-gray-5);line-height:var(--sl-line-height-headings);box-shadow:0 2px 0 var(--sl-tab-color-border);color:var(--sl-color-gray-3);outline-offset:var(--sl-outline-offset-inside);overflow-wrap:initial;align-items:center;gap:.5rem;padding:.275rem 1.25rem;text-decoration:none;display:flex}.tab:where(.astro-scn3uvmv) :where(.astro-scn3uvmv)[role=tab][aria-selected=true]{--sl-tab-color-border:var(--sl-color-text-accent);color:var(--sl-color-white);font-weight:600}.tablist-wrapper:where(.astro-scn3uvmv)~[role=tabpanel]{margin-top:1rem}}\n@layer starlight.components{.sl-link-card:where(.astro-zaaezwya){border:1px solid var(--sl-color-gray-5);box-shadow:var(--sl-shadow-sm);border-radius:.5rem;grid-template-columns:1fr auto;gap:.5rem;padding:1rem;display:grid;position:relative}a:where(.astro-zaaezwya){line-height:var(--sl-line-height-headings);text-decoration:none}a:where(.astro-zaaezwya):before{content:\"\";position:absolute;inset:0}.stack:where(.astro-zaaezwya){flex-direction:column;gap:.5rem}.title:where(.astro-zaaezwya){color:var(--sl-color-white);font-weight:600;font-size:var(--sl-text-lg)}.description:where(.astro-zaaezwya){color:var(--sl-color-gray-3);line-height:1.5}.icon:where(.astro-zaaezwya){color:var(--sl-color-gray-3)}.sl-link-card:where(.astro-zaaezwya):hover{background:var(--sl-color-gray-7,var(--sl-color-gray-6));border-color:var(--sl-color-gray-2)}.sl-link-card:where(.astro-zaaezwya):hover .icon:where(.astro-zaaezwya){color:var(--sl-color-white)}}\n :root[data-theme=dark] ._Skeleton_xtugx_1{--unstable_wave-bg:rgba(var(--aj-palette-source-neutralRgb-06) / .3)}:root[data-theme=light] ._Skeleton_xtugx_1{--unstable_wave-bg:rgba(var(--aj-palette-source-neutralRgb-10) / .3)}._Skeleton_xtugx_1{min-height:calc(var(--sp) * 16);border-radius:var(--rad);height:auto;display:block;position:relative;overflow:hidden}._Skeleton_xtugx_1._Level1_xtugx_17{background:var(--aj-palette-block-level1-glare), var(--aj-palette-block-level1-bg)}._Skeleton_xtugx_1._Level1_xtugx_17._Fade_xtugx_20:before{z-index:10;background:var(--aj-palette-block-level1-fadeBg)}._Skeleton_xtugx_1._Level2_xtugx_24{background-color:var(--aj-palette-block-level2-bg)}._Skeleton_xtugx_1._Level3_xtugx_27{background:var(--aj-palette-block-level3-glare), var(--aj-palette-block-level3-bg)}._Skeleton_xtugx_1._Inline_xtugx_30{vertical-align:text-bottom;width:60px;min-height:1em;margin:0;display:inline-block}._Skeleton_xtugx_1:before{content:\"\";width:100%;height:100%;position:absolute}._Skeleton_xtugx_1:after{content:\"\";z-index:var(--unstable_pseudo-zIndex);background:linear-gradient(90deg, transparent, var(--unstable_wave-bg,#00000014), transparent);animation:1.6s linear .5s infinite _wave_xtugx_1;position:absolute;inset:0;transform:translate(-100%)}@keyframes _wave_xtugx_1{0%{transform:translate(-100%)}50%{transform:translate(100%)}to{transform:translate(100%)}}\n@layer starlight.components{.sl-steps{--bullet-size:calc(var(--sl-line-height) * 1rem);--bullet-margin:.375rem;counter-reset:steps-counter var(--sl-steps-start,0);padding-inline-start:0;list-style:none}.sl-steps>li{counter-increment:steps-counter;padding-inline-start:calc(var(--bullet-size) + 1rem);min-height:calc(var(--bullet-size) + var(--bullet-margin));padding-bottom:1px;position:relative}.sl-steps>li+li{margin-top:0}.sl-steps>li:before{content:counter(steps-counter);top:0;width:var(--bullet-size);height:var(--bullet-size);line-height:var(--bullet-size);font-size:var(--sl-text-xs);text-align:center;color:var(--sl-color-white);background-color:var(--sl-color-gray-6);box-shadow:inset 0 0 0 1px var(--sl-color-gray-5);border-radius:99rem;font-weight:600;position:absolute;inset-inline-start:0}.sl-steps>li:after{--guide-width:1px;content:\"\";top:calc(var(--bullet-size) + var(--bullet-margin));bottom:var(--bullet-margin);width:var(--guide-width);background-color:var(--sl-color-hairline-light);position:absolute;inset-inline-start:calc((var(--bullet-size) - var(--guide-width)) / 2)}}@layer starlight.content{.sl-steps>li>:first-child{--lh:calc(1em * var(--sl-line-height));--shift-y:calc(.5 * (var(--bullet-size) - var(--lh)));transform:translateY(var(--shift-y));margin-bottom:var(--shift-y)}.sl-steps>li>:first-child:where(h1,h2,h3,h4,h5,h6){--lh:calc(1em * var(--sl-line-height-headings))}@supports (--prop:1lh){.sl-steps>li>:first-child{--lh:1lh}}}\n Skip to content try{(()=>{function e(e){if(!e)return;let t=e.getAttribute(`tabindex`)!==null,n=e.scrollWidth>e.clientWidth;n&&!t?e.setAttribute(`tabindex`,`0`):!n&&t&&e.removeAttribute(`tabindex`)}var t=window.requestIdleCallback||(e=>setTimeout(e,1)),n=window.cancelIdleCallback||clearTimeout;function r(e){let r=new Set,i,a;return new ResizeObserver(o=>{o.forEach(e=>r.add(e.target)),i&&clearTimeout(i),a&&n(a),i=setTimeout(()=>{a&&n(a),a=t(()=>{r.forEach(t=>e(t)),r.clear()})},250)})}function i(e,t){e.querySelectorAll?.(`.expressive-code pre > code`).forEach(e=>{let n=e.parentElement;n&&t.observe(n)})}var a=r(e);i(document,a),new MutationObserver(e=>e.forEach(e=>e.addedNodes.forEach(e=>{i(e,a)}))).observe(document.body,{childList:!0,subtree:!0}),document.addEventListener(`astro:page-load`,()=>{i(document,a)})})()}catch(e){console.error(`[EC] tabindex-js-module failed:`,e)}try{(()=>{function e(e){let t=document.createElement(`pre`);Object.assign(t.style,{opacity:`0`,pointerEvents:`none`,position:`absolute`,overflow:`hidden`,left:`0`,top:`0`,width:`20px`,height:`20px`,webkitUserSelect:`auto`,userSelect:`all`}),t.ariaHidden=`true`,t.textContent=e,document.body.appendChild(t);let n=document.createRange();n.selectNode(t);let r=getSelection();if(!r)return!1;r.removeAllRanges(),r.addRange(n);let i=!1;try{i=document.execCommand(`copy`)}finally{r.removeAllRanges(),document.body.removeChild(t)}return i}async function t(t){let n=t.currentTarget,r=n.dataset,i=!1,a=r.code.replace(/\\u007f/g,`\n`);try{await navigator.clipboard.writeText(a),i=!0}catch{i=e(a)}if(!i||n.parentNode?.querySelector(`.feedback`))return;let o=document.createElement(`div`);o.classList.add(`feedback`),o.append(r.copied),n.before(o),o.offsetWidth,requestAnimationFrame(()=>o?.classList.add(`show`));let s=()=>!o||o.classList.remove(`show`),c=()=>{!o||parseFloat(getComputedStyle(o).opacity)>0||(o.remove(),o=void 0)};setTimeout(s,1500),setTimeout(c,2500),n.addEventListener(`blur`,s),o.addEventListener(`transitioncancel`,c),o.addEventListener(`transitionend`,c)}function n(e){e.querySelectorAll?.(`.expressive-code .copy button`).forEach(e=>e.addEventListener(`click`,t))}n(document),new MutationObserver(e=>e.forEach(e=>e.addedNodes.forEach(e=>{n(e)}))).observe(document.body,{childList:!0,subtree:!0}),document.addEventListener(`astro:page-load`,()=>{n(document)})})()}catch(e){console.error(`[EC] copy-js-module failed:`,e)} Arcjet Docs Search Ctrl K Cancel \n\t(() => {\n\t\tconst openBtn = document.querySelector('button[data-open-modal]');\n\t\tconst shortcut = openBtn?.querySelector('kbd');\n\t\tif (!openBtn || !(shortcut instanceof HTMLElement)) return;\n\t\tconst platformKey = shortcut.querySelector('kbd');\n\t\tif (platformKey && /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)) {\n\t\t\tplatformKey.textContent = '⌘';\n\t\t\topenBtn.setAttribute('aria-keyshortcuts', 'Meta+K');\n\t\t}\n\t\tshortcut.style.display = '';\n\t})();\n GitHub Twitter YouTube Discord Email astro-island,astro-slot,astro-static-slot{display:contents} (()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})(); (()=>{var g=Object.defineProperty;var w=(a,s,c)=>s in a?g(a,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):a[s]=c;var l=(a,s,c)=>w(a,typeof s!=\"symbol\"?s+\"\":s,c);var E=new Set([\"__proto__\",\"constructor\",\"prototype\"]);{let a={0:t=>y(t),1:t=>c(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(c(t)),5:t=>new Set(c(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in a?a[p](e):void 0},c=t=>t.map(s),y=t=>typeof t!=\"object\"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,\"Component\");l(this,\"hydrator\");l(this,\"hydrate\",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest(\"astro-island[ssr]\");if(e){e.addEventListener(\"astro:hydrate\",this.hydrate,{once:!0});return}let r=this.querySelectorAll(\"astro-slot\"),n={},d=this.querySelectorAll(\"template[data-astro-template]\");for(let o of d){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute(\"data-astro-template\")||\"default\"]=o.innerHTML,o.remove())}for(let o of r){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute(\"name\")||\"default\"]=o.innerHTML)}let u;try{u=this.hasAttribute(\"props\")?y(JSON.parse(this.getAttribute(\"props\"))):{}}catch(o){let i=this.getAttribute(\"component-url\")||\" \",v=this.getAttribute(\"component-export\");throw v&&(i+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${i}`,this.getAttribute(\"props\"),o),o}let h;await this.hydrator(this)(this.Component,u,n,{client:this.getAttribute(\"client\")}),this.removeAttribute(\"ssr\"),this.dispatchEvent(new CustomEvent(\"astro:hydrate\"))});l(this,\"unmount\",()=>{this.isConnected||this.dispatchEvent(new CustomEvent(\"astro:unmount\"))})}disconnectedCallback(){document.removeEventListener(\"astro:after-swap\",this.unmount),document.addEventListener(\"astro:after-swap\",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute(\"await-children\")||document.readyState===\"interactive\"||document.readyState===\"complete\")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener(\"DOMContentLoaded\",e),r.disconnect(),this.childrenConnectedCallback()},r=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue===\"astro:end\"&&(this.lastChild.remove(),e())});r.observe(this,{childList:!0}),document.addEventListener(\"DOMContentLoaded\",e)}}async childrenConnectedCallback(){let e=this.getAttribute(\"before-hydration-url\");e&&await import(e),this.start()}getRetryImportUrl(e){let r=new URL(e,document.baseURI);return r.searchParams.set(\"astro-retry\",Date.now().toString()),r.toString()}async importWithRetry(e){try{return await import(e)}catch(r){return await new Promise(n=>setTimeout(n,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let r=this.getAttribute(\"component-url\"),n=new CustomEvent(\"astro:hydration-error\",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:r}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${r}`,e)}async start(){let e=JSON.parse(this.getAttribute(\"opts\")),r=this.getAttribute(\"client\");if(Astro[r]===void 0){window.addEventListener(`astro:${r}`,()=>this.start(),{once:!0});return}try{await Astro[r](async()=>{let n=this.getAttribute(\"renderer-url\");try{let[d,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute(\"component-url\")),n?this.importWithRetry(n):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute(\"component-export\")||\"default\";if(h.includes(\".\")){this.Component=d;for(let m of h.split(\".\")){if(E.has(m)||!this.Component||typeof this.Component!=\"object\"&&typeof this.Component!=\"function\"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=d[h]}return this.hydrator=u,this.hydrate}catch(d){return this.handleHydrationError(d),()=>{}}},e,this)}catch(n){this.handleHydrationError(n)}}attributeChangedCallback(){this.hydrate()}}l(f,\"observedAttributes\",[\"props\"]),customElements.get(\"astro-island\")||customElements.define(\"astro-island\",f)}})(); Dark Light Auto \n\tStarlightThemeProvider.updatePickers();\n var e=`starlight-theme`,t=e=>e===`auto`||e===`dark`||e===`light`?e:`auto`,n=()=>t(typeof localStorage matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;function a(e){window.StarlightThemeProvider.updatePickers(e),document.documentElement.dataset.theme=e===`auto`?i():e,r(e)}matchMedia(`(prefers-color-scheme: light)`).addEventListener(`change`,()=>{n()===`auto`&&a(`auto`)});var o=class extends HTMLElement{constructor(){super(),a(n()),this.querySelector(`#aj-theme-switcher`)?.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&a(t(e.currentTarget.value))})}};customElements.define(`starlight-theme-select`,o); var e=class extends HTMLElement{constructor(){super();let e=this.querySelector(`select`);e&&(e.addEventListener(`change`,e=>{e.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=e.currentTarget.value)}),window.addEventListener(`pageshow`,t=>{if(!t.persisted)return;let n=e.querySelector(`option[selected]`)?.index;n!==e.selectedIndex&&(e.selectedIndex=n??0)}))}};customElements.define(`starlight-lang-select`,e); var e=document.getElementById(`starlight__sidebar`),t=e?.querySelector(`sl-sidebar-state-persist`),n=`sl-sidebar-state`,r=()=>{let r=[],i=t?.dataset.hash||``;try{let e=sessionStorage.getItem(n),t=JSON.parse(e||`{}`);Array.isArray(t.open)&&t.hash===i&&(r=t.open)}catch{}return{hash:i,open:r,scroll:e?.scrollTop||0}},i=e=>{try{sessionStorage.setItem(n,JSON.stringify(e))}catch{}},a=()=>i(r()),o=(e,t)=>{let n=r();n.open[t]=e,i(n)};t?.addEventListener(`click`,e=>{if(!(e.target instanceof Element))return;let t=e.target.closest(`summary`)?.closest(`details`);if(!t)return;let n=t.querySelector(`sl-sidebar-restore`),r=parseInt(n?.dataset.index||``);isNaN(r)||o(!t.open,r)}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&a()}); 404 Page not found. Check the URL or try using the search bar. ",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-95d996c1c2c5fa68",
"is_error": false,
"tool_kind": "shell"
}curl -sS -m 20 https://arcjet.com/pricing -L | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | grep -iE "free|\\$|plan|month|request" | head -60
);--aj-palette-block-level2Event-challenge-blurBorder:rgba(var(--aj-palette-source-tint-01Rgb-05) / 0.3);--aj-palette-glowChannel:130 124 140;--aj-palette-dang
);--aj-palette-block-level2Event-challenge-blurBorder:rgba(var(--aj-palette-source-tint-01Rgb-05) / 0.3);--aj-palette-glowChannel:130 124 140;--aj-palette-dangerGlowChannel:191 58 50;--aj-shadowRing:0 0 #000;--aj-shadowChannel:21 21 21;--aj-shadowOpacity:0.12;} html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:var(--aj-fontWeight-lg);}body{margin:0;color:var(--aj-palette-text-secondary, var(--aj-palette-neutral-700, #32383E));font-family:var(--aj-fontFamily-body, "Inter", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"));font-size:var(--aj-fontSize-md, 1rem);line-height:var(--aj-lineHeight-md, 1.5);background-color:var(--aj-palette-background-body);}@media print{body{background-color:var(--aj-palette-common-white);}}body::backdrop{background-color:var(--aj-palette-background-backdrop);}[data-joy-color-scheme="light"]{-webkit-print-color-scheme:light;color-scheme:light;}[data-joy-color-scheme="dark"]{-webkit-print-color-scheme:dark;color-scheme:dark;} Product Building blocks Shield WAF Bot protection Rate limiting Signup form protection Email validation Sensitive information Prompt injection New Content moderation New Filters For agents Arcjet Guards Arcjet Plugin Arcjet Skills MCP Server CLI Protections Abuse protection Budget control Data loss prevention Prompt injection detection Integrations SDKs Astro Deno Express Fastify Next.js NestJS React Router Nuxt Bun SvelteKit Hono Flask Node.js FastAPI Remix AI Agent Frameworks Claude Agent SDK Claude Managed Agents Cloudflare Think CrewAI Genkit Google ADK LangChain LangGraph Mastra Microsoft Agent Framework OpenAI Agents Strands Agents TanStack AI Vercel AI SDK Vercel Eve Resources About Learning center Comparisons MCP Server CLI Support Trust Terms Pricing Docs Blog Sign in Sign up {"@context":"https://schema.org","@graph":[{"@type":"ImageObject","@id":"https://arcjet.com/#logo","url":"https://arcjet.com/arcjet-logo-light-essential.svg","contentUrl":"https://arcjet.com/arcjet-logo-light-essential.svg","width":453,"height":157,"caption":"Arcjet"},{"@type":"Organization","@id":"https://arcjet.com/#organization","name":"Arcjet","legalName":"Arcjet Labs, Inc.","url":"https://arcjet.com","description":"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.","logo":{"@id":"https://arcjet.com/#logo"},"image":{"@id":"https://arcjet.com/#logo"},"email":"support@arcjet.com","contactPoint":{"@type":"ContactPoint","contactType":"customer support","email":"support@arcjet.com"},"address":{"@type":"PostalAddress","addressLocality":"San Francisco","addressRegion":"CA","addressCountry":"US"},"sameAs":["https://github.com/arcjet","https://www.linkedin.com/company/arcjet","https://x.com/arcjet","https://www.youtube.com/@arcjethq","https://www.reddit.com/r/arcjet/","https://www.g2.com/sellers/arcjet","https://www.crunchbase.com/organization/arcjet"],"knowsAbout":["AI agent runtime security","Coding agent security","Prompt injection detection","Agent tool-call authorization","Malicious destination and MCP server detection","Sensitive data protection","Bot and API abuse protection","Application security"]},{"@type":"WebSite","@id":"https://arcjet.com/#website","name":"Arcjet","url":"https://arcjet.com","description":"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.","publisher":{"@id":"https://arcjet.com/#organization"}},{"@type":"SoftwareApplication","@id":"https://arcjet.com/#software","name":"Arcjet","url":"https://arcjet.com","description":"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.","applicationCategory":"SecurityApplication","publisher":{"@id":"https://arcjet.com/#organization"},"sameAs":["https://www.g2.com/products/arcjet/reviews"],"featureList":["Coding agent security","Prompt injection detection","Agent tool-call authorization","Destination threat analysis for agent requests","SIEM export","Sensitive data detection and redaction","Bot and API abuse protection","Rate limiting"]}]} {"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://arcjet.com/pricing#webpage","url":"https://arcjet.com/pricing","name":"AI agent runtime security pricing | Arcjet","description":"Arcjet pricing for AI runtime security: Individual at $25/mo, Startup at $299/mo, and Enterprise with custom pricing for mission critical apps. Usage fees apply. 15-day free trial.","isPartOf":{"@id":"https://arcjet.com/#website"},"about":{"@id":"https://arcjet.com/#software"},"mainEntity":{"@id":"https://arcjet.com/#software"},"breadcrumb":{"@id":"https://arcjet.com/pricing#breadcrumb"}},{"@type":"SoftwareApplication","@id":"https://arcjet.com/#software","name":"Arcjet","url":"https://arcjet.com","description":"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.","applicationCategory":"SecurityApplication","publisher":{"@id":"https://arcjet.com/#organization"},"sameAs":["https://www.g2.com/products/arcjet/reviews"],"featureList":["Coding agent security","Prompt injection detection","Agent tool-call authorization","Destination threat analysis for agent requests","SIEM export","Sensitive data detection and redaction","Bot and API abuse protection","Rate limiting"],"offers":[{"@type":"Offer","name":"Individual","url":"https://arcjet.com/pricing","price":"25","priceCurrency":"USD","description":"Individual base price per application per month, plus usage fees.","priceSpecification":{"@type":"UnitPriceSpecification","price":25,"priceCurrency":"USD","billingDuration":"P1M","referenceQuantity":{"@type":"QuantitativeValue","value":1,"unitText":"application"}}},{"@type":"Offer","name":"Startup","url":"https://arcjet.com/pricing","price":"299","priceCurrency":"USD","description":"Startup base price per application per month, plus usage fees.","priceSpecification":{"@type":"UnitPriceSpecification","price":299,"priceCurrency":"USD","billingDuration":"P1M","referenceQuantity":{"@type":"QuantitativeValue","value":1,"unitText":"application"}}}]},{"@type":"BreadcrumbList","@id":"https://arcjet.com/pricing#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://arcjet.com"},{"@type":"ListItem","position":2,"name":"Pricing","item":"https://arcjet.com/pricing"}]},{"@type":"FAQPage","@id":"https://arcjet.com/pricing#faq","isPartOf":{"@id":"https://arcjet.com/#website"},"mainEntity":[{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-1","name":"Can I book a demo?","acceptedAnswer":{"@type":"Answer","text":"Of course! Book a demo with our team."}},{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-2","name":"How does usage-based pricing work?","acceptedAnswer":{"@type":"Answer","text":"Any protect() SDK call counts as a web request, billed at $5 per million. Rate limit, filter, and Shield WAF rules are included in that single request. Protecting coding agents and custom agents counts as an agent request, billed at $50 per million."}},{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-3","name":"Are there any request limits?","acceptedAnswer":{"@type":"Answer","text":"There are no hard request limits on paid accounts (the trial has usage limits). All protections are billed based on actual usage at the per-unit rates shown in the usage fees table. You only pay for what you use and you can set budget thresholds to avoid surprises. Billing guarantees are available to insure against volumetric attacks - your app will never go down because you hit a limit."}},{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-4","name":"Is there a free plan?","acceptedAnswer":{"@type":"Answer","text":"Yes. When the 15 day trial ends, your account continues on a free plan limited to 10,000 requests per month. The limit is a hard stop rather than metered overage, so you are never billed for going over it. Set up billing and choose a plan to lift the cap."}},{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-5","name":"Do you support open source projects?","acceptedAnswer":{"@type":"Answer","text":"Yes. Many open source projects use Arcjet on the Individual plan. The Individual plan works well for non-commercial, community-maintained open source projects and includes access to all protections with discounted or free pricing. Reach out to us to discuss how Arcjet can help."}},{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-6","name":"What payment methods do you accept?","acceptedAnswer":{"@type":"Answer","text":"We accept all major credit and debit cards on all plans. Enterprise plans can optionally be purchased through an annual contract and paid by ACH/Wire."}},{"@type":"Question","@id":"https://arcjet.com/pricing#faq-question-7","name":"Who is behind Arcjet?","acceptedAnswer":{"@type":"Answer","text":"Arcjet Labs, Inc. is headquartered in San Francisco and also has an office in New York. We raised a seed round in 2023 and Series A in 2025. We're backed by Andreessen Horowitz, Plural, Seedcamp, and 20+ angel investors. Our CEO, David Mytton, writes the console.dev devtools newsletter."}}]}]} .css-5am9f0{--Icon-fontSize:calc(1em * undefined);--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-size:var(--Typography-fontSize, inherit);color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;--variant-borderWidth:0px;background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));font-weight:var(--aj-fontWeight-md);} Arcjet pricing .css-10hjjl9{--Icon-fontSize:calc(1em * undefined);--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-size:var(--Typography-fontSize, inherit);color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Put the decision where the action is. .css-y3knef{--padT:calc(var(--sp) * 3);--padR:calc(var(--sp) * 3);--padB:calc(var(--sp) * 3);--padL:calc(var(--sp) * 3);--rad:calc(var(--sp) * 2);} .css-ph7x90{--Icon-fontSize:calc(1em * var(--aj-lineHeight-xs, 1.33334));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-display, "Inter", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"));font-weight:var(--aj-fontWeight-xl, 700);font-size:var(--Typography-fontSize, var(--aj-fontSize-xl4, 2.25rem));line-height:var(--aj-lineHeight-xs, 1.33334);letter-spacing:-0.025em;color:var(--variant-plainColor, rgba(var(--aj-palette-primary-mainChannel) / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Individual .css-h8n4os{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, "Inter", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"));font-size:var(--Typography-fontSize, var(--aj-fontSize-lg, 1.125rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Get started. $ 25 / mo Start a 15 day trial 1 team member .css-1oq6rh{--Divider-thickness:1px;--Divider-lineColor:var(--aj-palette-divider);--_Divider-inset:var(--Divider-inset, 0px);margin:initial;margin-inline:var(--_Divider-inset);margin-block:initial;position:relative;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border:none;list-style:none;background-color:var(--Divider-lineColor);inline-size:initial;block-size:var(--Divider-thickness);--Divider-inset:calc(-1 * var(--List-padding));margin-block-start:calc(var(--List-gap) + var(--ListDivider-gap));margin-block-end:var(--ListDivider-gap);} 1 hour log retention Email support .css-yt03wz{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, "Inter", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"));font-size:var(--Typography-fontSize, var(--aj-fontSize-sm, 0.875rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;--variant-borderWidth:0px;background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));font-weight:var(--aj-fontWeight-md);} .css-1bqup1q{--Icon-fontSize:1.25em;--Icon-color:currentColor;--CircularProgress-size:1.25em;--CircularProgress-thickness:3px;font:inherit;-webkit-text-decoration:none;text-decoration:none;text-decoration-thickness:max(0.08em, 1px);text-underline-offset:0.15em;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:var(--aj-radius-xs);padding:0;cursor:pointer;text-decoration-color:var(--variant-outlinedBorder, rgba(var(--aj-palette-primary-mainChannel) / var(--Link-underlineOpacity, 0.72)));padding-block:min(0.1em, 4px);padding-inline:0.25em;-moz-appearance:none;-webkit-appearance:none;position:relative;--variant-borderWidth:0px;color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));}@media (hover: hover){.css-1bqup1q:hover{text-decoration-line:underline;}}.css-1bqup1q::-moz-focus-inner{border-style:none;}.css-1bqup1q.Mui-focusVisible,.css-1bqup1q:focus-visible{outline-offset:var(--focus-outline-offset, var(--aj-focus-thickness, 2px));outline:var(--aj-focus-thickness, 2px) solid var(--aj-palette-focusVisible, #0B6BCB);}@media (hover: hover){.css-1bqup1q:hover{background-color:var(--variant-solidHoverBg, var(--aj-palette-primary-solidHoverBg, var(--aj-palette-primary-600, #185EA5)));}}.css-1bqup1q:active{background-color:var(--variant-solidActiveBg, var(--aj-palette-primary-solidActiveBg, var(--aj-palette-primary-700, #12467B)));}.css-1bqup1q.Mui-disabled{pointer-events:none;cursor:default;--Icon-color:currentColor;color:var(--variant-solidDisabledColor, var(--aj-palette-primary-solidDisabledColor, var(--aj-palette-neutral-400, #9FA6AD)));background-color:var(--variant-solidDisabledBg, var(--aj-palette-primary-solidDisabledBg, var(--aj-palette-neutral-100, #F0F4F8)));} See usage fees .css-61owou{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-margin-start:clamp(4px, var(--Link-gap, 0.25em), 0.5rem);margin-inline-start:clamp(4px, var(--Link-gap, 0.25em), 0.5rem);} .css-bb2jb1{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:var(--Icon-margin);width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-size:var(--Icon-fontSize, var(--aj-fontSize-xl2));color:var(--Icon-color, var(--aj-palette-text-icon));} Startup For growing teams. $ 299 / mo Start a 15 day trial 2 team members 24 hour log retention Email + Slack support See usage fees Enterprise For teams at scale. .css-17n55b3{--Icon-fontSize:calc(1em * var(--aj-lineHeight-xs, 1.33334));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-display, "Inter", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"));font-weight:var(--aj-fontWeight-xl, 700);font-size:var(--Typography-fontSize, var(--aj-fontSize-xl4, 2.25rem));line-height:var(--aj-lineHeight-xs, 1.33334);letter-spacing:-0.025em;color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Custom Book a demo Unlimited team members SIEM export Priority support See usage fees .css-1iy83q4{--padT:calc(var(--sp) * 2.5);--padR:calc(var(--sp) * 12);--padB:calc(var(--sp) * 2.5);--padL:calc(var(--sp) * 12);--rad:calc(var(--sp) * 1);} Enterprise requirements? See more Usage fees Pay for what you use. Discounts available for committed usage. Feature Price Web Requests Protecting websites and web apps with bot protection, Shield WAF, email validation, etc. $5 per 1M requests Agent Requests Protecting coding agents and custom agents with PII detection, prompt injection protection, tool guards, etc. $50 per 1M requests Questions? .css-kbl3mq{--padT:calc(var(--sp) * 0);--padR:calc(var(--sp) * 0);--padB:calc(var(--sp) * 0);--padL:calc(var(--sp) * 0);--rad:calc(var(--sp) * 1);} .css-z18j96{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, "Inter", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"));font-size:var(--Typography-fontSize, var(--aj-fontSize-md, 1rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;--variant-borderWidth:0px;background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));font-weight:var(--aj-fontWeight-md);} Can I book a demo? How does usage-based pricing work? Are there any request limits? Is there a free plan? Do you support open source projects? What payment methods do you accept? Who is behind Arcjet? Still not sure? .css-1hz4a2r{--padT:calc(var(--sp) * 4);--padR:calc(var(--sp) * 4);--padB:calc(varShowing the first 20,000 characters. Full output is available in raw details.
Recorded tool call
{
"type": "tool_call",
"seq": 12,
"ts": "2026-10-21T13:29:19.624Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 https://arcjet.com/pricing -L | sed 's/<[^>]*>/ /g' | tr -s ' \\n' ' \\n' | grep -iE \"free|\\\\$|plan|month|request\" | head -60"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-97ad6322c4caa360",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 15,
"ts": "2026-10-21T13:29:21.420Z",
"turn": 1,
"output": {
"content": [
{
"text": " );--aj-palette-block-level2Event-challenge-blurBorder:rgba(var(--aj-palette-source-tint-01Rgb-05) / 0.3);--aj-palette-glowChannel:130 124 140;--aj-palette-dangerGlowChannel:191 58 50;--aj-shadowRing:0 0 #000;--aj-shadowChannel:21 21 21;--aj-shadowOpacity:0.12;} html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:var(--aj-fontWeight-lg);}body{margin:0;color:var(--aj-palette-text-secondary, var(--aj-palette-neutral-700, #32383E));font-family:var(--aj-fontFamily-body, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-size:var(--aj-fontSize-md, 1rem);line-height:var(--aj-lineHeight-md, 1.5);background-color:var(--aj-palette-background-body);}@media print{body{background-color:var(--aj-palette-common-white);}}body::backdrop{background-color:var(--aj-palette-background-backdrop);}[data-joy-color-scheme=\"light\"]{-webkit-print-color-scheme:light;color-scheme:light;}[data-joy-color-scheme=\"dark\"]{-webkit-print-color-scheme:dark;color-scheme:dark;} Product Building blocks Shield WAF Bot protection Rate limiting Signup form protection Email validation Sensitive information Prompt injection New Content moderation New Filters For agents Arcjet Guards Arcjet Plugin Arcjet Skills MCP Server CLI Protections Abuse protection Budget control Data loss prevention Prompt injection detection Integrations SDKs Astro Deno Express Fastify Next.js NestJS React Router Nuxt Bun SvelteKit Hono Flask Node.js FastAPI Remix AI Agent Frameworks Claude Agent SDK Claude Managed Agents Cloudflare Think CrewAI Genkit Google ADK LangChain LangGraph Mastra Microsoft Agent Framework OpenAI Agents Strands Agents TanStack AI Vercel AI SDK Vercel Eve Resources About Learning center Comparisons MCP Server CLI Support Trust Terms Pricing Docs Blog Sign in Sign up {\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"ImageObject\",\"@id\":\"https://arcjet.com/#logo\",\"url\":\"https://arcjet.com/arcjet-logo-light-essential.svg\",\"contentUrl\":\"https://arcjet.com/arcjet-logo-light-essential.svg\",\"width\":453,\"height\":157,\"caption\":\"Arcjet\"},{\"@type\":\"Organization\",\"@id\":\"https://arcjet.com/#organization\",\"name\":\"Arcjet\",\"legalName\":\"Arcjet Labs, Inc.\",\"url\":\"https://arcjet.com\",\"description\":\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\",\"logo\":{\"@id\":\"https://arcjet.com/#logo\"},\"image\":{\"@id\":\"https://arcjet.com/#logo\"},\"email\":\"support@arcjet.com\",\"contactPoint\":{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@arcjet.com\"},\"address\":{\"@type\":\"PostalAddress\",\"addressLocality\":\"San Francisco\",\"addressRegion\":\"CA\",\"addressCountry\":\"US\"},\"sameAs\":[\"https://github.com/arcjet\",\"https://www.linkedin.com/company/arcjet\",\"https://x.com/arcjet\",\"https://www.youtube.com/@arcjethq\",\"https://www.reddit.com/r/arcjet/\",\"https://www.g2.com/sellers/arcjet\",\"https://www.crunchbase.com/organization/arcjet\"],\"knowsAbout\":[\"AI agent runtime security\",\"Coding agent security\",\"Prompt injection detection\",\"Agent tool-call authorization\",\"Malicious destination and MCP server detection\",\"Sensitive data protection\",\"Bot and API abuse protection\",\"Application security\"]},{\"@type\":\"WebSite\",\"@id\":\"https://arcjet.com/#website\",\"name\":\"Arcjet\",\"url\":\"https://arcjet.com\",\"description\":\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\",\"publisher\":{\"@id\":\"https://arcjet.com/#organization\"}},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://arcjet.com/#software\",\"name\":\"Arcjet\",\"url\":\"https://arcjet.com\",\"description\":\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\",\"applicationCategory\":\"SecurityApplication\",\"publisher\":{\"@id\":\"https://arcjet.com/#organization\"},\"sameAs\":[\"https://www.g2.com/products/arcjet/reviews\"],\"featureList\":[\"Coding agent security\",\"Prompt injection detection\",\"Agent tool-call authorization\",\"Destination threat analysis for agent requests\",\"SIEM export\",\"Sensitive data detection and redaction\",\"Bot and API abuse protection\",\"Rate limiting\"]}]} {\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https://arcjet.com/pricing#webpage\",\"url\":\"https://arcjet.com/pricing\",\"name\":\"AI agent runtime security pricing | Arcjet\",\"description\":\"Arcjet pricing for AI runtime security: Individual at $25/mo, Startup at $299/mo, and Enterprise with custom pricing for mission critical apps. Usage fees apply. 15-day free trial.\",\"isPartOf\":{\"@id\":\"https://arcjet.com/#website\"},\"about\":{\"@id\":\"https://arcjet.com/#software\"},\"mainEntity\":{\"@id\":\"https://arcjet.com/#software\"},\"breadcrumb\":{\"@id\":\"https://arcjet.com/pricing#breadcrumb\"}},{\"@type\":\"SoftwareApplication\",\"@id\":\"https://arcjet.com/#software\",\"name\":\"Arcjet\",\"url\":\"https://arcjet.com\",\"description\":\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\",\"applicationCategory\":\"SecurityApplication\",\"publisher\":{\"@id\":\"https://arcjet.com/#organization\"},\"sameAs\":[\"https://www.g2.com/products/arcjet/reviews\"],\"featureList\":[\"Coding agent security\",\"Prompt injection detection\",\"Agent tool-call authorization\",\"Destination threat analysis for agent requests\",\"SIEM export\",\"Sensitive data detection and redaction\",\"Bot and API abuse protection\",\"Rate limiting\"],\"offers\":[{\"@type\":\"Offer\",\"name\":\"Individual\",\"url\":\"https://arcjet.com/pricing\",\"price\":\"25\",\"priceCurrency\":\"USD\",\"description\":\"Individual base price per application per month, plus usage fees.\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":25,\"priceCurrency\":\"USD\",\"billingDuration\":\"P1M\",\"referenceQuantity\":{\"@type\":\"QuantitativeValue\",\"value\":1,\"unitText\":\"application\"}}},{\"@type\":\"Offer\",\"name\":\"Startup\",\"url\":\"https://arcjet.com/pricing\",\"price\":\"299\",\"priceCurrency\":\"USD\",\"description\":\"Startup base price per application per month, plus usage fees.\",\"priceSpecification\":{\"@type\":\"UnitPriceSpecification\",\"price\":299,\"priceCurrency\":\"USD\",\"billingDuration\":\"P1M\",\"referenceQuantity\":{\"@type\":\"QuantitativeValue\",\"value\":1,\"unitText\":\"application\"}}}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://arcjet.com/pricing#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://arcjet.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pricing\",\"item\":\"https://arcjet.com/pricing\"}]},{\"@type\":\"FAQPage\",\"@id\":\"https://arcjet.com/pricing#faq\",\"isPartOf\":{\"@id\":\"https://arcjet.com/#website\"},\"mainEntity\":[{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-1\",\"name\":\"Can I book a demo?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Of course! Book a demo with our team.\"}},{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-2\",\"name\":\"How does usage-based pricing work?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Any protect() SDK call counts as a web request, billed at $5 per million. Rate limit, filter, and Shield WAF rules are included in that single request. Protecting coding agents and custom agents counts as an agent request, billed at $50 per million.\"}},{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-3\",\"name\":\"Are there any request limits?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"There are no hard request limits on paid accounts (the trial has usage limits). All protections are billed based on actual usage at the per-unit rates shown in the usage fees table. You only pay for what you use and you can set budget thresholds to avoid surprises. Billing guarantees are available to insure against volumetric attacks - your app will never go down because you hit a limit.\"}},{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-4\",\"name\":\"Is there a free plan?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. When the 15 day trial ends, your account continues on a free plan limited to 10,000 requests per month. The limit is a hard stop rather than metered overage, so you are never billed for going over it. Set up billing and choose a plan to lift the cap.\"}},{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-5\",\"name\":\"Do you support open source projects?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Many open source projects use Arcjet on the Individual plan. The Individual plan works well for non-commercial, community-maintained open source projects and includes access to all protections with discounted or free pricing. Reach out to us to discuss how Arcjet can help.\"}},{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-6\",\"name\":\"What payment methods do you accept?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"We accept all major credit and debit cards on all plans. Enterprise plans can optionally be purchased through an annual contract and paid by ACH/Wire.\"}},{\"@type\":\"Question\",\"@id\":\"https://arcjet.com/pricing#faq-question-7\",\"name\":\"Who is behind Arcjet?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Arcjet Labs, Inc. is headquartered in San Francisco and also has an office in New York. We raised a seed round in 2023 and Series A in 2025. We're backed by Andreessen Horowitz, Plural, Seedcamp, and 20+ angel investors. Our CEO, David Mytton, writes the console.dev devtools newsletter.\"}}]}]} .css-5am9f0{--Icon-fontSize:calc(1em * undefined);--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-size:var(--Typography-fontSize, inherit);color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;--variant-borderWidth:0px;background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));font-weight:var(--aj-fontWeight-md);} Arcjet pricing .css-10hjjl9{--Icon-fontSize:calc(1em * undefined);--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-size:var(--Typography-fontSize, inherit);color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Put the decision where the action is. .css-y3knef{--padT:calc(var(--sp) * 3);--padR:calc(var(--sp) * 3);--padB:calc(var(--sp) * 3);--padL:calc(var(--sp) * 3);--rad:calc(var(--sp) * 2);} .css-ph7x90{--Icon-fontSize:calc(1em * var(--aj-lineHeight-xs, 1.33334));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-display, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-weight:var(--aj-fontWeight-xl, 700);font-size:var(--Typography-fontSize, var(--aj-fontSize-xl4, 2.25rem));line-height:var(--aj-lineHeight-xs, 1.33334);letter-spacing:-0.025em;color:var(--variant-plainColor, rgba(var(--aj-palette-primary-mainChannel) / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Individual .css-h8n4os{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-size:var(--Typography-fontSize, var(--aj-fontSize-lg, 1.125rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Get started. $ 25 / mo Start a 15 day trial 1 team member .css-1oq6rh{--Divider-thickness:1px;--Divider-lineColor:var(--aj-palette-divider);--_Divider-inset:var(--Divider-inset, 0px);margin:initial;margin-inline:var(--_Divider-inset);margin-block:initial;position:relative;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;border:none;list-style:none;background-color:var(--Divider-lineColor);inline-size:initial;block-size:var(--Divider-thickness);--Divider-inset:calc(-1 * var(--List-padding));margin-block-start:calc(var(--List-gap) + var(--ListDivider-gap));margin-block-end:var(--ListDivider-gap);} 1 hour log retention Email support .css-yt03wz{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-size:var(--Typography-fontSize, var(--aj-fontSize-sm, 0.875rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;--variant-borderWidth:0px;background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));font-weight:var(--aj-fontWeight-md);} .css-1bqup1q{--Icon-fontSize:1.25em;--Icon-color:currentColor;--CircularProgress-size:1.25em;--CircularProgress-thickness:3px;font:inherit;-webkit-text-decoration:none;text-decoration:none;text-decoration-thickness:max(0.08em, 1px);text-underline-offset:0.15em;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:var(--aj-radius-xs);padding:0;cursor:pointer;text-decoration-color:var(--variant-outlinedBorder, rgba(var(--aj-palette-primary-mainChannel) / var(--Link-underlineOpacity, 0.72)));padding-block:min(0.1em, 4px);padding-inline:0.25em;-moz-appearance:none;-webkit-appearance:none;position:relative;--variant-borderWidth:0px;color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));}@media (hover: hover){.css-1bqup1q:hover{text-decoration-line:underline;}}.css-1bqup1q::-moz-focus-inner{border-style:none;}.css-1bqup1q.Mui-focusVisible,.css-1bqup1q:focus-visible{outline-offset:var(--focus-outline-offset, var(--aj-focus-thickness, 2px));outline:var(--aj-focus-thickness, 2px) solid var(--aj-palette-focusVisible, #0B6BCB);}@media (hover: hover){.css-1bqup1q:hover{background-color:var(--variant-solidHoverBg, var(--aj-palette-primary-solidHoverBg, var(--aj-palette-primary-600, #185EA5)));}}.css-1bqup1q:active{background-color:var(--variant-solidActiveBg, var(--aj-palette-primary-solidActiveBg, var(--aj-palette-primary-700, #12467B)));}.css-1bqup1q.Mui-disabled{pointer-events:none;cursor:default;--Icon-color:currentColor;color:var(--variant-solidDisabledColor, var(--aj-palette-primary-solidDisabledColor, var(--aj-palette-neutral-400, #9FA6AD)));background-color:var(--variant-solidDisabledBg, var(--aj-palette-primary-solidDisabledBg, var(--aj-palette-neutral-100, #F0F4F8)));} See usage fees .css-61owou{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-margin-start:clamp(4px, var(--Link-gap, 0.25em), 0.5rem);margin-inline-start:clamp(4px, var(--Link-gap, 0.25em), 0.5rem);} .css-bb2jb1{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin:var(--Icon-margin);width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;font-size:var(--Icon-fontSize, var(--aj-fontSize-xl2));color:var(--Icon-color, var(--aj-palette-text-icon));} Startup For growing teams. $ 299 / mo Start a 15 day trial 2 team members 24 hour log retention Email + Slack support See usage fees Enterprise For teams at scale. .css-17n55b3{--Icon-fontSize:calc(1em * var(--aj-lineHeight-xs, 1.33334));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-display, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-weight:var(--aj-fontWeight-xl, 700);font-size:var(--Typography-fontSize, var(--aj-fontSize-xl4, 2.25rem));line-height:var(--aj-lineHeight-xs, 1.33334);letter-spacing:-0.025em;color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Custom Book a demo Unlimited team members SIEM export Priority support See usage fees .css-1iy83q4{--padT:calc(var(--sp) * 2.5);--padR:calc(var(--sp) * 12);--padB:calc(var(--sp) * 2.5);--padL:calc(var(--sp) * 12);--rad:calc(var(--sp) * 1);} Enterprise requirements? See more Usage fees Pay for what you use. Discounts available for committed usage. Feature Price Web Requests Protecting websites and web apps with bot protection, Shield WAF, email validation, etc. $5 per 1M requests Agent Requests Protecting coding agents and custom agents with PII detection, prompt injection protection, tool guards, etc. $50 per 1M requests Questions? .css-kbl3mq{--padT:calc(var(--sp) * 0);--padR:calc(var(--sp) * 0);--padB:calc(var(--sp) * 0);--padL:calc(var(--sp) * 0);--rad:calc(var(--sp) * 1);} .css-z18j96{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-size:var(--Typography-fontSize, var(--aj-fontSize-md, 1rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;--variant-borderWidth:0px;background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));font-weight:var(--aj-fontWeight-md);} Can I book a demo? How does usage-based pricing work? Are there any request limits? Is there a free plan? Do you support open source projects? What payment methods do you accept? Who is behind Arcjet? Still not sure? .css-1hz4a2r{--padT:calc(var(--sp) * 4);--padR:calc(var(--sp) * 4);--padB:calc(var(--sp) * 4);--padL:calc(var(--sp) * 4);--rad:calc(var(--sp) * 2);} Need something custom or have any questions? Book a demo .css-izvoit{--Icon-fontSize:calc(1em * var(--aj-lineHeight-md, 1.5));--Icon-color:currentColor;margin:var(--Typography-margin, 0px);display:block;font-family:var(--aj-fontFamily-body, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-size:var(--Typography-fontSize, var(--aj-fontSize-md, 1rem));line-height:var(--aj-lineHeight-md, 1.5);color:var(--variant-plainColor, rgba(undefined / 1));border-radius:var(--aj-radius-xs);padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;font-weight:var(--aj-fontWeight-md);} Or .css-27ymkt{--Icon-fontSize:1.25em;--Icon-color:currentColor;--CircularProgress-size:1.25em;--CircularProgress-thickness:3px;font:inherit;-webkit-text-decoration:none;text-decoration:none;vertical-align:bottom;text-decoration-thickness:max(0.08em, 1px);text-underline-offset:0.15em;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:var(--aj-radius-xs);padding:0;cursor:pointer;text-decoration-color:var(--variant-outlinedBorder, rgba(var(--aj-palette-primary-mainChannel) / var(--Link-underlineOpacity, 0.72)));padding-block:min(0.1em, 4px);padding-inline:0.25em;-moz-appearance:none;-webkit-appearance:none;position:relative;--variant-borderWidth:0px;color:var(--variant-solidColor, var(--aj-palette-primary-solidColor, var(--aj-palette-common-white, #FFF)));background-color:var(--variant-solidBg, var(--aj-palette-primary-solidBg, var(--aj-palette-primary-500, #0B6BCB)));}@media (hover: hover){.css-27ymkt:hover{text-decoration-line:underline;}}.css-27ymkt::-moz-focus-inner{border-style:none;}.css-27ymkt.Mui-focusVisible,.css-27ymkt:focus-visible{outline-offset:var(--focus-outline-offset, var(--aj-focus-thickness, 2px));outline:var(--aj-focus-thickness, 2px) solid var(--aj-palette-focusVisible, #0B6BCB);}@media (hover: hover){.css-27ymkt:hover{background-color:var(--variant-solidHoverBg, var(--aj-palette-primary-solidHoverBg, var(--aj-palette-primary-600, #185EA5)));}}.css-27ymkt:active{background-color:var(--variant-solidActiveBg, var(--aj-palette-primary-solidActiveBg, var(--aj-palette-primary-700, #12467B)));}.css-27ymkt.Mui-disabled{pointer-events:none;cursor:default;--Icon-color:currentColor;color:var(--variant-solidDisabledColor, var(--aj-palette-primary-solidDisabledColor, var(--aj-palette-neutral-400, #9FA6AD)));background-color:var(--variant-solidDisabledBg, var(--aj-palette-primary-solidDisabledBg, var(--aj-palette-neutral-100, #F0F4F8)));} .css-1xltcl5{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-margin-end:clamp(4px, var(--Link-gap, 0.375em), 0.75rem);margin-inline-end:clamp(4px, var(--Link-gap, 0.375em), 0.75rem);} Join our Discord Try our live example Test an Arcjet-protected example application. Live example Read docs Arcjet Built with 🍵 in 🇺🇸 USA 🇨🇦 Canada 🇮🇹 Italy. Get started .css-12v8h79{--Icon-fontSize:1.25em;--Icon-color:currentColor;--CircularProgress-size:1.25em;--CircularProgress-thickness:3px;font-family:var(--aj-fontFamily-body, \"Inter\", var(--aj-fontFamily-fallback, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"));font-size:var(--aj-fontSize-md, 1rem);line-height:var(--aj-lineHeight-md, 1.5);color:var(--aj-palette-text-secondary, var(--aj-palette-neutral-700, #32383E));-webkit-text-decoration:none;text-decoration:none;text-decoration-thickness:max(0.08em, 1px);text-underline-offset:0.15em;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:var(--aj-radius-xs);padding:0;cursor:pointer;text-decoration-color:var(--variant-outlinedBorder, rgba(undefined / var(--Link-underlineOpacity, 0.72)));padding-block:min(0.1em, 4px);padding-inline:0.25em;margin-inline:-0.25em;-moz-appearance:none;-webkit-appearance:none;position:relative;}@media (hover: hover){.css-12v8h79:hover{text-decoration-line:underline;}}.css-12v8h79::-moz-focus-inner{border-style:none;}.css-12v8h79.Mui-focusVisible,.css-12v8h79:focus-visible{outline-offset:var(--focus-outline-offset, var(--aj-focus-thickness, 2px));outline:var(--aj-focus-thickness, 2px) solid var(--aj-palette-focusVisible, #0B6BCB);} Arcjet Guards Arcjet Plugin Arcjet Skills MCP Server CLI AI app protection Abuse protection Budget control Data loss prevention Prompt injection detection Building blocks Prompt injection New Content moderation New Bot protection Rate limiting Shield WAF Email validation Signup form protection Sensitive information Filters Learn Learning center AI agent security Agentic identity How-tos API security Bot protection Rate limiting Runtime security Comparisons Blog Company About Work with us Trust Support Terms Privacy SDKs Astro Deno Express Fastify Next.js NestJS React Router Nuxt Bun SvelteKit Hono Flask Node.js FastAPI Remix AI Agent Frameworks Claude Agent SDK Claude Managed Agents Cloudflare Think CrewAI Genkit Google ADK LangChain LangGraph Mastra Microsoft Agent Framework OpenAI Agents Strands Agents TanStack AI Vercel AI SDK Vercel Eve (globalThis[\"TURBOPACK\"] || (globalThis[\"TURBOPACK\"] = [])).push({\"otherChunks\":[\"static/immutable/chunks/2ro-rp_buw7wp.js\",\"static/immutable/chunks/0ykyzfd0mwwu3.js\",\"static/immutable/chunks/3hr0jidwdfvnf.js\",\"static/immutable/chunks/2qw64iamj4rwv.js\",\"static/immutable/chunks/1i8cs_4h-2wj4.js\"],\"runtimeModuleIds\":[94553]}); (self.__next_f=self.__next_f||[]).push([0]) self.__next_f.push([1,\"1:\\\"$Sreact.fragment\\\"\\n4:\\\"/_next/static/immutable/chunks/1lstjxu-sncod.js\\\"\\n5:\\\"/_next/static/immutable/chunks/15r4v7na_nav4.js\\\"\\n6:\\\"/_next/static/immutable/chunks/3bl6v8dry7fj1.js\\\"\\n7:I[39756,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"default\\\"]\\n8:I[37457,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"default\\\"]\\nc:I[97367,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"OutletBoundary\\\"]\\nd:\\\"$Sreact.suspense\\\"\\nf:\\\"ViewportBoundary\\\"\\n10:I[97367,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"$f\\\"]\\n12:\\\"MetadataBoundary\\\"\\n13:I[97367,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"$12\\\"]\\n15:I[68027,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"default\\\",1]\\n:HL[\\\"/_next/static/immutable/chunks/2n3p3s5oixuqh.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/media/Figtree_Italic_VariableFont-s.p.0out2fa__gyaa.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/Figtree_VariableFont-s.p.308kvgq2u39l5.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/IBMPlexMono_Italic-s.p.34b842rl5rfpe.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/IBMPlexMono_Medium-s.p.0b5uhr7rnxceh.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/IBMPlexMono_Medium_Italic-s.p.1jvpvbk7dbhvn.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/IBMPlexMono_Regular-s.p.3qa7m85-bneiw.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/Jost_Italic_VariableFont-s.p.0soqib3ej8sv6.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/media/Jost_VariableFont-s.p.0key_96npafu1.woff2\\\",\\\"font\\\",{\\\"crossOrigin\\\":\\\"\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\",\\\"type\\\":\\\"font/woff2\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/1ojxkzj9k61xa.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/3ta0k30l_wu0l.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/1a4oud6wu6rtj.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/05ttuomo4u_yq.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/1cn_0oq5kbmru.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/07ji_0_b-wycr.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n:HL[\\\"/_next/static/immutable/chunks/31p64ir6-ark_.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n9:X\\na:[[\\\"children\\\",{\\\"s\\\":\\\"__PAGE__\\\",\\\"d\\\":{\\\"r\\\":[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[\\\"$Lb\\\",[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/1ojxkzj9k61xa.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"1\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/3ta0k30l_wu0l.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"2\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/1a4oud6wu6rtj.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"3\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/05ttuomo4u_yq.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"4\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/1cn_0oq5kbmru.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"5\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/07ji_0_b-wycr.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"6\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/31p64ir6-ark_.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/0mob9w-xw___8.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/1lqojlzxopru-.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-2\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/12-4o9ggu-wm3.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-3\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/1o4ki8eb_w45f.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-4\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/0tigk5tcdg-oy.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-5\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/1mlltkpgbzyfi.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-6\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/1i74qw796tn_n.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-7\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/3g4t-gchtf0i1.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]],[\\\"$\\\",\\\"$Lc\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.MetadataOutlet\\\",\\\"children\\\":\\\"$@e\\\"}]}]]}],\\\"p\\\":false,\\\"v\\\":null}}]]\\n3:[[\\\"children\\\",{\\\"s\\\":\\\"pricing\\\",\\\"d\\\":{\\\"r\\\":[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L7\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L8\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":\\\"$undefined\\\",\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]]}],\\\"p\\\":false,\\\"v\\\":\\\"$9\\\"},\\\"c\\\":\\\"$Qa\\\"}]]\\n0:{\\\"P\\\":null,\\\"c\\\":[\\\"\\\",\\\"pricing\\\"],\\\"q\\\":\\\"\\\",\\\"i\\\":false,\\\"t\\\":{\\\"t\\\":{\\\"s\\\":\\\"\\\",\\\"h\\\":16,\\\"d\\\":{\\\"r\\\":[\\\"$\\\",\\\"$1\\\",\\\"c\\\",{\\\"children\\\":[[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/2n3p3s5oixuqh.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-0\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/1lstjxu-sncod.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-1\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/15r4v7na_nav4.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"script\\\",\\\"script-2\\\",{\\\"src\\\":\\\"/_next/static/immutable/chunks/3bl6v8dry7fj1.js\\\",\\\"async\\\":true,\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]],\\\"$L2\\\"]}],\\\"p\\\":false,\\\"v\\\":null},\\\"c\\\":\\\"$Q3\\\"},\\\"h\\\":{\\\"r\\\":[\\\"$\\\",\\\"$1\\\",\\\"h\\\",{\\\"children\\\":[null,[\\\"$\\\",\\\"$L10\\\",null,{\\\"children\\\":\\\"$L11\\\"}],[\\\"$\\\",\\\"$L13\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"div\\\",null,{\\\"hidden\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$d\\\",null,{\\\"name\\\":\\\"Next.Metadata\\\",\\\"children\\\":\\\"$L14\\\"}]}],null]}],[\\\"$\\\",\\\"meta\\\",null,{\\\"name\\\":\\\"next-size-adjust\\\",\\\"content\\\":\\\"\\\"}]]}],\\\"p\\\":false,\\\"v\\\":null}},\\\"m\\\":\\\"$undefined\\\",\\\"G\\\":[\\\"$15\\\",[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/2n3p3s5oixuqh.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]]],\\\"S\\\":false,\\\"r\\\":\\\"$undefined\\\",\\\"s\\\":\\\"$undefined\\\",\\\"a\\\":\\\"$undefined\\\",\\\"l\\\":\\\"$undefined\\\",\\\"p\\\":\\\"$undefined\\\",\\\"d\\\":\\\"$undefined\\\",\\\"b\\\":\\\"trK0AA9TpFRW42temF29r\\\"}\\n16:\\\"/_next/static/immutable/chunks/0mob9w-xw___8.js\\\"\\n17:\\\"/_next/static/immutable/chunks/1lqojlzxopru-.js\\\"\\n18:\\\"/_next/static/immutable/chunks/12-4o9ggu-wm3.js\\\"\\n19:\\\"/_next/static/immutable/chunks/1o4ki8eb_w45f.js\\\"\\n1a:\\\"/_next/static/immutable/chunks/0tigk5tcdg-oy.js\\\"\\n1b:\\\"/_next/static/immutable/chunks/1mlltkpgbzyfi.js\\\"\\n1c:\\\"/_next/static/immutable/chunks/1i74qw796tn_n.js\\\"\\n1d:\\\"/_next/static/immutable/chunks/3g4t-gchtf0i1.js\\\"\\n1e:I[25994,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\",\\\"$16\\\",\\\"$17\\\",\\\"$18\\\",\\\"$19\\\",\\\"$1a\\\",\\\"$1b\\\",\\\"$1c\\\",\\\"$1d\\\"],\\\"default\\\"]\\n22:I[78849,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"default\\\"]\\n23:\\\"StyledEngineProvider\\\"\\n24:I[17954,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"$23\\\"]\\n25:\\\"/_next/static/immutable/chunks/2h06fs84ci-fn.js\\\"\\n26:I[33488,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\",\\\"$25\\\",\\\"$18\\\",\\\"$17\\\",\\\"$1a\\\",\\\"$19\\\",\\\"$1b\\\"],\\\"default\\\"]\\n27:I[52637,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"SignalsScript\\\"]\\n28:I[81076,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"GoogleAdsScript\\\"]\\n29:I[79520,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"\\\"]\\n:HL[\\\"/_next/static/immutable/chunks/0djvimw1rz601.css\\\",\\\"style\\\",{\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]\\n9:C\\n1f:Tb34,{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"ImageObject\\\",\\\"@id\\\":\\\"https://arcjet.com/#logo\\\",\\\"url\\\":\\\"https://arcjet.com/arcjet-logo-light-essential.svg\\\",\\\"contentUrl\\\":\\\"https://arcjet.com/arcjet-logo-light-essential.svg\\\",\\\"width\\\":453,\\\"height\\\":157,\\\"caption\\\":\\\"Arcjet\\\"},{\\\"@type\\\":\\\"Organization\\\",\\\"@id\\\":\\\"https://arcjet.com/#organization\\\",\\\"name\\\":\\\"Arcjet\\\",\\\"legalName\\\":\\\"Arcjet Labs, Inc.\\\",\\\"url\\\":\\\"https://arcjet.com\\\",\\\"description\\\":\\\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\\\",\\\"logo\\\":{\\\"@id\\\":\\\"https://arcjet.com/#logo\\\"},\\\"image\\\":{\\\"@id\\\":\\\"https://arcjet.com/#logo\\\"},\\\"email\\\":\\\"support@arcjet.com\\\",\\\"contactPoint\\\":{\\\"@type\\\":\\\"ContactPoint\\\",\\\"contactType\\\":\\\"customer support\\\",\\\"email\\\":\\\"support@arcjet.com\\\"},\\\"address\\\":{\\\"@type\\\":\\\"PostalAddress\\\",\\\"addressLocality\\\":\\\"San Francisco\\\",\\\"addressRegion\\\":\\\"CA\\\",\\\"addressCountry\\\":\\\"US\\\"},\\\"sameAs\\\":[\\\"https://github.com/arcjet\\\",\\\"https://www.linkedin.com/company/arcjet\\\",\\\"https://x.com/arcjet\\\",\\\"https://www.youtube.com/@arcjethq\\\",\\\"https://www.reddit.com/r/arcjet/\\\",\\\"https://www.g2.com/sellers/arcjet\\\",\\\"https://www.crunchbase.com/organization/arcjet\\\"],\\\"knowsAbout\\\":[\\\"AI agent runtime security\\\",\\\"Coding agent security\\\",\\\"Prompt injection detection\\\",\\\"Agent tool-call authorization\\\",\\\"Malicious destination and MCP server detection\\\",\\\"Sensitive data protection\\\",\\\"Bot and API abuse protection\\\",\\\"Application security\\\"]},{\\\"@type\\\":\\\"WebSite\\\",\\\"@id\\\":\\\"https://arcjet.com/#website\\\",\\\"name\\\":\\\"Arcjet\\\",\\\"url\\\":\\\"https://arcjet.com\\\",\\\"description\\\":\\\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\\\",\\\"publisher\\\":{\\\"@id\\\":\\\"https://arcjet.com/#organization\\\"}},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://arcjet.com/#software\\\",\\\"name\\\":\\\"Arcjet\\\",\\\"url\\\":\\\"https://arcjet.com\\\",\\\"description\\\":\\\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\\\",\\\"applicationCategory\\\":\\\"SecurityApplication\\\",\\\"publisher\\\":{\\\"@id\\\":\\\"https://arcjet.com/#organization\\\"},\\\"sameAs\\\":[\\\"https://www.g2.com/products/arcjet/reviews\\\"],\\\"featureList\\\":[\\\"Coding agent security\\\",\\\"Prompt injection detection\\\",\\\"Agent tool-call authorization\\\",\\\"Destination threat analysis for agent requests\\\",\\\"SIEM export\\\",\\\"Sensitive data detection and redaction\\\",\\\"Bot and API abuse protection\\\",\\\"Rate limiting\\\"]}]}20:T14ca,{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@graph\\\":[{\\\"@type\\\":\\\"WebPage\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#webpage\\\",\\\"url\\\":\\\"https://arcjet.com/pricing\\\",\\\"name\\\":\\\"AI agent runtime security pricing | Arcjet\\\",\\\"description\\\":\\\"Arcjet pricing for AI runtime security: Individual at $25/mo, Startup at $299/mo, and Enterprise with custom pricing for mission critical apps. Usage fees apply. 15-day free trial.\\\",\\\"isPartOf\\\":{\\\"@id\\\":\\\"https://arcjet.com/#website\\\"},\\\"about\\\":{\\\"@id\\\":\\\"https://arcjet.com/#software\\\"},\\\"mainEntity\\\":{\\\"@id\\\":\\\"https://arcjet.com/#software\\\"},\\\"breadcrumb\\\":{\\\"@id\\\":\\\"https://arcjet.com/pricing#breadcrumb\\\"}},{\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"@id\\\":\\\"https://arcjet.com/#software\\\",\\\"name\\\":\\\"Arcjet\\\",\\\"url\\\":\\\"https://arcjet.com\\\",\\\"description\\\":\\\"Arcjet is the AI agent runtime security platform. Discover the agents running in your organization, enforce policy across every action, prompt, and tool call, and keep the evidence to prove what happened. Detect prompt injection, authorize agent tool calls, redact PII, and block bots and abuse.\\\",\\\"applicationCategory\\\":\\\"SecurityApplication\\\",\\\"publisher\\\":{\\\"@id\\\":\\\"https://arcjet.com/#organization\\\"},\\\"sameAs\\\":[\\\"https://www.g2.com/products/arcjet/reviews\\\"],\\\"featureList\\\":[\\\"Coding agent security\\\",\\\"Prompt injection detection\\\",\\\"Agent tool-call authorization\\\",\\\"Destination threat analysis for agent requests\\\",\\\"SIEM export\\\",\\\"Sensitive data detection and redaction\\\",\\\"Bot and API abuse protection\\\",\\\"Rate limiting\\\"],\\\"offers\\\":[{\\\"@type\\\":\\\"Offer\\\",\\\"name\\\":\\\"Individual\\\",\\\"url\\\":\\\"https://arcjet.com/pricing\\\",\\\"price\\\":\\\"25\\\",\\\"priceCurrency\\\":\\\"USD\\\",\\\"description\\\":\\\"Individual base price per application per month, plus usage fees.\\\",\\\"priceSpecification\\\":{\\\"@type\\\":\\\"UnitPriceSpecification\\\",\\\"price\\\":25,\\\"priceCurrency\\\":\\\"USD\\\",\\\"billingDuration\\\":\\\"P1M\\\",\\\"referenceQuantity\\\":{\\\"@type\\\":\\\"QuantitativeValue\\\",\\\"value\\\":1,\\\"unitText\\\":\\\"application\\\"}}},{\\\"@type\\\":\\\"Offer\\\",\\\"name\\\":\\\"Startup\\\",\\\"url\\\":\\\"https://arcjet.com/pricing\\\",\\\"price\\\":\\\"299\\\",\\\"priceCurrency\\\":\\\"USD\\\",\\\"description\\\":\\\"Startup base price per application per month, plus usage fees.\\\",\\\"priceSpecification\\\":{\\\"@type\\\":\\\"UnitPriceSpecification\\\",\\\"price\\\":299,\\\"priceCurrency\\\":\\\"USD\\\",\\\"billingDuration\\\":\\\"P1M\\\",\\\"referenceQuantity\\\":{\\\"@type\\\":\\\"QuantitativeValue\\\",\\\"value\\\":1,\\\"unitText\\\":\\\"application\\\"}}}]},{\\\"@type\\\":\\\"BreadcrumbList\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#breadcrumb\\\",\\\"itemListElement\\\":[{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":1,\\\"name\\\":\\\"Home\\\",\\\"item\\\":\\\"https://arcjet.com\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":2,\\\"name\\\":\\\"Pricing\\\",\\\"item\\\":\\\"https://arcjet.com/pricing\\\"}]},{\\\"@type\\\":\\\"FAQPage\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq\\\",\\\"isPartOf\\\":{\\\"@id\\\":\\\"https://arcjet.com/#website\\\"},\\\"mainEntity\\\":[{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-1\\\",\\\"name\\\":\\\"Can I book a demo?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"Of course! Book a demo with our team.\\\"}},{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-2\\\",\\\"name\\\":\\\"How does usage-based pricing work?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"Any protect() SDK call counts as a web request, billed at $5 per million. Rate limit, filter, and Shield WAF rules are included in that single request. Protecting coding agents and custom agents counts as an agent request, billed at $50 per million.\\\"}},{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-3\\\",\\\"name\\\":\\\"Are there any request limits?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"There are no hard request limits on paid accounts (the trial has usage limits). All protections are billed based on actual usage at the per-unit rates shown in the usage fees table. You only pay for what you use and you can set budget thresholds to avoid surprises. Billing guarantees are available to insure against volumetric attacks - your app will never go down because you hit a limit.\\\"}},{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-4\\\",\\\"name\\\":\\\"Is there a free plan?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"Yes. When the 15 day trial ends, your account continues on a free plan limited to 10,000 requests per month. The limit is a hard stop rather than metered overage, so you are never billed for going over it. Set up billing and choose a plan to lift the cap.\\\"}},{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-5\\\",\\\"name\\\":\\\"Do you support open source projects?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"Yes. Many open source projects use Arcjet on the Individual plan. The Individual plan works well for non-commercial, community-maintained open source projects and includes access to all protections with discounted or free pricing. Reach out to us to discuss how Arcjet can help.\\\"}},{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-6\\\",\\\"name\\\":\\\"What payment methods do you accept?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"We accept all major credit and debit cards on all plans. Enterprise plans can optionally be purchased through an annual contract and paid by ACH/Wire.\\\"}},{\\\"@type\\\":\\\"Question\\\",\\\"@id\\\":\\\"https://arcjet.com/pricing#faq-question-7\\\",\\\"name\\\":\\\"Who is behind Arcjet?\\\",\\\"acceptedAnswer\\\":{\\\"@type\\\":\\\"Answer\\\",\\\"text\\\":\\\"Arcjet Labs, Inc. is headquartered in San Francisco and also has an office in New York. We raised a seed round in 2023 and Series A in 2025. We're backed by Andreessen Horowitz, Plural, Seedcamp, and 20+ angel investors. Our CEO, David Mytton, writes the console.dev devtools newsletter.\\\"}}]}]}b:[\\\"$\\\",\\\"$L1e\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"$1f\\\"}}],[\\\"$\\\",\\\"script\\\",null,{\\\"type\\\":\\\"application/ld+json\\\",\\\"dangerouslySetInnerHTML\\\":{\\\"__html\\\":\\\"$20\\\"}}],\\\"$L21\\\"]}]\\n2:[\\\"$\\\",\\\"html\\\",null,{\\\"lang\\\":\\\"en\\\",\\\"className\\\":\\\"aj y3p_sW_variable I6JHVG_variable Yuho6W_variable\\\",\\\"children\\\":[\\\"$\\\",\\\"body\\\",null,{\\\"children\\\":[[\\\"$\\\",\\\"$L22\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L24\\\",null,{\\\"injectFirst\\\":true,\\\"children\\\":[\\\"$\\\",\\\"$L7\\\",null,{\\\"parallelRouterKey\\\":\\\"children\\\",\\\"error\\\":\\\"$undefined\\\",\\\"errorStyles\\\":\\\"$undefined\\\",\\\"errorScripts\\\":\\\"$undefined\\\",\\\"template\\\":[\\\"$\\\",\\\"$L8\\\",null,{}],\\\"templateStyles\\\":\\\"$undefined\\\",\\\"templateScripts\\\":\\\"$undefined\\\",\\\"notFound\\\":[[\\\"$\\\",\\\"$L1e\\\",null,{\\\"children\\\":[\\\"$\\\",\\\"$L26\\\",null,{}]}],[[\\\"$\\\",\\\"link\\\",\\\"0\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/1ojxkzj9k61xa.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"1\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/3ta0k30l_wu0l.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"2\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/1a4oud6wu6rtj.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"3\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/05ttuomo4u_yq.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}],[\\\"$\\\",\\\"link\\\",\\\"4\\\",{\\\"rel\\\":\\\"stylesheet\\\",\\\"href\\\":\\\"/_next/static/immutable/chunks/0djvimw1rz601.css\\\",\\\"precedence\\\":\\\"next\\\",\\\"crossOrigin\\\":\\\"$undefined\\\",\\\"nonce\\\":\\\"OWZhNjUxN2EtMjVkYi00N2RjLTlmNWEtZjcwYzllYjgzMDcz\\\"}]]],\\\"forbidden\\\":\\\"$undefined\\\",\\\"unauthorized\\\":\\\"$undefined\\\"}]}]}],[\\\"$\\\",\\\"$L27\\\",null,{}],[\\\"$\\\",\\\"$L28\\\",null,{}],[\\\"$\\\",\\\"$L29\\\",null,{\\\"id\\\":\\\"hs-script-loader\\\",\\\"src\\\":\\\"https://js.hs-scripts.com/45932667.js\\\",\\\"strategy\\\":\\\"lazyOnload\\\"}]]}]}]\\n2a:I[86472,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\",\\\"$16\\\",\\\"$17\\\",\\\"$18\\\",\\\"$19\\\",\\\"$1a\\\",\\\"$1b\\\",\\\"$1c\\\",\\\"$1d\\\"],\\\"default\\\"]\\n21:[\\\"$\\\",\\\"$L2a\\\",null,{}]\\n11:[[\\\"$\\\",\\\"meta\\\",\\\"0\\\",{\\\"charSet\\\":\\\"utf-8\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"viewport\\\",\\\"content\\\":\\\"width=device-width, initial-scale=1\\\"}]]\\n2b:I[27201,[\\\"$4\\\",\\\"$5\\\",\\\"$6\\\"],\\\"IconMark\\\"]\\ne:null\\n14:[[\\\"$\\\",\\\"title\\\",\\\"0\\\",{\\\"children\\\":\\\"AI agent runtime security pricing | Arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"1\\\",{\\\"name\\\":\\\"description\\\",\\\"content\\\":\\\"Arcjet pricing for AI runtime security: Individual at $25/mo, Startup at $299/mo, and Enterprise with custom pricing for mission critical apps. Usage fees apply. 15-day free trial.\\\"}],[\\\"$\\\",\\\"link\\\",\\\"2\\\",{\\\"rel\\\":\\\"canonical\\\",\\\"href\\\":\\\"https://arcjet.com/pricing\\\"}],[\\\"$\\\",\\\"link\\\",\\\"3\\\",{\\\"rel\\\":\\\"alternate\\\",\\\"type\\\":\\\"application/atom+xml\\\",\\\"href\\\":\\\"https://arcjet.com/blog/atom\\\",\\\"title\\\":\\\"Arcjet blog\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"4\\\",{\\\"property\\\":\\\"og:title\\\",\\\"content\\\":\\\"AI agent runtime security pricing | Arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"5\\\",{\\\"property\\\":\\\"og:description\\\",\\\"content\\\":\\\"Arcjet pricing for AI runtime security: Individual at $25/mo, Startup at $299/mo, and Enterprise with custom pricing for mission critical apps. Usage fees apply. 15-day free trial.\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"6\\\",{\\\"property\\\":\\\"og:url\\\",\\\"content\\\":\\\"https://arcjet.com/pricing\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"7\\\",{\\\"property\\\":\\\"og:site_name\\\",\\\"content\\\":\\\"Arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"8\\\",{\\\"property\\\":\\\"og:image\\\",\\\"content\\\":\\\"https://arcjet.com/social/arcjet-og-image.png\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"9\\\",{\\\"property\\\":\\\"og:image:width\\\",\\\"content\\\":\\\"1200\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"10\\\",{\\\"property\\\":\\\"og:image:height\\\",\\\"content\\\":\\\"630\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"11\\\",{\\\"property\\\":\\\"og:image:alt\\\",\\\"content\\\":\\\"Arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"12\\\",{\\\"property\\\":\\\"og:type\\\",\\\"content\\\":\\\"website\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"13\\\",{\\\"name\\\":\\\"twitter:card\\\",\\\"content\\\":\\\"summary_large_image\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"14\\\",{\\\"name\\\":\\\"twitter:site\\\",\\\"content\\\":\\\"@arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"15\\\",{\\\"name\\\":\\\"twitter:creator\\\",\\\"content\\\":\\\"@arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"16\\\",{\\\"name\\\":\\\"twitter:title\\\",\\\"content\\\":\\\"AI agent runtime security pricing | Arcjet\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"17\\\",{\\\"name\\\":\\\"twitter:description\\\",\\\"content\\\":\\\"Arcjet pricing for AI runtime security: Individual at $25/mo, Startup at $299/mo, and Enterprise with custom pricing for mission critical apps. Usage fees apply. 15-day free trial.\\\"}],[\\\"$\\\",\\\"meta\\\",\\\"18\\\",{\\\"name\\\":\\\"twitter:image\\\",\\\"content\\\":\\\"https://arcjet.com/social/arcjet-twitter-card.png\\\"}],[\\\"$\\\",\\\"link\\\",\\\"19\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon.png\\\",\\\"type\\\":\\\"image/x-icon\\\",\\\"media\\\":\\\"(prefers-color-scheme: dark)\\\"}],[\\\"$\\\",\\\"link\\\",\\\"20\\\",{\\\"rel\\\":\\\"icon\\\",\\\"href\\\":\\\"/favicon-light.png\\\",\\\"type\\\":\\\"image/png\\\",\\\"media\\\":\\\"(prefers-color-scheme: light)\\\"}],[\\\"$\\\",\\\"$L2b\\\",\\\"21\\\",{}]]\\n\"]) \n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-97ad6322c4caa360",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Got the pricing info. Next I need the quickstart docs. Let me search for the correct URL on docs.arcjet.com. I'll try the sitemap or a known path like /get-started. The Arcjet docs used to be at docs.arcjet.com/quick-start... now it's 404. Let me check the sitemap.
Got the pricing info. Next, I'll find the current quickstart documentation and check the SDK on npm.
curl -sS -m 20 https://docs.arcjet.com/sitemap-index.xml | head -20; echo ---; curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -iE "start|install|node|express" | head -20
<?xml version="1.0" encoding="UTF-8"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>https://docs.arcjet.com/sitemap-0.xml</loc
<?xml version="1.0" encoding="UTF-8"?><sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><sitemap><loc>https://docs.arcjet.com/sitemap-0.xml</loc><lastmod>2026-10-14T16:40:24.000Z</lastmod></sitemap></sitemapindex>--- https://docs.arcjet.com/agent-get-started/ https://docs.arcjet.com/redact/quick-start/ https://docs.arcjet.com/reference/nodejs/ https://docs.arcjet.com/sdk/astro/bot-protection/quick-start/ https://docs.arcjet.com/sdk/astro/filters/quick-start/ https://docs.arcjet.com/sdk/astro/get-started/ https://docs.arcjet.com/sdk/bun/bot-protection/quick-start/ https://docs.arcjet.com/sdk/bun/content-moderation/quick-start/ https://docs.arcjet.com/sdk/bun/email-validation/quick-start/ https://docs.arcjet.com/sdk/bun/filters/quick-start/ https://docs.arcjet.com/sdk/bun/get-started/ https://docs.arcjet.com/sdk/bun/nosecone/quick-start/ https://docs.arcjet.com/sdk/bun/plus/hono/get-started/ https://docs.arcjet.com/sdk/bun/rate-limiting/quick-start/ https://docs.arcjet.com/sdk/bun/sensitive-info/quick-start/ https://docs.arcjet.com/sdk/bun/shield/quick-start/ https://docs.arcjet.com/sdk/bun/signup-protection/quick-start/ https://docs.arcjet.com/sdk/claude-agent-sdk/content-moderation/quick-start/ https://docs.arcjet.com/sdk/claude-agent-sdk/get-started/ https://docs.arcjet.com/sdk/claude-agent-sdk/guards/quick-start/
Recorded tool call
{
"type": "tool_call",
"seq": 18,
"ts": "2026-10-21T13:29:24.956Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 https://docs.arcjet.com/sitemap-index.xml | head -20; echo ---; curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -iE \"start|install|node|express\" | head -20"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a058bdaada7e7594",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 22,
"ts": "2026-10-21T13:29:25.971Z",
"turn": 1,
"output": {
"content": [
{
"text": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"><sitemap><loc>https://docs.arcjet.com/sitemap-0.xml</loc><lastmod>2026-10-14T16:40:24.000Z</lastmod></sitemap></sitemapindex>---\nhttps://docs.arcjet.com/agent-get-started/\nhttps://docs.arcjet.com/redact/quick-start/\nhttps://docs.arcjet.com/reference/nodejs/\nhttps://docs.arcjet.com/sdk/astro/bot-protection/quick-start/\nhttps://docs.arcjet.com/sdk/astro/filters/quick-start/\nhttps://docs.arcjet.com/sdk/astro/get-started/\nhttps://docs.arcjet.com/sdk/bun/bot-protection/quick-start/\nhttps://docs.arcjet.com/sdk/bun/content-moderation/quick-start/\nhttps://docs.arcjet.com/sdk/bun/email-validation/quick-start/\nhttps://docs.arcjet.com/sdk/bun/filters/quick-start/\nhttps://docs.arcjet.com/sdk/bun/get-started/\nhttps://docs.arcjet.com/sdk/bun/nosecone/quick-start/\nhttps://docs.arcjet.com/sdk/bun/plus/hono/get-started/\nhttps://docs.arcjet.com/sdk/bun/rate-limiting/quick-start/\nhttps://docs.arcjet.com/sdk/bun/sensitive-info/quick-start/\nhttps://docs.arcjet.com/sdk/bun/shield/quick-start/\nhttps://docs.arcjet.com/sdk/bun/signup-protection/quick-start/\nhttps://docs.arcjet.com/sdk/claude-agent-sdk/content-moderation/quick-start/\nhttps://docs.arcjet.com/sdk/claude-agent-sdk/get-started/\nhttps://docs.arcjet.com/sdk/claude-agent-sdk/guards/quick-start/\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a058bdaada7e7594",
"is_error": false,
"tool_kind": "shell"
}npm view arcjet version dist-tags.latest 2>&1 | head; echo ---; npm view @arcjet/node version 2>&1 | head -3
version = '1.14.1'
version = '1.14.1' dist-tags.latest = '1.14.1' --- 1.14.1
Recorded tool call
{
"type": "tool_call",
"seq": 21,
"ts": "2026-10-21T13:29:24.956Z",
"name": "bash",
"turn": 1,
"input": {
"command": "npm view arcjet version dist-tags.latest 2>&1 | head; echo ---; npm view @arcjet/node version 2>&1 | head -3"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b550a8dfd5e43b3a",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 23,
"ts": "2026-10-21T13:29:27.337Z",
"turn": 1,
"output": {
"content": [
{
"text": "version = '1.14.1'\ndist-tags.latest = '1.14.1'\n---\n1.14.1\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b550a8dfd5e43b3a",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The user wants to use the hosted product "lightly" via SDK/API. No local service stack, and no long-running commands either. Arcjet requires an account/API key (ARCJET_KEY) obtained from app.arcjet.com — I can't create an account. But I can build a sample app. The question is whether it can run without an API key. The Arcjet SDK requires a key, and without a key protect() will fail (if failOpen? Actually, if there's no key, does the SDK throw an error at initialization time? The Arcjet Node SDK requires a key and throws "Arcjet key is required").
User's instruction: "If there is a developer workflow you can't execute for this product, clearly say so and stop." Arcjet does have a developer workflow that I can execute: install the SDK, write code. The only thing I can't do is sign up for an account and obtain a key. I can build the sample, install the SDK, write the code, verify that compilation/type-checking passes, and note that running it requires an ARCJET_KEY from the hosted console (a simple web signup — this is a limitation, but the workflow exists).
Let me check the Node.js get-started docs to get accurate sample code.
curl -sS -m 20 "https://docs.arcjet.com/sdk/nodejs/get-started/" | python3 -c "
import sys,re,html
h=sys.stdin.read()
m=re.search(r'<main.*?</main>', h, re.S)
h=m.group(0) if m else h
h=re.sub(r'<script.*?</script>','',h,flags=re.S)
h=re.sub(r'<style.*?</style>','',h,flags=re.S)
h=re.sub(r'<[^>]+>','\n',h)
h=html.unescape(h)
lines=[l.strip() for l in h.split('\n')]
print('\n'.join(l for l in lines if l))
" | head -150404
404 Page not found. Check the URL or try using the search bar.
Recorded tool call
{
"type": "tool_call",
"seq": 26,
"ts": "2026-10-21T13:29:30.992Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 \"https://docs.arcjet.com/sdk/nodejs/get-started/\" | python3 -c \"\nimport sys,re,html\nh=sys.stdin.read()\nm=re.search(r'<main.*?</main>', h, re.S)\nh=m.group(0) if m else h\nh=re.sub(r'<script.*?</script>','',h,flags=re.S)\nh=re.sub(r'<style.*?</style>','',h,flags=re.S)\nh=re.sub(r'<[^>]+>','\\n',h)\nh=html.unescape(h)\nlines=[l.strip() for l in h.split('\\n')]\nprint('\\n'.join(l for l in lines if l))\n\" | head -150"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-9514add35390898d",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 28,
"ts": "2026-10-21T13:29:31.288Z",
"turn": 1,
"output": {
"content": [
{
"text": "404\nPage not found. Check the URL or try using the search bar.\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-9514add35390898d",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Hmm, the sitemap lists paths like /sdk/nodejs/... . Let me try grepping the nodejs path from the sitemap.
curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -E "nodejs" | head -20
https://docs.arcjet.com/reference/nodejs/
https://docs.arcjet.com/reference/nodejs/
Recorded tool call
{
"type": "tool_call",
"seq": 31,
"ts": "2026-10-21T13:29:33.124Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -E \"nodejs\" | head -20"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-8109624de8c63cf1",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 33,
"ts": "2026-10-21T13:29:33.853Z",
"turn": 1,
"output": {
"content": [
{
"text": "https://docs.arcjet.com/reference/nodejs/\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-8109624de8c63cf1",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Does Node.js not have a get-started page? In the sitemap grep from earlier, sdk/nodejs/get-started wasn't displayed. Let's check the get-started pages across the entire sitemap and grab the Express one (an Express sample is the most lightweight — a single small server file). Actually running the server would be "long-running," but we don't need to run it. We just need to build it. Maybe we can do a dry test without keys... Arcjet requires a key. Can we test with a fake key? The SDK might accept any string, but protect() calls will fail with a network error. Actually, does the Arcjet SDK have a "test mode"? There's ARCJET_TEST_ENV and a test option... in the old version there was process.env.ARCJET_TEST_ENV. For now, let's fetch the express get-started documentation and build that.
curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -E "express" | head
https://docs.arcjet.com/sdk/node/plus/express/get-started/
https://docs.arcjet.com/sdk/node/plus/express/get-started/
Recorded tool call
{
"type": "tool_call",
"seq": 36,
"ts": "2026-10-21T13:29:36.361Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -E \"express\" | head"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a79a4c4fd346e784",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 38,
"ts": "2026-10-21T13:29:37.094Z",
"turn": 1,
"output": {
"content": [
{
"text": "https://docs.arcjet.com/sdk/node/plus/express/get-started/\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a79a4c4fd346e784",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Hmm, the SDK list mentioned Express: "SDKs Astro Deno Express Fastify Next.js NestJS React Router Nuxt Bun SvelteKit Hono Flask Node.js FastAPI Remix". In the sitemap, only express shows up under node/plus. Could it be that the Express docs are at /sdk/express/get-started/ but not included in the sitemap? Let me check the sitemap for a complete list of "get-started" and grab the node get-started URL.
curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -E "/sdk/(node|express|fastify)" | head -30
https://docs.arcjet.com/sdk/fastify/filters/quick-start/
https://docs.arcjet.com/sdk/fastify/filters/quick-start/ https://docs.arcjet.com/sdk/fastify/get-started/ https://docs.arcjet.com/sdk/node/bot-protection/advanced-signals/ https://docs.arcjet.com/sdk/node/bot-protection/quick-start/ https://docs.arcjet.com/sdk/node/bot-protection/reference/ https://docs.arcjet.com/sdk/node/content-moderation/ https://docs.arcjet.com/sdk/node/content-moderation/quick-start/ https://docs.arcjet.com/sdk/node/email-validation/quick-start/ https://docs.arcjet.com/sdk/node/email-validation/reference/ https://docs.arcjet.com/sdk/node/filters/quick-start/ https://docs.arcjet.com/sdk/node/filters/reference/ https://docs.arcjet.com/sdk/node/get-started/ https://docs.arcjet.com/sdk/node/nosecone/quick-start/ https://docs.arcjet.com/sdk/node/plus/express/get-started/ https://docs.arcjet.com/sdk/node/plus/hono/get-started/ https://docs.arcjet.com/sdk/node/rate-limiting/quick-start/ https://docs.arcjet.com/sdk/node/rate-limiting/reference/ https://docs.arcjet.com/sdk/node/sensitive-info/quick-start/ https://docs.arcjet.com/sdk/node/sensitive-info/reference/ https://docs.arcjet.com/sdk/node/shield/quick-start/ https://docs.arcjet.com/sdk/node/shield/reference/ https://docs.arcjet.com/sdk/node/signup-protection/quick-start/ https://docs.arcjet.com/sdk/node/signup-protection/reference/
Recorded tool call
{
"type": "tool_call",
"seq": 41,
"ts": "2026-10-21T13:29:39.218Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 https://docs.arcjet.com/sitemap-0.xml | grep -oE '<loc>[^<]+' | sed 's/<loc>//' | grep -E \"/sdk/(node|express|fastify)\" | head -30"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a22f6905a84ac92e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 43,
"ts": "2026-10-21T13:29:40.318Z",
"turn": 1,
"output": {
"content": [
{
"text": "https://docs.arcjet.com/sdk/fastify/filters/quick-start/\nhttps://docs.arcjet.com/sdk/fastify/get-started/\nhttps://docs.arcjet.com/sdk/node/bot-protection/advanced-signals/\nhttps://docs.arcjet.com/sdk/node/bot-protection/quick-start/\nhttps://docs.arcjet.com/sdk/node/bot-protection/reference/\nhttps://docs.arcjet.com/sdk/node/content-moderation/\nhttps://docs.arcjet.com/sdk/node/content-moderation/quick-start/\nhttps://docs.arcjet.com/sdk/node/email-validation/quick-start/\nhttps://docs.arcjet.com/sdk/node/email-validation/reference/\nhttps://docs.arcjet.com/sdk/node/filters/quick-start/\nhttps://docs.arcjet.com/sdk/node/filters/reference/\nhttps://docs.arcjet.com/sdk/node/get-started/\nhttps://docs.arcjet.com/sdk/node/nosecone/quick-start/\nhttps://docs.arcjet.com/sdk/node/plus/express/get-started/\nhttps://docs.arcjet.com/sdk/node/plus/hono/get-started/\nhttps://docs.arcjet.com/sdk/node/rate-limiting/quick-start/\nhttps://docs.arcjet.com/sdk/node/rate-limiting/reference/\nhttps://docs.arcjet.com/sdk/node/sensitive-info/quick-start/\nhttps://docs.arcjet.com/sdk/node/sensitive-info/reference/\nhttps://docs.arcjet.com/sdk/node/shield/quick-start/\nhttps://docs.arcjet.com/sdk/node/shield/reference/\nhttps://docs.arcjet.com/sdk/node/signup-protection/quick-start/\nhttps://docs.arcjet.com/sdk/node/signup-protection/reference/\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-a22f6905a84ac92e",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The user resent the request. I have the pricing info. Next, I need to fetch the Node get-started documentation, create a sample, install the SDK, verify it, and report back. Keeping it light: no server execution needed, just build and verify. Let me grab the docs.
curl -sS -m 20 "https://docs.arcjet.com/sdk/node/get-started/" | python3 -c "
import sys,re,html
h=sys.stdin.read()
m=re.search(r'<main.*?</main>', h, re.S)
h=m.group(0) if m else h
h=re.sub(r'<script.*?</script>','',h,flags=re.S)
h=re.sub(r'<style.*?</style>','',h,flags=re.S)
h=re.sub(r'<[^>]+>','\n',h)
h=html.unescape(h)
lines=[l.rstrip() for l in h.split('\n')]
print('\n'.join(l for l in lines if l.strip()))
" | head -180Get started with Node.js
Get started with Node.js
Arcjet
is the AI agent runtime security platform. Discover
the agents running in your organization, enforce policy across every action,
prompt, and tool call, and keep the evidence to prove what happened. Detect
prompt injection, authorize agent tool calls, redact PII, and block bots and
abuse.
Tip
Using an AI coding assistant? See the
Agent get started
guide, or
tell your agent:
“Set up Arcjet security for my app. Connect to the Arcjet MCP
server to get my API key, then add shield, bot detection, and rate
limiting.”
This guide shows you how to add Arcjet to your application. For an AI agent
framework it publishes one policy and guards one tool call with it. For an
HTTP framework it blocks automated clients that inflate costs and enforces
per-user token budgets. To secure Claude Code, GitHub Copilot, Muse Code,
OpenAI Codex, or Cursor, which need no SDK, see
Secure coding agents
.
1. Install Arcjet
Section titled “1. Install Arcjet”
In your project root, run the following:
Terminal window
npm
i
@arcjet/node
@arcjet/inspect
Terminal window
pnpm
add
@arcjet/node
@arcjet/inspect
Terminal window
yarn
add
@arcjet/node
@arcjet/inspect
Requirements
Section titled “Requirements”
Node.js 22.21.0 or later
CommonJS is not supported. Arcjet is ESM only.
2. Set your key
Section titled “2. Set your key”
Create a free Arcjet account
then follow the
instructions to add a site and get a key.
Add your key to a
.env.local
file in your project root.
You can also set
ARCJET_ENV
and other values in
.env
files.
.env.local
1
# Run Arcjet in development <https://docs.arcjet.com/environment#arcjet-env>.
2
ARCJET_ENV
=
development
3
# Arcjet key for your site (from <https://console.arcjet.com>).
4
# More info: <https://docs.arcjet.com/environment#arcjet-key>.
5
ARCJET_KEY
=
ajkey_yourkey
.ARCJET_ENV=development# Arcjet key for your site (from
).# More info:
.ARCJET_KEY=ajkey_yourkey">
3. Configure
Section titled “3. Configure”
This adds Arcjet to your application code, where it can see who is acting and
what they are asking for.
Create a new file at
index.ts
with the contents:
index.ts
1
import
arcjet
,
{
detectBot
,
shield
,
tokenBucket
}
from
"
@arcjet/node
"
;
2
import
{
isSpoofedBot
}
from
"
@arcjet/inspect
"
;
3
import
http
from
"
node:http
"
;
4
5
const
aj
=
arcjet
(
{
6
key
:
process
.
env
.
ARCJET_KEY
!
,
// Get your site key from https://console.arcjet.com
7
rules
:
[
8
// Shield protects your app from common attacks such as SQL injection
9
shield
(
{
mode
:
"
LIVE
"
}
)
,
10
// Create a bot detection rule
11
detectBot
(
{
12
mode
:
"
LIVE
"
,
// Blocks requests. Use "DRY_RUN" to log only
13
// Block all bots except the following
14
allow
:
[
15
"
CATEGORY:SEARCH_ENGINE
"
,
// Google, Bing, etc
Recorded tool call
{
"type": "tool_call",
"seq": 46,
"ts": "2026-10-21T13:29:42.310Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 \"https://docs.arcjet.com/sdk/node/get-started/\" | python3 -c \"\nimport sys,re,html\nh=sys.stdin.read()\nm=re.search(r'<main.*?</main>', h, re.S)\nh=m.group(0) if m else h\nh=re.sub(r'<script.*?</script>','',h,flags=re.S)\nh=re.sub(r'<style.*?</style>','',h,flags=re.S)\nh=re.sub(r'<[^>]+>','\\n',h)\nh=html.unescape(h)\nlines=[l.rstrip() for l in h.split('\\n')]\nprint('\\n'.join(l for l in lines if l.strip()))\n\" | head -180"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b0073cc03ee0e464",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 48,
"ts": "2026-10-21T13:29:44.414Z",
"turn": 1,
"output": {
"content": [
{
"text": "Get started with Node.js\nArcjet\n is the AI agent runtime security platform. Discover\nthe agents running in your organization, enforce policy across every action,\nprompt, and tool call, and keep the evidence to prove what happened. Detect\nprompt injection, authorize agent tool calls, redact PII, and block bots and\nabuse.\nTip\nUsing an AI coding assistant? See the\nAgent get started\n guide, or\ntell your agent:\n“Set up Arcjet security for my app. Connect to the Arcjet MCP\nserver to get my API key, then add shield, bot detection, and rate\nlimiting.”\nThis guide shows you how to add Arcjet to your application. For an AI agent\nframework it publishes one policy and guards one tool call with it. For an\nHTTP framework it blocks automated clients that inflate costs and enforces\nper-user token budgets. To secure Claude Code, GitHub Copilot, Muse Code,\nOpenAI Codex, or Cursor, which need no SDK, see\nSecure coding agents\n.\n1. Install Arcjet\nSection titled “1. Install Arcjet”\nIn your project root, run the following:\nTerminal window\nnpm\ni\n@arcjet/node\n@arcjet/inspect\nTerminal window\npnpm\nadd\n@arcjet/node\n@arcjet/inspect\nTerminal window\nyarn\nadd\n@arcjet/node\n@arcjet/inspect\nRequirements\nSection titled “Requirements”\nNode.js 22.21.0 or later\nCommonJS is not supported. Arcjet is ESM only.\n2. Set your key\nSection titled “2. Set your key”\nCreate a free Arcjet account\n then follow the\ninstructions to add a site and get a key.\nAdd your key to a\n.env.local\n file in your project root.\nYou can also set\nARCJET_ENV\nand other values in\n.env\n files.\n.env.local\n1\n# Run Arcjet in development <https://docs.arcjet.com/environment#arcjet-env>.\n2\nARCJET_ENV\n=\ndevelopment\n3\n# Arcjet key for your site (from <https://console.arcjet.com>).\n4\n# More info: <https://docs.arcjet.com/environment#arcjet-key>.\n5\nARCJET_KEY\n=\najkey_yourkey\n.ARCJET_ENV=development# Arcjet key for your site (from\n).# More info:\n.ARCJET_KEY=ajkey_yourkey\">\n3. Configure\nSection titled “3. Configure”\nThis adds Arcjet to your application code, where it can see who is acting and\nwhat they are asking for.\nCreate a new file at\nindex.ts\n with the contents:\nindex.ts\n1\nimport\narcjet\n,\n{\ndetectBot\n,\nshield\n,\ntokenBucket\n}\nfrom\n\"\n@arcjet/node\n\"\n;\n2\nimport\n{\nisSpoofedBot\n}\nfrom\n\"\n@arcjet/inspect\n\"\n;\n3\nimport\nhttp\nfrom\n\"\nnode:http\n\"\n;\n4\n5\nconst\naj\n=\narcjet\n(\n{\n6\nkey\n:\nprocess\n.\nenv\n.\nARCJET_KEY\n!\n,\n// Get your site key from https://console.arcjet.com\n7\nrules\n:\n [\n8\n// Shield protects your app from common attacks such as SQL injection\n9\nshield\n(\n{\nmode\n:\n\"\nLIVE\n\"\n}\n)\n,\n10\n// Create a bot detection rule\n11\ndetectBot\n(\n{\n12\nmode\n:\n\"\nLIVE\n\"\n,\n// Blocks requests. Use \"DRY_RUN\" to log only\n13\n// Block all bots except the following\n14\nallow\n:\n [\n15\n\"\nCATEGORY:SEARCH_ENGINE\n\"\n,\n// Google, Bing, etc\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b0073cc03ee0e464",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Alright, I've got a grasp of the core pattern. Let me check the rest of the docs to nail down the complete example (how to use the handler with node:http, the protect call, decision handling). I'll try grabbing more lines.
curl -sS -m 20 "https://docs.arcjet.com/sdk/node/get-started/" | python3 -c "
import sys,re,html
h=sys.stdin.read()
m=re.search(r'<main.*?</main>', h, re.S)
h=m.group(0) if m else h
h=re.sub(r'<script.*?</script>','',h,flags=re.S)
h=re.sub(r'<style.*?</style>','',h,flags=re.S)
h=re.sub(r'<[^>]+>','\n',h)
h=html.unescape(h)
lines=[l.rstrip() for l in h.split('\n')]
print('\n'.join(l for l in lines if l.strip()))
" | sed -n '180,340p'// Google, Bing, etc
// Google, Bing, etc
16
// Uncomment to allow these other common bot categories
17
// See the full list at https://arcjet.com/bot-list
18
//"CATEGORY:MONITOR", // Uptime monitoring services
19
//"CATEGORY:PREVIEW", // Link previews such as Slack, Discord
20
]
,
21
}
)
,
22
// Create a token bucket rate limit. Other algorithms are supported.
23
tokenBucket
(
{
24
mode
:
"
LIVE
"
,
25
// Tracked by IP address by default, but this can be customized
26
// See https://docs.arcjet.com/fingerprints
27
//characteristics: ["ip.src"],
28
refillRate
:
5
,
// Refill 5 tokens per interval
29
interval
:
10
,
// Refill every 10 seconds
30
capacity
:
10
,
// Bucket capacity of 10 tokens
31
}
)
,
32
]
,
33
}
)
;
34
35
const
server
=
http
.
createServer
(
async
function
(
36
req
:
http
.
IncomingMessage
,
37
res
:
http
.
ServerResponse
,
38
)
{
39
const
decision
=
await
aj
.
protect
(
req
,
{
requested
:
5
}
)
;
// Deduct 5 tokens from the bucket
40
console
.
log
(
"
Arcjet decision
"
,
decision
)
;
41
42
if
(
decision
.
isDenied
())
{
43
if
(
decision
.
reason
.
isRateLimit
())
{
44
res
.
writeHead
(
429
,
{
"
Content-Type
"
:
"
application/json
"
}
)
;
Recorded tool call
{
"type": "tool_call",
"seq": 51,
"ts": "2026-10-21T13:29:46.255Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sS -m 20 \"https://docs.arcjet.com/sdk/node/get-started/\" | python3 -c \"\nimport sys,re,html\nh=sys.stdin.read()\nm=re.search(r'<main.*?</main>', h, re.S)\nh=m.group(0) if m else h\nh=re.sub(r'<script.*?</script>','',h,flags=re.S)\nh=re.sub(r'<style.*?</style>','',h,flags=re.S)\nh=re.sub(r'<[^>]+>','\\n',h)\nh=html.unescape(h)\nlines=[l.rstrip() for l in h.split('\\n')]\nprint('\\n'.join(l for l in lines if l.strip()))\n\" | sed -n '180,340p'"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-80280715416b84a5",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 53,
"ts": "2026-10-21T13:29:47.971Z",
"turn": 1,
"output": {
"content": [
{
"text": "// Google, Bing, etc\n16\n// Uncomment to allow these other common bot categories\n17\n// See the full list at https://arcjet.com/bot-list\n18\n//\"CATEGORY:MONITOR\", // Uptime monitoring services\n19\n//\"CATEGORY:PREVIEW\", // Link previews such as Slack, Discord\n20\n]\n,\n21\n}\n)\n,\n22\n// Create a token bucket rate limit. Other algorithms are supported.\n23\ntokenBucket\n(\n{\n24\nmode\n:\n\"\nLIVE\n\"\n,\n25\n// Tracked by IP address by default, but this can be customized\n26\n// See https://docs.arcjet.com/fingerprints\n27\n//characteristics: [\"ip.src\"],\n28\nrefillRate\n:\n5\n,\n// Refill 5 tokens per interval\n29\ninterval\n:\n10\n,\n// Refill every 10 seconds\n30\ncapacity\n:\n10\n,\n// Bucket capacity of 10 tokens\n31\n}\n)\n,\n32\n]\n,\n33\n}\n)\n;\n34\n35\nconst\nserver\n=\nhttp\n.\ncreateServer\n(\nasync\nfunction\n(\n36\nreq\n:\nhttp\n.\nIncomingMessage\n,\n37\nres\n:\nhttp\n.\nServerResponse\n,\n38\n)\n{\n39\nconst\ndecision\n=\nawait\naj\n.\nprotect\n(\nreq\n,\n{\n requested\n:\n5\n}\n)\n;\n// Deduct 5 tokens from the bucket\n40\nconsole\n.\nlog\n(\n\"\nArcjet decision\n\"\n,\ndecision\n)\n;\n41\n42\nif\n (\ndecision\n.\nisDenied\n())\n{\n43\nif\n (\ndecision\n.\nreason\n.\nisRateLimit\n())\n{\n44\nres\n.\nwriteHead\n(\n429\n,\n{\n\"\nContent-Type\n\"\n:\n\"\napplication/json\n\"\n}\n)\n;\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-80280715416b84a5",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Got enough info to write a solid example. Let me build the project: package.json (ESM), install @arcjet/node and @arcjet/inspect, index.js (use JS to avoid needing a TS build? Docs use TS. For lightness, use plain ESM JS or TS with Node 22 type stripping — Node 22.23 supports --experimental-strip-types, and actually type stripping is enabled by default in 22.18+). Keep it simple: write index.ts and run with node index.ts (Node 22 natively supports type stripping from 22.18). Node v22.23.2 — yes, type stripping is unflagged since 22.18.0.
Can't run the server (it's long-running, and forbidden). But install, type-check, and maybe verify initialization without running? Running requires ARCJET_KEY and starting the server — user said no long-running commands. Write it, install deps, validate syntax with node --check.
One consideration: can the SDK be initialized without a real key? Does Arcjet throw if the key is missing/malformed? Key validation — ajkey_ prefix. Can't call protect() without a real key from the hosted console (would fail). So workflow: code is actionable, but running requires the user to sign up for a free account and add ARCJET_KEY. This is a light constraint but the product has an actionable dev workflow, so proceed.
Let me scaffold the project.
I have all the information I need. Arcjet has a workflow that I can actually handle (install the SDK → write code → add key). So I'll continue. I'll build a minimal Node.js example using the hosted Arcjet service via @arcjet/node — no local stack, no long-running processes (the server startup will be left to you).
cd /sandbox/repo && mkdir -p arcjet-example && cd arcjet-example && npm init -y >/dev/null && npm pkg set type=module name=arcjet-example scripts.start="node index.ts" && npm i @arcjet/node @arcjet/inspect 2>&1 | tail -2
found 0 vulnerabilities
found 0 vulnerabilities
Recorded tool call
{
"type": "tool_call",
"seq": 56,
"ts": "2026-10-21T13:29:52.855Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && mkdir -p arcjet-example && cd arcjet-example && npm init -y >/dev/null && npm pkg set type=module name=arcjet-example scripts.start=\"node index.ts\" && npm i @arcjet/node @arcjet/inspect 2>&1 | tail -2"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b0199235570b6978",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 59,
"ts": "2026-10-21T13:29:59.363Z",
"turn": 1,
"output": {
"content": [
{
"text": "\nfound 0 vulnerabilities\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b0199235570b6978",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The user has resent the same message (probably a retry/continuation). I'm in the middle of a task: I've already created the scaffold and installed the dependencies. Next up is writing index.ts and .env.local, doing validation (node --check), and then wrapping things up including pricing and manageability. I'll continue from where I left off.
Continuing — the project scaffold is done and the SDK is installed. Now writing the example code:
File edits
1 file
Writtenarcjet-example/index.tsView changes
/sandbox/repo/arcjet-example/index.ts
Written content · previous contents were not recorded
import arcjet, { detectBot, shield, tokenBucket } from "@arcjet/node";import { isSpoofedBot } from "@arcjet/inspect";import http from "node:http";const aj = arcjet({// Get your site key from https://console.arcjet.comkey: process.env.ARCJET_KEY!,rules: [// Shield protects your app from common attacks such as SQL injectionshield({ mode: "LIVE" }),// Block all bots except search engines (Google, Bing, etc.)// Full list: https://arcjet.com/bot-listdetectBot({mode: "LIVE", // Blocks requests. Use "DRY_RUN" to log onlyallow: ["CATEGORY:SEARCH_ENGINE"],}),// Token bucket rate limit, tracked by IP address by default// See https://docs.arcjet.com/fingerprintstokenBucket({mode: "LIVE",refillRate: 5, // Refill 5 tokens per intervalinterval: 10, // Refill every 10 secondscapacity: 10, // Bucket capacity of 10 tokens}),],});const server = http.createServer(async function (req: http.IncomingMessage,res: http.ServerResponse,) {const decision = await aj.protect(req, { requested: 5 }); // Deduct 5 tokensconsole.log("Arcjet decision:", decision.decision, decision.reason);if (decision.isDenied()) {if (decision.reason.isRateLimit()) {res.writeHead(429, { "Content-Type": "application/json" });res.end(JSON.stringify({ message: "Too many requests" }));} else if (decision.reason.isBot()) {res.writeHead(403, { "Content-Type": "application/json" });res.end(JSON.stringify({ message: "No bots allowed" }));} else if (decision.reason.isShield()) {res.writeHead(403, { "Content-Type": "application/json" });res.end(JSON.stringify({ message: "Request blocked by WAF" }));} else {res.writeHead(403, { "Content-Type": "application/json" });res.end(JSON.stringify({ message: "Forbidden" }));}return;}if (decision.results.some(isSpoofedBot)) {// Example: extra checks for spoofed search engine botsres.writeHead(403, { "Content-Type": "application/json" });res.end(JSON.stringify({ message: "Spoofed bot detected" }));return;}res.writeHead(200, { "Content-Type": "application/json" });res.end(JSON.stringify({ message: "Hello world" }));});server.listen(3000, () => {console.log("Arcjet-protected server listening on http://localhost:3000");});
Source: write · chatcmpl-tool-8a2e56921aad886f
Recorded tool call
{
"type": "tool_call",
"seq": 63,
"ts": "2026-10-21T13:30:06.309Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/arcjet-example/index.ts",
"content": "import arcjet, { detectBot, shield, tokenBucket } from \"@arcjet/node\";\nimport { isSpoofedBot } from \"@arcjet/inspect\";\nimport http from \"node:http\";\n\nconst aj = arcjet({\n // Get your site key from https://console.arcjet.com\n key: process.env.ARCJET_KEY!,\n rules: [\n // Shield protects your app from common attacks such as SQL injection\n shield({ mode: \"LIVE\" }),\n // Block all bots except search engines (Google, Bing, etc.)\n // Full list: https://arcjet.com/bot-list\n detectBot({\n mode: \"LIVE\", // Blocks requests. Use \"DRY_RUN\" to log only\n allow: [\"CATEGORY:SEARCH_ENGINE\"],\n }),\n // Token bucket rate limit, tracked by IP address by default\n // See https://docs.arcjet.com/fingerprints\n tokenBucket({\n mode: \"LIVE\",\n refillRate: 5, // Refill 5 tokens per interval\n interval: 10, // Refill every 10 seconds\n capacity: 10, // Bucket capacity of 10 tokens\n }),\n ],\n});\n\nconst server = http.createServer(async function (\n req: http.IncomingMessage,\n res: http.ServerResponse,\n) {\n const decision = await aj.protect(req, { requested: 5 }); // Deduct 5 tokens\n console.log(\"Arcjet decision:\", decision.decision, decision.reason);\n\n if (decision.isDenied()) {\n if (decision.reason.isRateLimit()) {\n res.writeHead(429, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: \"Too many requests\" }));\n } else if (decision.reason.isBot()) {\n res.writeHead(403, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: \"No bots allowed\" }));\n } else if (decision.reason.isShield()) {\n res.writeHead(403, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: \"Request blocked by WAF\" }));\n } else {\n res.writeHead(403, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: \"Forbidden\" }));\n }\n return;\n }\n\n if (decision.results.some(isSpoofedBot)) {\n // Example: extra checks for spoofed search engine bots\n res.writeHead(403, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: \"Spoofed bot detected\" }));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ message: \"Hello world\" }));\n});\n\nserver.listen(3000, () => {\n console.log(\"Arcjet-protected server listening on http://localhost:3000\");\n});\n"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-8a2e56921aad886f",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 65,
"ts": "2026-10-21T13:30:06.309Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 2392 bytes to /sandbox/repo/arcjet-example/index.ts",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-8a2e56921aad886f",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenarcjet-example/.env.localView changes
/sandbox/repo/arcjet-example/.env.local
Written content · previous contents were not recorded
# Run Arcjet in development: https://docs.arcjet.com/environment#arcjet-envARCJET_ENV=development# Arcjet key for your site (from https://console.arcjet.com)# More info: https://docs.arcjet.com/environment#arcjet-keyARCJET_KEY=ajkey_yourkey
Source: write · chatcmpl-tool-bf4350605416713c
Recorded tool call
{
"type": "tool_call",
"seq": 64,
"ts": "2026-10-21T13:30:06.309Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/arcjet-example/.env.local",
"content": "# Run Arcjet in development: https://docs.arcjet.com/environment#arcjet-env\nARCJET_ENV=development\n# Arcjet key for your site (from https://console.arcjet.com)\n# More info: https://docs.arcjet.com/environment#arcjet-key\nARCJET_KEY=ajkey_yourkey\n"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-bf4350605416713c",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 66,
"ts": "2026-10-21T13:30:06.309Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 245 bytes to /sandbox/repo/arcjet-example/.env.local",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-bf4350605416713c",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Continuing: add a README and verify that the code passes the syntax/type check. Node 22.23 natively supports TS type stripping for .ts files (from 22.18 onward, no flag needed). Run node --check against the ts file — does it support it? node --check does parsing, but for .ts, type stripping might apply. Just run node --check index.ts. Also, without a key, can we do a quick import check? If we import @arcjet/node without ARCJET_KEY — the arcjet() constructor might validate the format of the key. Since the environment variable isn't set, it'll probably error out. Just do the syntax check only.
File edits
1 file
Writtenarcjet-example/README.mdView changes
/sandbox/repo/arcjet-example/README.md
Written content · previous contents were not recorded
# Arcjet example (Node.js)Minimal example protecting an HTTP server with the hosted Arcjet service via itsSDK (`@arcjet/node`). Rules: Shield WAF, bot detection (search engines allowed),and a token-bucket rate limit.## Run1. Create a free account at https://app.arcjet.com, add a site, and copy the key.2. Put the key in `.env.local` (`ARCJET_KEY=ajkey_...`).3. `npm start` (Node.js >= 22.21, runs TypeScript directly)4. Test:- `curl http://localhost:3000` → 200 Hello world- `curl -A "Googlebot" http://localhost:3000` → allowed (search engine)- `curl -A "curl" http://localhost:3000` repeatedly → 429 after the bucket empties(default `ARCJET_ENV=development` runs rules in DRY_RUN; set `ARCJET_ENV=production`or keep `mode: "LIVE"` per rule to actually block)## PricingSee https://arcjet.com/pricing — 15-day trial, then a free plan (10k requests/mo,hard stop). Paid plans: Individual $25/mo, Startup $299/mo, Enterprise custom(per application, plus usage: $5 per 1M web requests via `protect()`, $50 per 1Magent requests).Docs: https://docs.arcjet.com/sdk/node/get-started/
Source: write · chatcmpl-tool-9979935fe281d784
Recorded tool call
{
"type": "tool_call",
"seq": 69,
"ts": "2026-10-21T13:30:11.725Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/arcjet-example/README.md",
"content": "# Arcjet example (Node.js)\n\nMinimal example protecting an HTTP server with the hosted Arcjet service via its\nSDK (`@arcjet/node`). Rules: Shield WAF, bot detection (search engines allowed),\nand a token-bucket rate limit.\n\n## Run\n\n1. Create a free account at https://app.arcjet.com, add a site, and copy the key.\n2. Put the key in `.env.local` (`ARCJET_KEY=ajkey_...`).\n3. `npm start` (Node.js >= 22.21, runs TypeScript directly)\n4. Test:\n - `curl http://localhost:3000` → 200 Hello world\n - `curl -A \"Googlebot\" http://localhost:3000` → allowed (search engine)\n - `curl -A \"curl\" http://localhost:3000` repeatedly → 429 after the bucket empties\n (default `ARCJET_ENV=development` runs rules in DRY_RUN; set `ARCJET_ENV=production`\n or keep `mode: \"LIVE\"` per rule to actually block)\n\n## Pricing\n\nSee https://arcjet.com/pricing — 15-day trial, then a free plan (10k requests/mo,\nhard stop). Paid plans: Individual $25/mo, Startup $299/mo, Enterprise custom\n(per application, plus usage: $5 per 1M web requests via `protect()`, $50 per 1M\nagent requests).\n\nDocs: https://docs.arcjet.com/sdk/node/get-started/\n"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-9979935fe281d784",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 71,
"ts": "2026-10-21T13:30:11.725Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 1121 bytes to /sandbox/repo/arcjet-example/README.md",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-9979935fe281d784",
"is_error": false,
"tool_kind": "file_edit"
}cd /sandbox/repo/arcjet-example && node --check index.ts && echo "syntax OK" && ls node_modules/@arcjet | head
syntax OK
syntax OK analyze analyze-wasm body cache duration env headers inspect ip logger
Recorded tool call
{
"type": "tool_call",
"seq": 70,
"ts": "2026-10-21T13:30:11.725Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/arcjet-example && node --check index.ts && echo \"syntax OK\" && ls node_modules/@arcjet | head"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b8fe7c97985f26b4",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 72,
"ts": "2026-10-21T13:30:11.725Z",
"turn": 1,
"output": {
"content": [
{
"text": "syntax OK\nanalyze\nanalyze-wasm\nbody\ncache\nduration\nenv\nheaders\ninspect\nip\nlogger\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b8fe7c97985f26b4",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The task is essentially complete. One thing to verify: does npm start work (node runs TS directly on 22.23)? Node 22.18+ supports type stripping by default. I shouldn't actually start the server (since it's long-running). Without a real key, the SDK might throw an exception at initialization time. Can I do a quick smoke test with a fake key and an immediately-exiting import? I could also test whether module initialization with a fake key throws an exception, but... that would end up calling the hosted API at protect time, not at initialization time. I could also run a quick test that just imports the module with ARCJET_KEY set and exits — but index.ts starts the server (long-running). I could import the SDK with a fake key, construct arcjet(), and then test a small snippet that exits. That's fast. Let me try running it with a timeout.
One last quick sanity check that the SDK initializes (without starting the server or making real requests):
cd /sandbox/repo/arcjet-example && timeout 20 node --input-type=module -e "
import arcjet, { shield, detectBot, tokenBucket } from '@arcjet/node';
const aj = arcjet({
key: 'ajkey_test_dummy_key_for_init_check',
rules: [shield({mode:'DRY_RUN'}), detectBot({mode:'DRY_RUN', allow:['CATEGORY:SEARCH_ENGINE']}), tokenBucket({mode:'DRY_RUN', refillRate:5, interval:10, capacity:10})],
});
console.log('SDK initialized OK:', typeof aj.protect === 'function');
" 2>&1 | tail -3SDK initialized OK: true
SDK initialized OK: true
Recorded tool call
{
"type": "tool_call",
"seq": 77,
"ts": "2026-10-21T13:30:15.834Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/arcjet-example && timeout 20 node --input-type=module -e \"\nimport arcjet, { shield, detectBot, tokenBucket } from '@arcjet/node';\nconst aj = arcjet({\n key: 'ajkey_test_dummy_key_for_init_check',\n rules: [shield({mode:'DRY_RUN'}), detectBot({mode:'DRY_RUN', allow:['CATEGORY:SEARCH_ENGINE']}), tokenBucket({mode:'DRY_RUN', refillRate:5, interval:10, capacity:10})],\n});\nconsole.log('SDK initialized OK:', typeof aj.protect === 'function');\n\" 2>&1 | tail -3"
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b8227f7f6a7fcf16",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 78,
"ts": "2026-10-21T13:30:16.948Z",
"turn": 1,
"output": {
"content": [
{
"text": "SDK initialized OK: true\n",
"type": "text"
}
]
},
"run_id": "cmvi5eyy8006e0ioq40uwy79m",
"tool_id": "chatcmpl-tool-b8227f7f6a7fcf16",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The task is complete. I need to provide the final summary: what I built, how the pricing works, whether it's easy for me to manage, and the status of the block. The previous message ended with a sanity check. Now is the time to wrap things up.
Done. Everything is built and verified in /sandbox/repo/arcjet-example/.
What I built
A minimal Node.js server protected by Arcjet's hosted service via @arcjet/node (v1.14.1):
index.ts— HTTP server with three Arcjet rules: Shield WAF (SQL injection etc.), bot detection (blocks bots, allows search engines, plus spoofed-bot checks via@arcjet/inspect), and a token-bucket rate limit (10 capacity, refill 5/10s). Returns 429/403 with reasons on denial..env.local—ARCJET_ENV=development+ARCJET_KEYplaceholderREADME.md— run/test instructions- Verified: deps installed clean,
node --checkpasses, SDK initializes correctly. Node 22.23 here runs the TypeScript directly (npm start).
I did not start the server or make live requests — running it needs your key, and per your constraints I avoided long-running commands. Nothing blocked me: docs, npm, and the pricing page were all reachable.
How pricing works
- 15-day free trial, then a free plan: 10,000 requests/month (hard stop, never billed for overage)
- Paid plans (per application/month, plus usage): Individual $25/mo (1 member), Startup $299/mo (2 members), Enterprise custom
- Usage fees: $5 per 1M web requests (each
protect()call counts; rate limit/WAF/bot rules included in that single request) and $50 per 1M agent requests (AI agent protections) - No hard request limits on paid accounts; budget thresholds available
Is it easy for me to manage?
Yes, mostly. The code side is fully actionable: standard npm SDK, clean typed API, ESM-only but that's it — I can install, write, edit, and typecheck rules without friction. The one thing I can't do is the account step: getting an ARCJET_KEY requires signing up at app.arcjet.com through the web console (there's an MCP server/CLI for agents, but it still needs your credentials). Once you drop a key into .env.local, everything else is code I can iterate on.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents