Outbound Research

Discover prospects and enrich them before reaching out

Live preview

Checking API key

How it works

Each Generate brief action makes one /search request with type: "deep" and a JSON schema for the selected prospect, role, and company.

The schema separates the brief into prospect context, overview, outbound triggers, and call talking points so the output maps directly into sales prep.

Use output.grounding when you want to show sources next to the generated brief.

Source code

npm install exa-js
import Exa from "exa-js";
const exa = new Exa("YOUR_API_KEY");

type Prospect = {
  firstName: string;
  lastName: string;
  role: string;
  company: string;
};

const prospects: Prospect[] = [
  { firstName: "Cameron", lastName: "Adams", role: "CPO", company: "Canva" },
  { firstName: "Yuhki", lastName: "Yamashita", role: "CPO", company: "Figma" },
  { firstName: "Farhan", lastName: "Thawar", role: "Head of Engineering", company: "Shopify" },
  { firstName: "Gene", lastName: "Lee", role: "Head of Growth Eng", company: "Ramp" },
];

async function generateBrief(prospect: Prospect) {
  const result = await exa.search(
    `Generate an outbound research brief for ${prospect.firstName} ${prospect.lastName}, ${prospect.role} at ${prospect.company}`,
    {
      type: "deep",
      systemPrompt: `You are generating concise outbound research for a sales call.
Ground every claim in current public information.
Tie company signals back to the specific prospect's role.
No em dashes.`,
      outputSchema: {
        type: "object",
        required: ["prospect_context", "overview", "outbound_triggers", "call_talking_points"],
        properties: {
          prospect_name: { type: "string", description: "Prospect's full name" },
          prospect_context: {
            type: "string",
            description: "One sentence about the prospect's role, remit, or likely priorities.",
          },
          overview: {
            type: "object",
            required: ["company", "product", "market"],
            properties: {
              company: { type: "string", description: "Company overview. 12 words or less." },
              product: { type: "string", description: "Product overview. 12 words or less." },
              market: { type: "string", description: "Market overview. 12 words or less." },
            },
          },
          outbound_triggers: {
            type: "array",
            description:
              "Recent news or signals that make outreach timely for this prospect. Return 2-4 dated bullets.",
            items: {
              type: "object",
              required: ["date", "text"],
              properties: {
                date: { type: "string", description: "Event date in Month YYYY format." },
                text: {
                  type: "string",
                  description: "Trigger text tied to the prospect's role or priorities.",
                },
              },
            },
          },
          call_talking_points: {
            type: "array",
            description: "Call talking points grounded in the triggers and prospect role.",
            items: { type: "string" },
          },
        },
      },
    },
  );

  return { brief: result.output.content, grounding: result.output.grounding };
}

const { brief, grounding } = await generateBrief(prospects[0]);

console.log(brief);
console.log(grounding);
Ask ExaBot