SendX exposes one REST surface at https://api.sendx.io/api/v1/rest, authenticated with a single header and backed by 6 official SDKs regenerated in late 2025. It is a small API by ESP standards, and that narrowness matters: there is no SMTP relay to fall back on, so every byte of programmatic mail goes through it. On the agent side the answer is blunter — as of August 2026 there is no official SendX MCP server and no community server in any major registry.
The question in 2026 is no longer whether a vendor has an API but whether an agent can drive it on day one against a server someone else maintains. For SendX the answer is no — and knowing what sits in the SendX GitHub org matters, because two repositories there look like MCP servers and are not.
Checked August 2026 against the Glama, Smithery and mcp.so registries and the sendx GitHub organisation. Agent access means Zapier MCP over the maintained SendX Zapier app — 3 triggers, 3 actions — or a thin custom server over the v1 REST API, a small job given one X-Team-ApiKey header and clean per-resource endpoints.
Two entries are real routes to agent access; two are SendX repositories often mistaken for MCP servers, listed so you can rule them out.
The only no-code path. Triggers Contact Created, Get Tags, Get List; actions Create or Update Contact, Add Tag, Remove Tag. Contacts and tags only — no campaigns, no transactional mail.
The route most teams take. One static header, JSON bodies, no OAuth dance. Budget a day for contacts, lists, tags and /send/email, and gate the send tool behind an allowlist so an agent cannot bill you by mistake.
TypeScript, MIT, updated April 3, 2026: “Your own personal AI assistant. Any OS. Any Platform.” A general-purpose assistant, not an MCP server, and it does not touch the SendX API.
Shell, MIT, updated April 16, 2026. Deliverability and compliance guidance packaged for agents. Useful as context; it exposes no tools and speaks no protocol.
An absent MCP server is a maintenance transfer, not a dealbreaker: without a first-party server, every endpoint rename lands on your backlog instead of the vendor’s. The mitigating factor is that SendX’s surface is small and stable — v1 has not been superseded, the SDKs were regenerated in December 2025, and roughly 16 resource families is far less to wrap than Brevo or MailerLite. An agent that manages contacts and tags is a Zapier MCP job today; one that composes campaigns means writing the server.
Everything lives under one base URL: no regional variants, no GraphQL surface, no async job API. Resources are singular nouns, responses are JSON for successes and errors alike, status codes are conventional. This is the whole contract.
| Base URL | https://api.sendx.io/api/v1/rest |
| Version | v1 CURRENT |
| Transport | HTTPS required; plain HTTP is not accepted |
| Response format | JSON |
| Authentication | Static key in the X-Team-ApiKey header |
| Pagination | offset (default 0), limit (default 10, safe max 30) |
| Search | search string, min 2 chars, matches firstName, lastName, email |
| Bulk operations | Not supported — the reference states the API “doesn’t support bulk updates” |
| Resource IDs | Opaque strings, <prefix>_<22 alphanumeric chars> |
| Status codes | 2xx · 400 401 403 404 406 422 · 500 |
| SMTP relay | None — transactional mail is REST-only via POST /send/email |
The surface splits into three jobs. Audience management — contacts, lists, tags, custom fields, segments — is the bulk of it. Campaign management mirrors the dashboard closely enough that programmatic sends are viable. Behavioural I/O covers events, visitor identification and webhooks. The transactional endpoint sits apart as the only part gated behind a paid add-on and metered separately. No request timeout is documented, so set your own.
One mechanism, one static key, no OAuth flow and no refresh token. First integration is fast; key hygiene is entirely yours.
Every call carries the key in a header named X-Team-ApiKey — not Authorization, not a bearer token, not a query parameter. Generate it at app.sendx.io/setting/connectors/api. It is team-scoped rather than seat-scoped and never expires on its own, so rotation is a manual operation you must schedule.
curl -X GET "https://api.sendx.io/api/v1/rest/contact?offset=0&limit=30" \ -H "X-Team-ApiKey: $SENDX_API_KEY" \ -H "Content-Type: application/json"
The key used by POST /send/email is issued inside the add-on’s own panel — profile icon › Settings › Add-ons › Transactional Email › Settings — not the general connectors screen. Both travel in the same header, which is exactly why the failure confuses people: the request shape is identical, and the only symptom is an authorisation error on the send endpoint while every contact call keeps working.
A SendX key is all-or-nothing across the team account: the same string that reads a contact can delete a list, create a campaign or trigger metered transactional sends. There is no scoped token, no read-only key, no per-resource grant. Your only containment is member-level access and your own proxy layer — which matters most when wrapping SendX for AI use, since exposing /send/email as a tool exposes your billing at $0.003 per email with no volume cliff to halt a loop.
SendX publishes no numeric rate limits anywhere in official documentation — only the line “Respect API rate limits for optimal performance”, with no figure attached. Every cell below that would normally hold a number is marked unpublished rather than filled from a comparison site.
| Limit | Documented value | Practical guidance |
|---|---|---|
| API requests per minute | Not published | Discover empirically; back off on 429 and 5xx |
| Emails per hour | Not published | Marketing plans are contact-based with unlimited sends |
| Recipients per message | Not published | The to array accepts multiple recipients; no stated ceiling |
| Message size | Not published | Keep HTML under typical inbox-provider limits regardless |
| Pagination page size | 30 in the schema, 100 in the prose | Use limit=30 — both sources accept it |
| Bulk updates | Not supported | One call per record; the real throughput ceiling |
| Concurrent SMTP connections | N/A | No SMTP relay exists for SendX customers |
The workaround is engineering discipline, not a documented allowance. With no bulk endpoint a 50,000-contact reconciliation is 50,000 requests, and with no published ceiling you cannot size concurrency in advance. Build the sync as a queue with a small worker pool — start at 2 to 4 concurrent requests — use exponential backoff with jitter, and checkpoint so an interrupted run resumes. Note too that pagination is contradictory in the docs: limit=30 is the only value both the prose and the OpenAPI schema accept, and the default of 10 silently truncates any loop that omits the parameter. If you need volume under published limits, pair SendX campaigns with a dedicated relay such as Brevo or Sender for app mail.
All 6 clients are MIT licensed and generated from one OpenAPI description, so class names line up across languages (ContactApi, CampaignApi, EmailSendingApi, WebhookApi, TrackingApi). Five were regenerated the same day in September 2025; JavaScript was refreshed again that December.
| Language | Package | Install | Repo |
|---|---|---|---|
| JavaScript | sendx-javascript-sdk | npm install sendx-javascript-sdk | sendx-javascript-sdk |
| Python | sendx | pip install sendx | sendx-python-sdk |
| PHP | sendx/sendx-php-sdk | composer require sendx/sendx-php-sdk | sendx-php-sdk |
| Java | sendx-java-sdk | Maven or Gradle per the repo README | sendx-java-sdk |
| Ruby | sendx-ruby-sdk | gem install sendx-ruby-sdk | sendx-ruby-sdk |
| Go | sendx-go-sdk | go get github.com/sendx/sendx-go-sdk | sendx-go-sdk |
The same org still hosts an earlier client generation named sendx-api-<lang> across all six languages, last touched between 2016 and 2020. They rank well in search and get pasted into tutorials; they are dead code. Python carries a second trap — a legacy PyPI listing under the capitalised name SendX — so install the lowercase sendx package, whose import module is sendx_python_sdk.
There is no meaningful third-party SDK ecosystem, and with six generated clients there is little reason for one. Outside those six — C#, Rust, Elixir, Kotlin — generate from the OpenAPI description or call the endpoints directly; a hand-rolled client is realistically 100 lines. Note that go-guerrilla and smtpd in the SendX org are SMTP server building blocks, not API clients and not a relay you can authenticate against.
The full reference is at docs.sendx.io/api-reference/introduction. Below are the 15 resources you will actually use, relative to the base URL. Collections accept offset, limit and search; single-resource paths take the opaque encrypted ID.
| Resource | Methods | Description |
|---|---|---|
| Email Sending /send/email | POST | Send transactional email. Requires from, to, subject, htmlBody; optional replyTo, textBody. Returns 202. Paid add-on plus verified domain. |
| Contact /contact | GET, POST | List contacts with offset, limit and search, or create one. Only email is required. |
| Contact /contact/{id} | GET, PUT, DELETE | Read, update or delete one contact by ID. No bulk equivalent. |
| List /list | GET, POST | Subscriber lists used to organise contacts and target campaigns. |
| List /list/{id} | GET, PUT, DELETE | Read, rename or delete an individual list. |
| Tag /tag | GET, POST | Create and enumerate tags, the primary segmentation primitive. |
| Campaign /campaign | GET, POST | Create and list campaigns, the core marketing send object. |
| Campaign /campaign/{id} | GET, PUT, DELETE | Read, modify or remove a single campaign. |
| Sender /sender | GET, POST | Sender identities, which must be verified before use. |
| Custom Field /custom-field | GET, POST | Custom contact attributes for personalisation and segmentation. |
| Template /template | GET, POST | Reusable templates for campaigns and template-based sends. |
| Segment /segment | GET | Read-only dynamic segments from attributes, tags and behaviour. |
| Webhook /webhook | GET, POST, DELETE | Outbound webhook subscriptions pushing events to your endpoint. |
| Events /event | POST | Record custom and revenue events against a contact. |
| Tracking /track/identify | POST | Bind an anonymous visitor’s activity to a known contact. |
Beyond these, the API exposes /member for team administration, /report for campaign analytics, and /post, /post-category and /post-tag behind SendX’s blog features. One caveat: only POST /send/email and GET /contact are documented verbatim with full parameter and response detail. The rest follow the singular-noun convention and match Api class names in the official SDKs, but confirm them against the live reference before hard-coding.
Two snippets cover the shapes you will write most: creating a contact through an official SDK, and sending transactional mail over raw REST. Both use the same header name, but the transactional key is issued separately.
# pip install sendx
import os
import sendx_python_sdk
from sendx_python_sdk.rest import ApiException
configuration = sendx_python_sdk.Configuration()
configuration.api_key['TeamApiKey'] = os.environ["SENDX_API_KEY"]
with sendx_python_sdk.ApiClient(configuration) as api_client:
contact_api = sendx_python_sdk.ContactApi(api_client)
contact_request = sendx_python_sdk.ContactRequest()
contact_request.email = "johndoe@sendx.io"
contact_request.first_name = "John"
try:
contact = contact_api.create_contact(contact_request)
print("Contact created:", contact) # id is a string, never an int
except ApiException as e:
print("SendX API error:", e.status, e.body)// Paid Transactional Email add-on required, plus a verified sending domain.
// NOTE: SendX has NO SMTP relay - transactional mail is REST only.
const res = await fetch('https://api.sendx.io/api/v1/rest/send/email', {
method: 'POST',
headers: {
'X-Team-ApiKey': process.env.SENDX_TRANSACTIONAL_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: { email: 'hello@yourdomain.com', name: 'Your App' },
to: [{ email: 'customer@example.com', name: 'Customer' }],
replyTo: { email: 'support@yourdomain.com' },
subject: 'Your receipt',
htmlBody: '<h1>Thanks!</h1><p>Your order is confirmed.</p>',
textBody: 'Thanks! Your order is confirmed.',
}),
});
console.log(res.status, await res.json());
// Expected: 202 { status: 'success', message: 'Email queued for delivery' }SendX sends transactional mail only through POST /send/email. No hostname, no port 587, 465 or 2525, no SMTP credential is ever issued. The confusion is structural: SendX’s own navigation carries a Switch Products menu to SendPost, marketed verbatim as “Email API + SMTP Relay” — same parent company, separate signup, separate docs, demo-gated. You cannot point WP Mail SMTP, Postfix or any SMTP-AUTH-only app at SendX, and no upgrade changes that: full API access already ships on every paid tier.
The reference states outright that the API “doesn’t support bulk updates”. No batch create, no import endpoint, no async job resource — every mutation is a single-record round trip. Combined with unpublished rate limits this produces the most common SendX integration failure: a naive Promise.all that works for 50 records in staging and collapses at 50,000 in production.
Identifiers take the form <resource_prefix>_<22 alphanumeric characters>: not sequential, no ordering information, string storage required. Casting one to a numeric type in a typed language or a spreadsheet import truncates it silently; sorting by ID gives a wrong “most recent contact”; incrementing an ID to walk a collection just returns 404.
You must be on a paid plan; the feature is not on the free tier. It is off by default and must be toggled at profile icon › Settings › Add-ons › Transactional Email. Your sending domain must already be verified or sends fail. Billing is $10/month including 3,000 emails then $0.003 each, in arrears — enabling the toggle does not start charges, so it is safe to switch on speculatively, but a runaway loop bills silently with no volume cliff. Compliance note: transactional messages can reach contacts who unsubscribed from marketing email.
SendX publishes no dated first-party changelog or release-notes feed, so the timeline below is reconstructed from timestamps on official repositories and the current documented state of official pages. Treat SDK dates as last-updated, not release dates.
Track changes at the official API reference and the SendX repository list.
Every request goes to https://api.sendx.io/api/v1/rest over HTTPS, authenticated with one static key in a header named X-Team-ApiKey — not an Authorization bearer token, not a query parameter, and no OAuth flow. A minimal check is GET /contact?offset=0&limit=30; a 401 means a wrong key or a wrong header name.
Generate it at app.sendx.io/setting/connectors/api. The transactional endpoint uses a different credential, issued under profile icon › Settings › Add-ons › Transactional Email › Settings. Both travel in the same header, which is why mixing them up is confusing: contact calls keep working while POST /send/email fails authorisation.
Yes — six, all MIT licensed and generated from one OpenAPI description: JavaScript (npm install sendx-javascript-sdk), Python (pip install sendx), PHP, Java, Ruby and Go. Avoid the older sendx-api-<lang> repositories in the same org — last touched between 2016 and 2020 and unsupported.
SendX publishes no numeric rate limit. The official reference offers only “Respect API rate limits for optimal performance” — no requests-per-minute ceiling, no emails-per-hour cap, no message-size limit. Assume a limit exists but is undocumented: use a small bounded worker pool, retry with exponential backoff and jitter on 429 and 5xx, and make long syncs resumable.
Use offset and limit on GET /contact. The default limit is 10, which catches people out. The documented maximum is contradictory — prose says 100, an OpenAPI schema block says 30 — so use limit=30. Loop, incrementing offset until a page returns empty. There is no cursor and no next link.
No. As of August 2026 there is no official SendX MCP server and none in the Glama, Smithery or mcp.so registries. Two repositories in the SendX org are commonly mistaken for one: openclaw is a general-purpose AI assistant and email-skills is deliverability guidance — neither speaks MCP. Your options are Zapier MCP over the SendX Zapier app (contacts and tags only) or a thin custom server on the v1 REST API.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.