---
title: "Exa / Neural web search"
description: "Exa tool exa-search on looot: input fields, $0.007 per call, output shape, and code to run it with curl, JavaScript or Python."
sidebar:
  hidden: true
---

{/* Generated by scripts/generate-api-reference.mjs from data/api-reference.json. Do not edit. */}

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](/providers/exa)
- **Job:** [Search the web and get ranked results](/reference/jobs/web-search) (`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:

```txt
{ 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](/get-started/sign-in#use-the-token-in-scripts-and-agents) 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:

<CodeGroup>

```bash curl
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}'
```

```js JavaScript
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);
```

```python Python
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"))
```

</CodeGroup>

To let looot pick among every provider of this job instead, send `job:web.search` as `endpointId`; see [the job page](/reference/jobs/web-search).
