InboxWarm API documentation
Reference documentation for InboxWarm's REST API. Use this alongside the InboxWarm API Postman collection.
On this page
Email Accounts
Warmup
Deliverability
Base URL#
https://app.inboxwarm.ai/api/v1Authentication#
InboxWarm uses a mixed authentication scheme depending on the HTTP method:
GET and DELETE requests — send your API key as the api_key query parameter.
POST and PATCH requests — send your API key as an apiKey field inside the JSON body.
Generate and manage keys from Developer kit > API Integration in the InboxWarm app. Each key grants full account access across every endpoint below.
Example — GET request:
GET https://app.inboxwarm.ai/api/v1/email-accounts?api_key=YOUR_API_KEYExample — POST request body:
{
"apiKey": "YOUR_API_KEY",
...
}Rate limits#
GET /rate-limit — this call does not count against your quota.Errors#
Errors follow a consistent shape:
{
"error_code": "validation_error",
"message": "One or more fields are invalid.",
"details": {}
}Common error_code values: validation_error (400), not_found (404), conflict (409), unprocessable (422).
Endpoint index#
Email Accounts
/email-accountsList Email AccountsPOST/email-accountsConnect Email AccountPOST/email-accounts/bulk-connectBulk Connect Email AccountsPOST/email-accounts/{emailAccountId}/disconnectDisconnect Email AccountDELETE/email-accounts/{emailAccountId}Delete Email AccountPOST/email-accounts/bulk-deleteBulk Delete Email AccountsGET/email-accounts/{emailAccountId}/statusGet Email Account StatusPOST/email-accounts/bulk-statusBulk Email Account StatusWarmup
/warmup-settings/{emailAccountId}Get Warmup SettingsPATCH/warmup-settings/{emailAccountId}Update Warmup SettingsGET/warmup-settings/languagesList Warmup LanguagesGET/warmup-settings/industriesList Warmup IndustriesPOST/warmup-settings/{emailAccountId}/startStart WarmupPOST/warmup-settings/{emailAccountId}/stopStop WarmupPOST/warmup-settings/bulk-actionBulk Warmup ActionPOST/warmup-settings/bulk-updateBulk Update Warmup SettingsGET/warmup-status/{emailAccountId}Warmup Activity HistoryDeliverability
Reports
System
Health Check#
https://app.inboxwarm.ai/api/v1/healthBasic liveness check for the API.
api_keyResponses
{
"status": "ok"
}Rate Limit Status#
https://app.inboxwarm.ai/api/v1/rate-limitCheck current rate-limit consumption without using up a request against your quota.
api_keyResponses
{
"limit": 20,
"remaining": 18,
"reset": 1752585600
}Email Accounts
List Email Accounts#
https://app.inboxwarm.ai/api/v1/email-accountsList connected email accounts with their current status. Supports search, pagination, and sorting. Use search to look up the emailAccountId for an address if you ever need to re-resolve it.
api_keyQuery parameters
searchSearch by email address or namestatusactive | warming | paused | error | auth-expiredsortsortByResponses
{
"items": [
{
"id": "12345",
"fromEmail": "john@yourcompany.com",
"fromName": "John Doe",
"type": "gmail",
"status": "warming",
"createdAt": "2026-06-01T10:00:00.000Z"
},
{
"id": "12346",
"fromEmail": "sales@yourcompany.com",
"fromName": "Sales Team",
"type": "microsoft",
"status": "active",
"createdAt": "2026-06-03T14:20:00.000Z"
}
],
"total": 2,
"page": 1,
"limit": 20,
"totalPages": 1
}Connect Email Account#
https://app.inboxwarm.ai/api/v1/email-accountsConnect a Gmail, Microsoft, or SMTP/IMAP account using SMTP/IMAP credentials (an app password works for Gmail and Microsoft). Store the returned emailAccountId — every other endpoint is keyed off it.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"fromEmail": "john@yourcompany.com",
"fromName": "John Doe",
"type": "gmail",
"smtp": {
"host": "smtp.example.com",
"port": 587,
"password": "your-password",
"encryption": "TLS",
"userName": "smtp-username"
},
"imap": {
"host": "imap.example.com",
"port": 993,
"encryption": "SSL",
"userName": "imap-username"
}
}Responses
{
"emailAccountId": "12345",
"fromEmail": "john@yourcompany.com",
"fromName": "John Doe",
"type": "gmail",
"status": "active"
}Bulk Connect Email Accounts#
https://app.inboxwarm.ai/api/v1/email-accounts/bulk-connectConnect up to 20 accounts in one call. Each entry is validated and connected independently — one bad or duplicate account doesn't stop the others — and the response reports success or failure per account, in the same order as the input.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccounts": [
{
"fromEmail": "john@yourcompany.com",
"fromName": "John Doe",
"type": "gmail",
"smtp": { "host": "smtp.example.com", "port": 587, "password": "your-password", "encryption": "TLS", "userName": "smtp-username" },
"imap": { "host": "imap.example.com", "port": 993, "encryption": "SSL", "userName": "imap-username" }
},
{
"fromEmail": "sales@yourcompany.com",
"type": "microsoft",
"smtp": { "password": "app-specific-password" }
}
]
}Responses
{
"results": [
{
"success": true,
"emailAccountId": "12345",
"fromEmail": "john@yourcompany.com",
"fromName": "John Doe",
"type": "gmail",
"status": "active"
},
{
"success": false,
"fromEmail": "sales@yourcompany.com",
"error_code": "already_connected",
"message": "This email address is already connected.",
"details": {}
}
]
}Disconnect Email Account#
https://app.inboxwarm.ai/api/v1/email-accounts/{emailAccountId}/disconnectPause an account without deleting it. Config and history are preserved for reconnecting later.
apiKeyRequest body
{
"apiKey": "{{apiKey}}"
}Responses
{
"emailAccountId": "12345",
"status": "disconnected"
}Delete Email Account#
https://app.inboxwarm.ai/api/v1/email-accounts/{emailAccountId}Permanently remove an account and all associated warmup data and history.
api_keyResponses
No response body
Bulk Delete Email Accounts#
https://app.inboxwarm.ai/api/v1/email-accounts/bulk-deletePermanently remove up to 20 accounts in one call.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountIds": [
"12345",
"12346"
]
}Responses
{
"results": [
{
"emailAccountId": "12345",
"deleted": true
},
{
"emailAccountId": "12346",
"deleted": true
}
]
}Get Email Account Status#
https://app.inboxwarm.ai/api/v1/email-accounts/{emailAccountId}/statusDetailed status for a single account — connection health, warmup state, auth status, active errors.
api_keyResponses
{
"emailAccountId": "12345",
"fromEmail": "john@yourcompany.com",
"type": "gmail",
"authStatus": "connected",
"warmupStatus": "active",
"healthScore": 92,
"connectionError": null,
"lastConnectedAt": "2026-07-15T08:00:00.000Z"
}Bulk Email Account Status#
https://app.inboxwarm.ai/api/v1/email-accounts/bulk-statusStatus for up to 50 accounts in one call, returned in the same order as the input IDs.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountIds": [
"12345",
"12346"
]
}Responses
{
"results": [
{
"emailAccountId": "12345",
"fromEmail": "john@yourcompany.com",
"type": "gmail",
"authStatus": "connected",
"warmupStatus": "active",
"healthScore": 92,
"connectionError": null,
"lastConnectedAt": "2026-07-15T08:00:00.000Z"
},
{
"emailAccountId": "12346",
"fromEmail": "sales@yourcompany.com",
"type": "microsoft",
"authStatus": "connected",
"warmupStatus": "paused",
"healthScore": 81,
"connectionError": null,
"lastConnectedAt": "2026-07-14T22:10:00.000Z"
}
]
}Warmup
Get Warmup Settings#
https://app.inboxwarm.ai/api/v1/warmup-settings/{emailAccountId}Fetch the current warmup configuration for an account.
api_keyResponses
{
"emailAccountId": "12345",
"displayName": "Ada Lovelace",
"timeZone": "America/New_York",
"sendingDays": [1, 2, 3, 4, 5],
"sendingWindowStartTime": "09:00",
"sendingWindowEndTime": "17:00",
"warmupLanguage": "en",
"targetIndustry": "saas_software",
"warmupTopics": ["Referral request", "Case study"]
}Update Warmup Settings#
https://app.inboxwarm.ai/api/v1/warmup-settings/{emailAccountId}Update one or more warmup settings for an account — sender name, timezone, sending schedule, language, industry, or topics. Only the fields you send are changed.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"displayName": "Ada Lovelace",
"timeZone": "America/New_York",
"sendingDays": [1, 2, 3, 4, 5],
"sendingWindowStartTime": "09:00",
"sendingWindowEndTime": "17:00",
"warmupLanguage": "en",
"targetIndustry": "saas_software",
"warmupTopics": ["Referral request", "Case study"]
}Responses
{
"emailAccountId": "12345",
"displayName": "Ada Lovelace",
"timeZone": "America/New_York",
"sendingDays": [1, 2, 3, 4, 5],
"sendingWindowStartTime": "09:00",
"sendingWindowEndTime": "17:00",
"warmupLanguage": "en",
"targetIndustry": "saas_software",
"warmupTopics": ["Referral request", "Case study"]
}List Warmup Languages#
https://app.inboxwarm.ai/api/v1/warmup-settings/languagesList every language warmup content can be generated in, so you know which values warmupLanguage accepts.
api_keyResponses
{
"languages": [
{ "code": "en", "name": "English", "nativeName": "English", "script": "Latin" },
{ "code": "es", "name": "Spanish", "nativeName": "Español", "script": "Latin" },
{ "code": "ja", "name": "Japanese", "nativeName": "日本語", "script": "Japanese" }
]
}List Warmup Industries#
https://app.inboxwarm.ai/api/v1/warmup-settings/industriesList every target industry and its suggested topics, so you know which values targetIndustry and warmupTopics accept.
api_keyResponses
{
"industries": [
{
"key": "e_commerce",
"name": "E-Commerce",
"topics": [
"Abandoned cart follow-up",
"New product launch",
"Seasonal sale announcement",
"Order and shipping update",
"Customer review request"
]
},
{
"key": "saas_software",
"name": "SaaS / Software",
"topics": ["Feature announcement", "Onboarding tip", "Case study"]
}
]
}Start Warmup#
https://app.inboxwarm.ai/api/v1/warmup-settings/{emailAccountId}/startStart warmup for an account.
apiKeyRequest body
{
"apiKey": "{{apiKey}}"
}Responses
{
"emailAccountId": "12345",
"warmupStatus": "active"
}Stop Warmup#
https://app.inboxwarm.ai/api/v1/warmup-settings/{emailAccountId}/stopStop warmup for an account.
apiKeyRequest body
{
"apiKey": "{{apiKey}}"
}Responses
{
"emailAccountId": "12345",
"warmupStatus": "paused"
}Bulk Warmup Action#
https://app.inboxwarm.ai/api/v1/warmup-settings/bulk-actionStart or stop warmup for up to 50 accounts in one call.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountIds": [
"12345",
"12346"
],
"action": "start"
}Responses
{
"results": [
{
"emailAccountId": "12345",
"status": "ok"
},
{
"emailAccountId": "12346",
"status": "ok"
}
]
}Bulk Update Warmup Settings#
https://app.inboxwarm.ai/api/v1/warmup-settings/bulk-updateApply schedule and/or content settings to up to 50 accounts in one call.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountIds": [
"12345",
"12346"
],
"apply": ["language", "window"],
"warmupLanguage": "es",
"sendingWindowStartTime": "06:00",
"sendingWindowEndTime": "10:00"
}Responses
{
"updatedCount": 2
}Warmup Activity History#
https://app.inboxwarm.ai/api/v1/warmup-status/{emailAccountId}Today's warmup activity for an account: sent, received, replied, spam, bounced.
api_keyResponses
{
"emailAccountId": "12345",
"date": "2026-07-15",
"current": "active",
"dailySendingLimit": 10,
"sent": 12,
"received": 10,
"replied": 7,
"spam": 1,
"bounced": 0
}Deliverability
Get Setup Score#
https://app.inboxwarm.ai/api/v1/setup-score/{emailAccountId}Cached setup health score (DMARC, SPF, DKIM, MX, blacklist checks) for an account.
api_keyResponses
{
"emailAccountId": "12345",
"emailAccountScore": 86,
"dmarcScore": 15,
"spfScore": 29,
"dkimScore": 18,
"mxRecordScore": 9,
"ipBlacklistScore": 5,
"domainBlacklistScore": 10,
"updatedAt": "2026-07-14T10:30:00.000Z",
"manualLastRefreshedAt": "2026-07-14T10:30:00.000Z"
}Refresh Setup Score#
https://app.inboxwarm.ai/api/v1/setup-score/{emailAccountId}/refreshSynchronously recompute the setup score for an account.
apiKeyRequest body
{
"apiKey": "{{apiKey}}"
}Responses
{
"emailAccountId": "12345",
"emailAccountScore": 88,
"dmarcScore": 15,
"spfScore": 29,
"dkimScore": 18,
"mxRecordScore": 9,
"ipBlacklistScore": 7,
"domainBlacklistScore": 10,
"updatedAt": "2026-07-15T09:00:00.000Z",
"manualLastRefreshedAt": "2026-07-15T09:00:00.000Z"
}DNS Health Check#
https://app.inboxwarm.ai/api/v1/dns-health/{emailAccountId}Live DNS lookup for the account's sending domain — pass/fail for SPF, DKIM, DMARC, MX.
api_keyResponses
{
"emailAccountId": "12345",
"spf": "pass",
"dkim": "pass",
"dmarc": "pass",
"mx": "pass",
"cachedAt": "2026-07-15T09:00:00.000Z"
}Get Deliverability Score#
https://app.inboxwarm.ai/api/v1/deliverability-score/{emailAccountId}Overall and per-ESP inbox-vs-spam deliverability rate for a date range.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"startDate": "2026-06-01",
"endDate": "2026-06-30",
"esps": [
"gmail",
"outlook",
"other"
]
}Responses
{
"emailAccountId": "12345",
"totalDeliverabilityRate": 88,
"totalSentCount": 1500,
"totalInboxCount": 1320,
"totalSpamInboxCount": 180,
"gmail": {
"deliverabilityRate": 92,
"sentCount": 500,
"inboxCount": 460,
"spamCount": 40
},
"outlook": {
"deliverabilityRate": 92,
"sentCount": 500,
"inboxCount": 460,
"spamCount": 40
},
"other": {
"deliverabilityRate": 92,
"sentCount": 500,
"inboxCount": 460,
"spamCount": 40
}
}Reports
Dashboard#
https://app.inboxwarm.ai/api/v1/dashboardAccount-wide warmup summary across all connected inboxes.
api_keyResponses
{
"totalAccounts": 42,
"activeWarmups": 30,
"pausedWarmups": 8,
"accountsWithErrors": 2,
"avgSetupScore": 78.5
}Single Account Report#
https://app.inboxwarm.ai/api/v1/reportsDaily warmup report for one account over a date range.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountId": "12345",
"from": "2026-06-01",
"to": "2026-06-30"
}Responses
{
"emailAccountId": "12345",
"from": "2026-06-01",
"to": "2026-06-30",
"days": [
{
"date": "2026-06-15",
"sent": 25,
"inbox": 20,
"received": 22,
"spam": 3,
"bounced": 1,
"undelivered": 0,
"replied": 5,
"deliverabilityRate": 92.5
}
]
}Bulk Report#
https://app.inboxwarm.ai/api/v1/reports/bulkDaily warmup reports for up to 50 accounts over a date range.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountIds": [
"12345",
"12346"
],
"from": "2026-06-01",
"to": "2026-06-30"
}Responses
{
"reports": [
{
"emailAccountId": "12345",
"from": "2026-06-01",
"to": "2026-06-30",
"days": [
{
"date": "2026-06-15",
"sent": 25,
"inbox": 20,
"received": 22,
"spam": 3,
"bounced": 1,
"undelivered": 0,
"replied": 5,
"deliverabilityRate": 92.5
}
]
}
]
}Export Report#
https://app.inboxwarm.ai/api/v1/reports/exportKick off an async CSV export of warmup reports, delivered by email when ready.
apiKeyRequest body
{
"apiKey": "{{apiKey}}",
"emailAccountIds": [
"12345",
"12346"
],
"from": "2026-06-01",
"to": "2026-06-30"
}Responses
{
"jobId": "a1b2c3d4",
"status": "queued"
}Spam Test
Start Spam Test#
https://app.inboxwarm.ai/api/v1/spam-testsStart an inbox placement test. Returns a testCode and the seed inboxes to mail. Paste the testCode anywhere in your email — subject line or body — and send that email from the mailbox you want measured to every address in testEmails. We then search those mailboxes for the code to see whether it landed in the inbox or in spam. A test expires 24 hours after it is created if the email never arrives.
apiKeyRequest body
{
"apiKey": "{{apiKey}}"
}Responses
{
"testCode": "ibxwrm-4f1c9a7b2e8d05c1",
"testEmails": [
"seed.one@gmail.com",
"seed.two@outlook.com",
"seed.three@yourseeddomain.com"
],
"status": "pending",
"expiresAt": "2026-08-19T10:00:00Z"
}Get Spam Test Results#
https://app.inboxwarm.ai/api/v1/spam-tests/{testCode}/resultsFull placement breakdown for a completed test: where the email landed in each seed mailbox, the inbox/spam percentages and the spam score. Returns 202 not_ready while the test is still running, 410 expired if the window closed before the email arrived, and 409 test_failed if the check itself could not run. unreachableCount counts seed mailboxes we could not open — those are excluded from accountsChecked rather than counted against your email.
api_keyResponses
{
"testCode": "ibxwrm-4f1c9a7b2e8d05c1",
"status": "completed",
"spamScore": 80.0,
"inboxCount": 4,
"spamCount": 1,
"notFoundCount": 0,
"accountsChecked": [
{
"emailAccount": "seed.one@gmail.com",
"placement": "inbox",
"foundInInbox": true,
"foundInSpam": false
},
{
"emailAccount": "seed.two@outlook.com",
"placement": "spam",
"foundInInbox": false,
"foundInSpam": true
}
],
"unreachableCount": 0,
"placementSummary": {
"totalChecked": 5,
"totalAttempted": 5,
"unreachableCount": 0,
"inboxPlacement": { "count": 4, "percentage": 80.0 },
"spamPlacement": { "count": 1, "percentage": 20.0 },
"notFound": { "count": 0, "percentage": 0 }
},
"expiresAt": "2026-08-19T10:00:00Z"
}List Spam Tests#
https://app.inboxwarm.ai/api/v1/spam-testsList your spam tests, newest first, with the same fields as the status endpoint. Paginated with page and limit (default 20, maximum 100).
api_keyResponses
{
"items": [
{
"testCode": "ibxwrm-4f1c9a7b2e8d05c1",
"status": "completed",
"spamScore": 80.0,
"inboxCount": 4,
"spamCount": 1,
"notFoundCount": 0,
"expiresAt": "2026-08-19T10:00:00Z"
}
],
"total": 1,
"page": 1,
"limit": 20,
"totalPages": 1
}