API documentation
A fast, read-only JSON REST API over Email Love's library of real marketing emails from 6,000+ brands. Using an AI tool? See the MCP docs instead.
Introduction
The base URL is https://dev.emaillove.com. All responses are JSON. Every request is read-only. Each record links back to its page on emaillove.com via a url field; attribution is required when you display the data.
Authentication
Send your API key as a bearer token. Keys look like el_live_....
Authorization: Bearer $EMAILLOVE_API_KEY
No key? Anonymous requests work too, at a lower rate limit. Generate a free key → (tied to your Email Love account).
Rate limits
Limits are per minute. Every response includes X-RateLimit-Limit and X-RateLimit-Tier; a 429 includes Retry-After.
| Tier | Limit | Keyed on |
|---|---|---|
| anonymous | 20 / min | IP address |
| free | 120 / min | your account |
Response format
List responses wrap results in data with a meta object (pagination + attribution). Paginate with page and per_page.
{
"data": [ /* ... */ ],
"meta": {
"page": 1, "per_page": 20, "count": 20,
"attribution": { "source": "Email Love", "url": "https://emaillove.com" }
}
}Errors
Errors return a JSON body with an error object and a standard HTTP status.
{ "error": { "code": "not_found", "message": "No email with id 999." } }| Status | Meaning |
|---|---|
| 400 | Bad request (e.g. malformed id). |
| 401 | Invalid or revoked API key. |
| 404 | No such resource. |
| 429 | Rate limit exceeded. See Retry-After. |
Endpoints
Six endpoints over one resource model.
List emails
Search and filter the email library. Returns a page of email summaries.
| Parameter | Type | Description |
|---|---|---|
| q | string | Free-text search (e.g. "welcome", "Black Friday"). |
| brand | string | Filter by brand slug (e.g. "glossier"). |
| category | string | Filter by category slug (e.g. "apparel"). |
| page | integer | Page number, 1-based. Default 1. |
| per_page | integer | Results per page, 1-50. Default 20. |
curl "https://dev.emaillove.com/v1/emails?brand=glossier&per_page=2" \ -H "Authorization: Bearer $EMAILLOVE_API_KEY"
{
"data": [
{
"id": 1522673,
"title": "Email Inspiration from Glossier",
"subject_line": "You asked, we listened",
"from_email": "gTEAM@eml.glossier.com",
"brand": "Glossier",
"brand_slug": "glossier",
"thumbnail_url": "https://.../glossier-..._thumbnail.jpg",
"preview_url": "https://.../glossier-..._screenshot.jpg",
"url": "https://emaillove.com/email-inspiration-from-glossier-12",
"captured_date": "2026-05-18",
"sent_date": "Wed, 14 May 2026 16:02:11 +0000"
}
],
"meta": {
"page": 1, "per_page": 2, "count": 1,
"query": { "q": null, "brand": "glossier", "category": null },
"attribution": { "source": "Email Love", "url": "https://emaillove.com" }
}
}Get an email
Retrieve one email, including its cleaned, render-safe HTML (the html field), the full-length screenshot (preview_url), the small thumbnail (thumbnail_url), and the categories and lifecycle stages it is filed under. The list endpoints return everything here except html, fetch a single email to get the markup.
| Parameter | Type | Description |
|---|---|---|
| id required | integer | Numeric email id from a list response. |
curl "https://dev.emaillove.com/v1/emails/1522673" \ -H "Authorization: Bearer $EMAILLOVE_API_KEY"
{
"data": {
"id": 1522673,
"title": "Email Inspiration from Glossier",
"subject_line": "You asked, we listened",
"from_email": "gTEAM@eml.glossier.com",
"brand": { "name": "Glossier", "slug": "glossier", "url": "https://emaillove.com/authors/glossier" },
"thumbnail_url": "https://.../_thumbnail.jpg",
"preview_url": "https://.../_screenshot.jpg",
"categories": [ { "slug": "apparel", "name": "Apparel" } ],
"journey_stages": [],
"captured_date": "2026-05-18",
"sent_date": "Wed, 14 May 2026 16:02:11 +0000",
"emaillove_url": "https://emaillove.com/email-inspiration-from-glossier-12",
"html": "<!DOCTYPE html><html>... cleaned email HTML ...</html>"
},
"meta": { "attribution": { "source": "Email Love", "url": "https://emaillove.com" } }
}List brands
List brands in the library. Omit q to get the top brands by email count.
| Parameter | Type | Description |
|---|---|---|
| q | string | Brand name search. |
| page | integer | Page number. Default 1. |
| per_page | integer | Results per page, 1-50. Default 20. |
curl "https://dev.emaillove.com/v1/brands?q=glossier"
{
"data": [
{ "name": "Glossier", "slug": "glossier", "description": "...", "email_count": 142,
"url": "https://emaillove.com/authors/glossier" }
],
"meta": { "page": 1, "per_page": 20, "count": 1, "attribution": { "source": "Email Love", "url": "https://emaillove.com" } }
}Get a brand
Get a brand and a page of its emails.
| Parameter | Type | Description |
|---|---|---|
| slug required | string | Brand slug. |
| page | integer | Page number. Default 1. |
| per_page | integer | Emails per page, 1-50. Default 20. |
curl "https://dev.emaillove.com/v1/brands/glossier?per_page=2"
{
"data": {
"brand": { "name": "Glossier", "slug": "glossier", "email_count": 142, "url": "https://emaillove.com/authors/glossier" },
"emails": [ { "id": 1522673, "title": "...", "subject_line": "...", "brand_slug": "glossier", "preview_url": "...", "url": "...", "captured_date": "2026-05-18" } ]
},
"meta": { "page": 1, "per_page": 2, "count": 1, "attribution": { "source": "Email Love", "url": "https://emaillove.com" } }
}Brand insights
Aggregated analytics for one brand: send frequency, ESP mix, sender addresses, subject-line metrics, day-of-week and hour-of-day send patterns, technology flags, content metrics, and deliverability (SPF/DKIM/DMARC). The same data the MCP get_brand_insights tool returns. Returns 404 (no_insights) for tracked brands with too few captured emails to aggregate.
| Parameter | Type | Description |
|---|---|---|
| slug required | string | Brand slug (e.g. "rei"). |
curl "https://dev.emaillove.com/v1/brands/rei/insights" \ -H "Authorization: Bearer $EMAILLOVE_API_KEY"
{
"data": {
"brand": { "slug": "rei", "name": "REI", "url": "https://emaillove.com/authors/rei" },
"frequency": { "total_sent": 38, "avg_per_week": 0.32, "first_send": "2024-03-01 11:41:26", "last_send": "2026-06-16 17:42:32" },
"technology": { "esp_breakdown": [ { "name": "Iterable", "count": "28" }, { "name": "Oracle Responsys", "count": "5" } ],
"responsive_pct": 1, "amp_pct": 0, "dark_mode_pct": 0, "outlook_opt_pct": 1 },
"subject_line": { "avg_length": 36.8, "contains_emoji_pct": 0.42, "top_words": [ { "word": "deals", "count": 8 } ] },
"send_patterns": { "by_day_of_week": { "Fri": 11, "Sun": 6 }, "by_hour": { "11": 9, "12": 7 } },
"content": { "avg_word_count": 1221.5, "avg_image_count": 34.2, "animated_gif_pct": 0 },
"deliverability": { "spf_pass_pct": 1, "dkim_pass_pct": 1, "dmarc_pass_pct": 1 },
"senders": [ { "from_email": "rei_email@email.rei.com", "count": "29" } ],
"dashboard_url": "https://emaillove.com/brand-insights?brand=rei"
},
"meta": { "attribution": { "source": "Email Love", "url": "https://emaillove.com" } }
}List journeys
List brands that have a curated lifecycle journey.
| Parameter | Type | Description |
|---|---|---|
| page | integer | Page number. Default 1. |
| per_page | integer | Results per page, 1-50. Default 30. |
curl "https://dev.emaillove.com/v1/journeys?per_page=2"
{
"data": [
{ "brand": "hims", "brand_slug": "hims", "email_count": 10, "url": "https://emaillove.com/journeys/hims" }
],
"meta": { "page": 1, "per_page": 2, "count": 1, "attribution": { "source": "Email Love", "url": "https://emaillove.com" } }
}Get a journey
Get one brand's lifecycle journey, broken into stages, with the emails filed under each stage in capture order. This is Email Love's most differentiated data.
| Parameter | Type | Description |
|---|---|---|
| brand required | string | Brand slug (e.g. "hims"). |
| emails_per_stage | integer | Emails returned per stage, 1-10. Default 5. |
curl "https://dev.emaillove.com/v1/journeys/hims?emails_per_stage=2"
{
"data": {
"brand": "hims", "brand_slug": "hims", "url": "https://emaillove.com/journeys/hims",
"stages": [
{ "stage": "Transactional", "stage_slug": "hims-transactional-emails", "email_count": 4,
"emails": [ { "id": 19273, "title": "Hims Transactional Email", "brand_slug": "hims", "preview_url": "...", "url": "...", "captured_date": "2024-11-08" } ] }
]
},
"meta": { "attribution": { "source": "Email Love", "url": "https://emaillove.com" } }
}Wiring this into an AI tool? The same library is a native MCP server. Read the MCP docs →
Questions? hello@emaillove.com