Launching 2026

Transactional email API
for developers

Send transactional emails via REST API. Async delivery with retry logic, dead-letter queue and full status tracking. Built with Java and Spring Boot.

✓ You're on the list. We'll reach out before launch.

No spam. Unsubscribe anytime.

Simple flow, reliable delivery

Your application calls the REST API. StackSend handles the queuing, retries and delivery — you just get the result.

Your app
POST /emails
Kafka queue
SMTP delivery
Status tracked

If Kafka is unavailable, the service falls back to direct delivery automatically — no downtime, no manual intervention.

CREATED PROCESSING SENT
FAILED → retried up to 3 times → dead-letter queue

REST endpoints

All endpoints require a Bearer JWT token in the Authorization header. Base URL: https://api.stacksend.dev

POST /auth/login Authenticate and get JWT token

Request body

// POST /auth/login
{
  "email": "you@example.com",
  "password": "yourpassword"
}
FieldTypeRequiredDescription
emailstringrequiredValid email address
passwordstringrequiredAccount password

Response

// HTTP 200 OK
{
  "token": "eyJhbGciOiJIUzI1NiJ9..."
}
200JWT token returned
400Invalid credentials
POST /emails Submit email for delivery

Request

// POST /emails
// Authorization: Bearer <token>

{
  "to": "recipient@example.com",
  "subject": "Your order was confirmed",
  "body": "Hello! Your order #1234 has been confirmed."
}
FieldTypeRequiredDescription
tostringrequiredRecipient email address
subjectstringrequiredEmail subject line
bodystringrequiredPlain text or HTML email body

Response

// HTTP 202 Accepted
{
  "message": "Event sent to Kafka"
}
202Email accepted for async processing
400Invalid request payload
401Missing or invalid JWT token
# Step 1 — Authenticate
TOKEN=$(curl -s -X POST https://api.stacksend.dev/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","password":"yourpassword"}' \
  | jq -r .token)

# Step 2 — Send email
curl -X POST https://api.stacksend.dev/emails \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "recipient@example.com",
    "subject": "Welcome to StackSend",
    "body": "Your account is ready."
  }'
RestTemplate rest = new RestTemplate();

// Authenticate
Map credentials = Map.of("email", "you@example.com", "password", "yourpassword");
Map auth = rest.postForObject("https://api.stacksend.dev/auth/login", credentials, Map.class);
String token = (String) auth.get("token");

// Send email
HttpHeaders headers = new HttpHeaders();
headers.setBearerAuth(token);
headers.setContentType(MediaType.APPLICATION_JSON);

Map payload = Map.of(
  "to", "user@example.com",
  "subject", "Order confirmed",
  "body", "Your order #1234 was confirmed."
);
rest.postForEntity("https://api.stacksend.dev/emails",
  new HttpEntity<>(payload, headers), String.class);

Production-grade email infrastructure

Everything listed here is built and working. No roadmap items, no "coming soon".

📨
REST API
Two endpoints — login and send email. JSON in, JSON out. Works with any HTTP client.
🔐
JWT Authentication
Token-based auth with configurable expiration. Every request validated before processing.
Async delivery via Kafka
Emails are queued and processed asynchronously. Your API call returns in milliseconds.
🔄
Automatic fallback
If Kafka is unavailable, direct delivery kicks in. No configuration needed, no downtime.
♻️
Retry + Dead-letter queue
Failed emails retried up to 3 times. Permanently failed emails moved to DLQ for inspection.
📊
Prometheus metrics
Delivery rates, latency and error counts exposed via /actuator/prometheus. Grafana ready.
💾
Full status tracking
Every email stored in PostgreSQL with status, timestamps, retry count and last error.
🐳
Docker ready
Full Docker Compose setup included. One command to run the entire stack locally.
Java 21Spring Boot 3Apache Kafka PostgreSQLFlywayDocker PrometheusGrafanaJWT TestcontainersGitHub Actions

What's coming next

These features are planned but not yet available. Early access users will be the first to test each one.

Coming soon

API Keys per account

Replace JWT login with static API keys per account. Simpler integration, more secure for production use.

Coming soon

Dashboard

Web interface showing sent emails, delivery status, bounce rate and usage metrics per account.

Coming soon

Email templates

Save reusable templates with variables. Send with templateId + variables instead of full body.

Coming soon

Webhooks

Get notified on delivered, bounced and failed events. Your endpoint receives the event payload automatically.

Planned

Spring Boot Starter

Native Spring Boot autoconfigure on Maven Central. Add one dependency and inject the client directly.

Planned

SMS notifications

Same API, new channel. Send SMS to any country with delivery receipts and usage-based pricing.

Planned

Push notifications

iOS and Android push via a single API call. No SDK to maintain on the client side.

Planned

Multi-tenancy

Full account isolation. Each customer sees only their own emails, usage and billing.

Usage-based, no surprises

Pay for what you send. No tiers, no annual commitment, no lock-in. Pause anytime.

What you pay forPriceDetails
🔑 Platform access $5/month API access, dashboard, support
✉️ Emails sent $0.50 per 1,000 emails — charged on top of the $5
Example: sending 50,000 emails/month costs $5 (platform) + $25 (emails) = $30 total. No charge when inactive.
🎁 Early access: first 3 months platform fee at no cost. You only pay for the emails you send.