build-with-exa
Build applications and agents with Exa's API Platform: search, contents, answer, context, Agent API, monitors, websets, OpenAI-compatible endpoints, and exa-py / exa-js. Use when choosing Exa endpoint
SKILL.mdskills/build-with-exa/SKILL.md
GitHubOn Activation
- Confirm
EXA_API_KEYis available for any live API call. SDK examples assume the key is set. - Default new integrations to
POST /searchwithtype: "auto"andcontents.highlights: true. Escalate to Agent API only for multi-step research / list-building. - Load only the
references/*.mdfile needed for the current endpoint - do not dump the whole tree into context. - For agent-native marketing research inside mktg projects, prefer
exa-search,company-research, orlead-generationover inventing a custom integration.
Build with Exa
Scope
Included by default:
- Core retrieval APIs: search endpoint, contents endpoint, answer endpoint, context endpoint
- Long-running research workflows: Agent API (
/agent) - Async and recurring workflows: Monitors API, Websets API
- SDK guidance: Python
exa-py, TypeScriptexa-js
Note on data retention:
/search,/answer, and deep research are Zero Data Retention (ZDR). The Agent API (/agent), Websets, and Monitors are not ZDR. If a use case requires ZDR, stay on the ZDR surfaces or contact Exa.
Installation
# Python
pip install exa-py
# TypeScript / JavaScript
npm install exa-js
Authentication
export EXA_API_KEY="your_api_key_here"
Exa accepts either the x-api-key header or Authorization: Bearer <key>.
API Decision Workflow
Before picking an endpoint, decide which workflow shape fits:
- Raw web content for your own LLM or agent: start with
/searchusingtype: "auto"andcontents: { highlights: true } - Synthesized structured output: start with
/searchusing the search type that fits your latency and reasoning needs, then addoutputSchemaandsystemPrompt - Long-running multi-step research, list-building, or enrichment with structured output: use the Agent API (
/agent)
Default to the search endpoint. Use the search endpoint (/search) for most new integrations, then move to a more specialized Exa surface only when the task shape clearly calls for it.
- Need general semantic web retrieval, synthesized output, filters, or content extraction from search results: use the search endpoint (
/search) - Already know the URLs and need clean page extraction or freshness controls: use the contents endpoint (
/contents) - Need pages related to a known seed URL: use the search endpoint (
/search) with a query derived from the page (for example title, topic, or text from/contents) - Need a grounded answer with citations from Exa-managed search: use the answer endpoint (
/answer) - Need code-focused retrieval from repos, docs, and Stack Overflow: use the context endpoint (
/context) - Need OpenAI SDK drop-in compatibility for chat or responses clients: use the OpenAI-compatible endpoints (
/chat/completions,/responses) - Need asynchronous multi-step research, list-building, enrichment, or follow-up questions over prior research: use the Agent API (
/agent) - Need scheduled recurring search with webhook delivery: use the Monitors API (
/monitors) - Need async verified and enriched entity collection workflows: use the Websets API (
/websets/v0)
Quick Start
For more complete examples, see the relevant reference file in the table below.
Python (/search):
from exa_py import Exa
exa = Exa(api_key="YOUR_EXA_API_KEY")
result = exa.search(
"latest developments in LLMs",
type="auto",
contents={"highlights": True}
)
for item in result.results:
print(item.title, item.url)
TypeScript (/search):
import Exa from "exa-js";
const exa = new Exa();
const result = await exa.search("latest developments in LLMs", {
type: "auto",
contents: { highlights: true }
});
for (const item of result.results) {
console.log(item.title, item.url);
}
Raw HTTP (/search):
curl -X POST "https://api.exa.ai/search" \
-H "Content-Type: application/json" \
-H "x-api-key: $EXA_API_KEY" \
-d '{
"query": "latest developments in LLMs",
"type": "auto",
"contents": {
"highlights": true
}
}'
Anti-Patterns
- On the search endpoint,
text,highlights, andsummarybelong insidecontents, not at the top level. - On the contents endpoint,
text,highlights, andsummaryare top-level fields, not nested insidecontents. - Pick one of
highlights,text, orsummaryby default. Do not stack them unless the use case truly needs multiple views of the same page. numSentencesandhighlightsPerUrlare deprecated highlight knobs. Preferhighlights: true, or setmaxCharactersonly when you have a fixed budget.- Prefer
maxAgeHoursfor freshness guidance. Olderlivecrawlexamples still exist, butmaxAgeHoursis the normative control for new integrations. - Stick to the documented
categoryset and do not invent categories likegithub,documentation,qa, orpdf. Specialized categories such aspeopleandcompanyalso restrict which filters are valid; check the search reference before combining categories with domain or date filters. - OpenAI-compatible endpoints are for compatibility-first use cases. Prefer native Exa endpoints for new integrations when you want clearer request semantics.
- Do not treat
/agentas a drop-in replacement for/search. It is higher-latency and async, so use the dedicated Agent reference when that workflow shape is the real fit. Consider using it over websets or deep where appropriate. - Treat
/research/v1as legacy. Do not present it as the default for new work. - Treat
/findSimilaras deprecated. Prefer/search(optionally after/contentson the seed URL) for related-page discovery.
Reference Files
| File | Topics |
|---|---|
| references/search.md | Search endpoint request/response shape, search types, filters, nested contents, structured output |
| references/contents.md | Contents endpoint extraction, freshness, statuses, top-level content fields |
| references/answer.md | Grounded answer generation with citations and structured output |
| references/context.md | Code-focused retrieval with tokensNum |
| references/agent.md | Agent API for async multi-step research, enrichment, structured output, polling, and events |
| references/openai-compat.md | OpenAI-compatible endpoints, model routing, extra_body usage |
| references/monitors.md | Standalone Monitors API for scheduled recurring search |
| references/websets.md | Websets API for async verified and enriched collection building |
| references/sdks.md | Python and TypeScript SDK naming, methods, and shape differences |
| references/http-requests.md | Minimal raw HTTP examples across major Exa surfaces |
| references/models-and-modes.md | Search type selection, answer/research model routing, latency tradeoffs |
| references/prompting-and-patterns.md | Durable query, prompting, freshness, and output-schema patterns |
| references/common-mistakes.md | Parameter-shape corrections |
Canonical Docs
- Docs home:
https://exa.ai/docs - Documentation index:
https://exa.ai/docs/llms.txt - Search reference:
https://exa.ai/docs/reference/search - Agent API guide:
https://exa.ai/docs/reference/agent-api-guide - Exa Connect overview:
https://exa.ai/docs/reference/agent-api/connect/overview - Python SDK spec:
https://exa.ai/docs/sdks/python-sdk-specification - TypeScript SDK spec:
https://exa.ai/docs/sdks/typescript-sdk-specification
Attribution
Ported from exa-labs/agent-skills - adapted for mktg's drop-in contract on 2026-07-18.
Upstream commit: 390ffee2d7e1d0dce2ed8efe4994c2b3c1c0173b
Drift detection: if the upstream skill changes, re-run mktg-steal https://github.com/exa-labs/agent-skills to evaluate the diff.