Email enrichment
Look up an email address and get its social footprint: registered sites, public profiles, likely usernames and activity dates.
POST /v1/lookup/email takes an email address and returns its social footprint: the sites it is registered on, the
public profiles behind those accounts, likely usernames, account activity dates and a mailbox check. Use it to enrich
a contact record or to see who is behind a sign-up.
Get a key
The Enrich API has its own key, separate from your Web Access key. Contact us to get one. The samples
below read the key from STRING_ENRICH_KEY and the address to look up from EMAIL:
export STRING_ENRICH_KEY="your key"
export EMAIL="the address to look up"Send it as Authorization: Bearer <key> or x-api-key: <key>. Keep it server-side. A missing or wrong key returns
401.
Look up an email
curl https://enrich.usestring.ai/v1/lookup/email \
-H "Authorization: Bearer $STRING_ENRICH_KEY" \
-H "Content-Type: application/json" \
-d "{\"email\": \"$EMAIL\"}" \
--max-time 180import os
import requests
res = requests.post(
"https://enrich.usestring.ai/v1/lookup/email",
headers={"Authorization": f"Bearer {os.environ['STRING_ENRICH_KEY']}"},
json={"email": os.environ["EMAIL"]},
timeout=180,
)
print(res.json())const res = await fetch("https://enrich.usestring.ai/v1/lookup/email", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.STRING_ENRICH_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email: process.env.EMAIL }),
signal: AbortSignal.timeout(180_000),
});
console.log(await res.json());| Field | Type | Default | Description |
|---|---|---|---|
email | string | — | Required. The address to look up. Up to 254 characters, 64 before the @. |
fresh | boolean | false | true ignores a result cached in the last 24 hours and runs a new lookup. |
A new lookup can take up to three minutes, so set your HTTP client timeout to at least 180 seconds. Results are cached for 24 hours, and a cached result returns immediately.
Response
Trimmed to one entry per list:
{
"ok": true,
"data": {
"email": "…",
"complete": true,
"sites_checked": 169,
"profiles": [
{
"site": "GitHub",
"domain": "github.com",
"profile": { "username": "…", "name": "…", "url": "…", "created_at": "…", "followers": 12 },
"details": { "company": "…" }
}
],
"registered_on": [{ "site": "GitHub", "domain": "github.com" }],
"identity": {
"verdict": "…",
"summary": "…",
"groups": [],
"accounts": [{ "site": "github", "status": "…", "group": 0 }]
},
"usernames": [{ "value": "…", "kind": "username", "likelihood": "likely", "confidence": 0.9, "sites": ["GitHub"] }],
"mailbox": { "service": "gmail", "accepts_mail": true },
"activity": {
"first_seen": "2014-03-02",
"last_seen": "2026-10-30",
"events": [{ "date": "2014-03-02", "site": "GitHub", "event": "account_created" }]
}
},
"meta": { "cached": false, "took_ms": 41250 }
}| Field | Type | Description |
|---|---|---|
email | string | The address looked up. |
complete | boolean | true when every site finished checking. |
sites_checked | number | How many sites were checked. |
profiles | array | Sites with an account on this address and profile details. See Profiles. |
registered_on | array | Every site where the address is registered, as site and domain. |
identity | object | Whether the accounts appear to belong to one person: verdict, summary, groups, and accounts[] with site, status and group. |
usernames | array | Likely usernames for the person: value, kind, likelihood, confidence from 0 to 1, and the sites it came from. |
mailbox | object | service, the mailbox service (for example gmail), and accepts_mail. |
activity | object | first_seen and last_seen in ISO 8601, and events[] with date, site and event: account_created, last_login or last_seen. |
meta.cached | boolean | true when the result came from the 24-hour cache. |
An address with no footprint returns ok: true with empty profiles and registered_on. That is a real "nothing
found", not an error. A field with nothing to report is left out.
Profiles
Each profiles[] entry has site, domain, profile and details. profile holds the common attributes under one
name each, when the site reports them: username, name, url, avatar_url, bio, location, created_at,
last_active_at, followers and following. details holds any other attributes the site reports, and its keys vary
by site.
Check your usage
curl https://enrich.usestring.ai/v1/me \
-H "Authorization: Bearer $STRING_ENRICH_KEY"{ "ok": true, "client": "your-org", "usage": { "today": 12, "daily_cap": 500 } }today counts lookups since 00:00 UTC, cached ones included. Failed lookups are not counted.
Limits
| Limit | Value | When you hit it |
|---|---|---|
| Lookups per day | Your key's daily_cap from /v1/me, resetting at 00:00 UTC | 429 with daily_cap |
| New lookups at once | 2 per key. Cached results are always served. | 429 with busy |
| Request body | 16 KB | 413 |
To raise your daily cap, contact us.
Errors
Errors return ok: false with a code:
{ "ok": false, "error": { "code": "busy", "message": "too many lookups in progress, retry shortly" } }| Status | code | Meaning | Retry | Counted |
|---|---|---|---|---|
400 | bad_request | email is missing, not a string, or not an address. | No. Fix the body. | No |
401 | unauthorized | Missing or wrong key. | No. Check the key. | No |
404 | not_found | Unknown path or method. | No. | No |
413 | — | Body over 16 KB. | No. | No |
429 | busy | Two new lookups are already running on your key. | After the retry-after header (15 s). | No |
429 | daily_cap | Daily cap reached. | After 00:00 UTC. | No |
502 | lookup_failed | The lookup failed. | Once. | No |
503 | over_capacity | Temporarily out of capacity. | After the retry-after header. | No |
Permitted use
Results describe publicly observable account registrations and profiles for an email address. Do not use them as a factor in decisions about employment, credit, insurance or housing eligibility.