Documentation Index
Fetch the complete documentation index at: https://docs.orthogonal.com/llms.txt
Use this file to discover all available pages before exploring further.
These examples show how to combine multiple APIs through Orthogonal for common workflows. Each use case chains 2-4 APIs to accomplish a complete task.
1. Lead Research & Enrichment
Goal: Research a target company and build a complete profile of key contacts.
APIs used: LinkUp (AI search) → Apollo (enrichment) → Hunter (email finding)
const ORTH_KEY = process.env.ORTHOGONAL_API_KEY;
async function run(api, path, body) {
const res = await fetch('https://api.orthogonal.com/v1/run', {
method: 'POST',
headers: {
'Authorization': `Bearer ${ORTH_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ api, path, body })
});
return res.json();
}
async function researchLead(company) {
// Step 1: Research the company with AI search
const research = await run('linkup', '/search', {
q: `${company} company funding valuation news 2026`,
depth: 'standard'
});
// Step 2: Find contacts at the company
const contacts = await run('hunter', '/domain-search', {
domain: `${company}.com`
});
// Step 3: Enrich the top contact
const topContact = contacts.data?.data?.emails?.[0];
if (topContact?.value) {
const enriched = await run('apollo', '/v1/people/match', {
email: topContact.value
});
return { research: research.data, contact: enriched.data };
}
return { research: research.data, contacts: contacts.data };
}
const result = await researchLead('stripe');
2. Competitor Social Intelligence
Goal: Monitor a competitor’s social media presence and extract brand assets.
APIs used: Shofo (social scraping) → Brand.dev (brand extraction) → Olostep (web scraping)
async function analyzeCompetitor(domain, linkedinSlug) {
// Step 1: Get their recent LinkedIn posts
const posts = await run('shofo', '/linkedin/company-posts', {
company_url: `https://linkedin.com/company/${linkedinSlug}`
});
// Step 2: Extract brand assets - logos, colors
const brand = await run('brand-dev', '/v1/brand/retrieve', {
domain: domain
});
// Step 3: Scrape their pricing page
const pricing = await run('olostep', '/v1/scrapes', {
url_to_scrape: `https://${domain}/pricing`,
formats: ['markdown']
});
return {
socialActivity: posts.data,
brandAssets: brand.data,
pricingInfo: pricing.data
};
}
const intel = await analyzeCompetitor('notion.so', 'notionhq');
3. Event-Based Prospecting
Goal: Find people who recently engaged with relevant content and enrich them for outreach.
APIs used: Fiber (people search) → Shofo (social activity) → Tomba (email finding)
async function findEngagedProspects(criteria) {
// Step 1: Find people matching your ICP
const prospects = await run('fiber', '/v1/natural-language-search/profiles', {
query: criteria,
limit: 10
});
const enrichedProspects = [];
for (const person of prospects.data?.profiles || []) {
// Step 2: Check their recent LinkedIn activity
const activity = await run('shofo', '/linkedin/user-posts', {
profile_url: person.linkedin_url
});
// Step 3: Find their email
const email = await run('tomba', '/v1/linkedin', {
url: person.linkedin_url
});
enrichedProspects.push({
...person,
recentPosts: activity.data?.posts?.slice(0, 3),
email: email.data?.data?.email
});
}
return enrichedProspects;
}
const prospects = await findEngagedProspects(
'VP of Sales at Series B SaaS companies in San Francisco'
);
4. Account-Based Marketing Research
Goal: Deep-dive on a target account - company intel, key people, and their social presence.
APIs used: Brand.dev (company data) → Fiber (find employees) → Apollo (enrich contacts)
async function abmResearch(targetDomain) {
// Step 1: Get company brand info and products
const company = await run('brand-dev', '/v1/brand/retrieve', {
domain: targetDomain
});
// Step 2: Find decision makers
const people = await run('fiber', '/v1/natural-language-search/profiles', {
query: `executives and VPs at ${targetDomain} company`,
limit: 5
});
// Step 3: Enrich each person with contact details
const enrichedPeople = [];
for (const person of people.data?.profiles || []) {
const enriched = await run('apollo', '/v1/people/match', {
linkedin_url: person.linkedin_url
});
enrichedPeople.push({
...person,
contact: enriched.data?.person
});
}
return {
company: company.data,
decisionMakers: enrichedPeople
};
}
const account = await abmResearch('figma.com');
5. Content & Trigger Monitoring
Goal: Monitor social channels for buying signals and company news.
APIs used: Shofo (X/Twitter monitoring) → LinkUp (news search) → Riveter (structured extraction)
async function monitorTriggers(companyHandle, domain) {
// Step 1: Get recent tweets mentioning the company
const tweets = await run('shofo', '/x/user-posts', {
username: companyHandle
});
// Step 2: Search for recent news/announcements
const news = await run('linkup', '/search', {
q: `${domain} announcement funding launch 2026`,
depth: 'standard'
});
// Step 3: Extract structured triggers from the news
const triggers = await run('riveter', '/v1/run', {
input: news.data?.results?.map(r => r.content).join('\n\n'),
output_schema: {
type: 'object',
properties: {
funding_events: { type: 'array', items: { type: 'string' } },
product_launches: { type: 'array', items: { type: 'string' } },
hiring_signals: { type: 'array', items: { type: 'string' } },
expansion_news: { type: 'array', items: { type: 'string' } }
}
}
});
return {
socialActivity: tweets.data,
news: news.data,
triggers: triggers.data
};
}
const signals = await monitorTriggers('stripe', 'stripe.com');