API Documentation
Transform company domains into actionable sales intelligence. Everything you need to integrate lead research into your sales workflow.
Quick Start
Get your first intelligence report in under 30 seconds.
curl -X POST https://zadro.ai/api/v1/research \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "acme.com", "vertical": "technology"}'
Getting Started
The Zadro.ai API provides instant lead intelligence for B2B sales teams. With a single API call, transform any company domain into a comprehensive sales strategy report tailored to your industry vertical.
Prerequisites
- A Zadro.ai account (sign up free)
- An API key from your dashboard
- Basic knowledge of REST APIs
Base URL
https://zadro.ai/api/v1
Authentication
All API requests require authentication using an API key in the X-API-Key header.
X-API-Key: YOUR_API_KEY
Never expose your API key in client-side code or public repositories. Use environment variables and server-side requests.
API Reference
The Zadro.ai API is organized around REST principles. All requests and responses use JSON format.
Endpoints
/v1/research
Generate comprehensive lead intelligence for a company domain.
Request Body
{
"domain": "acme.com", // Required: Company domain
"vertical": "packaging", // Required: Industry vertical
"company": "ACME Corp", // Optional: Company name
"name": "John Doe", // Optional: Contact name
"state": "CA", // Optional: State
"role": "procurement", // Optional: Contact role
"relationship": "evaluating", // Optional: Relationship
"requirements": "Looking for sustainable packaging for energy bars", // Optional: Lead requirements
"refresh": false // Optional: Bypass cache (default: false)
}
Required Fields
domain- Company website domain (e.g., "acme.com")vertical- Industry vertical for targeted intelligence
Optional Fields
company- Company name (improves matching accuracy)name- Contact person's namestate- State or region for geographic contextrole- Contact's role Tailors sales angle to the decision-maker.relationship- Your relationship with this prospect.requirements- Lead requirements or notes Significantly enhances intelligence with customized sales angles.refresh- Bypass 30-day cache and generate fresh intelligence
Supported Verticals
Supported Roles
Supported Relationships
/v1/research/{id}
Retrieve a previously generated research result.
Retrieve cached results by their public ID. Only accessible to the organization that created it.
Request Format
cURL
curl -X POST https://zadro.ai/api/v1/research \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "acme.com", "vertical": "packaging"}'
JavaScript (fetch)
const response = await fetch('https://zadro.ai/api/v1/research', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
domain: 'acme.com',
vertical: 'packaging',
requirements: 'Sustainable packaging for Q2 launch',
}),
});
const data = await response.json();
Python
import requests
response = requests.post(
'https://zadro.ai/api/v1/research',
headers={
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
json={
'domain': 'acme.com',
'vertical': 'packaging',
'requirements': 'Sustainable packaging for Q2 launch',
}
)
data = response.json()
PHP (Guzzle)
use GuzzleHttp\Client;
$client = new Client();
$response = $client->post('https://zadro.ai/api/v1/research', [
'headers' => [
'X-API-Key' => 'YOUR_API_KEY',
'Content-Type' => 'application/json',
],
'json' => [
'domain' => 'acme.com',
'vertical' => 'packaging',
'requirements' => 'Sustainable packaging for Q2 launch',
]
]);
$data = json_decode($response->getBody(), true);
Response Format
Success Response (200)
{
"success": true,
"cached": false,
"id": "a1b2c3d4-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"domain": "acme.com",
"vertical": "packaging",
"time": 34.2,
"data": {
"company": {
"company_name": "ACME Corporation",
"website_url": "https://acme.com",
"summary": "ACME Corp is a mid-market packaging manufacturer ...",
"key_takeaways": [
"Focus on sustainable materials and eco-friendly solutions",
"Strong presence in food and beverage sector"
],
"portfolio": [
"Corrugated Boxes: Custom corrugated packaging for retail and shipping.",
"Flexible Packaging: Pouches and wraps for food and consumer goods."
],
"positioning": "Positions as a sustainable packaging partner for food brands with scalable manufacturing.",
"founded_year": "2006",
"employee_count": "51-200",
"hq": "Chicago, IL, US",
"industry": "Business Services",
"socials": [
{ "platform": "linkedin", "url": "https://linkedin.com/company/acme-corp" },
{ "platform": "twitter", "url": "https://twitter.com/acmecorp" }
]
},
"sales": {
"sales_angle": "Lead with sustainability messaging and supply reliability ...",
"opportunity": "Offer sustainable material options, packaging optimization, and fulfillment support ..."
},
"market": {
"size": "$350B global packaging market (example)",
"growth_rate": "4.2% CAGR (example)",
"trends": [
"Increased demand for eco-friendly materials",
"Automation adoption accelerating"
]
},
"signals": {
"founder_info": "",
"estimated_revenue": "",
"recent_news": ""
},
"competitors": [
{ "domain": "rivalcorp.com", "relevance": 8.74 },
{ "domain": "packagingco.com", "relevance": 6.21 }
],
"sources": [
{
"url": "https://acme.com/about",
"title": "About ACME Corp",
"type": "onsite"
}
],
"confidence": {
"company": {
"score": 0.92,
"parts": {
"summary": 0.93,
"takeaways": 0.92,
"positioning": 0.90
}
},
"sales": {
"score": 0.78,
"parts": {
"angle": 0.80,
"opportunity": 0.75
}
},
"market": {
"score": 0.70,
"parts": {
"size": 0.72,
"growth_rate": 0.68,
"trends": 0.70
}
},
"signals": {
"score": 0.35,
"parts": {
"founder": 0.00,
"revenue": 0.50,
"news": 0.20
}
},
"sources": {
"score": 0.85,
"parts": {
"onsite": 0.95,
"external": 0.60,
"mix": 0.85
}
},
"total": 0.76
}
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
success |
boolean | Request success status |
cached |
boolean | Whether result was served from cache |
id |
string | Unique identifier for this result |
domain |
string | Requested domain (normalized) |
vertical |
string | Vertical slug used for the run |
time |
number | Processing time in seconds |
data.company.company_name |
string | Company/brand name (on-site identifier) |
data.company.website_url |
string | Canonical website URL (https) |
data.company.summary |
string | Company overview and positioning (100-150 words) |
data.company.key_takeaways |
string[] | 3-5 factual bullets |
data.company.portfolio |
string[] | Product/service list ("title: description"); empty if unknown |
data.company.positioning |
string | Positioning statement; empty if unknown |
data.company.founded_year |
string|null | Year the company was founded |
data.company.employee_count |
string|null | Employee range (e.g., "51-200") |
data.company.hq |
string|null | Headquarters location |
data.company.industry |
string|null | Industry classification |
data.company.socials |
object[]|null | Social media profiles |
data.company.socials[].platform |
string | Platform name (e.g., "linkedin", "twitter", "facebook") |
data.company.socials[].url |
string | Full profile URL |
data.signals.founder_info |
string | Founder/leadership notes; empty if unknown |
data.signals.estimated_revenue |
string | Revenue range string; empty if unknown |
data.signals.recent_news |
string | Recent news summary; empty if unknown |
data.sales.sales_angle |
string | Recommended sales approach |
data.sales.opportunity |
string | Opportunity analysis (how to position and what to offer) |
data.market.size |
string | Market size string; may be empty if unavailable |
data.market.growth_rate |
string | Growth rate/CAGR string; may be empty if unavailable |
data.market.trends |
string[] | Market trends list; empty if unavailable |
data.sources |
object[] | Evidence links (3-10 items) |
data.sources[].url |
string | Source URL (https) |
data.sources[].title |
string | Page title/label |
data.sources[].type |
string | One of: onsite, news, directory |
data.confidence.total |
number | Overall confidence score (0-1) |
data.confidence.company.score |
number | Company section confidence |
data.confidence.company.parts.summary |
number | Confidence for company summary |
data.confidence.company.parts.takeaways |
number | Confidence for key takeaways |
data.confidence.company.parts.positioning |
number | Confidence for positioning |
data.confidence.sales.score |
number | Sales section confidence |
data.confidence.sales.parts.angle |
number | Confidence for sales angle |
data.confidence.sales.parts.opportunity |
number | Confidence for opportunity |
data.confidence.market.score |
number | Market section confidence |
data.confidence.market.parts.size |
number | Confidence for market size |
data.confidence.market.parts.growth_rate |
number | Confidence for growth rate |
data.confidence.market.parts.trends |
number | Confidence for market trends |
data.confidence.signals.score |
number | Signals section confidence |
data.confidence.signals.parts.founder |
number | Confidence for founder/leadership info |
data.confidence.signals.parts.revenue |
number | Confidence for estimated revenue |
data.confidence.signals.parts.news |
number | Confidence for recent news |
data.confidence.sources.score |
number | Sources quality confidence |
data.confidence.sources.parts.onsite |
number | Confidence based on on-site evidence |
data.confidence.sources.parts.external |
number | Confidence based on third-party evidence |
data.confidence.sources.parts.mix |
number | Confidence based on evidence mix |
data.competitors |
object[]|null | Competitor domains ranked by relevance |
data.competitors[].domain |
string | Competitor domain |
data.competitors[].relevance |
number | Relevance score (higher = more similar) |
Note: Empty strings/arrays are expected when unverified; fields are left blank rather than guessed. Enrichment fields (founded_year, employee_count, hq, industry, socials, competitors) may be null if data is unavailable for the domain.
|
||
Error Handling
The API uses conventional HTTP status codes to indicate success or failure.
HTTP Status Codes
Error Response Format
{
"error": "Invalid domain format",
"message": "Domain must be a valid hostname without protocol",
"error_code": "VALIDATION_ERROR"
}
Error Codes
VALIDATION_ERROR- Invalid request parametersBLOCKED_DOMAIN- Generic email domains not allowedVERTICAL_NOT_FOUND- Invalid or disabled verticalAPI_ERROR- External API failurePROCESSING_ERROR- Internal processing errorINVALID_JSON- Invalid JSON in responseTOKEN_LIMIT- AI token limit exceededRATE_LIMIT_EXCEEDED- Too many requests
Rate Limits
Rate limits protect the API from abuse and ensure fair usage for all customers.
Handling Rate Limits
When you exceed the rate limit, you'll receive a 429 response.
Implement exponential backoff:
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status === 429) {
const delay = 1000 * Math.pow(2, i);
await new Promise(r => setTimeout(r, delay));
continue;
}
return response;
}
throw new Error('Max retries exceeded');
}
Best Practices
Results are cached for 30 days. Store results to avoid duplicate requests.
Check domain format before making API calls to avoid wasting requests.
The requirements field dramatically improves intelligence quality.
Implement proper error handling and show users meaningful messages.
Track your API usage through the dashboard to avoid surprises.
Always use HTTPS endpoints to protect API keys and data in transit.