Getting Started
Abstract’s Email Reputation API requires only your unique API key api_key
and a single email email
:
https://emailreputation.abstractapi.com/v1/
? api_key = YOUR_UNIQUE_API_KEY
& email = johnsmith@gmail.com
This was a successful request, and all available details about that email were returned:
{
"email_address": "benjamin.richard@abstractapi.com",
"email_deliverability": {
"status": "deliverable",
"status_detail": "valid_email",
"is_format_valid": true,
"is_smtp_valid": true,
"is_mx_valid": true,
"mx_records": [
"gmail-smtp-in.l.google.com",
"alt3.gmail-smtp-in.l.google.com",
"alt4.gmail-smtp-in.l.google.com",
"alt1.gmail-smtp-in.l.google.com",
"alt2.gmail-smtp-in.l.google.com"
]
},
"email_quality": {
"score": 0.8,
"is_free_email": false,
"is_username_suspicious": false,
"is_disposable": false,
"is_catchall": true,
"is_subaddress": false,
"is_role": false,
"is_dmarc_enforced": true,
"is_spf_strict": true,
"minimum_age": 1418
},
"email_sender": {
"first_name": "Benjamin",
"last_name": "Richard",
"email_provider_name": "Google",
"organization_name": "Abstract API",
"organization_type": "company"
},
"email_domain": {
"domain": "abstractapi.com",
"domain_age": 1418,
"is_live_site": true,
"registrar": "NAMECHEAP INC",
"registrar_url": "http://www.namecheap.com",
"date_registered": "2020-05-13",
"date_last_renewed": "2024-04-13",
"date_expires": "2025-05-13",
"is_risky_tld": false
},
"email_risk": {
"address_risk_status": "low",
"domain_risk_status": "low"
},
"email_breaches": {
"total_breaches": 2,
"date_first_breached": "2018-07-23T14:30:00Z",
"date_last_breached": "2019-05-24T14:30:00Z",
"breached_domains": [
{ "domain": "apollo.io", "date_breached": "2018-07-23T14:30:00Z" },
{ "domain": "canva.com", "date_breached": "2019-05-24T14:30:00Z" }
]
}
}
Request parameters
Your unique API key. Note that each user has unique API keys for each of
Abstract’s APIs, so your Email Validation API key will not work for your IP
Geolocation API, for example.
The email address to validate.
Response parameters
The API response is returned in a universal and lightweight JSON format.
The email address you submitted for analysis.
email_deliverability.status
Whether the email is considered deliverable
, undeliverable
, or unknown
.
email_deliverability.status_detail
Additional detail on deliverability (e.g., inbox_full
, full_mailbox
, invalid_format
).
email_deliverability.is_format_valid
Is true
if the email follows the correct format.
email_deliverability.is_smtp_valid
Is true
if the SMTP check was successful.
email_deliverability.is_mx_valid
Is true
if the domain has valid MX records.
email_deliverability.mx_records
List of MX records associated with the domain.
Confidence score between 0.01 and 0.99 representing email quality.
email_quality.is_free_email
Is true
if the email is from a known free provider like Gmail or Yahoo.
email_quality.is_username_suspicious
Is true
if the username appears auto-generated or suspicious.
email_quality.is_disposable
Is true
if the email is from a disposable email provider.
email_quality.is_catchall
Is true
if the domain is configured to accept all emails.
email_quality.is_subaddress
Is true
if the email uses subaddressing (e.g., user+label@domain.com
).
Is true
if the email is a role-based address (e.g., info@domain.com
, support@domain.com
).
email_quality.is_dmarc_enforced
Is true
if a strict DMARC policy is enforced on the domain.
email_quality.is_spf_strict
Is true
if the domain enforces a strict SPF policy.
email_quality.minimum_age
Is Estimated age of the email address in days, or null
if unknown.
First name associated with the email address, if available.
Last name associated with the email address, if available.
email_sender.email_provider_name
Name of the email provider (e.g., Google, Microsoft).
email_sender.organization_name
Organization linked to the email or domain, if available.
email_sender.organization_type
Type of organization (e.g., company
).
Domain part of the submitted email address.
Age of the domain in days.
email_domain.is_live_site
Is true
if the domain has a live website.
Name of the domain registrar.
email_domain.registrar_url
URL of the domain registrar.
email_domain.date_registered
Date when the domain was registered.
email_domain.date_last_renewed
Last renewal date of the domain.
email_domain.date_expires
Expiration date of the domain registration.
email_domain.is_risky_tld
Is true
if the domain uses a top-level domain associated with risk.
email_risk.address_risk_status
Risk status of the email address: low
, medium
, or high
.
email_risk.domain_risk_status
Risk status of the domain: low
, medium
, or high
.
email_breaches.total_breaches
Total number of data breaches involving this email.
email_breaches.date_first_breached
Date of the first known breach.
email_breaches.date_last_breached
Date of the most recent breach.
email_breaches.breached_domains
List of breached domains including:
email_breaches.breached_domains[].domain
Domain affected by the breach.
email_breaches.breached_domains[].date_breached
Date when the breach occurred.
Request examples
In the example below, we show the request and response for an email does not follow the proper format. If the email fails the is_format_valid
check, then the other checks will not be performed and will be returned as false
https://emailreputation.abstractapi.com/v1/
? api_key = YOUR_UNIQUE_API_KEY
& email = johnsmith
The request was valid and successful, and so it returns the following:
{
"email_address": "johnsmith",
"email_deliverability": {
"status": "undeliverable",
"status_detail": "invalid_format",
"is_format_valid": false,
"is_smtp_valid": false,
"is_mx_valid": false,
"mx_records": []
},
"email_quality": {
"score": null,
"is_free_email": null,
"is_username_suspicious": null,
"is_disposable": null,
"is_catchall": null,
"is_subaddress": null,
"is_role": null,
"is_dmarc_enforced": null,
"is_spf_strict": null,
"minimum_age": null
},
"email_sender": {
"first_name": null,
"last_name": null,
"email_provider_name": null,
"organization_name": null,
"organization_type": null
},
"email_domain": {
"domain": null,
"domain_age": null,
"is_live_site": null,
"registrar": null,
"registrar_url": null,
"date_registered": null,
"date_last_renewed": null,
"date_expires": null,
"is_risky_tld": null
},
"email_risk": {
"address_risk_status": null,
"domain_risk_status": null
},
"email_breaches": {
"total_breaches": null,
"date_first_breached": null,
"date_last_breached": null,
"breached_domains": []
}
}
Possible values for status_detail
This field provides more information about the deliverability result.
When status
is deliverable
:
- valid_email: The email address exists, is valid, and can receive new emails.
- high_traffic_email: The email is valid and exists, but the server is receiving too many messages. Your email might bounce.
When status
is undeliverable
:
- invalid_mailbox: The email address doesn’t exist or is no longer active. It can’t receive new emails.
- full_mailbox: The email exists but its mailbox is full, so new emails will bounce.
- invalid_format: The email doesn’t follow the correct format (e.g., missing
@
or domain).
- dns_record_not_found: We couldn’t find MX records for the domain, so we couldn’t complete the SMTP check.
- unavailable_server: The mail server for the domain is currently unreachable.
When status
is unknown
:
Bulk upload (CSV)
Don’t know how to or don’t want to make API calls? Use the bulk CSV uploader to easily use the API. The results will be sent to your email when ready.
Here are some best practices when bulk uploading a CSV file:
- Ensure the selected column contains the email addresses to be analyzed.
- Remove any empty rows from the file.
- Include only one email address per row.
- The maximum file size permitted is 50,000 rows.
Response and error codes
Whenever you make a request that fails for some reason, an error is returned also in the JSON format. The errors include an error code and description, which you can find in detail below.
Code | Type | Details |
---|
200 | OK | Everything worked as expected. |
400 | Bad request | Bad request. |
401 | Unauthorized | The request was unacceptable. Typically due to the API key missing or incorrect. |
422 | Quota reached | The request was aborted due to insufficient API credits. (Free plans) |
429 | Too many requests | The request was aborted due to the number of allowed requests per second being reached. This happens on free plans as requests are limited to 1 per second. |
500 | Internal server error | The request could not be completed due to an error on the server side. |
503 | Service unavailable | The server was unavailable. |
Code samples and libraries
Please see the top of this page for code samples for these languages and more. If we’re missing a code sample, or if you’d like to contribute a code sample or library in exchange for free credits, email us at: team@abstractapi.com
Other notes
A note on metered billing: Each individual email you submit counts as a credit used. Credits are also counted per request, not per successful response. So if you submit a request for the (invalid) email address “kasj8929hs”, that still counts as 1 credit.