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);