Email Lookup
Check Breaches
Check if an email has been exposed in known data breaches. 1 credit, with free repeats for 6 months.
POST
/
api
/
agent
/
breaches
Check Breaches
curl --request POST \
--url https://encrata.com/api/agent/breaches \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "<string>"
}
'import requests
url = "https://encrata.com/api/agent/breaches"
payload = { "email": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({email: '<string>'})
};
fetch('https://encrata.com/api/agent/breaches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://encrata.com/api/agent/breaches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://encrata.com/api/agent/breaches"
payload := strings.NewReader("{\n \"email\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://encrata.com/api/agent/breaches")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://encrata.com/api/agent/breaches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"email": "safe@example.com",
"breached": false,
"breach_info": {
"breach_count": 0,
"services": [],
"exposed_data": [],
"interests": []
},
"credits": 1
}
{
"email": "user@example.com",
"breached": true,
"breach_info": {
"breach_count": 3,
"services": [
{ "name": "LinkedIn", "domain": "linkedin.com", "breach_date": "2012-05-05", "data_types": ["Email addresses", "Passwords"] },
{ "name": "Adobe", "domain": "adobe.com", "breach_date": "2013-10-04", "data_types": ["Email addresses", "Usernames"] },
{ "name": "Dropbox", "domain": "dropbox.com", "breach_date": "2012-07-01", "data_types": ["Email addresses", "Passwords"] }
],
"exposed_data": ["Email addresses", "Passwords", "Usernames"],
"interests": [{ "category": "Professional", "signal": 1 }]
},
"credits": 1
}
{ "error": "Insufficient credits. Please top up your account." }
Authentication
Requires an API key in theAuthorization header.
Authorization: Bearer YOUR_API_KEY
Request
string
required
The email address to check for data breaches.
Example request
curl -X POST "https://encrata.com/api/agent/breaches" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'
import requests
resp = requests.post(
"https://encrata.com/api/agent/breaches",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={"email": "test@example.com"},
)
print(resp.json())
const resp = await fetch("https://encrata.com/api/agent/breaches", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ email: "test@example.com" }),
});
const data = await resp.json();
Response
Returns the canonical breach shape shared with the dashboard, so the CLI and this endpoint all return identical fields.string
The email address that was checked.
boolean
Whether the email appears in one or more known breaches.
object
The canonical breach detail object.
Show breach_info
Show breach_info
number
Number of known data breaches the email appears in.
object[]
Breached services, each
{ name, domain, breach_date, data_types }.string[]
Aggregated data types exposed across all breaches (e.g.
["Passwords", "Email addresses"]).object[]
Inferred interest categories, each
{ category, signal }, derived from
which services the email was breached on.number
Credits charged for this request.
1 on a fresh charge, or 0 when you were
already charged for this address within the billing window (a free repeat).Errors
Errors return a JSON body of the form{"error": "<message>"} with the matching
HTTP status code.
| Status | Message | Cause |
|---|---|---|
400 | Invalid request body | Malformed JSON |
400 | Invalid email address | Address fails syntax parsing |
401 | API key required / bad key | Missing or invalid API key |
401 | Unauthorized | The key’s account could not be resolved |
402 | Insufficient credits. Please top up your account. | Not enough credits and not a free repeat |
405 | Only POST method is allowed | Wrong HTTP method |
502 | Breach lookup failed. Please try again. | Transient provider error, retry shortly |
503 | Breach lookup is temporarily unavailable | Breach provider not configured |
Credits
Each check costs 1 credit. Billing is per-customer: 1 on the first check of an address,0 for repeats within the billing window. See Credits.
{
"email": "safe@example.com",
"breached": false,
"breach_info": {
"breach_count": 0,
"services": [],
"exposed_data": [],
"interests": []
},
"credits": 1
}
{
"email": "user@example.com",
"breached": true,
"breach_info": {
"breach_count": 3,
"services": [
{ "name": "LinkedIn", "domain": "linkedin.com", "breach_date": "2012-05-05", "data_types": ["Email addresses", "Passwords"] },
{ "name": "Adobe", "domain": "adobe.com", "breach_date": "2013-10-04", "data_types": ["Email addresses", "Usernames"] },
{ "name": "Dropbox", "domain": "dropbox.com", "breach_date": "2012-07-01", "data_types": ["Email addresses", "Passwords"] }
],
"exposed_data": ["Email addresses", "Passwords", "Usernames"],
"interests": [{ "category": "Professional", "signal": 1 }]
},
"credits": 1
}
{ "error": "Insufficient credits. Please top up your account." }
Bulk
To check a list of emails today, call this endpoint once per address (it is rate limited to 60 requests per minute, and repeats within the billing window are free atcredits: 0).
A dedicated async breach-jobs pipeline (
/api/agent/breach-jobs, mirroring
Email Validity
and Email Identity)
is not available yet. Until it ships, use the single endpoint above for
programmatic bulk checks.Was this page helpful?
⌘I
Check Breaches
curl --request POST \
--url https://encrata.com/api/agent/breaches \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"email": "<string>"
}
'import requests
url = "https://encrata.com/api/agent/breaches"
payload = { "email": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({email: '<string>'})
};
fetch('https://encrata.com/api/agent/breaches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://encrata.com/api/agent/breaches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'email' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://encrata.com/api/agent/breaches"
payload := strings.NewReader("{\n \"email\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://encrata.com/api/agent/breaches")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"email\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://encrata.com/api/agent/breaches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"email\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"email": "safe@example.com",
"breached": false,
"breach_info": {
"breach_count": 0,
"services": [],
"exposed_data": [],
"interests": []
},
"credits": 1
}
{
"email": "user@example.com",
"breached": true,
"breach_info": {
"breach_count": 3,
"services": [
{ "name": "LinkedIn", "domain": "linkedin.com", "breach_date": "2012-05-05", "data_types": ["Email addresses", "Passwords"] },
{ "name": "Adobe", "domain": "adobe.com", "breach_date": "2013-10-04", "data_types": ["Email addresses", "Usernames"] },
{ "name": "Dropbox", "domain": "dropbox.com", "breach_date": "2012-07-01", "data_types": ["Email addresses", "Passwords"] }
],
"exposed_data": ["Email addresses", "Passwords", "Usernames"],
"interests": [{ "category": "Professional", "signal": 1 }]
},
"credits": 1
}
{ "error": "Insufficient credits. Please top up your account." }