Warmer AI API
The Warmer AI API allows you to integrate our lead enrichment and personalization capabilities into your own applications, workflows, and automation tools like Zapier, Make.com, or custom software.
✨ Latest Features
- • Email verification with deliverability scoring
- • Plan-based feature access control
- • Enhanced error handling and responses
- • Comprehensive processing statistics
🔑 Access Requirements
- • API Access: Pro/Enterprise plans
- • Email Verification: Pro/Enterprise plans
- • Basic Features: All plan levels
- • Rate Limit: 60 requests/minute
Base URL: https://warmer.ai/api
Getting Started
1. Generate an API Token
First, create an API token in your API Settings.
2. Make Your First Request
Include your token in the Authorization header:
curl -X GET "https://warmer.ai/api/user" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json"
Authentication
All API requests must include a valid API token in the Authorization header using Bearer authentication.
Authorization: Bearer YOUR_API_TOKEN
Security: Keep your API tokens secure. Never expose them in client-side code or public repositories.
Plans & Features
Warmer AI API features are available based on your subscription plan. Some advanced features require Pro or Enterprise plans.
Basic Plan
- ✓ Lead processing & enrichment
- ✓ AI personalization generation
- ✓ Campaign management
- ✗ Email verification
- ✗ API access
Pro Plan
- ✓ All Basic features
- ✓ Email verification
- ✓ Full API access
- ✓ Priority processing
Enterprise Plan
- ✓ All Pro features
- ✓ Advanced exports
- ✓ Priority support
- ✓ Custom integrations
Plan Requirements: API access and email verification features require Pro or Enterprise plans.
Attempting to use restricted features will return a 403 Forbidden error with upgrade instructions.
Rate Limits
API requests are limited to 60 requests per minute per token. Rate limit headers are included in responses:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1640995200
Error Handling
The API uses conventional HTTP status codes and returns JSON error responses:
Success Response:
{
"success": true,
"data": { ... }
}
Validation Error (422):
{
"success": false,
"error": "Validation failed",
"details": {
"email": ["The email field is required."]
}
}
Feature Access Error (403):
{
"success": false,
"error": "Feature not available",
"details": {
"feature": "email_verification",
"message": "Email verification is only available on Pro and Enterprise plans",
"required_plans": ["pro", "enterprise"],
"upgrade_required": true
}
}
Insufficient Credits (402):
{
"success": false,
"error": "Insufficient credits",
"details": "You need at least 1 credit to process this lead"
}
Authentication Error (401):
{
"success": false,
"error": "Unauthenticated",
"message": "Invalid or missing API token"
}
Common HTTP Status Codes:
200- Success201- Created (campaigns, leads)400- Bad Request401- Unauthorized (invalid token)402- Payment Required (insufficient credits)403- Forbidden (feature not available on plan)404- Not Found422- Validation Failed429- Rate Limit Exceeded500- Internal Server Error
Email Verification
Pro/Enterprise Feature: Email verification is available on Pro and Enterprise plans only.
Email verification validates email addresses using multiple verification methods including:
Verification Methods
- • Syntax validation
- • Domain verification
- • MX record checks
- • SMTP validation
- • Deliverability scoring
Verification Results
-
validEmail is deliverable -
riskyEmail may have issues -
invalidEmail is not deliverable -
not_verifiedVerification not performed
Processing Behavior
When email verification is enabled, leads with invalid emails will not proceed to enrichment and personalization,
while valid and risky emails will continue through the full pipeline.
Lead Processing
Process a Lead
Process a single lead through enrichment and personalization pipeline.
POST /api/leads/process
Request Body:
{
"email": "[email protected]",
"linkedin": "https://linkedin.com/in/john-doe",
"company_domain": "example.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "Example Corp",
"email_verification_enabled": false
}
Parameters:
email* - Lead's email addressfirst_name- Lead's first namelast_name- Lead's last namelinkedin- LinkedIn profile URLcompany_domain- Company domain for enrichmentcompany_name- Company nameemail_verification_enabled- Enable email verification (Pro/Enterprise only)
* Required field
Response (without email verification):
{
"success": true,
"lead_id": 12345,
"enriched_data": {
"linkedin": {
"has_data": true,
"processed_data": "CEO at Example Corp...",
"raw_data": { ... }
},
"company": {
"has_data": true,
"processed_data": "Example Corp helps...",
"company_name": "Example Corp",
"description": "...",
"source": "linkedin"
}
},
"personalizations": {
"company_compliments": [
"Love that Example Corp is solving...",
"The fact that Example Corp made..."
],
"personal_compliments": [
"Saw you're on company #3 after Google...",
"CEO to 50k followers journey..."
],
"best_personalizations": {
"company": "Love that Example Corp is solving...",
"personal": "Saw you're on company #3 after Google..."
}
},
"credits_used": 2,
"processing_time": 3.245
}
Response (with email verification enabled):
{
"success": true,
"lead_id": 12346,
"email_verification": {
"status": "valid",
"verified": true,
"details": {
"result": "valid",
"score": 99,
"reason": "accepted_email",
"disposable": false,
"role_account": false
}
},
"enriched_data": {
"linkedin": { ... },
"company": { ... }
},
"personalizations": {
"company_compliments": [ ... ],
"personal_compliments": [ ... ],
"best_personalizations": { ... }
},
"credits_used": 2,
"processing_time": 4.123
}
Note: If email verification is enabled and the email is found to be invalid, the lead will not proceed to enrichment and personalization. The response will include only the email verification data and no personalizations will be generated.
Get Lead Status
Retrieve the status and results of a processed lead.
GET /api/leads/{leadId}
Campaign Management
Create Campaign
POST /api/campaigns
Request Body:
{
"name": "Q4 Outreach Campaign",
"leads": [
{
"email": "[email protected]",
"linkedin": "https://linkedin.com/in/john-doe",
"company_domain": "example.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "Example Corp"
},
{
"email": "[email protected]",
"linkedin": "https://linkedin.com/in/jane-smith",
"company_domain": "techcorp.com",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "TechCorp"
}
],
"email_verification_enabled": true
}
Parameters:
name* - Campaign nameleads* - Array of leads (max 1000)email_verification_enabled- Enable email verification for all leads (Pro/Enterprise only)
* Required field
Response:
{
"success": true,
"campaign": {
"id": 456,
"name": "Q4 Outreach Campaign",
"total_leads": 2,
"status": "processing",
"created_at": "2024-01-15T10:30:00Z"
},
"message": "Campaign created successfully. Leads are being processed in the background."
}
List Campaigns
GET /api/campaigns?per_page=20
Get Campaign Details
Retrieve detailed information about a campaign, including lead processing status and email verification results.
GET /api/campaigns/{campaignId}
Response (with email verification):
{
"success": true,
"campaign": {
"id": 456,
"name": "Q4 Outreach Campaign",
"status": "processing",
"progress_percentage": 50,
"total_leads": 2,
"processing_stats": {
"total_leads": 2,
"pending": 0,
"email_verifying": 0,
"email_verified": 1,
"email_invalid": 1,
"email_risky": 0,
"processing": 0,
"personalizing": 0,
"completed": 1,
"failed": 0,
"insufficient_credits": 0
},
"leads": [
{
"id": 1001,
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"company_name": "Example Corp",
"status": "completed",
"email_verification": {
"status": "valid",
"verified": true,
"details": {
"result": "valid",
"score": 99,
"reason": "accepted_email"
}
},
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:35:00Z"
},
{
"id": 1002,
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "TechCorp",
"status": "failed",
"email_verification": {
"status": "invalid",
"verified": false,
"details": {
"result": "invalid",
"score": 0,
"reason": "invalid_domain"
}
},
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:32:00Z"
}
],
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:35:00Z"
}
}
Get Campaign Statistics
GET /api/campaigns/{campaignId}/stats
User Information
Get information about the authenticated user, including remaining credits.
GET /api/user
Response:
{
"success": true,
"user": {
"id": 123,
"name": "John Doe",
"email": "[email protected]",
"remaining_credits": 500
}
}
Integration Examples
Zapier Integration
Use the Webhooks by Zapier app to send data to Warmer AI's API:
- Trigger: When a new lead is added to your CRM
- Action: POST to
https://warmer.ai/api/leads/process - Include your API token in headers
- Map lead data to the request body
Make.com Integration
Use the HTTP module to call Warmer AI's API:
- Module: HTTP > Make a request
- Method: POST
- URL:
https://warmer.ai/api/leads/process - Headers:
Authorization: Bearer YOUR_TOKEN
Clay Integration
Use Clay's HTTP API enrichment to call Warmer AI:
- Add HTTP API column
- Configure POST request to
https://warmer.ai/api/leads/process - Set Authorization header with your token
- Map prospect data to API fields
- Extract personalizations from response
Python Example
import requests
# Configuration
API_TOKEN = "your_api_token_here"
BASE_URL = "https://warmer.ai/api"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
# Process a single lead with email verification (Pro/Enterprise only)
def process_lead_with_verification(email, linkedin=None, company_domain=None, first_name=None, last_name=None):
lead_data = {
"email": email,
"linkedin": linkedin,
"company_domain": company_domain,
"first_name": first_name,
"last_name": last_name,
"email_verification_enabled": True # Requires Pro/Enterprise plan
}
response = requests.post(
f"{BASE_URL}/leads/process",
json=lead_data,
headers=headers
)
if response.status_code == 200:
data = response.json()
if data["success"]:
# Check email verification result
if "email_verification" in data:
verification = data["email_verification"]
print(f"Email verification: {verification['status']} (verified: {verification['verified']})")
# Only proceed if email is valid or risky
if verification["verified"] or verification["status"] == "risky":
personalizations = data["personalizations"]
print("Personal compliments:", personalizations["personal_compliments"])
print("Company compliments:", personalizations["company_compliments"])
else:
print(f"Email {email} is invalid - no personalizations generated")
print(f"Credits used: {data['credits_used']}")
return data
else:
print("Error:", data["error"])
if "details" in data and data["details"].get("upgrade_required"):
print("Upgrade to Pro/Enterprise required for email verification")
elif response.status_code == 403:
data = response.json()
if data.get("details", {}).get("feature") == "email_verification":
print("Email verification requires Pro/Enterprise plan")
else:
print("Access denied:", data.get("error"))
else:
print(f"HTTP Error: {response.status_code}")
print(response.text)
return None
# Create a campaign with email verification
def create_campaign_with_verification(name, leads):
campaign_data = {
"name": name,
"leads": leads,
"email_verification_enabled": True
}
response = requests.post(
f"{BASE_URL}/campaigns",
json=campaign_data,
headers=headers
)
if response.status_code == 201:
data = response.json()
if data["success"]:
campaign = data["campaign"]
print(f"Campaign created: {campaign['name']} (ID: {campaign['id']})")
print(f"Processing {campaign['total_leads']} leads...")
return campaign["id"]
elif response.status_code == 403:
print("Email verification requires Pro/Enterprise plan")
else:
print(f"Failed to create campaign: {response.status_code}")
print(response.text)
return None
# Example usage
if __name__ == "__main__":
# Process single lead
result = process_lead_with_verification(
email="[email protected]",
linkedin="https://linkedin.com/in/john-doe",
company_domain="example.com",
first_name="John",
last_name="Doe"
)
# Create campaign
leads = [
{
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe",
"linkedin": "https://linkedin.com/in/john-doe"
},
{
"email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"company_domain": "techcorp.com"
}
]
campaign_id = create_campaign_with_verification("Python API Test Campaign", leads)
Need Help?
If you have questions about the API or need assistance with integration, we're here to help!