Continuum API
Email verification and continuous monitoring API. Verify emails in real time, process bulk lists, monitor mailbox health, and receive signed webhooks when status changes.
Base URL: https://api.continuumapi.com
Dashboard: app.continuumapi.com
Quickstart
Get your API key from the dashboard, then verify your first email:
curl -X POST https://api.continuumapi.com/v1/verify \
-H "Authorization: Bearer cnt_your_key_here" \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com"}'
{
"id": "cmofz5wme0001d7bb",
"email": "user@example.com",
"domain": "example.com",
"status": "unknown",
"subStatus": "smtp_not_checked",
"checks": {
"syntaxValid": true,
"mxFound": true,
"mxRecords": ["mail.example.com"],
"isDisposable": false,
"isRoleAccount": false,
"smtpChecked": false,
"smtpReachable": null,
"isCatchAll": null,
"greylisted": false
},
"score": 55,
"durationMs": 38,
"checkedAt": "2026-04-27T10:00:00.000Z"
}
Authentication
All requests require a Bearer token:
Authorization: Bearer cnt_your_key_here
Alternatively use the X-API-Key header. Get your key from your dashboard.
POST /v1/verify
Verify a single email address. Returns a structured verdict with 9 check results and a 0-100 confidence score.
Request
| Field | Type | Description |
|---|---|---|
email required | string | Email address to verify. Max 254 characters. |
Response
| Field | Type | Description |
|---|---|---|
status | string | valid · invalid · risky · unknown |
subStatus | string|null | Reason for non-valid status |
score | integer | Confidence score 0-100 |
checks | object | Individual check results |
durationMs | integer | Total verification time in ms |
checkedAt | string | ISO 8601 timestamp |
Bulk jobs
Upload a CSV and verify up to 100,000 emails asynchronously.
POST /v1/bulk-jobs
curl -X POST https://api.continuumapi.com/v1/bulk-jobs \ -H "Authorization: Bearer cnt_your_key_here" \ -F "file=@emails.csv"
GET /v1/bulk-jobs/:id
Poll for job status and progress.
GET /v1/bulk-jobs/:id/results
Paginated per-email results. Supports status and isDuplicate filters.
Monitoring
Register emails for continuous background rechecks. Get webhooks when status changes.
POST /v1/monitoring
| Field | Type | Description |
|---|---|---|
email required | string | Email to monitor |
intervalHours | integer | 1, 6, 12, 24, 48, 72, or 168. Default: 24 |
tags | string[] | Up to 10 labels for filtering |
Webhooks
Receive signed HTTPS payloads when events occur.
Signature verification
const crypto = require('crypto');
function verify(secret, rawBody, header) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody, 'utf8').digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected), Buffer.from(header));
}
Status codes
| Status | Meaning | Safe to send? |
|---|---|---|
| valid | SMTP-confirmed deliverable | Yes |
| invalid | Syntax error, no MX, or SMTP rejected | No |
| risky | Deliverable but high bounce risk | With caution |
| unknown | SMTP unavailable or greylisted | Human review |
Sub-statuses
| subStatus | Description |
|---|---|
syntax_invalid | RFC 5321 syntax failure |
no_mx_records | Domain has no MX records |
smtp_rejected | Server returned permanent 5xx |
smtp_greylisted | Server returned 4xx |
smtp_not_checked | SMTP disabled or skipped |
catch_all | Server accepts all addresses |
role_account | Shared mailbox (info@, admin@, etc.) |
disposable_domain | Known throwaway email provider |
Webhook events
| Event | Trigger |
|---|---|
verification.completed | Single email verified |
bulk_job.completed | Bulk job finished |
email.status_changed | Monitored email changed status |
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | VALIDATION_ERROR | Invalid request body |
| 401 | UNAUTHORIZED | Missing or invalid API key |
| 404 | NOT_FOUND | Resource not found |
| 429 | RATE_LIMITED | Too many requests |
Rate limits
| Plan | Requests/month | Requests/minute |
|---|---|---|
| Free | 100 | 10 |
| Growth | 10,000 | 100 |
| Scale | 100,000 | 1,000 |