The official Python SDK for Exa, the web search API for AI.
pip install exa-pyRequires Python 3.9+
from exa_py import Exa
exa = Exa(api_key="your-api-key")
# Search the web
results = exa.search(
"blog post about artificial intelligence",
type="auto",
contents={"highlights": True}
)
# Ask a question
response = exa.answer("What is the capital of France?")results = exa.search(
"machine learning startups",
contents={"highlights": True}
)results = exa.search(
"climate tech news",
num_results=20,
start_published_date="2024-01-01",
include_domains=["techcrunch.com", "wired.com"],
contents={"highlights": True}
)results = exa.search(
"What are the latest battery breakthroughs?",
type="auto",
system_prompt="Prefer official sources and avoid duplicate results",
output_schema={
"type": "object",
"properties": {
"summary": {"type": "string"},
"key_companies": {"type": "array", "items": {"type": "string"}},
},
"required": ["summary", "key_companies"],
},
)
print(results.output.content if results.output else None)for chunk in exa.stream_search(
"What are the latest battery breakthroughs?",
type="auto",
):
if chunk.content:
print(chunk.content, end="", flush=True)Search output_schema modes:
{"type": "text", "description": "..."}: return plain text inoutput.content{"type": "object", ...}: return structured JSON inoutput.content
system_prompt and output_schema are supported on every search type.
Search streaming is available via stream_search(...), which yields OpenAI-style chat completion chunks.
For type: "object", search currently enforces:
- max nesting depth:
2 - max total properties:
10
Deep search variants that also support additional_queries:
deep-litedeepdeep-reasoning
results = exa.get_contents(
["https://docs.exa.ai"],
text=True
)results = exa.get_contents(
["https://arxiv.org/abs/2303.08774"],
highlights=True
)response = exa.answer("What caused the 2008 financial crisis?")
print(response.answer)for chunk in exa.stream_answer("Explain quantum computing"):
print(chunk, end="", flush=True)from exa_py import AsyncExa
exa = AsyncExa(api_key="your-api-key")
results = await exa.search("async search example", contents={"highlights": True})See the full documentation for all features including websets, filters, and advanced options.