Exa / Neural web search
Exa tool exa-search on looot: input fields, $0.007 per call, output shape, and code to run it with curl, JavaScript or Python.
Neural or keyword web search. Send query; type (auto, fast, deep and others), numResults, category, domains and dates refine it, and contents adds page text. Returns ranked results with title, URL, date and highlights. The charge follows Exa’s reported costDollars.
- Tool id:
exa-search - Provider: Exa
- Job: Search the web and get ranked results (
web.search) - Price: $0.007 per call. A call that fails at the provider costs $0.
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
additionalQueries |
array | no | Additional query variations, deep-search types only. |
category |
string | no | Data category hint. company/people categories reject startPublishedDate/endPublishedDate/excludeDomains with a 400. |
contents |
object | no | Content options for the returned results – each requested type (highlights/text/summary) adds $0.001/page. |
endPublishedDate |
string | no | Only links published before this ISO 8601 date. |
excludeDomains |
array | no | Never these hostnames/domain paths. Rejected with a 400 alongside category company/people. |
includeDomains |
array | no | Only these hostnames/domain paths (e.g. example.com, example.com/docs, *.example.com). |
numResults |
integer | no | Results to return. The cost dial above 10 – each additional result is $0.001. |
outputSchema |
object | no | JSON schema for synthesized output (root type “text” or “object”). Adds ~2s synthesis latency. Depth 2, max 10 top-level properties. |
query |
string | yes | The query string for the search. Example: “Latest developments in LLM capabilities” |
startPublishedDate |
string | no | Only links published after this ISO 8601 date. |
systemPrompt |
string | no | Additional instructions guiding generated output/agent behavior (source preferences, novelty/duplication constraints). |
type |
string | no | auto (default) balances quality/speed; fast reduces latency; instant optimizes for minimum response time; deep-lite/deep/deep-reasoning trade latency for research depth (~1s/450ms/250ms/4-15s/12-40s respectively). |
Output
Shape of the run’s result, checked against 49 real answers:
{ results: { id, url, image, title, author, snippet, highlights: string[], publishedDate }[], requestId, searchTime, costDollars: { total, search: { neural } }, resolvedSearchType }
Run it
Every call needs your API token in LOOOT_TOKEN; Sign in shows how to get one. Each run also needs a new idempotency key, so a retry never pays twice. With wait: 30 the answer comes back inline when the run ends within 30 seconds. Otherwise you get the running run back: poll GET /v1/runs/<runId>.
Example input with placeholder values:
curl -X POST "https://api.looot.ai/v1/runs" \
-H "Authorization: Bearer $LOOOT_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"endpointId":"exa-search","input":{"query":"Latest developments in LLM capabilities"},"wait":30}'const response = await fetch("https://api.looot.ai/v1/runs", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.LOOOT_TOKEN}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
endpointId: "exa-search",
input: {
query: "Latest developments in LLM capabilities",
},
wait: 30,
}),
});
const run = await response.json();
console.log(run.status, run.result);import os
import uuid
import requests
response = requests.post(
"https://api.looot.ai/v1/runs",
headers={
"Authorization": f"Bearer {os.environ['LOOOT_TOKEN']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"endpointId": "exa-search",
"input": {
"query": "Latest developments in LLM capabilities",
},
"wait": 30,
},
timeout=90,
)
run = response.json()
print(run["status"], run.get("result"))To let looot pick among every provider of this job instead, send job:web.search as endpointId; see the job page.