Skip to content
SimpleCold

API docs

Endpoints

Verify one address

On this page

Checks one email address in real time and returns its category, status and a plain reason. Use it on sign-up and lead forms.

GET/api/v1/api-validation/single

Query parameters

ParameterTypeRequiredDescription
emailstringYesThe address to verify. URL-encode it: addresses can contain + and other characters that mean something in a URL.

Send your API key as Authorization: Bearer <your-api-key>. See Using your API key.

Request

curl -G "https://simplecold.com/api/v1/api-validation/single" \
  --data-urlencode "[email protected]" \
  -H "Authorization: Bearer YOUR_API_KEY"

-G puts the --data-urlencode value in the query string of a GET request.

Set your client timeout above 12 seconds, or you will cut off answers you would otherwise get.

Response · 200
{
  "code": "SUCCESS",
  "message": "Successfully performed operation.",
  "payload": {
    "email": "[email protected]",
    "domain": "example.com",
    "status": "mailbox_found",
    "statusMessage": "The mailbox exists and accepts mail.",
    "category": "deliverable",
    "failType": "none",
    "mxLocation": "US",
    "siteLocation": "US",
    "siteLanguage": "EN",
    "suggestion": null
  },
  "requestId": "9b07c1d2-..."
}

The result is always inside payload. Code that reads category from the top level of the response gets undefined.

Response fields

FieldTypeDescription
emailstringThe address that was checked, trimmed and lowercased.
domainstringThe domain part of the address.
categorystringWhat to act on: deliverable, risky or undeliverable, or pending while the check is still running. Treat any other value as unknown.
statusstringThe reason code: the specific outcome, such as mailbox_found, accept_all, disposable or mailbox_not_found. See Statuses and categories.
statusMessagestringA plain-language reason you can show to a person or store in a CRM.
failTypestringpermanent, temporary or none. temporary means a later re-check may give a different answer.
mxLocationstring | nullCountry code where the domain's mail servers appear to be.
siteLocationstring | nullCountry code where the domain's website appears to be.
siteLanguagestring | nullLanguage of the domain's website.
suggestionstring | nullA likely correction when the domain looks misspelled (for example [email protected] → [email protected]); otherwise null. We never change the address for you.

Status values

The status field holds one of these reason codes. Each maps to one category:

CategoryReason codes
deliverablemailbox_found
riskyaccept_all, role_address, disposable, mailbox_unconfirmed, blocked_by_server, no_response
undeliverablemailbox_not_found, mailbox_disabled, rejected, server_error, no_mail_server, invalid_format, possible_typo
pendingprocessing

Statuses and categories explains each one.

Typos

When the domain looks like a misspelling of a common provider (gmial.com, hotmial.com, gmail.con), the address is reported as possible_typo with a suggestion:

payload
{
  "email": "[email protected]",
  "domain": "gmial.com",
  "status": "possible_typo",
  "statusMessage": "Possible typo. Did you mean [email protected]?",
  "category": "undeliverable",
  "failType": "permanent",
  "mxLocation": null,
  "siteLocation": null,
  "siteLanguage": null,
  "suggestion": "[email protected]"
}

Check the suggested address separately if you want to use it.

Slow mail servers: the processing status

Most checks finish in a few seconds. Some mail servers deliberately answer slowly (greylisting), so a check can take up to a minute. Instead of keeping your request open, the API answers within about 12 seconds. If the mailbox has not answered yet, you get:

payload
{
  "email": "[email protected]",
  "domain": "example.com",
  "status": "processing",
  "statusMessage": "Still checking this mailbox. Ask again in about a minute; you will not be charged again.",
  "category": "pending",
  "failType": "none",
  "mxLocation": null,
  "siteLocation": null,
  "siteLanguage": null,
  "suggestion": null
}

The check keeps running on our side. To get the final result:

GET/api/v1/api-validation/single/result
Request
curl -G "https://simplecold.com/api/v1/api-validation/single/result" \
  --data-urlencode "[email protected]" \
  -H "Authorization: Bearer YOUR_API_KEY"

It takes the same email query parameter and returns one of three things:

ResponseMeaningWhat to do
200 with status: "processing"Still runningWait and ask again.
200 with any other statusFinishedStore it. The pending marker is cleared.
404, No check in progress for this email.Nothing pending for this addressYou already collected the result, or no check was started.

Collecting a result never uses credits. Calling GET /api-validation/single again for the same address within 30 minutes doesn't charge again either. Each address is charged once, when its final result is ready.

Poll every 10 to 20 seconds for up to 3 minutes. /single/result shares the single endpoint's limit of 100 requests per minute. Once you have read a finished result, a second call returns 404, so save it the first time.

Errors

HTTPBodyCause
400{ "success": false, "message": "Please check your input and try again.", "data": [...] }email is missing or not a valid address. Don't retry; treat the address as invalid.
400{ "code": "FAILURE", "message": "Insufficient credits.", "data": null }Your balance can't cover the request (Please buy credits. when it is empty).
401{ "code": "FAILURE", "message": "Invalid API key", "data": null }See authentication errors.
404{ "code": "FAILURE", "message": "No check in progress for this email.", "data": null }/single/result only: nothing pending for this address.
429{ "code": "RATE_LIMITED", "message": "Rate limit exceeded. Maximum 100 requests per minute per API key.", "data": { "policy": "...", "retryAfterSeconds": 6, ... }, "status": 429, "error": "..." }Over 100 requests per minute with this API key. Wait Retry-After seconds. See Rate limits.

The full response formats are described in the introduction.

Test it

Test addresses return fixed results and don't use credits:

Request
curl -G "https://simplecold.com/api/v1/api-validation/single" \
  --data-urlencode "[email protected]" \
  -H "Authorization: Bearer YOUR_API_KEY"

A 200 with "code": "SUCCESS" and "status": "accept_all" in the payload means your integration works. See Test emails for the full list.

Single validation | SimpleCold API docs