# Exa Contents API

[Tools](/tools) / [Search And Extraction](/tools/category/search-and-extraction) / [Exa Contents](/tools/exa/contents)

Fetch clean, LLM-ready content for a list of URLs.

Data from Exa.

Category: [Search And Extraction](/tools/category/search-and-extraction)

## Price

$0.00135 per successful call ≈ 740 calls with the $1 signup credit.

Known example parameters are illustrative and may be incomplete; inspect all required inputs before running.

## Discover

```sh
curl https://keepbal.com/apis/v1/discover -H 'Authorization: Bearer YOUR_KEEPBAL_KEY' -H 'Content-Type: application/json' -d '{"query":"Exa"}'
```

## Inspect

```sh
curl https://keepbal.com/apis/v1/inspect -H 'Authorization: Bearer YOUR_KEEPBAL_KEY' -H 'Content-Type: application/json' -d '{"publicId":"exa/contents"}'
```

## curl

```sh
curl https://keepbal.com/apis/v1/exa/contents \
  -H 'Authorization: Bearer YOUR_KEEPBAL_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"body":{"urls":["https://example.com"],"text":true}}'
```

## MCP run_tool

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run_tool",
    "arguments": {
      "tool": "exa/contents",
      "input": {
        "body": {
          "urls": [
            "https://example.com"
          ],
          "text": true
        }
      }
    }
  }
}
```

## Python

```python
import json, os, requests

# Inspect first and replace input_data with the required parameters.
input_data = json.loads("{\"body\":{\"urls\":[\"https://example.com\"],\"text\":true}}")
response = requests.post(
    "https://keepbal.com/apis/v1/exa/contents",
    headers={"Authorization": "Bearer " + os.environ["KEEPBAL_API_KEY"]},
    json=input_data,
)
response.raise_for_status()
print(response.json())
```

## Errors and billing

Failed provider calls are not charged. HTTP 400 invalid_request means invalid JSON or parameters, including missing pathParams. HTTP 401 missing_api_key or invalid_api_key means authentication is required. HTTP 402 insufficient_credits means insufficient balance; top up before retrying. HTTP 503 provider_unavailable means the provider is unavailable. A pending run can settle later; poll GET /apis/v1/runs/{id} instead of starting another execution.

## How much does this API cost?

$0.00135 per successful call

## How do I start?

Create a KeepBal account with $1 free credit, obtain an API key, and inspect this tool before running it.

## Related tools

- [Exa Search](/tools/exa/search) — Search the web and extract contents from the results. — Variable: provider price plus 35%
- [Chatgpt Ask](/tools/cloro/chatgpt-ask) — Get ChatGPT&#39;s consumer-app answer to a prompt, with cited sources, in a chosen country. — Variable: provider price plus 35%
- [Copilot Ask](/tools/cloro/copilot-ask) — Get Copilot&#39;s consumer-app answer to a prompt, with cited sources, in a chosen country. — Variable: provider price plus 35%
- [Gemini Ask](/tools/cloro/gemini-ask) — Get Gemini&#39;s consumer-app answer to a prompt, with cited sources, in a chosen country. — Variable: provider price plus 35%
- [Google AI Mode](/tools/cloro/google-ai-mode) — Get Google AI Mode&#39;s answer to a prompt, with cited sources and product cards. — Variable: provider price plus 35%
- [Google News](/tools/cloro/google-news) — Search Google News as a user in a chosen country and get the articles as JSON. — Variable: provider price plus 35%



[Start with $1 free credit](/sign-up)

[Tools](/tools) · [MCP documentation](/docs/mcp)
