Implementation Guide

Build GTM workflows with Exa's APIs.

Data Enrichment

Research a single company (“Research Acme Corp”) or a person (“Research Jane Doe”) in one API call. Exa responds with structured data in your specified schema.

Making a request

Call Exa's search endpoint with these parameters:

FieldHow to use
queryWhat you want to search about.
typeChoose between "deep" (4-20s) for faster, validated enrichments or "deep-reasoning" (12-40s) when accuracy matters more than speed.
outputSchemaHow Exa will format the output. Define the fields you want back, where each field's description is the prompt that tells Exa what to return. Examples enrichments included below.
systemPrompt (optional)Helps guide the search with additional context and rules.

Here's a complete call combining the four parameters:

import Exa from "exa-js";
const exa = new Exa(process.env.EXA_API_KEY!);

const result = await exa.search("Research Acme Corp", {
  type: "deep",
  // Optional: encode rules and judgment criteria
  systemPrompt:
    "You are researching companies for a B2B platform that sells sales intelligence to RevOps teams. The seller's ICP is companies with 50-500 employees that use HubSpot.",
  outputSchema: {
    type: "object",
    required: ["company_name"],
    properties: {
      // Pick any enrichments from the table below
      company_name: {
        type: "string",
        description: "Most commonly-used company name",
      },
      annual_revenue: {
        type: "integer",
        description: "Estimated annual revenue in dollars",
      },
    },
  },
});

console.log(result.output.content);

Suggested Enrichments

Below are suggested enrichments. Rename and reshape them to fit your product. Keep the wording where it fits and add creative fields freely.

Company Firmographics

If you're doing outbound prospecting or account research, add any of these to outputSchema.properties.

Suggested FieldTypeOutputSchema Description
company_namestringMost commonly-used company name
legal_namestringFull legal company name
taglinestringCompany tagline or slogan
product_descriptionstringProduct description in 8 words or less
founding_storystringTwo sentence founding story
year_foundedintegerYear the company was founded
headquartersstringCity and country of headquarters
headcountintegerEstimated number of employees
competitorsstring[]Array of competitor company names, up to 10
notable_customersstring[]Array of notable customer names
fun_factsstring[]Array of interesting facts about the company

People Contact Data

If you're identifying buyers at an account or researching specific people, add any of these to outputSchema.properties.

When the subject is a company:

Suggested FieldTypeOutputSchema Description
ceostringCurrent CEO full name
foundersstring[]Array of founder full names
decision_makersstring[]Array of likely decision-makers for the seller's product, based on the systemPrompt
alumni_of_<organization>string[]Array of current employees who previously worked at or attended <organization>

When the subject is a person:

Suggested FieldTypeOutputSchema Description
locationstringCurrent city and country
years_of_experienceintegerEstimated total years of professional experience
career_narrativestringOne-paragraph story of how they got here
recent_newsstring[]Everything they've publicly said, done, or appeared in
common_groundstring[]Shared alma mater, past employer, or other point of connection.
personalized_hookstringCold-email opener referencing something they actually said/did
why_they_would_buystringOne-liner pitch angle for this person

News & Signals

If you're timing outreach to real-time events (funding rounds, hires, product launches), add any of these to outputSchema.properties.

Suggested FieldTypeOutputSchema Description
recent_news_headlinesstring[]Array of recent news headlines about the company
buying_triggersstring[]Array of reasons to reach out now, based on the seller's product (defined in systemPrompt)
product_launchesstring[]Array of recent product launches

Financial

If you're qualifying accounts on revenue, funding, or valuation, add any of these to outputSchema.properties.

Suggested FieldTypeOutputSchema Description
annual_revenueintegerEstimated annual revenue in dollars
valuationintegerMost recent estimated valuation in dollars
public_market_capintegerMarket capitalization in dollars for publicly traded companies
total_fundingintegerTotal funding raised in dollars
last_funding_roundstringMost recent funding round, including stage and amount
key_investorsstring[]Array of top investor names

List Building

Specify what you want to search for and Exa returns a list of matching companies, people, or other entities. Useful for sourcing outbound prospects, building competitor sets, finding candidates to hire, or mapping a market segment.

Note: Exa has a new Agent API in beta that is recommended for exhaustive list-building tasks.

Making a request

Call Exa's search endpoint with these parameters:

FieldHow to use
queryA categorical description of who to find, e.g. "Series B fintech companies in the US".
typeChoose between "deep" (4-20s) for faster discovery or "deep-reasoning" (12-40s) when the criteria are subtle.
outputSchemaHow Exa will format the list. Wrap your per-item fields under a top-level array property. Each field's description is the prompt that tells Exa what to return. Control list size via systemPrompt (e.g. “Return up to 10 companies”).
systemPrompt (optional)Encodes ICP rules and scoring criteria. Strongly recommended for opinionated fields like icp_fit_score.

The query is the most important parameter. Mix 4-8 descriptive keywords across dimensions like stage, geography, technology, competitor, use case, or buyer persona. Example queries:

  • "Series B fintech companies in the US" (stage + vertical + geography)
  • "Seed-stage AI healthcare startups" (stage + tech + vertical)
  • "Companies using LangChain for document processing" (technology + use case)
  • "Companies similar to Stripe with a developer-focused product" (lookalike)
  • "B2B SaaS companies with a VP of Data Science" (buyer persona)

Aim for queries that are specific enough to filter relevant results but broad enough to return a useful list. Too broad (“AI companies”) returns junk; too narrow (“Series B AI radiology startups in Boston with 50 employees”) returns nothing.

Here's a complete call returning a scored list of companies:

import Exa from "exa-js";
const exa = new Exa(process.env.EXA_API_KEY!);

const result = await exa.search(
  "Series B fintech companies in the US with 50-200 employees",
  {
    type: "deep",
    // Optional: encode rules and judgment criteria
    systemPrompt:
      "Return up to 10 companies matching the seller's ICP: B2B fintech, recently raised Series B, US-based, 50-200 employees. Score each on icp_fit_score 1-10.",
    outputSchema: {
      type: "object",
      required: ["companies"],
      properties: {
        companies: {
          type: "array",
          items: {
            type: "object",
            required: ["company_name", "domain"],
            properties: {
              company_name: {
                type: "string",
                description: "Most commonly-used company name",
              },
              domain: {
                type: "string",
                description: "Primary company domain, e.g. acme.com",
              },
              headcount: {
                type: "integer",
                description: "Estimated number of employees",
              },
              icp_fit_score: {
                type: "integer",
                description: "ICP fit score from 1 to 10",
              },
              icp_fit_reasoning: {
                type: "string",
                description: "One-sentence rationale for the score",
              },
            },
          },
        },
      },
    },
  }
);

console.log(result.output.content.companies);

Monitors

Schedule Exa Monitors to push fresh, deduplicated results to your webhook on a schedule. Useful for tracking news on target accounts, keeping CRM data current, watching competitor moves, or pinging Slack when a buying signal fires.

Making a request

POST to Exa's monitors endpoint with these parameters:

FieldHow to use
searchThe recurring search to run. search.query follows the same patterns as List Building. search.numResults caps the result count per run (1-100).
triggerThe recurring schedule. period is a single-unit duration string: 1h, 6h, 1d, or 7d (minimum 1 hour, no cron). Schedule is anchored to the monitor's creation time. Omit trigger entirely for manual-only monitors.
webhookThe HTTPS endpoint Exa POSTs to. webhook.url must be public. webhook.events filters to specific event types (defaults to all).
outputSchema (optional)Same idea as Data Enrichment and List Building: shapes the structured output Exa returns on every run. Each field's description is the prompt that tells Exa what to return.
metadata (optional)Arbitrary pass-through context echoed in every webhook delivery. Useful for routing updates back to a specific Slack thread, CRM record, or ticket.

Here's a complete call creating a daily fintech-funding monitor:

import Exa from "exa-js";
const exa = new Exa(process.env.EXA_API_KEY!);

const monitor = await exa.monitors.create({
  name: "Series B Fintech Funding",
  search: {
    query: "New Series B fintech funding rounds in the US",
    numResults: 10,
  },
  trigger: {
    type: "interval",
    period: "1d", // single-unit duration: 1h | 6h | 1d | 7d. Min 1 hour.
  },
  webhook: {
    url: "https://example.com/exa-webhook",
    events: ["monitor.run.completed"],
  },
  // Optional: pass-through context echoed in every webhook delivery
  metadata: {
    slack_channel_id: "C123ABC",
    crm_list_id: "list_abc",
  },
});

// Store this immediately. Only returned on creation; needed to verify
// webhook signatures.
console.log(monitor.webhookSecret);

The response includes a webhookSecret that is only returned on creation. Store it immediately. It's required to verify the Exa-Signature header on every incoming webhook so you can confirm payloads actually came from Exa.