API Documentation
Build powerful email workflows with the MailMimo API. All 49 endpoints documented.
1. Get your API key
Sign up at mailmimo.xyz and go to Settings > API Keys. Create a key with the permissions you need.
2. Make your first request
curl https://mailmimo.xyz/api/dashboard/stats \
-H "Authorization: Bearer cr_your_api_key_here"3. Base URL
https://mailmimo.xyz/apiAuthentication
All API requests require a Bearer token. Use an API Key (recommended) or a JWT token from login.
Authorization: Bearer cr_your_api_key_hereAuthorization: Bearer eyJhbG...Errors & Rate Limits
| Code | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad Request - missing or invalid fields |
| 401 | Unauthorized - invalid or missing token |
| 402 | Insufficient Credits |
| 404 | Not Found |
| 409 | Conflict - duplicate resource |
| 429 | Rate Limited |
| 500 | Server Error |
Rate limits: 60 req/min general, 10 req/min for auth endpoints.
Register
/auth/registerCreate a new account. Requires verification code from /auth/send-code.
{ "name": "John Doe", "email": "john@example.com", "password": "securepass123", "code": "123456" }{ "token": "eyJhbG...", "user": { "id": "...", "name": "John", "email": "john@example.com", "role": "user" } }Login
/auth/login{ "email": "john@example.com", "password": "securepass123" }{ "token": "eyJhbG...", "user": { "id": "...", "email": "john@example.com", "name": "John", "role": "user", "creditsRemaining": 100 } }Get Profile
/auth/me{ "id": "usr_abc", "name": "John", "email": "john@example.com", "plan": "pro", "role": "user", "creditsRemaining": 950 }Dashboard Stats
/dashboard/statsGet overview statistics for the current user.
{ "stats": { "totalContacts": 150, "activeCampaigns": 3, "emailsSent": 1200, "openRate": 45.5, "replyRate": 8.2 } }List Campaigns
/campaigns{ "campaigns": [{
"id": "cmp_abc", "name": "Q1 Outreach", "status": "active",
"list": { "id": "...", "name": "Prospects" },
"sequences": [...],
"emailStats": { "total": 100, "sent": 95, "failed": 2, "bounced": 3, "queued": 0 }
}] }Create Campaign
/campaigns{
"name": "Q1 Outreach",
"listId": "list_abc",
"sequences": [
{ "templateId": "tpl_1", "delayDays": 0 },
{ "templateId": "tpl_2", "delayDays": 3, "conditionType": "not_opened" }
],
"schedule": { "timezone": "UTC", "sendHour": 9 }
}{ "campaign": { "id": "cmp_abc", "name": "Q1 Outreach", "status": "draft", "sequences": [...] } }Start Campaign
/campaigns/{id}/startStart a draft campaign. Validates email accounts exist and enforces rate limits (free: 10/hr, pro: 100/hr).
{ "success": true, "message": "Campaign started successfully" }Quick Send
/campaigns/quick-sendCreate and start a campaign in one step. Max 500 recipients.
{
"campaign_name": "Quick Test",
"subject": "Hello {{firstName}}",
"body": "<p>Hi {{firstName}}, welcome!</p>",
"recipients": ["a@test.com", "b@test.com"]
}{ "success": true, "campaign_id": "cmp_xyz", "stats": { "total": 50, "queued": 50 }, "credits_remaining": 900 }Contact Lists
/contactsGet all contact lists for the current user.
{ "lists": [{
"id": "list_abc", "name": "Prospects", "contactCount": 150,
"createdAt": "2026-01-01T00:00:00Z", "_count": { "contacts": 150 }
}] }Create List + Contacts
/contactsCreate a new contact list with optional bulk contacts (max 10,000).
{
"name": "Anthropic Leads",
"contacts": [
{ "email": "john@anthropic.com", "firstName": "John", "lastName": "Doe", "company": "Anthropic", "title": "Engineer" },
{ "email": "jane@anthropic.com", "firstName": "Jane", "lastName": "Smith", "company": "Anthropic", "title": "PM" }
]
}{ "list": { "id": "list_abc", "name": "Anthropic Leads", "contacts": [...] } }Get / Update / Delete Contact
/contacts/{id}{ "contact": {
"id": "...", "email": "john@example.com", "firstName": "John", "lastName": "Doe",
"company": "Anthropic", "title": "Engineer", "industry": "AI",
"customFields": {}, "verificationStatus": "valid",
"createdAt": "...", "listId": "...", "listName": "Prospects"
} }/contacts/{id}{ "email": "new@example.com", "firstName": "John", "lastName": "Doe", "company": "NewCo", "title": "CTO", "industry": "Tech" }/contacts/{id}Returns { "success": true }. Decrements list contactCount.
Search Contacts
/contacts/searchSearch contacts across all lists with filters.
?q=john&company=anthropic&title=engineer&industry=ai&listId=list_abc&page=1&limit=50{ "contacts": [...], "total": 150, "page": 1, "totalPages": 3 }Bulk Actions
/contacts/bulkDelete or move multiple contacts at once (max 1000).
{ "action": "delete", "contactIds": ["id1", "id2", "id3"] }{ "action": "move", "contactIds": ["id1", "id2"], "targetListId": "list_xyz" }Move Contact
/contacts/{id}/move{ "targetListId": "list_xyz" }List Detail / Delete
/contacts/list/{id}Get list info and all contacts in it.
{ "list": { "id": "...", "name": "Prospects", "contactCount": 150, "createdAt": "..." },
"contacts": [{ "id": "...", "email": "...", "firstName": "...", "lastName": "...", "company": "...", "title": "...", "verificationStatus": "..." }]
}/contacts/list/{id}Delete list and all contacts in it (cascade). Returns { "success": true, "message": "List deleted" }.
Search Leads
/leads/searchDiscover leads by company name using 5 data sources: LinkedIn search, GitHub (basic + advanced), Web Search, and Email Pattern generation. Supports email verification. Costs 1 credit per lead found.
{
"company": "Anthropic",
"domain": "anthropic.com",
"title": "engineer",
"industry": "AI",
"location": "San Francisco",
"topic": "AI safety",
"limit": 50,
"sources": ["search_engine", "github", "github_advanced", "web_search", "pattern"],
"verify": true
}{
"leads": [
{ "name": "John Doe", "firstName": "John", "lastName": "Doe", "title": "Engineer",
"company": "Anthropic", "email": "john@anthropic.com", "linkedinUrl": "",
"source": "github", "confidence": 70 }
],
"total": 25,
"sources": { "github": 10, "github_advanced": 8, "web_search": 5, "pattern": 2 },
"verified": 18,
"credits_used": 25,
"credits_remaining": 49975
}Leads to Contacts
/leads/to-contactsConvert discovered leads into contacts. Provide one of: listId, listName (creates new list), or campaignId (uses campaign's list).
{
"leads": [
{ "email": "john@anthropic.com", "firstName": "John", "lastName": "Doe", "company": "Anthropic", "title": "Engineer" }
],
"listName": "Anthropic Leads"
}{ "created": 10, "errors": 2, "errorDetails": [{ "email": "dup@example.com", "error": "Already exists in list" }], "listId": "list_abc" }Verify Email
/verifyVerify email deliverability: syntax, MX records, disposable check, role-based, catch-all. Costs 1 credit per email.
{ "email": "user@example.com" }{
"email": "user@example.com", "is_valid": true, "syntax_valid": true,
"mx_found": true, "is_disposable": false, "is_role_based": false,
"is_catch_all": false, "confidence": 95, "credits_remaining": 99
}Email Finder
/email-finderFind email addresses associated with a domain. Costs 2 credits.
{ "domain": "anthropic.com" }AI Generate Email
/ai/generate-emailUse AI to generate personalized cold emails. Costs 1 credit.
{
"contactName": "John Doe",
"company": "Anthropic",
"productService": "Email outreach platform",
"title": "CTO",
"industry": "AI",
"valueProposition": "10x reply rates",
"language": "en"
}{ "emails": [{ "subject": "...", "body": "..." }] }Domain Management
/domains|POST/domainsManage sending domains for email authentication.
{ "domains": [{
"id": "...", "domain": "mailmimo.xyz", "spfVerified": true, "dkimVerified": true,
"dmarcVerified": true, "verified": true, "dnsRecords": [...]
}] }{ "domain": "mail.example.com" }Verify Domain
/domains/{id}/verifyCheck SPF, DKIM, and DMARC DNS records for a domain.
{ "domain": { "id": "...", "domain": "example.com", "spfVerified": true, "dkimVerified": false, "dmarcVerified": true }, "dnsRecords": [...] }Domain DNS Search
/domain/searchCheck DNS records for any domain. Use quick: true for MX/SPF/DMARC only.
{ "domain": "example.com", "quick": true }{ "data": { "domain": "example.com", "hasMx": true, "spf": true, "dmarc": true, "mxRecords": [...], "dnsRecords": [...] } }Email Accounts
/email-accounts|POST/email-accounts|PUT/email-accounts|DELETE/email-accountsConnect and manage SMTP email accounts for sending.
{
"email": "sender@example.com",
"provider": "smtp",
"credentials": { "host": "smtp.example.com", "port": 465, "user": "sender@example.com", "pass": "password" },
"dailyLimit": 50,
"warmupEnabled": true
}{ "account": { "id": "...", "email": "sender@example.com", "provider": "smtp", "dailyLimit": 50, "warmupEnabled": true, "healthScore": 100 } }Test Connection
/email-accounts/test-connectionTest SMTP connection for an existing account or new credentials.
{ "id": "account_id" }{ "provider": "smtp", "credentials": { "host": "smtp.example.com", "port": 465, "user": "user@example.com", "pass": "pass" } }Warmup
/warmup|POST/warmupGET returns warmup status for all accounts. POST triggers warmup cycle.
{ "accounts": [{
"id": "...", "email": "sender@example.com", "provider": "smtp",
"warmupEnabled": true, "warmupStartDate": "...", "healthScore": 85,
"dailyLimit": 50, "warmupDay": 15, "warmupProgress": 50
}] }Templates
/templates|POST/templatesManage email templates. Supports {{variable}} placeholders. Content safety check blocks phishing/scam content.
{
"name": "Welcome Email",
"subject": "Welcome {{firstName}}!",
"body": "<h1>Hi {{firstName}}</h1><p>Thanks for joining {{company}}.</p>",
"language": "en"
}{ "template": { "id": "tpl_abc", "name": "Welcome Email", "subject": "...", "body": "...", "variables": ["firstName", "company"] } }Campaign Analytics
/analytics/{campaignId}Get detailed analytics for a campaign including daily breakdown.
{
"summary": { "total": 100, "sent": 95, "delivered": 90, "opened": 45, "replied": 8, "bounced": 5, "failed": 0 },
"daily": [
{ "date": "2026-01-01", "sent": 50, "delivered": 48, "opened": 20, "replied": 3, "bounced": 2 }
]
}A/B Tests
/ab-tests?campaignId=xxx|POST/ab-tests{
"campaignId": "cmp_abc",
"testName": "Subject Line Test",
"variants": [
{ "name": "Variant A", "subject": "Quick question", "body": "...", "isControl": true, "weight": 50 },
{ "name": "Variant B", "subject": "Hey {{firstName}}", "body": "...", "weight": 50 }
],
"sampleSize": 100,
"winningMetric": "open_rate"
}A/B Test Detail
/ab-tests/{id}|DELETE/ab-tests/{id}GET returns full test results with variant performance. DELETE cancels the test.
{ "test": {
"id": "...", "name": "Subject Line Test", "status": "running", "winningMetric": "open_rate",
"variants": [
{ "id": "...", "name": "Variant A", "subject": "Quick question", "sentCount": 50, "openCount": 20, "replyCount": 3 },
{ "id": "...", "name": "Variant B", "subject": "Hey {{firstName}}", "sentCount": 50, "openCount": 25, "replyCount": 5 }
]
} }Webhooks
/webhooks|POST/webhooks|DELETE/webhooksReceive real-time event notifications. Supported events:
{ "url": "https://your-app.com/webhook", "events": ["email.opened", "email.replied"] }{ "event": "email.opened", "timestamp": "2026-01-01T12:00:00Z", "data": { "emailId": "...", "recipient": "john@example.com" } }Webhook Logs
/webhooks/{id}/logs?limit=50View delivery logs for a specific webhook.
{ "logs": [{
"id": "...", "event": "email.opened", "payload": {...}, "status": "delivered",
"statusCode": 200, "success": true, "createdAt": "..."
}] }Teams
/teams|POST/teams{ "name": "Sales Team" }Team Detail
/teams/{id}|PUT/teams/{id}|DELETE/teams/{id}{ "memberId": "member_abc", "role": "admin" }{ "memberId": "member_abc" }Invite / Accept
/teams/{id}/invite{ "email": "colleague@example.com", "role": "member" }/teams/accept{ "token": "invite_token_from_email" }API Keys
/api-keys|POST/api-keys|DELETE/api-keysManage API keys for programmatic access. Keys start with cr_ and are shown only on creation.
{
"name": "My Integration",
"permissions": ["read", "write"],
"rateLimit": 1000,
"expiresInDays": 90
}{ "apiKey": { "id": "...", "name": "My Integration", "key": "cr_a1b2c3d4...", "permissions": ["read", "write"], "rateLimit": 1000 } }White Label
/white-label|POST/white-label|DELETE/white-labelCustomize branding for your MailMimo instance.
{
"brandName": "MyEmailTool",
"logoUrl": "https://example.com/logo.png",
"primaryColor": "#4f46e5",
"secondaryColor": "#10b981",
"customDomain": "mail.example.com",
"emailFooter": "Powered by MyEmailTool",
"unsubscribeText": "Click here to unsubscribe"
}Unsubscribers
/unsubscribe/list|POST/unsubscribe/listGET returns all unsubscribed contacts (max 500). POST resubscribes a contact.
{ "contactId": "contact_abc" }{ "success": true, "message": "Contact resubscribed" }