
Elastic Email exposes a JSON REST API at https://api.elasticemail.com/v4, backed by 13 official SDKs (Python, Node, C#, PHP, Java, Ruby, Go, Rust, Perl, Bash, plus two TypeScript flavours) refreshed in May 2026. The company also shipped its own first-party MCP server at mcp.elasticemail.com in October 2025, the same year SendGrid and Mailgun still relied on community wrappers, making it one of the few ESPs where campaigns, contacts, templates and Send-HTTP are all reachable from Claude or Cursor with a single API key.
Elastic Email is one of a small group of ESPs that ship a first-party Model Context Protocol server. That matters because it removes the DIY wrapper step: any MCP-capable client. Claude Desktop, ChatGPT, Cursor, Copilot, Gemini CLI, can drive campaigns, lists, contacts, templates and transactional sends by pointing at a single hosted URL and supplying an API key.
Elastic Email operates a first-party hosted MCP endpoint at https://mcp.elasticemail.com. Authentication uses the X-Auth-Token header carrying an Elastic Email API key scoped to Account, Templates, Campaigns, Contacts, Files, Send HTTP and view rights on Access Tokens. Marketing endpoints (campaigns, contacts) are gated on plan tier, the transactional-only Email API plan cannot expose them, even through MCP.
As of August 2026 the Elastic Email MCP surface splits into one official hosted server, the vendor’s own landing/setup page, one community directory entry and a marketplace bridge via Zapier. All entries below are reachable from any MCP-capable IDE or chat client.
First-party hosted MCP server launched October 20, 2025. Exposes campaigns, contacts, lists, segments, templates, files and Send HTTP as MCP tools; auth via X-Auth-Token header carrying an Elastic Email API key.
Product page and setup guide from Elastic Email. Walks through creating a scoped API key, wiring the endpoint into Claude/ChatGPT/Cursor, and the marketing use cases the vendor supports.
Community MCP directory entry pointing at the official Elastic Email server. Useful for discovery, but the tools and auth are the same as the hosted endpoint above.
Marketplace bridge. Zapier MCP exposes Elastic Email through the existing Zapier integration, extending the reach to the wider Zapier catalogue but at the cost of an extra hop and per-task pricing.
Why buyers should care. An official MCP server is the fastest way to make an ESP usable inside AI-first workflows. Compared with Mailgun or SendGrid where teams still hand-roll wrappers around REST, Elastic Email removes an integration project. The trade-off: MCP coverage depends on plan tier. Campaigns and Contacts tools are unavailable on the transactional-only Email API plan.
| Base URL | https://api.elasticemail.com/v4 |
| Version | 4.0.0 (current); v2 legacy remains at /v2 |
| Response format | JSON only |
| Request timeout | 600 seconds hard cap per API request |
| Pagination | offset + limit query parameters; default offset=0, max 1000 on /campaigns |
| Auth header | X-ElasticEmail-ApiKey (REST); X-Auth-Token (MCP) |
| Concurrent requests | 20 concurrent connections per source IP |
| Max payload | 20 MB per message (body + attachments) |
The v4 surface is built around eight logical resource families: sending (/emails, /emails/transactional, /emails/mergefile), audience (/contacts, /lists, /segments), content (/templates, /campaigns, /files), deliverability (/domains, /suppressions, /verifications), telemetry (/statistics, /events, /webhook), reseller (/subaccounts), inbound (/inboundroute) and security (/security/apikeys). Compared with Brevo‘s broader marketing surface, Elastic Email keeps the API tight and transactional-first while still shipping full campaign management for Marketing-plan customers.
All v4 REST calls should carry the X-ElasticEmail-ApiKey HTTP header with the API key value. The key is created inside the Elastic Email dashboard under Settings › Security › API Keys, and every key can be scoped to a subset of resources (Campaigns, Contacts, Templates, Send HTTP, etc.). Rotating a key is a delete + create operation, there is no in-place rotation endpoint.
Legacy code and some v2 examples pass the key as ?apikey=YOUR_KEY. It still works on v4, but it will end up in HTTP access logs, browser history, proxy caches and any client-side network trace. Prefer the header; keep the query-parameter form for one-off curl smoke tests only.
The MCP server at mcp.elasticemail.com uses a different header name-X-Auth-Token-but the value is still an Elastic Email API key. The key must be scoped to Account, Templates, Campaigns, Contacts, Files, Send HTTP and view rights on Access Tokens. Missing any of these silently degrades the tool list an LLM sees.
Scope caveat. Elastic Email does not implement OAuth 2.0 for the public REST API in 2026; there is no authorization-code flow. Third-party apps that need per-user access have to store an Elastic Email API key on behalf of the customer, typically scoped down to Send HTTP + Templates for transactional-only integrations. Treat those keys as long-lived secrets, encrypt at rest, and rebuild the delete-create rotation into your admin surface.
| Limit | Value | Notes |
|---|---|---|
| Concurrent connections (per IP) | 20 | Same ceiling on SMTP and REST from the same source IP |
| API request timeout | 600 seconds | Hard cap per request; long jobs must be split |
| SMTP command timeout | 2 minutes | Applies to a single SMTP command, not the whole session |
| Message size | 20 MB | Body + attachments combined |
| Free-tier daily cap | 100 emails/day | Enforced on top of the 3,000/month allowance |
| Requests per minute | Not published | Dynamically enforced by Reputation Automation + IP pool tier |
The workaround for the 20-concurrent ceiling is the same as with any provider that throttles per source IP: cap your worker pool at 20, add jitter between requests, and shard high-volume traffic across multiple egress IPs (NAT gateways, worker regions). If you are migrating from SendPulse or MailerSend where per-hour caps are the visible constraint, the mental model shifts: with Elastic Email the concurrency limit is the binding one, not raw throughput.
Elastic Email ships 13 official SDKs across every mainstream language plus Rust, Perl and Bash. All repositories were last refreshed in May 2026, which is closer to active than SparkPost‘s aging client set and comparable to Mailgun‘s cadence.
| Language | Package | Install | Repo |
|---|---|---|---|
| Python | elasticemail-python | pip install git+https://github.com/elasticemail/elasticemail-python.git | GitHub |
| JavaScript / Node.js | @elasticemail/elasticemail-client | npm install @elasticemail/elasticemail-client --save | GitHub |
| C# | ElasticEmail (NuGet) | dotnet add package ElasticEmail | GitHub |
| PHP | elasticemail/elasticemail-php | composer require elasticemail/elasticemail-php | GitHub |
| Java | com.elasticemail:elasticemail | Add Maven/Gradle dependency (see repo README) | GitHub |
| Ruby | ElasticEmail gem | gem install ElasticEmail | GitHub |
| Go | github.com/ElasticEmail/elasticemail-go | go get github.com/ElasticEmail/elasticemail-go | GitHub |
| Rust | elasticemail crate | cargo add elasticemail | GitHub |
| Perl | elasticemail-perl | Clone repo per README | GitHub |
| Bash | elasticemail-bash | Clone repo per README | GitHub |
| TypeScript (Angular) | @elasticemail/elasticemail-ts-angular | npm install @elasticemail/elasticemail-ts-angular | GitHub |
| TypeScript (Axios) | @elasticemail/elasticemail-ts-axios | npm install @elasticemail/elasticemail-ts-axios | GitHub |
Auto-generated SDKs. All Elastic Email SDKs are generated from the OpenAPI spec by OpenAPI Generator. That is efficient for parity across languages, but it means idioms feel un-native (nested model classes, verbose method names like emails_transactional_post). Wrap them behind your own service layer if you want ergonomic call sites.
Because the official SDK matrix is broad, third-party wrappers are rare and rarely needed. Elixir, Clojure and Erlang shops typically use a plain HTTP client (Finch, clj-http, hackney) against v4 rather than a community library. The one community pattern worth calling out is Sendy and MailWizz configurations that use Elastic Email as an SMTP relay, both projects document how to plug smtp.elasticemail.com in without ever touching the SDK matrix, which suits self-hosted marketing users who only need the SMTP surface.
The v4 surface exposes 18 resources at https://api.elasticemail.com/v4. The full OpenAPI spec is published at the official REST reference. The table below summarises the 18 top-level resources; each supports the standard subset of HTTP verbs listed.
| Resource | Methods | Description |
|---|---|---|
| Emails (transactional) /emails/transactional | POST | Send transactional (1:1) email with per-recipient personalization. |
| Emails (bulk) /emails | POST, GET | Send bulk/campaign email; GET returns message status by MsgID. |
| Emails Merge File /emails/mergefile | POST | Send a bulk email using an uploaded merge file for per-recipient variables. |
| Campaigns /campaigns | GET, POST, PUT, DELETE | Create, list, update and delete marketing campaigns. |
| Contacts /contacts | GET, POST, PUT, DELETE | Manage individual contacts (create, update status, delete). |
| Lists /lists | GET, POST, PUT, DELETE | Manage subscriber lists and their memberships. |
| Segments /segments | GET, POST, PUT, DELETE | Dynamic contact segments defined by rule expressions. |
| Templates /templates | GET, POST, PUT, DELETE | Reusable email templates (HTML, drag-drop, AI-generated). |
| Domains /domains | GET, POST, PUT, DELETE | Add/verify sending domains and read SPF/DKIM status. |
| Statistics /statistics | GET | Aggregate delivery, open, click, bounce and spam metrics. |
| Events /events | GET, POST | Query raw event log (delivered, opened, clicked, bounced, unsubscribed). |
| Webhooks /webhook | GET, POST, PUT, DELETE | Manage HTTPS callback endpoints that receive real-time delivery events. |
| Suppressions /suppressions | GET, POST, DELETE | Read and manage bounce, unsubscribe and complaint suppression lists. |
| SubAccounts /subaccounts | GET, POST, PATCH, DELETE | Provision and manage reseller/sub-accounts (Pro/Reseller only). |
| Files /files | GET, POST, DELETE | Upload and reference attachments and merge files. |
| Verifications /verifications | GET, POST, DELETE | Email address verification jobs (single or bulk). |
| InboundRoute /inboundroute | GET, POST, PUT, DELETE | Configure inbound email parsing rules to webhooks. |
| Security (API keys) /security/apikeys | GET, POST, DELETE | Manage API keys and scoped access tokens. |
import ElasticEmail
from ElasticEmail.api import emails_api
from ElasticEmail.model.email_content import EmailContent
from ElasticEmail.model.body_part import BodyPart
from ElasticEmail.model.body_content_type import BodyContentType
from ElasticEmail.model.transactional_recipient import TransactionalRecipient
from ElasticEmail.model.email_transactional_message_data import EmailTransactionalMessageData
configuration = ElasticEmail.Configuration()
configuration.api_key['apikey'] = 'YOUR_API_KEY'
with ElasticEmail.ApiClient(configuration) as api_client:
api = emails_api.EmailsApi(api_client)
payload = EmailTransactionalMessageData(
recipients=TransactionalRecipient(to=['user@example.com']),
content=EmailContent(
body=[BodyPart(
content_type=BodyContentType('HTML'),
content='<strong>Hello from Elastic Email</strong>',
charset='utf-8',
)],
_from='sender@yourdomain.com',
subject='Transactional test',
),
)
api.emails_transactional_post(payload)const ElasticEmail = require('@elasticemail/elasticemail-client');
const defaultClient = ElasticEmail.ApiClient.instance;
defaultClient.authentications['apikey'].apiKey = 'YOUR_API_KEY';
const api = new ElasticEmail.EmailsApi();
const email = ElasticEmail.EmailMessageData.constructFromObject({
Recipients: [ new ElasticEmail.EmailRecipient('user@example.com') ],
Content: {
Body: [ ElasticEmail.BodyPart.constructFromObject({
ContentType: 'HTML',
Content: '<strong>Hello from Elastic Email</strong>'
}) ],
Subject: 'Transactional test',
From: 'sender@yourdomain.com'
}
});
api.emailsPost(email, (err, data) => {
if (err) return console.error(err);
console.log('Sent:', data);
});When you create an SMTP credential Elastic Email obfuscates the password after the initial creation window (only the last 5 characters remain visible). There is no retrieval endpoint. If a credential is lost you must delete and regenerate. Each account is capped at 15 SMTP credentials, so plan storage in your secret manager accordingly.
The free plan advertises up to 3,000 emails/month but layers a strict 100 emails/day ceiling on top. Bursty transactional traffic, a welcome flow plus a password-reset spike, hits this ceiling silently and returns errors that look like generic delivery failures. Move to a paid plan before production traffic.
Both SMTP and REST are throttled to 20 concurrent connections from a single source IP. High-throughput senders (MailWizz, PowerMTA, custom queues) must cap workers at 20 or requests are rejected. If you need more, shard across multiple egress IPs; there is no per-account concurrency lift beyond that on the standard plan.
Elastic Email’s Reputation Automation moves accounts across shared IP pools based on your reputation score. Bad campaigns hurt not just deliverability but which pool tier you are eligible for. Warm slowly, keep bounce and complaint rates low, and lean on the built-in /verifications endpoint before large sends.
If you subscribe to the transactional-only Email API plan, the /campaigns and /contacts REST endpoints, and the equivalent MCP tools, are not available. Anyone planning to mix marketing and transactional through one integration should pick the Marketing (Starter/Pro) tier from day one.
/templates.Track future changes on the official Elastic Email blog and the REST API reference. The v2 API remains online for legacy customers but is not receiving new features, treat it as maintenance mode.
v4 is the current REST API at https://api.elasticemail.com/v4 and is the one all official 2026 SDKs target. v2 at https://api.elasticemail.com/v2 is still online for legacy customers but is not the surface you should build against for new work, new features (AI Template Designer, Checkouts, Paid Newsletters, MCP-backed operations) are exposed only on v4. Migrations from v2 to v4 mostly touch payload shape (JSON body vs form-encoded) and auth (X-ElasticEmail-ApiKey header replacing apikey query params).
Install with pip install git+https://github.com/elasticemail/elasticemail-python.git, set configuration.api_key['apikey'] = 'YOUR_API_KEY', then call emails_api.EmailsApi(client).emails_transactional_post(payload) with an EmailTransactionalMessageData object containing recipients, content.body (HTML or Text BodyPart), _from and subject. The SDK targets Python 3.6+ and was last refreshed in May 2026.
Send your API key in the X-ElasticEmail-ApiKey HTTP header on every v4 request. Elastic Email also accepts ?apikey= as a query parameter, but that leaks secrets into access logs, use the header. The MCP server uses a different header, X-Auth-Token, but the value is still an Elastic Email API key with the right scopes.
Elastic Email v4 uses offset + limit query parameters, not cursors. Default offset=0; the maximum limit is per-endpoint (1000 on /campaigns, lower on others). Iterate by incrementing offset until an empty array comes back. There is no Link header or next_cursor field.
Yes. The official MCP server at https://mcp.elasticemail.com is a hosted HTTP MCP endpoint. Point Claude Desktop, ChatGPT, Cursor, Copilot or Gemini CLI at it, provide your Elastic Email API key via the X-Auth-Token header, and campaigns/contacts/lists/templates/files/Send-HTTP tools appear as MCP tools. Coverage depends on plan (see next answer).
Your API key must grant Account, Templates, Campaigns, Contacts, Files, Send HTTP and view access to Access Tokens. On the transactional-only Email API plan, /campaigns and /contacts are gated, those MCP tools will error out even with the scope. Move to Marketing (Starter/Pro) if you want the full MCP surface.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.