Docs / API reference
Email Scoring
Scores an email address from 0 to 3 for how likely it is to be fake, disposable or abusive.
Overview#
scoring/email evaluates the address passed in email without sending anything to it. It returns a score, a plain-language reason, the booleans isValid, isDisposable, isFree, isRoleBased and isEducational, a blacklisted flag, and a domain block with the domain's age and its MX, SPF, DKIM, DMARC and BIMI status (the same data as Domain Lookup).
When to use it#
- Block throwaway addresses at signup, trial creation and promo redemption.
- Decide whether to require email confirmation or extra verification.
- Clean a mailing list before a campaign to protect your sender reputation.
Reading the result#
The score runs from 0 (clean) to 3 (almost certainly bad). A sensible policy:
- 0 to 1: accept normally.
- 2: accept but verify, for example by sending a confirmation link and limiting what the account can do until it is clicked.
- 3: reject, or send to manual review.
Read the flags to understand why. isDisposable is the strongest abuse indicator. isFree (webmail providers) is normal for consumers and says little by itself, while isRoleBased (info@, support@) means a shared mailbox rather than a person. isEducational marks school or university domains, useful if you offer student pricing. A domain that is new or has no MX record pushes the score up.
Extra signals#
suggestion: when the domain looks like a typo of a major provider (gmial.com,hotmial.com,yaho.com,outlok.com,icloud.co,gmail.con), the corrected address, for exampleahmed@gmail.com; otherwisenull. Show it as "Did you mean...?". A typo domain with no MX scores 3 (Email domain looks like a typo of gmail.com.); one that does receive mail scores at least 2.isGibberish:truewhen the part before the@looks randomly generated or keyboard-mashed (xk3j9qz2v,qwerty123,aaaaaa1, a long run of digits). The check is conservative and does not flag ordinary Arabic or Latin names such asmohammed.alqahtaniornoura1995. It raises the score to at least 1.normalized: the canonical address for multi-account detection. It is lower-cased, drops+tagsuffixes, and removes the dots of Gmail addresses, soA.B+shop@gmail.combecomesab@gmail.com. The original stays inemail.
Notes#
- Counts as one request. Test mode returns fake data, is free and raises no events.
- Not part of the Standard plan; available on trial, Premium and pay-as-you-go. Without access you get error 117 (
feature_not_available). - Custom rules for the email group can test the address, domain and each flag, overwrite the score, or mark the address valid or invalid. Matches are listed in
custom_rules_applied. - A
spam_emailevent is raised when the score is 2 or higher and is sent to your webhooks. - A missing or malformed address returns error 119 (
invalid_email_address) with HTTP 200.
Request#
https://gurdx.cretip.com/api/scoring/email
- Authenticate with the key parameter or an Authorization: Bearer header.
- Counts as 1 request.
- Available on: Free trial Premium Pay-as-you-go
Parameters#
| Name | Type | Description |
|---|---|---|
email
required
query |
string |
The email command is used to specify the email you want to validate. Expected values: an email address Sample value: name@domain.com
|
Every method also accepts format, lang, mode, userID, callback. See Options.
Code samples#
curl -G "https://gurdx.cretip.com/api/scoring/email" \
--data-urlencode "key=YOUR_API_KEY" \
--data-urlencode "email=user@example.com"
<?php
$response = file_get_contents('https://gurdx.cretip.com/api/scoring/email?'.http_build_query(['key' => 'YOUR_API_KEY', 'email' => 'user@example.com']));
$result = json_decode($response, true);
if ($result['status'] === 'success') {
print_r($result['data']);
} else {
echo $result['code'].': '.$result['description'];
}
const params = new URLSearchParams({"key":"YOUR_API_KEY","email":"user@example.com"});
const res = await fetch(`https://gurdx.cretip.com/api/scoring/email?${params}`);
const result = await res.json();
if (result.status === 'success') {
console.log(result.data);
} else {
console.error(result.code, result.description);
}
import requests
res = requests.get("https://gurdx.cretip.com/api/scoring/email", params={"key": "YOUR_API_KEY", "email": "user@example.com"})
result = res.json()
if result["status"] == "success":
print(result["data"])
else:
print(result["code"], result["description"])
Response#
Success#
{
"data": {
"score": 3,
"reason": "Email domain is considered dangerous.",
"isValid": false,
"isFree": false,
"isRoleBased": true,
"isEducational": false,
"isDisposable": false,
"blacklisted": false,
"email": "test@dangerous-domain.com",
"domain": {
"name": "dangerous-domain.com",
"is_dangerous": true,
"is_spf": false,
"is_dmarc": false,
"is_dkim": false,
"is_mx": false,
"is_bimi": false,
"created_at": "2025-02-05",
"is_new": true
},
"custom_rules_applied": {
"total": 0,
"rules": []
},
"suggestion": null,
"isGibberish": false,
"normalized": "test@dangerous-domain.com"
},
"status": "success",
"executionTime": 1
}Error#
Errors are delivered with HTTP 200 — always check the status field.
{
"status": "error",
"code": 101,
"type": "invalid_key",
"description": "The API Key is missing or invalid."
}Response fields#
| Name | Type | Description |
|---|---|---|
data.score |
integer |
A risk-score from 0 to 3 indicating how risky this email address is (0=safe, 1=low-risk, 2=high-risk, 3=too-risky). |
data.reason |
string |
The reason behind considering this email address as risky. Note: The value of this property will be empty if the score is 0.
|
data.isFree |
boolean |
Indicates whether the email address is from a free email service provider. |
data.isRoleBased |
boolean |
Indicates whether the email address is a role-based email address. Role-based email addresses are those that are associated with a particular role or group, such as admin, support, info, etc.
|
data.isEducational |
boolean |
Indicates whether the email address is an educational email address. |
data.isValid |
boolean |
A boolean value that you can rely on to determine if the email address is 100% safe & valid or not. |
data.isDisposable |
boolean |
Indicates whether the email address is a disposable email address (also known as Temporary Email Addresses). |
data.blacklisted |
boolean |
Indicates if the email/domain is blacklisted due to applying custom rules or were found in one of your blacklists. |
data.suggestion |
string|null |
Corrected address when the domain looks like a typo of a major provider, e.g. ahmed@gmail.com. |
data.isGibberish |
boolean |
True when the local part looks randomly generated or keyboard-mashed. |
data.normalized |
string |
Canonical address for multi-account detection (lower-case, +tag removed, Gmail dots removed). |
data.domain.name |
string |
The full domain name associated with the email address (for example, gmail.com).
|
data.domain.is_dangerous |
boolean|null |
Indicates whether the domain is flagged as dangerous or suspicious, which may suggest a higher risk of fraud or abuse. If this property is set to true, the domain is considered high-risk or potentially malicious. As a result, the isValid property will also be false, indicating that the email address should not be trusted for critical communications or user registrations. It is strongly recommended to block or flag such email addresses in your application workflow.
|
data.domain.is_spf |
boolean|null |
Indicates whether the domain has a valid SPF (Sender Policy Framework) record, which helps prevent email spoofing. |
data.domain.is_dmarc |
boolean|null |
Indicates whether the domain has a valid DMARC (Domain-based Message Authentication, Reporting, and Conformance) record, which helps protect against email phishing and spoofing. |
data.domain.is_dkim |
boolean|null |
Indicates whether the domain has a valid DKIM (DomainKeys Identified Mail) record, which verifies the authenticity of the sender's domain. |
data.domain.is_mx |
boolean|null |
Indicates whether the domain has valid MX (Mail Exchange) records, confirming that it is capable of receiving emails. |
data.domain.is_bimi |
boolean|null |
Indicates whether the domain has a valid BIMI (Brand Indicators for Message Identification) record, which allows brand logos to be displayed in supported email clients. |
data.domain.created_at |
string|null |
The date when the domain was first registered or created, if available. |
data.domain.is_new |
boolean|null |
Indicates whether the domain is new or recently registered (registered within 1 year), which may affect its reputation and trustworthiness. |
data.domain |
object |
The information associated with the domain name of the email address. |
data.custom_rules_applied.total |
integer |
The total number of custom rules applied to this request. |
data.custom_rules_applied.rules.id |
string |
The rule ID as shown in the dashboard (e.g: CR104).
|
data.custom_rules_applied.rules.title |
string |
The rule title you set when creating the rule. |
data.custom_rules_applied.rules |
object |
The custom rules applied to this request, learn more. |
data.custom_rules_applied |
object |
The custom rules applied to this request, learn more. |
data.status |
string |
The response status. Expected values: success, or error.
|
data.executionTime |
integer |
Time spent in milliseconds to process the data. |
data |
object |
— |
Found a mistake? Tell us on the contact page. Contact