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",
"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"
}
],
"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 and the categories and lifecycle stages it is filed under.
| 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",
"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",
"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" } }
}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