Skip to content
Gauge

ax-check.com

Exa

exa.ai

ax-check.com

Checked 29 October 2026

A

100/100

Agents need your login

Exa.ai gives agents docs, install steps, and prices upfront.

All 23 checklist items passed: install commands, code examples, OpenAPI/MCP specs, and static pricing tables are all readable without login or clicks.

1 fix to start with

Concrete changes, backed by what we found.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Recorded coding sessions

Same task, 3 models, no exa.ai account. Recorded 29 October 2026 on Pi.

3 recorded · 43s

43s · recorded

Session findings

Select a finding to see it in context.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Exa. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
Thinking…

Let me check what's available in the environment and see if there are any Exa SDKs I can work with to build an example.

ls /sandbox/repo; env | grep -iE "exa|api_key" | sed 's/=.*/=<set>/'
PI_GATEWAY_API_KEY=<set>
PI_GATEWAY_API_KEY=<set>
Thinking…

I don't have an EXA_API_KEY available, so I'm checking the network connectivity and the npm package status instead. Exa offers an SDK through npm and Python with endpoints for search, answer generation, and research capabilities. I should verify the pricing structure from their documentation—search costs around $5 per thousand results, answers have an additional charge, and they offer a free tier with $10 in monthly credits—but I need to confirm this since my knowledge might be outdated. Let me test the network connection first.

curl -s -m 15 -o /dev/null -w "%{http_code}\n" https://api.exa.ai/ ; npm view exa-js version 2>&1 | tail -2
404
404
2.26.0
Thinking…

Network is working, and the npm registry is working too. There's no EXA_API_KEY. Because of that, I can build the example but can't run it live. Let me try fetching the pricing info from Exa's docs.

curl -s -m 20 https://docs.exa.ai/reference/pricing | sed 's/<[^>]*>/ /g' | tr -s ' \n' ' \n' | grep -iE "price|cost|\$|credit" | head -60
Redirecting...
Redirecting...
Thinking…

Try the exa.ai/pricing page.

curl -sL -m 25 https://exa.ai/pricing -A "Mozilla/5.0" | sed 's/<[^>]*>/\n/g' | tr -s ' \n' ' \n' | grep -iE '\$|per |credits|cost' | head -80
var upper = value.trim().toUpperCase();
 var upper = value.trim().toUpperCase();
 if (fragment && /^(?=[\w.:-]*[A-Za-z])[\w.:-]{1,64}$/.test(fragment)) {
(({protect:a})=>{function b(a){return new Promise((b,c)=>{if(document.querySelector(`script[src="${a}"]`))return void b();let d=document.createElement("script");d.src=a,d.async=!0,d.onload=()=>b(),d.onerror=a=>{console.error("Error loading script",a),c(a)},document.head.appendChild(d)})}var c=class a{#a;#b;#c=0;constructor(){let{promise:b,resolve:c}=a.#d();this.#a=b,this.#b=c,this.#e(),window.addEventListener("online",this.#f),window.addEventListener("visibilitychange",this.#f)}getChallenge=async()=>(await this.#g(),await this.#a.then(a=>"function"==typeof a?a():a));#f=()=>{if(document.hidden)return;let{promise:b,resolve:c}=a.#d();this.#a=b,this.#b=c,window.V_C=[],window.V_C.push=c;let d=document.querySelector('script[src*="c.js"]');d&&d.remove(),this.#c+=1};#e=()=>{if(window.V_C){let a=window.V_C.pop();a&&this.#b(a)}else window.V_C=[],window.V_C.push=this.#b};#g=()=>{let a=new URL("/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/a-4-a/c.js",window.location.origin);return a.searchParams.set("i",String(this.#c)),a.searchParams.set("v",String(3)),a.searchParams.set("h",window.location.host),b(a.pathname+a.search)};#h=()=>{window.V_C=void 0};static #d(){let a,b;return{promise:new Promise((c,d)=>{a=c,b=d}),resolve:a,reject:b}}},d=class a{#a=!1;#b;constructor(a){this.#b=a}get loaded(){return this.#a}load=async()=>{this.#a||await this.#f()};#c=()=>{if(typeof globalThis.window>"u")throw Error("KPSDK is not available in the server");if(!window.KPSDK)throw Error("KPSDK is not loaded");let b=this.#b.map(b=>{let c=a.#e(b.path);return{domain:c.host,path:c.pathname,method:b.method}});try{window.KPSDK.configure(b)}catch(a){console.error("Error configuring KPSDK...",a)}};#f=async()=>{let a=this;return new Promise((c,d)=>{let e=()=>{document.removeEventListener("kpsdk-load",e),this.#c()},f=()=>{document.removeEventListener("kpsdk-ready",f),a.#a=!0,c()};document.addEventListener("kpsdk-load",e,{once:!0}),document.addEventListener("kpsdk-ready",f,{once:!0}),b("/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/p.js").catch(a=>{document.removeEventListener("kpsdk-load",e),document.removeEventListener("kpsdk-ready",f),d(a)})})};static #e(a){let b;try{b=new URL(a)}catch{b=new URL(a,location.origin)}return b}},e=a=>{let b=a.replace(/[.?+^$[\]\\(){}|-]/g,"\\$&").split("*").join(".*");return RegExp(`^${b}$`)},f=({path:a,pattern:b})=>-1!==a.search(b);async function g(a,b,c){let d=XMLHttpRequest.prototype.open,g=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(a,b,c,e,f){return this._requestUrl=b.toString(),this._requestMethod=a,d.call(this,a,b,c??!0,e,f)},XMLHttpRequest.prototype.send=async function(d){let h=this._requestUrl;if(!h||this._isReexecution)return g.call(this,d);let i=new URL(h,location.href),j=i.origin===location.origin,k=this._requestMethod??"GET",l=c.find(a=>{let b=f({path:i.pathname,pattern:e(a.path)}),c=a.method.toLowerCase()===k.toLowerCase()||"*"===a.method;return b&&c});if(!l||!j)return g.call(this,d);let m=await a.getChallenge();if(this.setRequestHeader("x-is-human",JSON.stringify(m)),this.setRequestHeader("x-path",i.pathname),this.setRequestHeader("x-method",k),0!==m.b||b.loaded||((1===m.d||l?.advancedOptions?.checkLevel==="deepAnalysis")&&await b.load(),!b.loaded))return g.call(this,d);this.setRequestHeader("x-is-human",JSON.stringify(m)),this.setRequestHeader("x-path",i.pathname),this.setRequestHeader("x-method",k);let n=new XMLHttpRequest;return n._isReexecution=!0,n.open(k,h,!0),n.setRequestHeader("x-is-human",JSON.stringify(m)),n.setRequestHeader("x-path",i.pathname),n.setRequestHeader("x-method",k),this.timeout&&(n.timeout=this.timeout),this.responseType&&(n.responseType=this.responseType),this.withCredentials&&(n.withCredentials=this.withCredentials),n.onreadystatechange=()=>{Object.defineProperty(this,"readyState",{value:n.readyState,writable:!0,configurable:!0}),n.readyState===XMLHttpRequest.DONE&&(Object.defineProperty(this,"status",{value:n.status,writable:!0,configurable:!0}),Object.defineProperty(this,"statusText",{value:n.statusText,writable:!0,configurable:!0}),Object.defineProperty(this,"response",{value:n.response,writable:!0,configurable:!0}),Object.defineProperty(this,"responseText",{value:n.responseText,writable:!0,configurable:!0}),Object.defineProperty(this,"responseXML",{value:n.responseXML,writable:!0,configurable:!0}),this.getAllResponseHeaders=()=>n.getAllResponseHeaders(),this.getResponseHeader=a=>n.getResponseHeader(a)),this.onreadystatechange&&this.onreadystatechange.call(this,new Event("readystatechange"))},n.onload=a=>{this.onload&&this.onload.call(this,a)},n.onerror=a=>{this.onerror&&this.onerror.call(this,a)},n.onabort=a=>{this.onabort&&this.onabort.call(this,a)},n.ontimeout=a=>{this.ontimeout&&this.ontimeout.call(this,a)},n.onloadstart=a=>{this.onloadstart&&this.onloadstart.call(this,a)},n.onloadend=a=>{this.onloadend&&this.onloadend.call(this,a)},n.onprogress=a=>{this.onprogress&&this.onprogress.call(this,a)},n.send(d)}}!function({protect:a=[]}){let b;for(let b of a)if(b.advancedOptions?.checkLevel!==void 0&&"deepAnalysis"!==b.advancedOptions.checkLevel&&"basic"!==b.advancedOptions.checkLevel)throw Error(`Invalid checkLevel "${b.advancedOptions.checkLevel}" for route "${b.path}". Must be one of: deepAnalysis, basic`);let h=new c,i=new d(a);g(h,i,a).catch(a=>{console.error("Error patching XMLHttpRequest:",a)}),b=window.fetch,window.fetch=async(c,d)=>{let g=new URL(c instanceof Request?c.url:c,location.href),j=g.origin===location.origin,k=d?.method??(c instanceof Request?c.method:"GET"),l=a.find(a=>{let b=f({path:g.pathname,pattern:e(a.path)}),c=a.method.toLowerCase()===k.toLowerCase()||"*"===a.method;return b&&c});if(null==l||!j)return b(c,d);let m=await h.getChallenge(),n=new Headers(d?.headers||(c instanceof Request?c.headers:void 0));n.set("x-is-human",JSON.stringify(m)),n.set("x-path",g.pathname),n.set("x-method",k);let o={...d,headers:n};return i.loaded||0!==m.b?b(c,o):1===m.d||l?.advancedOptions?.checkLevel==="deepAnalysis"?(await i.load(),window.fetch(c,o)):b(c,o)}}({protect:a})})({ protect: [{"path":"/api/token/issue","method":"POST"},{"path":"/api/library/suggest-edit","method":"POST"},{"path":"/api/library/data-partner","method":"POST"},{"path":"/api/contact/partner","method":"POST"},{"path":"/api/contact/partners","method":"POST"}] });
Start for free with over $120 in credits per year
$10 credits every month plus a $10 onboarding bonus. No payment method required
Free $10 credits per month
10 Search Queries Per Second (QPS)
Up to 1,000 results per search
From $4
$0.012–$1.00
$1
/1k pages per content type
$15
From $4
(per 1k requests)
$4
$7
$12
$1
(per 1k pages)
$15
$5
Cost per additional result above 10
(per 1k requests)
$1
$1
$1
$1
(per 1k pages)
$1
$1
$1
$1
$1
$0.10
$0.005
$0.02
$0.07
$0.012
$0.025
$0.10
$0.50
$1.00
Up to $1000 worth of free credits
self.__next_f.push([1,"1:\"$Sreact.fragment\"\ne:I[84488,[],\"default\",1]\n:HL[\"/_next/static/media/e4af272ccee01ff0-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/526eb32230f31761.css\",\"style\"]\n:HL[\"/_next/static/css/51dccd5ba6174469.css\",\"style\"]\n:HL[\"/_next/static/css/310b7cad5ce53a11.css\",\"style\"]\n2:T9f3,"])
self.__next_f.push([1,"(function(){\n try {\n var global = [\"gclid\",\"gclsrc\",\"gbraid\",\"wbraid\",\"dclid\",\"gad_source\",\"gad_campaignid\",\"fbclid\",\"msclkid\",\"li_fat_id\",\"twclid\",\"rdt_cid\",\"ttclid\",\"irclickid\",\"mc_cid\",\"mc_eid\",\"_gl\",\"grclid\",\"graid\",\"grcpid\",\"gruid\",\"grpuid\",\"bfcid\"];\n var scoped = [[\"/blog\",[\"category\"],null],[\"/careers\",[\"location\"],null],[\"/claude\",[\"ref\"],null],[\"/pricing\",[\"partner\"],{\"partner\":[\"A16Z\",\"SPC\",\"ODF\",\"GMI\"]}],[\"/library\",[\"date\",\"latitude\",\"longitude\",\"team\",\"season\",\"t\"],null],[\"/library/places\",[\"q\"],null]];\n var url = new URL(window.location.href);\n var path = url.pathname;\n var onPath = function(prefix){ return path === prefix || path.indexOf(prefix + '/') === 0; };\n var allowed = function(lower){\n if (lower.indexOf('utm_') === 0 || global.indexOf(lower) !== -1) return true;\n for (var s = 0; s \u003c scoped.length; s++) {\n if (onPath(scoped[s][0]) \u0026\u0026 scoped[s][1].indexOf(lower) !== -1) return true;\n }\n return false;\n };\n var valueAllowed = function(lower, value){\n var upper = value.trim().toUpperCase();\n for (var s = 0; s \u003c scoped.length; s++) {\n var legal = scoped[s][2] \u0026\u0026 scoped[s][2][lower];\n if (legal \u0026\u0026 onPath(scoped[s][0]) \u0026\u0026 legal.indexOf(upper) === -1) return false;\n }\n return true;\n };\n var changed = false;\n var keys = [];\n url.searchParams.forEach(function(_, k){ if (keys.indexOf(k) === -1) keys.push(k); });\n for (var i = 0; i \u003c keys.length; i++) {\n var lower = keys[i].toLowerCase();\n var keep = allowed(lower);\n var vals = url.searchParams.getAll(keys[i]);\n for (var j = 0; keep \u0026\u0026 j \u003c vals.length; j++) {\n if (!valueAllowed(lower, vals[j])) keep = false;\n }\n if (!keep) {\n url.searchParams.delete(keys[i]);\n changed = true;\n }\n }\n var fragment = url.hash ? url.hash.slice(1) : '';\n if (url.hash) {\n url.hash = '';\n changed = true;\n }\n if (changed) {\n window.history.replaceState(window.history.state, '', url.href);\n }\n if (fragment \u0026\u0026 /^(?=[\\w.:-]*[A-Za-z])[\\w.:-]{1,64}$/.test(fragment)) {\n var scrollToAnchor = function(){\n var id;\n try { id = decodeURIComponent(fragment); } catch (_) { id = fragment; }\n var el = document.getElementById(id);\n if (el) el.scrollIntoView();\n };\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', scrollToAnchor);\n } else {\n scrollToAnchor();\n }\n }\n } catch (_) {}\n})();"])
self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"pricing\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"pricing\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/526eb32230f31761.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/51dccd5ba6174469.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/310b7cad5ce53a11.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"__variable_d8ebd1\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"id\":\"url-sanitizer\",\"dangerouslySetInnerHTML\":{\"__html\":\"$2\"}}],false,[\"$\",\"script\",null,{\"id\":\"translate-crash-fix\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){\\n var rc = Node.prototype.removeChild;\\n Node.prototype.removeChild = function(c){\\n return c.parentNode !== this ? c : rc.call(this,c);\\n };\\n var ib = Node.prototype.insertBefore;\\n Node.prototype.insertBefore = function(n,r){\\n return r \u0026\u0026 r.parentNode !== this ? n : ib.call(this,n,r);\\n };\\n })();\"}}],\"$L3\",\"$L4\",\"$L5\",\"$L6\",\"$L7\",\"$L8\",\"$L9\"]}],\"$La\"]}]]}],{\"children\":[\"$Lb\",{\"children\":[\"$Lc\",{},null,false,null]},null,false,null]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"QMSZh1HxZ2h0iZZpTrg4A\"}\n"])
self.__next_f.push([1,"10:I[41366,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"PHProvider\"]\n12:I[65553,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n13:I[96234,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n14:I[76796,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n15:I[65816,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n16:I[57498,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n17:I[62572,[],\"\"]\n18:I[34618,[],\"\"]\n19:I[95919,[\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"24345\",\"static/chunks/app/not-found-f0f42fd993dd129d.js\"],\"default\"]\n1a:\"$Sreact.suspense\"\n1b:I[48405,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n1c:I[8544,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"default\"]\n1d:I[50230,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"65776\",\"static/chunks/65776-3b79f1276ef23947.js\",\"23682\",\"static/chunks/23682-f7aca40019b63534.js\",\"16077\",\"static/chunks/16077-e62b6161ab18238d.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"26237\",\"static/chunks/26237-1b71e23ef2268c83.js\",\"7177\",\"static/chunks/app/layout-e8f52e768d69e5c6.js\"],\"SpeedInsights\"]\n1e:I[60152,[\"62168\""])
self.__next_f.push([1,",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"19968\",\"static/chunks/19968-7d8c6375906ea9bd.js\",\"34356\",\"static/chunks/app/pricing/layout-273671b0705d318f.js\"],\"default\"]\n1f:I[9737,[],\"ClientPageRoot\"]\n20:I[16487,[\"62168\",\"static/chunks/c2b750b4-3c62a0c706321c2c.js\",\"85553\",\"static/chunks/85553-0529a572667760ea.js\",\"41105\",\"static/chunks/41105-599165a9a48f0b7a.js\",\"15473\",\"static/chunks/15473-2c98031042410664.js\",\"69295\",\"static/chunks/69295-c3beb37cfdc1f3c5.js\",\"90161\",\"static/chunks/90161-4957a620381dda12.js\",\"57388\",\"static/chunks/57388-27cbcafe429d531c.js\",\"16907\",\"static/chunks/app/pricing/page-745f8ace587ed3ba.js\"],\"default\"]\n23:I[4313,[],\"OutletBoundary\"]\n25:I[4313,[],\"ViewportBoundary\"]\n27:I[4313,[],\"MetadataBoundary\"]\n:HL[\"/fonts/ABCArizonaFlare-Regular.woff2\",\"font\",{\"crossOrigin\":\"anonymous\",\"type\":\"font/woff2\"}]\n:HL[\"/fonts/ABCDiatype-Regular.woff2\",\"font\",{\"crossOrigin\":\"anonymous\",\"type\":\"font/woff2\"}]\n3:[\"$\",\"script\",null,{\"id\":\"announcement-banner-dismissal-bootstrap\",\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){\\n try {\\n var key = \\\"banner_dismissed_exa_3\\\";\\n if (localStorage.getItem(key) === 'true') {\\n document.documentElement.setAttribute('data-announcement-banner-dismissed', 'true');\\n }\\n } catch (_) {}\\n })();\"}}]\n4:[\"$\",\"style\",null,{\"id\":\"announcement-banner-dismissal-style\",\"dangerouslySetInnerHTML\":{\"__html\":\"\\n html[data-announcement-banner-dismissed=\\\"true\\\"] .announcement-banner {\\n display: none !important;\\n height: 0 !important;\\n padding: 0 !important;\\n overflow: hidden !important;\\n }\\n \"}}]\nf:T18dd,"])
self.__next_f.push([1,"(({protect:a})=\u003e{function b(a){return new Promise((b,c)=\u003e{if(document.querySelector(`script[src=\"${a}\"]`))return void b();let d=document.createElement(\"script\");d.src=a,d.async=!0,d.onload=()=\u003eb(),d.onerror=a=\u003e{console.error(\"Error loading script\",a),c(a)},document.head.appendChild(d)})}var c=class a{#a;#b;#c=0;constructor(){let{promise:b,resolve:c}=a.#d();this.#a=b,this.#b=c,this.#e(),window.addEventListener(\"online\",this.#f),window.addEventListener(\"visibilitychange\",this.#f)}getChallenge=async()=\u003e(await this.#g(),await this.#a.then(a=\u003e\"function\"==typeof a?a():a));#f=()=\u003e{if(document.hidden)return;let{promise:b,resolve:c}=a.#d();this.#a=b,this.#b=c,window.V_C=[],window.V_C.push=c;let d=document.querySelector('script[src*=\"c.js\"]');d\u0026\u0026d.remove(),this.#c+=1};#e=()=\u003e{if(window.V_C){let a=window.V_C.pop();a\u0026\u0026this.#b(a)}else window.V_C=[],window.V_C.push=this.#b};#g=()=\u003e{let a=new URL(\"/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/a-4-a/c.js\",window.location.origin);return a.searchParams.set(\"i\",String(this.#c)),a.searchParams.set(\"v\",String(3)),a.searchParams.set(\"h\",window.location.host),b(a.pathname+a.search)};#h=()=\u003e{window.V_C=void 0};static #d(){let a,b;return{promise:new Promise((c,d)=\u003e{a=c,b=d}),resolve:a,reject:b}}},d=class a{#a=!1;#b;constructor(a){this.#b=a}get loaded(){return this.#a}load=async()=\u003e{this.#a||await this.#f()};#c=()=\u003e{if(typeof globalThis.window\u003e\"u\")throw Error(\"KPSDK is not available in the server\");if(!window.KPSDK)throw Error(\"KPSDK is not loaded\");let b=this.#b.map(b=\u003e{let c=a.#e(b.path);return{domain:c.host,path:c.pathname,method:b.method}});try{window.KPSDK.configure(b)}catch(a){console.error(\"Error configuring KPSDK...\",a)}};#f=async()=\u003e{let a=this;return new Promise((c,d)=\u003e{let e=()=\u003e{document.removeEventListener(\"kpsdk-load\",e),this.#c()},f=()=\u003e{document.removeEventListener(\

Showing the first 20,000 characters. Full output is available in raw details.

Thinking…

I've got enough information: free $10 in monthly credits + $10 onboarding bonus, no payment method required, pay-as-you-go pricing, and the search price is listed. It seems llms.txt is being offered. Let me grab pricing details from https://exa.ai/llms.txt or the pricing Markdown. I'll try https://exa.ai/pricing.md or docs.

curl -sL -m 20 https://exa.ai/pricing.md | head -100; echo ====; curl -sL -m 20 https://docs.exa.ai/reference/pricing.md | head -80
> ## Documentation Index
> ## Documentation Index
> Fetch the complete documentation index at: https://exa.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The Exa API is served at https://api.exa.ai. Authenticate with `Authorization: Bearer $EXA_API_KEY` (or `x-api-key: $EXA_API_KEY`); create keys at https://dashboard.exa.ai/api-keys?utm_source=docs&utm_medium=docs&utm_campaign=markdown_instructions.
> Prefer the official SDKs, `exa-py` (`pip install exa-py`) and `exa-js` (`npm install exa-js`); both read `EXA_API_KEY` from the environment.
> Tool-using agents can call Exa without writing code through the hosted MCP server at https://mcp.exa.ai/mcp, or install the Exa agent skill with `npx skills add exa-labs/agent-skills` (skill file: https://exa.ai/docs/skill.md).
> The OpenAPI specs at https://exa.ai/docs/exa-spec.yaml and https://exa.ai/docs/team-management-spec.yaml are the source of truth for request and response schemas.

# Pricing

> Pay-as-you-go rates for Exa Search, Contents, Answer, Monitors, and the Agent API

***

Exa is pay-as-you-go. There is no subscription and no minimum spend: you load credits and are charged per request, at the rates below.

> [!TIP]
>
> **Start for free.** The Free Tier gives you \$10 in credits (up to 2,500 Lite searches) the day you sign up, and your free balance resets to \$10 on the first of every month. No payment method required. Complete onboarding in the dashboard and your first team earns a one-time \$10 bonus. Get an API key and start building.
>
> **Scaling up?** For high volume, custom indexes, higher rate limits, SLAs, or Zero Data Retention, [talk to us](https://exa.ai/contact/sales) about an [Enterprise plan](#enterprise) with volume discounts.

> **[Get your Exa API key](https://dashboard.exa.ai/api-keys?utm_source=docs\&utm_medium=docs\&utm_campaign=get_key_card)**
>
> Create a key in the dashboard. New accounts start with free credits.

## Products

> **[Search](https://exa.ai/docs/search/quickstart.md)**
>
> From **\$4** / 1k requests
>
> Real-time search with token-efficient page contents.

> **[Deep Search](https://exa.ai/docs/search/deep-search.md)**
>
> **\$12–15** / 1k requests
>
> Multi-step research with structured outputs and citations.

> **[Contents](https://exa.ai/docs/contents/quickstart.md)**
>
> **\$1** / 1k pages
>
> Full page text, highlights, and summaries for known URLs.

> **[Answer](https://exa.ai/docs/reference/answer.md)**
>
> **\$5** / 1k requests
>
> An LLM answer to a question, with citations.

> **[Monitors](https://exa.ai/docs/monitors/quickstart.md)**
>
> **\$15** / 1k requests
>
> Scheduled searches that surface new events on the web.

> **[Agent](https://exa.ai/docs/agent/quickstart.md)**
>
> **\$0.012–\$1.00** / fixed-effort run, or usage-based
>
> Async deep research, list building, and enrichment.

## Search, Contents, Answer, and Monitors

Each endpoint has a base price per request that includes up to 10 results. Additional results and Exa-generated page summaries are billed on top.

| Endpoint | Base price (up to 10 results) | Each result above 10 | AI page summaries |
| - | - | - | - |
| `/search` (`lite`) | \$4 / 1k requests | \$1 / 1k results | — |
| `/search` (`instant`) | \$4 / 1k requests | \$1 / 1k results | \$1 / 1k pages |
| `/search` (`auto`, `fast`) | \$7 / 1k requests | \$1 / 1k results | \$1 / 1k pages |
| `/answer` | \$5 / 1k requests | — | — |
| `/monitors` | \$15 / 1k requests | \$1 / 1k results | \$1 / 1k pages |
| `/contents` | \$1 / 1k pages, per content type | — | \$1 / 1k pages |

`instant` and `fast` are [legacy search types](https://exa.ai/docs/search/quickstart.md#legacy-search-types) and keep these prices.

## Agent

Set a fixed `effort` on [Agent](https://exa.ai/docs/agent/quickstart.md) for a predictable per-request price. `auto` is the default metered mode; [`ultra`](https://exa.ai/docs/agent/agent-ultra) is also metered and uses the same usage rates:

| Effort | Price |
| - | - |
| `minimal` | \$0.012 / request |
| `low` | \$0.025 / request |
| `medium` | \$0.10 / request |
| `high` | \$0.50 / request |
| `xhigh` | \$1.00 / request |

Metered runs bill actual usage up to their per-run cap. `auto` defaults to a \$5 cap; `ultra` defaults to a \$20 cap:

| Usage component | Price |
| - | - |
| Agent Compute Units | \$0.10 / ACU |
| Search tool calls | \$0.005 / search |
| Email contact enrichment | \$0.02 / email |
====
> ## Documentation Index
> Fetch the complete documentation index at: https://exa.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The Exa API is served at https://api.exa.ai. Authenticate with `Authorization: Bearer $EXA_API_KEY` (or `x-api-key: $EXA_API_KEY`); create keys at https://dashboard.exa.ai/api-keys?utm_source=docs&utm_medium=docs&utm_campaign=markdown_instructions.
> Prefer the official SDKs, `exa-py` (`pip install exa-py`) and `exa-js` (`npm install exa-js`); both read `EXA_API_KEY` from the environment.
> Tool-using agents can call Exa without writing code through the hosted MCP server at https://mcp.exa.ai/mcp, or install the Exa agent skill with `npx skills add exa-labs/agent-skills` (skill file: https://exa.ai/docs/skill.md).
> The OpenAPI specs at https://exa.ai/docs/exa-spec.yaml and https://exa.ai/docs/team-management-spec.yaml are the source of truth for request and response schemas.

# Pricing

> Pay-as-you-go rates for Exa Search, Contents, Answer, Monitors, and the Agent API

***

Exa is pay-as-you-go. There is no subscription and no minimum spend: you load credits and are charged per request, at the rates below.

> [!TIP]
>
> **Start for free.** The Free Tier gives you \$10 in credits (up to 2,500 Lite searches) the day you sign up, and your free balance resets to \$10 on the first of every month. No payment method required. Complete onboarding in the dashboard and your first team earns a one-time \$10 bonus. Get an API key and start building.
>
> **Scaling up?** For high volume, custom indexes, higher rate limits, SLAs, or Zero Data Retention, [talk to us](https://exa.ai/contact/sales) about an [Enterprise plan](#enterprise) with volume discounts.

> **[Get your Exa API key](https://dashboard.exa.ai/api-keys?utm_source=docs\&utm_medium=docs\&utm_campaign=get_key_card)**
>
> Create a key in the dashboard. New accounts start with free credits.

## Products

> **[Search](https://exa.ai/docs/search/quickstart.md)**
>
> From **\$4** / 1k requests
>
> Real-time search with token-efficient page contents.

> **[Deep Search](https://exa.ai/docs/search/deep-search.md)**
>
> **\$12–15** / 1k requests
>
> Multi-step research with structured outputs and citations.

> **[Contents](https://exa.ai/docs/contents/quickstart.md)**
>
> **\$1** / 1k pages
>
> Full page text, highlights, and summaries for known URLs.

> **[Answer](https://exa.ai/docs/reference/answer.md)**
>
> **\$5** / 1k requests
>
> An LLM answer to a question, with citations.

> **[Monitors](https://exa.ai/docs/monitors/quickstart.md)**
>
> **\$15** / 1k requests
>
> Scheduled searches that surface new events on the web.

> **[Agent](https://exa.ai/docs/agent/quickstart.md)**
>
> **\$0.012–\$1.00** / fixed-effort run, or usage-based
>
> Async deep research, list building, and enrichment.

## Search, Contents, Answer, and Monitors

Each endpoint has a base price per request that includes up to 10 results. Additional results and Exa-generated page summaries are billed on top.

| Endpoint | Base price (up to 10 results) | Each result above 10 | AI page summaries |
| - | - | - | - |
| `/search` (`lite`) | \$4 / 1k requests | \$1 / 1k results | — |
| `/search` (`instant`) | \$4 / 1k requests | \$1 / 1k results | \$1 / 1k pages |
| `/search` (`auto`, `fast`) | \$7 / 1k requests | \$1 / 1k results | \$1 / 1k pages |
| `/answer` | \$5 / 1k requests | — | — |
| `/monitors` | \$15 / 1k requests | \$1 / 1k results | \$1 / 1k pages |
| `/contents` | \$1 / 1k pages, per content type | — | \$1 / 1k pages |

`instant` and `fast` are [legacy search types](https://exa.ai/docs/search/quickstart.md#legacy-search-types) and keep these prices.
Thinking…

Next, I'll quickly fetch the search quickstart in order to build the example correctly. Let's grab the search quickstart md.

curl -sL -m 20 https://exa.ai/docs/search/quickstart.md | sed -n '20,120p'
```python Python theme={null}

```python Python theme={null}
from exa_py import Exa

exa = Exa()

result = exa.search(
    "recent techniques for improving retrieval in RAG systems",
    type="auto",
    contents={"highlights": True},
)

for item in result.results:
    print(item.title, item.url)
    print(item.highlights)
```

```javascript JavaScript theme={null}
import Exa from "exa-js";

const exa = new Exa();

const result = await exa.search(
  "recent techniques for improving retrieval in RAG systems",
  {
    type: "auto",
    contents: { highlights: true }
  }
);

for (const item of result.results) {
  console.log(item.title, item.url);
  console.log(item.highlights);
}
```

```bash cURL theme={null}
curl -s -X POST "https://api.exa.ai/search" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $EXA_API_KEY" \
  -d '{
    "query": "recent techniques for improving retrieval in RAG systems",
    "type": "auto",
    "contents": { "highlights": true }
  }'
```

Search returns up to 10 results by default. Set `numResults` to request up to 100 results; fewer may be returned when fewer relevant pages are available. Search does not support pagination.

> **Example response**
>
> Highlights and the list below are shortened.
>
> ```json theme={null}
> {
>   "requestId": "c3174df2b9cd5afbc64cdf79f3719b19",
>   "resolvedSearchType": "",
>   "results": [
>     {
>       "id": "https://arxiv.org/html/2608.21702",
>       "title": "From Association to Causation: Improving Retrieval Precision ofRetrieval-Augmented Generation via Causal Relations and an Attention Mechanism",
>       "url": "https://arxiv.org/html/2608.21702",
>       "highlights": [
>         "Retrieval-Augmented Generation (RAG) grounds LLM generation on retrieved documents, but the standard terminal retrieval stage—dense-vector similarity, optionally followed by reranking—often returns documents that merely share keywords with the query without containing the needed information...\n..."
>       ],
>       "image": "https://arxiv.org/static/base/1.0.1/images/icons/smileybones-small.svg",
>       "favicon": "https://arxiv.org/static/browse/0.3.4/images/icons/favicon-32x32.png"
>     },
>     {
>       "id": "https://www.thoughtworks.com/en-us/insights/blog/generative-ai/four-retrieval-techniques-improve-rag",
>       "title": "Four retrieval techniques to improve RAG you need to know",
>       "url": "https://www.thoughtworks.com/en-us/insights/blog/generative-ai/four-retrieval-techniques-improve-rag",
>       "publishedDate": "2025-04-14T00:00:00.000Z",
>       "highlights": [
>         "It's not surprising, then, that we've seen a range of different approaches emerge that attempt to address RAG's limitations over the last year or so.\n..."
>       ],
>       "image": "https://www.thoughtworks.com/content/dam/thoughtworks/images/illustration/brand/tw_illustration_5.jpg"
>     }
>   ],
>   "searchTime": 1324.3,
>   "costDollars": {
>     "total": 0.007,
>     "search": {
>       "neural": 0.007
>     }
>   }
> }
> ```

Results are ranked by relevance. Each one carries metadata such as title, URL, and publication date, plus whatever you requested under `contents`.

## Writing queries

The `query` field is the only required field when using the Search API.

Write queries in natural language. Include the subject and, when useful, the kind of source and time period you want.

Queries can be broad and exploratory. `"Latest news on EU battery policy"` gives Exa enough intent to discover relevant pages; `"news"` does not. When the source type matters, name it in the query:

```text theme={null}
Recent technical articles comparing hybrid and semantic retrieval for RAG systems
Thinking…

Build a small example. Is there an EXA_API_KEY? It doesn't exist in the environment. So we can't actually run it against the API — need to note that point. Still, we can build the example and check whether it works without a key (it'll fail with an auth error, but that'll prove the plumbing is wired up correctly). Keep it lightweight: npm install exa-js in /sandbox/repo, write an example file, and run it (it'll return 401 without a key — that's fine/expected, and will serve as confirmation that the SDK is working).

Not blocked: the docs are accessible. There's no EXA_API_KEY in the environment — will mention that.

cd /sandbox/repo && npm init -y >/dev/null 2>&1 && npm install exa-js 2>&1 | tail -2
Run `npm audit` for details.

Run `npm audit` for details.
Thinking…

EXA_API_KEY isn't set in the environment. I can write an example, but can't run it live. I'll write a small sample file and note that an API key is required. Let me try writing a JS example (the SDK is already installed). Run a smoke test to confirm that the SDK loads.

File edits

1 file

Completed
Writtenexa-example.mjsView changes

/sandbox/repo/exa-example.mjs

Written content · previous contents were not recorded

// Simple Exa example: search the web and print results with highlights.
// Requires: EXA_API_KEY in the environment (get one at https://dashboard.exa.ai/api-keys)
// Run: node exa-example.mjs
import Exa from "exa-js";
const exa = new Exa(); // reads EXA_API_KEY automatically
// 1) Basic search (type "auto" picks the best strategy; up to 10 results by default)
const search = await exa.search(
"recent techniques for improving retrieval in RAG systems",
{
type: "auto",
numResults: 5,
contents: { highlights: true },
}
);
console.log(`Search took ${search.searchTime}ms, cost $${search.costDollars?.total}`);
for (const r of search.results) {
console.log(`- ${r.title}\n ${r.url}\n ${r.highlights?.[0]?.slice(0, 120)}...`);
}
// 2) Direct question answering with citations
const answer = await exa.answer(
"What is retrieval-augmented generation?",
{ text: { maxCharacters: 400 } }
);
console.log(`\nAnswer (cost $${answer.costDollars?.total}):\n${answer.text}`);
console.log("Sources:", answer.citations?.map((c) => c.url).join(", "));
Thinking…

EXA_API_KEY isn't set in the environment variables. I can't actually run this. Let me check whether EXA_API_KEY exists — the earlier grep only showed PI_GATEWAY_API_KEY. So I'll note that it can't be run without a key. As a quick smoke test, running it without the key will just result in an authentication error. Maybe just checking whether the module can be imported would be enough.

cd /sandbox/repo && node -e "import('exa-js').then(m=>console.log('SDK loads OK:', typeof m.default))" && node exa-example.mjs 2>&1 | head -5
SDK loads OK: function
SDK loads OK: function
file:///sandbox/repo/node_modules/exa-js/dist/index.mjs:3543
        throw new ExaError(
              ^

ExaError: API key must be provided as an argument or as an environment variable (EXA_API_KEY)
Thinking…

Since there's no EXA_API_KEY in this environment, I can't execute the live calls. Even so, that's not a problem — I'll note that point. I'll submit the summary.

Done — no blocking issues. Here's the summary:

What I built

/sandbox/repo/exa-example.mjs — a minimal Node.js example using the official exa-js SDK (installed via npm install exa-js):

  1. exa.search() — natural-language web search with highlights, printing titles/URLs, latency, and per-request cost
  2. exa.answer() — a direct LLM answer with citations

The SDK loads and runs fine; it correctly errors out asking for a key, since no EXA_API_KEY is set in this environment. Get a free key at https://dashboard.exa.ai/api-keys, then:

export EXA_API_KEY=your-key
node exa-example.mjs

No local services or long-running processes needed — it's a pure hosted-API call.

How pricing works

Pay-as-you-go, no subscription, charged per request against loaded credits:

ProductPrice
/search (lite/instant)$4 / 1k requests
/search (auto/fast)$7 / 1k requests
/answer$5 / 1k requests
/contents$1 / 1k pages
/monitors$15 / 1k requests
Agent API$0.012–$1.00 per fixed-effort run, or metered (~$0.10/compute unit)

Base price includes up to 10 results; extra results and AI summaries are ~$1/1k each. Free tier: $10 credits on signup, resetting to $10 monthly, no payment method required (~2,500 lite searches/month), plus a one-time $10 onboarding bonus. Every API response even includes costDollars so you can track spend per call.

Ease of management

Very easy. Single API key auth, official SDKs (exa-js/exa-py) that read EXA_API_KEY from env, clean per-request pricing with costs returned in responses, generous free tier, and good agent-friendly docs (markdown endpoints, OpenAPI spec, even an MCP server). Nothing to run locally, nothing to babysit.

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

AX Check by Gauge