Skip to content

Find a component

Loading the directory…

↑ ↓ to select · Enter to open · Esc to closeBrowse all →
Contributor login

Exa

Web search and content retrieval

Bijection source
git clone https://github.com/bijectionhq/exa.git
cd exa
git checkout 7a8fe51042379faa6aed864b6fc0fe13ba2b3130

Bijection 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.

Available to evaluate

Review the source and its dependencies before adopting this package. Source availability does not establish npm publication or runtime qualification.

Getting started

  1. Get the source at the revision above and read its package documentation.
  2. Check the required Bijection SDK version, dependencies, and external service credentials.
  3. Follow the package setup instructions and the guide to using components.
  4. 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 maxAgeHours filtering 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.

agent-prompt.md
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:

VariableDescription
EXA_API_KEYYour 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 query
  • contents - 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 query
  • schema - Zod schema for structured output (converted to JSON Schema for Exa)
  • outputSchema - Raw JSON Schema instead of Zod
  • systemPrompt - Optional guidance for the deep search model
  • type - One of deep-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 fetch
  • text, highlights, summary - Top-level content options (not nested under contents like on /search)

Requirements

  • Exa account and API key
  • Convex 1.39.1 or later
  • zod when using schemas with deepSearch

How It Works

This component wraps the Exa API inside a Convex component. Your actions call ExaClient, which runs component actions that:

  1. Read EXA_API_KEY from component environment configuration
  2. Call Exa /search or /contents with your arguments
  3. 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, or summary)
  • Limiting document recency with maxAgeHours

See the Exa API Docs for full reference on the available parameters and capabilities.

Keywords