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",
      "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 /v1/emails/{id}

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.

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",
    "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" } }
}
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/brands/{slug}/insights

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.

ParameterTypeDescription
slug requiredstringBrand slug (e.g. "rei").
Request
curl "https://dev.emaillove.com/v1/brands/rei/insights" \
  -H "Authorization: Bearer $EMAILLOVE_API_KEY"
Response
{
  "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" } }
}
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