Enrichment API
The Fuego API enriches email addresses in real-time directly from your application. It is fast enough to run at the point of capture — during user signup, lead capture, or form submission — and tells you who is behind the address, what kind of organization it belongs to, and whether it shows abuse signals.
Fuego never connects to mail servers. All domain checks are DNS-only.
API Basics
- Base URL:
https://app.gofuego.io/api/v1/ - Authentication: API token via the
tokenquery parameter (required for all requests) - Rate Limit: by plan — 60/min (Starter), 300/min (Growth), 600/min (Scale); 30/min on the free trial
- Format: JSON
Authentication
Add your token as a query parameter to every request:
https://app.gofuego.io/api/v1/enrich?token=YOUR_API_TOKEN&email=kochanski@jmc.com
Keep your API token secure — never expose it in client-side code or public repositories.
Getting Started
- Log in to your Fuego account at app.gofuego.io
- Navigate to “API Settings” in your account dashboard
- Generate a new API token
- Use this token in your API requests as shown above
Enriching an Email
Endpoint
GET https://app.gofuego.io/api/v1/enrich
Parameters
| Parameter | Required | Description |
|---|---|---|
| token | Yes | Your API token |
| Yes | The email address to enrich |
Each request uses one enrichment from your monthly plan (or free-trial balance). Syntactically invalid addresses and unknown results (category: "unknown") are always free — you only pay when Fuego tells you something useful.
Example Request
curl -X GET "https://app.gofuego.io/api/v1/enrich?token=YOUR_API_TOKEN&email=kochanski@jmc.com"
Example Response
{
"success": true,
"email": "kochanski@jmc.com",
"user": "kochanski",
"domain": "jmc.com",
"syntax_valid": true,
"did_you_mean": null,
"normalized_email": "kochanski@jmc.com",
"disposable": false,
"free": false,
"role": false,
"plus_address": false,
"has_mx": true,
"category": "enterprise",
"risk": "low",
"organization": {
"name": "Jupiter Mining Corporation",
"industry": "Mining (except Oil and Gas)",
"country": "UK",
"ticker": "JMC",
"employees": 58000,
"employee_range": "10000+",
"description": "Jupiter Mining Corporation is a large mining company operating ore freighters across the solar system."
}
}
Response Fields
| Field | Type | Description |
|---|---|---|
| success | boolean | Always true when the request was processed |
| string | The email address that was enriched | |
| user | string | The local part of the email address (before the @) |
| domain | string | The domain part of the email address |
| syntax_valid | boolean | Whether the address passes format checks. Invalid addresses are not charged a credit |
| did_you_mean | string/null | Suggested correction for likely typos (e.g. gmail.cmo → gmail.com), or null |
| normalized_email | string/null | The address with any plus tag stripped (lister+promo@gmail.com → lister@gmail.com). Use it to deduplicate signups. Null when syntax is invalid |
| disposable | boolean | Whether the email uses a throwaway/temporary email service |
| free | boolean | Whether the email uses a free consumer provider (Gmail, Yahoo, etc.) |
| role | boolean | Whether the email is a shared role address (info@, admin@, support@, etc.) |
| plus_address | boolean | Whether the address uses plus addressing (user+tag@domain) — commonly used to register multiple accounts from one mailbox |
| has_mx | boolean | Whether the domain has DNS MX records. This is a DNS lookup only — Fuego never connects to mail servers |
| category | string | The organization category behind the address (see table below) |
| risk | string | A simple risk level: low, medium, or high (see table below) |
| organization | object | Details about the organization behind the domain. Fields are null when unknown |
Category Values
| Category | Description |
|---|---|
enterprise |
A business with roughly 1,000+ employees |
smb |
A small or medium-sized business |
education |
A school, college, or university |
government |
A government agency or department |
nonprofit |
A nonprofit organization |
individual |
A personal address on a free consumer provider |
disposable |
A throwaway/temporary email service |
unknown |
The organization could not be determined (unknown results are free) |
Risk Levels
| Risk | Trigger |
|---|---|
high |
The address is disposable, has invalid syntax, or the domain has no MX records |
medium |
The address is a shared role address (info@, support@, etc.) |
low |
Everything else |
Organization Fields
| Field | Description |
|---|---|
| name | Organization name |
| industry | The organization’s industry, from a fixed list based on the NAICS 2022 subsectors |
| country | 2-letter country code |
| ticker | Stock ticker symbol (public companies only) |
| employees | Approximate number of employees |
| employee_range | One of: 1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10000+ |
| description | Brief description of the organization |
All organization fields are null when the value is unknown.
More Examples
A disposable address:
{
"success": true,
"email": "rimmer@trashmail.example",
"user": "rimmer",
"domain": "trashmail.example",
"syntax_valid": true,
"did_you_mean": null,
"normalized_email": "rimmer@trashmail.example",
"disposable": true,
"free": false,
"role": false,
"plus_address": false,
"has_mx": true,
"category": "disposable",
"risk": "high",
"organization": {
"name": null,
"industry": null,
"country": null,
"ticker": null,
"employees": null,
"employee_range": null,
"description": null
}
}
An individual using plus addressing — note normalized_email gives you the canonical mailbox for deduplication:
{
"success": true,
"email": "lister+promo@gmail.com",
"user": "lister+promo",
"domain": "gmail.com",
"syntax_valid": true,
"did_you_mean": null,
"normalized_email": "lister@gmail.com",
"disposable": false,
"free": true,
"role": false,
"plus_address": true,
"has_mx": true,
"category": "individual",
"risk": "low",
"organization": {
"name": null,
"industry": null,
"country": null,
"ticker": null,
"employees": null,
"employee_range": null,
"description": null
}
}
A likely typo — the mistyped domain has no MX records, and did_you_mean carries the suggested fix:
{
"success": true,
"email": "lister@gmail.cmo",
"user": "lister",
"domain": "gmail.cmo",
"syntax_valid": true,
"did_you_mean": "lister@gmail.com",
"normalized_email": "lister@gmail.cmo",
"disposable": false,
"free": false,
"role": false,
"plus_address": false,
"has_mx": false,
"category": "unknown",
"risk": "high",
"organization": {
"name": null,
"industry": null,
"country": null,
"ticker": null,
"employees": null,
"employee_range": null,
"description": null
}
}
Bulk List Endpoints
You can also enrich whole CSV files through the API. See the List Enrichment guide for a walkthrough.
Upload a List
POST https://app.gofuego.io/api/v1/lists
Multipart form upload with a file field (your CSV) and an optional name field.
curl -X POST "https://app.gofuego.io/api/v1/lists?token=YOUR_API_TOKEN" \
-F "file=@leads.csv" \
-F "name=June signups"
Response (201 Created):
{
"id": 42,
"name": "June signups",
"status": "analyzing",
"message": "List successfully uploaded and queued for processing."
}
The list is analyzed automatically. Its status becomes ready_to_enrich once analysis completes.
Check List Status
GET https://app.gofuego.io/api/v1/lists/:id
{
"id": 42,
"name": "June signups",
"status": "enriching",
"progress": 65,
"total_rows": 10000,
"processed_rows": 6500,
"stats": null
}
Statuses: uploaded, analyzing, ready_to_enrich, enriching, finalizing, completed, error.
Start Enrichment
POST https://app.gofuego.io/api/v1/lists/:id/enrich
Starts enrichment of a list in ready_to_enrich status. Uses one enrichment per row, charged against your monthly quota (or trial credits) up front — errored and invalid rows are refunded. Returns 402 Payment Required if your trial credits can’t cover the list and you have no subscription.
{
"status": "enriching",
"message": "Enrichment started."
}
Get Results
GET https://app.gofuego.io/api/v1/lists/:id/results
{
"id": 42,
"name": "June signups",
"status": "completed",
"stats": {
"low_risk": 8900,
"medium_risk": 700,
"high_risk": 380,
"error": 20,
"categories": {
"enterprise": 1200,
"smb": 4400,
"education": 300,
"government": 100,
"nonprofit": 150,
"individual": 3300,
"disposable": 250,
"unknown": 300
},
"role": 700,
"free": 3300,
"disposable": 250,
"plus_address": 45
},
"download_url": "https://app.gofuego.io/...",
"completed_at": "2026-06-11T12:00:00Z"
}
Rows that error during enrichment (and syntactically invalid rows) are refunded automatically.
The enriched CSV contains your original columns plus: category, risk, syntax_valid, role, free, disposable, plus_address, has_mx, did_you_mean, organization_name, organization_industry, organization_country, organization_employees, organization_employee_range, organization_ticker.
Integration Examples
JavaScript
async function enrichEmail(email) {
const params = new URLSearchParams({
token: process.env.FUEGO_API_KEY,
email: email
});
const response = await fetch(`https://app.gofuego.io/api/v1/enrich?${params.toString()}`);
if (!response.ok) {
throw new Error(`Fuego API error: ${response.status}`);
}
return response.json();
}
// Example usage in a signup flow:
const lead = await enrichEmail("kochanski@jmc.com");
if (lead.risk === "high") {
// Block disposable, invalid, or no-MX signups
} else if (lead.did_you_mean) {
// Ask the user: "Did you mean kochanski@jmc.com?"
} else if (lead.plus_address) {
// Check lead.normalized_email against existing accounts
} else if (lead.category === "enterprise") {
// Route to sales
}
Python
import os
import requests
def enrich_email(email):
response = requests.get(
"https://app.gofuego.io/api/v1/enrich",
params={"token": os.environ["FUEGO_API_KEY"], "email": email},
)
response.raise_for_status()
return response.json()
# Example usage in a signup flow:
lead = enrich_email("kochanski@jmc.com")
if lead["risk"] == "high":
pass # Block disposable, invalid, or no-MX signups
elif lead["did_you_mean"]:
pass # Ask the user: "Did you mean ...?"
elif lead["plus_address"]:
pass # Check lead["normalized_email"] against existing accounts
elif lead["category"] == "enterprise":
pass # Route to sales
Ruby
require 'net/http'
require 'json'
require 'uri'
def enrich_email(email)
uri = URI("https://app.gofuego.io/api/v1/enrich")
uri.query = URI.encode_www_form(token: ENV["FUEGO_API_KEY"], email: email)
response = Net::HTTP.get(uri)
JSON.parse(response)
end
# Example usage in a signup flow:
lead = enrich_email("kochanski@jmc.com")
case
when lead["risk"] == "high"
# Block disposable, invalid, or no-MX signups
when lead["did_you_mean"]
# Ask the user: "Did you mean ...?"
when lead["plus_address"]
# Check lead["normalized_email"] against existing accounts
when lead["category"] == "enterprise"
# Route to sales
end
Error Handling
The API returns HTTP status codes to indicate success or failure:
| Status | Meaning |
|---|---|
| 200 | Success |
| 201 | Created (list uploaded) |
| 400 | Bad request (invalid parameters) |
| 401 | Unauthorized (invalid API token) |
| 402 | Payment required (free trial exhausted — subscribers are never blocked; usage beyond quota is billed as overage) |
| 404 | Not found (e.g. unknown list ID) |
| 422 | Unprocessable entity (e.g. malformed request) |
| 429 | Too many requests (rate limit exceeded) |
Error Response Format
When an error occurs, the API returns a JSON response with details:
{
"error": "Error message",
"timestamp": "2026-06-11T12:00:00Z"
}
Note that a syntactically invalid email is not an error: the request succeeds with syntax_valid: false, risk: "high", and does not count against your quota.
Best Practices
- Store your API token securely and never expose it in client-side code
- Implement proper error handling and respect your plan’s rate limit
- Use test mode with a development API key while building your integration
- Surface
did_you_meansuggestions to users instead of silently rejecting typos - Deduplicate accounts on
normalized_emailso plus-address variants can’t create multiples - Treat
riskas your first gate, then branch oncategoryfor routing and segmentation
For more information on interpreting enrichment results, see our Understanding Enrichment Data guide.