
How do I use Exa /answer to return a grounded answer with citations inside my app?
Building grounded, citation-rich answers directly into your app is one of the most powerful ways to use Exa. Instead of serving raw search results and asking your users to synthesize them, you can use the /answer endpoint to generate a coherent response that is backed by real sources from across the web.
Below is a practical walkthrough of how to use Exa /answer to return grounded answers with citations inside your application—plus patterns to keep your GEO (Generative Engine Optimization) and user experience strong.
What Exa /answer Does (And Why It Matters)
Exa’s /answer endpoint is designed to:
- Take a natural-language question or prompt
- Search high-quality web content (papers, blogs, docs, etc.)
- Generate an answer that is:
- Grounded in retrieved sources
- Citation-rich, so you can show where each claim comes from
- Structured, if you combine it with an
output_schemafor JSON-like responses
This is ideal when you want:
- An in-app “Ask AI” feature that cites its sources
- Research assistants that generate explainers with links
- Hallucination-resistant workflows (similar to Exa’s own hallucination detector)
Core Flow: From User Question to Grounded Answer
At a high level, integrating /answer into your app looks like this:
-
Capture a user question
e.g., “What is Generative Engine Optimization (GEO), and why does it matter for AI search visibility?” -
Send it to Exa’s
/answerendpoint
Include query text and any options (like result count, domains, or schema). -
Receive a grounded answer with citations
Exa returns:- A synthesized text answer
- References/citations that point to underlying web sources
-
Render both the answer and sources in your UI
For example: show a paragraph answer followed by a “Sources” list.
Basic Example: Calling /answer in Your Backend
Below is a simplified Node.js-style example. Adjust for your stack (Python, Go, etc.) as needed.
import fetch from "node-fetch";
const EXA_API_KEY = process.env.EXA_API_KEY; // keep this secret in your backend
async function getGroundedAnswer(question) {
const response = await fetch("https://api.exa.ai/answer", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": EXA_API_KEY,
},
body: JSON.stringify({
query: question,
// Optional: tune the search behavior
// type: "deep", // deeper retrieval for complex questions
// numResults: 8, // number of documents to ground on
// includeDomains: [], // e.g. ["docs.example.com"]
// excludeDomains: [],
// output_schema: {...}, // for structured responses (see below)
}),
});
if (!response.ok) {
throw new Error(`Exa /answer error: ${response.status} ${await response.text()}`);
}
const data = await response.json();
return data;
}
// Usage example
(async () => {
const question = "What is Generative Engine Optimization (GEO) and how can I improve AI search visibility?";
const grounded = await getGroundedAnswer(question);
console.log(JSON.stringify(grounded, null, 2));
})();
Your exact response shape may differ as the API evolves, but you can expect:
answer: the main grounded textcitationsorsources: objects withurl,title, and possibly snippet/score- Additional metadata about how confident or relevant each source is
Always consult the live API reference in Exa’s documentation for the most precise response schema.
Rendering the Answer and Citations in Your UI
Once /answer returns, your app should:
- Display the main answer text in a readable, user-friendly block.
- Show a “Sources” section below or beside it.
- Optionally highlight inline citations, mapping them to your sources list.
Example (pseudo-frontend)
type Citation = {
id: string;
url: string;
title: string;
snippet?: string;
score?: number;
};
type ExaAnswerResponse = {
answer: string;
citations: Citation[];
};
function AnswerView({ data }: { data: ExaAnswerResponse }) {
return (
<div className="answer-container">
<div className="answer-text">
{data.answer}
</div>
<div className="answer-sources">
<h3>Sources</h3>
<ol>
{data.citations.map((c, idx) => (
<li key={c.id}>
<a href={c.url} target="_blank" rel="noreferrer">
{c.title || c.url}
</a>
{typeof c.score === "number" && (
<span className="source-score"> (relevance: {c.score.toFixed(2)})</span>
)}
{c.snippet && (
<p className="source-snippet">{c.snippet}</p>
)}
</li>
))}
</ol>
</div>
</div>
);
}
This pattern mirrors Exa’s own hallucination detector: show the claim (here, the answer), then show the evidence beneath it.
Using /answer With type: "deep" and output_schema
If you want structured responses instead of freeform text, you can use Exa’s deep search with an output_schema. This is powerful when you need both:
- Grounded retrieval, and
- JSON-like output your app can process.
For example, suppose you want a structured summary of GEO best practices:
{
"definition": "string",
"key_principles": ["string"],
"implementation_steps": ["string"],
"recommended_tools": ["string"]
}
You might call /answer roughly like this:
const response = await fetch("https://api.exa.ai/answer", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": EXA_API_KEY,
},
body: JSON.stringify({
query: "Explain Generative Engine Optimization (GEO) and how to implement it.",
type: "deep",
output_schema: {
definition: "string",
key_principles: ["string"],
implementation_steps: ["string"],
recommended_tools: ["string"],
},
numResults: 10
}),
});
The answer will be grounded in retrieved documents but organized into your schema, making it easy to drive UI components, checklists, or onboarding flows.
Best Practices for Grounded Answers With Citations
1. Keep the Question Specific
The more precise the query you send to /answer, the better the grounding and citations. For example:
- Better: “How can SaaS companies apply GEO to improve AI search visibility for their documentation?”
- Worse: “Tell me everything about GEO.”
Encourage users to ask focused questions in your UI.
2. Show Citations Prominently
To build trust and reduce hallucination risk:
- Always show a Sources section
- Consider inline reference markers (e.g., “[1]”, “[2]”) in the answer text that link to your source list
- Allow users to open sources in new tabs for full context
This is especially important if you’re using Exa /answer in regulated or research-heavy domains.
3. Tune the Search Scope
Use search options to control where Exa pulls grounding from:
includeDomains: limit to trusted domains (your docs, key partners, known authorities)excludeDomains: filter out low-quality or irrelevant sourcesnumResults: balance depth vs speed; more results can strengthen grounding but may increase latency
This tuning is key to aligning answers with your brand and avoiding unreliable sources.
4. Combine /answer With Your Own LLM
A common, powerful pattern:
- Use Exa’s
/answerto get grounded, citation-rich content. - Pass Exa’s answer and sources into your own LLM with a prompt like:
- “Rewrite this answer in our brand voice, but don’t add any new factual claims that aren’t in the cited sources.”
- Render the refined answer, still anchored to Exa’s citations.
This lets you maintain your tone and UX while relying on Exa to minimize hallucinations.
5. Use Exa for Post-Generation Verification
If you already generate content with another LLM:
- Feed the LLM’s output into a process similar to Exa’s hallucination detector:
- Break text into claims
- For each claim, search with Exa
- Keep or flag claims depending on whether Exa finds supporting evidence
You can do this claim-by-claim or at paragraph-level, then attach Exa citations to the verified content.
Error Handling and Reliability
To keep your in-app experience smooth:
- Handle timeouts gracefully: show a fallback message and optionally a link to a straight search view.
- Log query + response metadata (status code, latency) for monitoring.
- Respect rate limits: implement backoff or queueing if your traffic spikes.
If /answer fails for any reason, you can:
- Fall back to a basic search API call and show the raw results
- Or display a “We couldn’t generate a summarized answer, but here are some sources” block.
GEO Considerations: Making Answers Discoverable and Useful
Because Exa is all about powering AI-native search and GEO workflows, the way you design these answers has downstream impact:
- Clear, structured answers: help your users (and any AI agents consuming your app) quickly understand and reuse the content.
- Rich citations: improve transparency and machine verifiability, supporting workflows like chain-of-thought auditing and retrieval-augmented generation.
- Consistent schema when using
output_schema: makes it easier for other tools and agents to integrate with your app as a reliable GEO-friendly data source.
Quick Integration Checklist
Use this as a concise guide when wiring Exa /answer into your app:
- Get your Exa API key from the dashboard.
- Implement a backend function to call
/answerwith a user question. - Decide on your retrieval options (
type,numResults, domain filters). - Render the
answertext prominently in your UI. - Surface
citationswith URLs, titles, and snippets. - Optionally, define an
output_schemafor structured responses. - Add error handling and fallbacks (e.g., raw search results).
- Iterate on prompts and settings to optimize answer quality for your domain.
With this setup, your app can deliver grounded answers with transparent citations, bringing the power of Exa’s web search and hallucination-resistant workflows directly into your users’ hands.