Exa
Web search and content retrieval
git clone https://github.com/bijectionhq/exa.git
cd exa
git checkout 7a8fe51042379faa6aed864b6fc0fe13ba2b3130Bijection repository access is required. Request access.
Description
Web search and content retrieval
Explore the package README for API concepts, configuration, and examples. Check the Bijection source for adaptation-specific setup.
Review the source and its dependencies before adopting this package. Source availability does not establish npm publication or runtime qualification.
Getting started
- Get the source at the revision above and read its package documentation.
- Check the required Bijection SDK version, dependencies, and external service credentials.
- Follow the package setup instructions and the guide to using components.
- Exercise the component in your deployment according to your project’s verification rules.
Open source
Maintained source: bijectionhq/exa. Based on exa-labs/exa-convex. License: Apache-2.0. Consult the repository for license terms, notices, and contributor attribution.
From the upstream publisher
Convex component for web search and content extraction with Exa
Explore the demo ↗Upstream overview
From the upstream package documentation.
The Exa component brings real-time web intelligence to Convex applications through the Exa API. It provides three core functions: web search with optional highlights, structured deep search, and direct URL content fetching. Developers can power AI agents, research workflows, content monitoring, and knowledge-base updates with fresh web context in just a few backend calls.
Use cases
From the upstream package documentation.
- AI agents and assistants: Give LLM-powered features fresh web context for companies, products, markets, news, and user-specific research
- Structured research workflows: Turn broad web searches into typed, schema-validated outputs for funding rounds, product launches, industry reports, and competitive analysis
- Content monitoring: Watch domains, topics, or recent activity windows with
maxAgeHoursfiltering for alerts, dashboards, and internal workflows - Knowledge base enrichment: Pull content from trusted URLs to keep docs, datasets, and internal context up to date with external sources
- News and market intelligence: Search recent coverage, extract highlights, and summarize relevant articles for feeds, briefings, and reports
How it works
From the upstream package documentation.
The component runs Exa from your Convex backend through the ExaClient class. Add it to your Convex app, set EXA_API_KEY, and create an ExaClient instance pointed at your component configuration.
Use search() for web search with optional highlights, summaries, or extracted text; deepSearch() for structured research with typed outputs; and contents() to fetch content from specific URLs. Each method runs as a Convex action, so your Exa API key stays server-side.
For schema-based research, deepSearch() converts your Zod schema into JSON Schema for Exa’s deep search API, then returns typed results that fit naturally into the rest of your Convex functions.
Upstream package FAQ
What types of web searches does the Exa component support?
The Exa component supports semantic AI-powered web searches that understand intent and context rather than just keyword matching. It's designed for finding relevant, high-quality content for AI applications, research, and knowledge extraction rather than traditional search engine results.
Can I extract content from any URL using this component?
The Exa component provides URL fetching and content extraction capabilities that return clean, structured content suitable for AI processing. The extraction focuses on main content and removes navigation, ads, and other page elements to provide usable data for RAG and agent systems.
How do I use Exa search results in my Convex database?
After performing searches or content extraction with the Exa component in Convex actions, you can store the results in your Convex database using mutations. This enables you to build searchable knowledge bases, cache research results, or feed data into vector search systems.
What's the difference between Exa and traditional web scraping?
The Exa component uses AI-powered semantic search to find relevant content rather than scraping predetermined websites. It provides clean, structured results optimized for AI consumption, handles content extraction automatically, and focuses on finding the most relevant information for specific queries.
Use with agents and CLI
Give your coding agent the component’s source identity and setup guidance.
Help me integrate Exa with Bijection.
Read: https://bijection.com/components/exa/SKILL.md
Check SDK compatibility and dependency availability.
Follow this project's execution and verification rules.Upstream README.md
View repository ↗Documentation from exa-labs/exa-convex, recorded October 23, 2026. APIs and setup may differ in the Bijection adaptation.
convex-exa
Web search and content extraction for Convex applications. Search the web, pull clean page content, and return structured answers.
Quick Start
1. Install the Component
npm install @exalabs/convex-exa zod
zod is required when you pass a Zod schema to deepSearch.
2. Configure Convex
Add the component to your convex/convex.config.ts:
import { defineApp } from "convex/server";
import { v } from "convex/values";
import exa from "@exalabs/convex-exa/convex.config";
const app = defineApp({
env: {
EXA_API_KEY: v.string(),
},
});
app.use(exa, {
name: "exa",
env: {
EXA_API_KEY: app.env.EXA_API_KEY,
},
});
export default app;
3. Set Up Environment Variables
Add this to your Convex Dashboard → Settings → Environment Variables:
| Variable | Description |
|---|---|
EXA_API_KEY | Your Exa API key |
You can also set it from the CLI: npx convex env set EXA_API_KEY <your-key>.
4. Use the Component
import { action } from "./_generated/server";
import { ExaClient } from "@exalabs/convex-exa";
import { components } from "./_generated/api";
import { z } from "zod";
const exa = new ExaClient(components.exa);
export const searchNews = action({
handler: async (ctx) => {
return await exa.search(ctx, {
query: "recent llm launches",
contents: {
highlights: true,
maxAgeHours: 24,
},
});
},
});
export const summarizeFunding = action({
handler: async (ctx) => {
return await exa.deepSearch(ctx, {
query: "recent AI startup funding announcements",
systemPrompt: "Prefer official sources and avoid duplicate reporting.",
schema: z.object({
summary: z.string(),
companies: z.array(z.string()),
}),
});
},
});
export const fetchKnownPage = action({
handler: async (ctx) => {
return await exa.contents(ctx, {
urls: ["https://exa.ai/docs"],
highlights: true,
maxAgeHours: 12,
});
},
});
API Reference
search(ctx, args)
Run Exa /search with type: "auto" by default. Use for general retrieval; pass nested contents when you want highlights or text on result URLs.
await exa.search(ctx, {
query: "battery recycling policy changes in the EU",
contents: {
highlights: true,
},
});
Parameters:
query- Search querycontents- Optional nested options for text, highlights, summary,maxAgeHours, etc.- Other fields are forwarded to the Exa search API (filters,
numResults,type, etc.)
deepSearch(ctx, args)
Run Exa /search with type: "deep" by default. Use when you want structured or synthesized output.
await exa.deepSearch(ctx, {
query: "Compare recent frontier model launches",
schema: z.object({
summary: z.string(),
models: z.array(z.string()),
}),
});
Parameters:
query- Search queryschema- Zod schema for structured output (converted to JSON Schema for Exa)outputSchema- Raw JSON Schema instead of ZodsystemPrompt- Optional guidance for the deep search modeltype- One ofdeep-lite,deep,deep-reasoning
Returns: Exa search response; structured fields follow your schema when provided
contents(ctx, args)
Fetch content for URLs you already know via Exa /contents.
await exa.contents(ctx, {
urls: ["https://exa.ai/docs"],
highlights: true,
maxAgeHours: 12,
});
Parameters:
urls- URLs to fetchtext,highlights,summary- Top-level content options (not nested undercontentslike on/search)
Requirements
- Exa account and API key
- Convex 1.39.1 or later
zodwhen using schemas withdeepSearch
How It Works
This component wraps the Exa API inside a Convex component. Your actions call ExaClient, which runs component actions that:
- Read
EXA_API_KEYfrom component environment configuration - Call Exa
/searchor/contentswith your arguments - Return typed results to your Convex action
The API key stays in Convex env—not in client-visible code.
Development
Building the Component
To build the component locally:
# Install dependencies
npm install
cd example && npm install && cd ..
# Build with Convex codegen (generates component API)
npm run build:codegen
# Or just build TypeScript
npm run build:esm
# Run tests
npm test
The component requires a Convex deployment to generate proper component API types (_generated/component.ts).
Example App
Work against a live deployment with the example app:
npm run dev
This runs the example Convex backend and rebuilds the component when src/ changes.
See example/README.md for a walkthrough of the example app, which demonstrates:
searchNews: Retrieve general web results based on queries.deepResearch: Perform structured and schema-driven deep search.fetchKnownPage: Extract contents from a specific, known URL.
These example actions highlight key parameters you’ll likely want to adjust in your own application, such as:
- Filtering by domain
- Including or excluding text via text filters
- Setting the number of results to return
- Choosing a search mode
- Selecting a content mode (
highlights,text, orsummary) - Limiting document recency with
maxAgeHours
See the Exa API Docs for full reference on the available parameters and capabilities.