Email Love
Generate API key

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.

TierLimitKeyed on
anonymous20 / minIP address
free120 / minyour 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." } }
StatusMeaning
400Bad request (e.g. malformed id).
401Invalid or revoked API key.
404No such resource.
429Rate limit exceeded. See Retry-After.

Endpoints

Six endpoints over one resource model.

GET /v1/emails

List emails

Search and filter the email library. Returns a page of email summaries.

ParameterTypeDescription
qstringFree-text search (e.g. "welcome", "Black Friday").
brandstringFilter by brand slug (e.g. "glossier").
categorystringFilter by category slug (e.g. "apparel").
pageintegerPage number, 1-based. Default 1.
per_pageintegerResults per page, 1-50. Default 20.
Request
curl "https://dev.emaillove.com/v1/emails?brand=glossier&per_page=2" \
  -H "Authorization: Bearer $EMAILLOVE_API_KEY"
Response
{
  "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 /v1/emails/{id}

Get an email

Retrieve one email, including its cleaned, render-safe HTML and the categories and lifecycle stages it is filed under.

ParameterTypeDescription
id requiredintegerNumeric email id from a list response.
Request
curl "https://dev.emaillove.com/v1/emails/1522673" \
  -H "Authorization: Bearer $EMAILLOVE_API_KEY"
Response
{
  "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" } }
}
GET /v1/brands

List brands

List brands in the library. Omit q to get the top brands by email count.

ParameterTypeDescription
qstringBrand name search.
pageintegerPage number. Default 1.
per_pageintegerResults per page, 1-50. Default 20.
Request
curl "https://dev.emaillove.com/v1/brands?q=glossier"
Response
{
  "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 /v1/brands/{slug}

Get a brand

Get a brand and a page of its emails.

ParameterTypeDescription
slug requiredstringBrand slug.
pageintegerPage number. Default 1.
per_pageintegerEmails per page, 1-50. Default 20.
Request
curl "https://dev.emaillove.com/v1/brands/glossier?per_page=2"
Response
{
  "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" } }
}
GET /v1/journeys

List journeys

List brands that have a curated lifecycle journey.

ParameterTypeDescription
pageintegerPage number. Default 1.
per_pageintegerResults per page, 1-50. Default 30.
Request
curl "https://dev.emaillove.com/v1/journeys?per_page=2"
Response
{
  "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 /v1/journeys/{brand}

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.

ParameterTypeDescription
brand requiredstringBrand slug (e.g. "hims").
emails_per_stageintegerEmails returned per stage, 1-10. Default 5.
Request
curl "https://dev.emaillove.com/v1/journeys/hims?emails_per_stage=2"
Response
{
  "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