Exa has released Agent Ultra, the highest effort level of its Exa Agent API. It is built for research that must run to exhaustion: large list building, entity enrichment, and questions that need thousands of sources. Exa team reports that Ultra beats Opus 5.5, GPT-6 Astra, and Perplexity Agent, each at maximum effort, on 4 research benchmarks.
Is it deployable? Yes, as a hosted API. Agent Ultra is live today on the Exa API by setting effort: "ultra". It is not open weights and cannot be self-hosted.
What is Exa Agent Ultra?
Exa Agent splits a task into subtasks and assigns subagents to research several domains at once. It routes frontier models to steps that need them and faster models where those are enough. Ultra is the mode that spends the most compute. According to the Agent Ultra docs, it runs longer than any other effort to return the most complete results.
Ultra runs typically finish complex tasks in about 30 minutes. Very hard tasks can take up to 3 hours.
/* ———- PANE 2 ———- */
var B=[
{n:’WANDR’,m:’Soft recall’,d:’Wide and deep research: find a large list of qualifying entities with evidence-backed fields. Up to 200 tasks.’,v:[81.4,72.3,26.0,40.1],pct:1},
{n:’DeepSearchQA’,m:’F1′,d:’Multi-step web research with exhaustive answer sets. Up to 200 tasks.’,v:[93.9,77.6,85.3,89.7],pct:1},
{n:’WideSearch’,m:’Row-level F1′,d:’Broad information gathering into tables. Up to 100 tasks.’,v:[58.9,51.6,54.7,56.0],pct:1},
{n:’Company Find-All’,m:’Avg. passing entities per task’,d:’GTM intelligence: how many qualifying companies each system finds. Up to 100 tasks.’,v:[2451,146,113,98],pct:0}
];
var names=[‘Agent Ultra’,’Opus 5.5′,’GPT-6 Astra’,’Perplexity Agent’],bi=0;
chips(‘bs’,function(c){bi=+c.dataset.b;drawBars()});$(‘gain’).onchange=drawBars;
function drawBars(){
var b=B[bi],mx=b.pct?100:Math.max.apply(null,b.v),h=””;
names.forEach(function(n,i){var g=(i>0&&$(‘gain’).checked)?’Ultra +’+((b.v[0]/b.v[i]-1)*100).toFixed(1)+’%‘:”;
h+=’
‘});
$(‘bars’).innerHTML=h;
$(‘bmeta’).innerHTML=’Metric: ‘+b.m+’. ‘+b.d+’ Graded task counts vary by provider.’+(b.pct?”:’ Bars scaled to the top score.’);
setTimeout(function(){[].forEach.call($(‘bars’).querySelectorAll(‘.fill’),function(f){f.style.width=f.dataset.w+’%’})},30);resize();
}
drawBars();
/* ———- PANE 3 ———- */
var si=0,sraf=null;
chips(‘sc’,function(c){si=+c.dataset.s;if(si===2&&+$(‘dur’).value===0){$(‘dur’).value=1800;js()}});
function js(){var c=+$(‘cost’).value,d=+$(‘dur’).value;$(‘cv’).textContent=”$”+c;$(‘dv’).textContent=d?d.toLocaleString(‘en-US’)+’s (‘+Math.round(d/60)+’ min)’:’not set’;
var s=”{n “query”: “Find all companies building browser automation tools in the United States.”,n “effort”: “ultra”,n “budget”: {n “maxCostDollars”: “+c+’‘+(d?’,n “maxDurationSeconds”: ‘+d+’‘:”)+’n }n}’;
$(‘json’).innerHTML=’POST https://api.exa.ai/agent/runsn’+s;resize()}
$(‘cost’).oninput=js;$(‘dur’).oninput=js;js();
$(‘sim’).onclick=function(){
cancelAnimationFrame(sraf);var c=+$(‘cost’).value,d=+$(‘dur’).value||10800,cap=Math.min(d,10800);
var endT,endC,reason,msg;
if(si===0){endT=Math.min(cap*.55,1800);endC=c*.45;reason=’schema_satisfied’;msg=’The agent finished the task under both limits. Runs that finish early cost less than the cap.’}
else if(si===1){endT=Math.min(cap*.7,5400);endC=c;reason=’budget_reached’;msg=’Spend reached maxCostDollars. The run completes and returns what it found.’}
else if(si===2){endT=cap;endC=c*.8;reason=’time_limit_reached’;msg=’Elapsed time reached maxDurationSeconds (Ultra-only control). The run returns what it found.’}
else {endT=Math.min(cap*.4,1200);endC=c*.3;reason=’stopped’;msg=’You called POST /agent/runs/{id}/stop. You keep results so far and are billed up to the stop.’}
$(‘rs’).textContent=”running…”;var st=performance.now();
(function f(n){var u=Math.min(1,(n-st)/2600);$(‘cf’).style.width=(endC/c*100*u)+’%’;$(‘tf’).style.width=(endT/cap*100*u)+’%’;
$(‘cs’).textContent=”$”+(endC*u).toFixed(2)+’ / $’+c;$(‘ts’).textContent=Math.round(endT*u/60)+’ min / ‘+Math.round(cap/60)+’ min’+(+$(‘dur’).value?”:’ (no time cap set)’);
if(u<1)sraf=requestAnimationFrame(f);else{$(‘rs’).textContent=reason;$(‘cap3’).textContent=msg}})(st);
};
})();


