Listonosh is an open-source mail transfer agent. Run your own SPF/DKIM/DMARC-aligned sender on your own IPs — no vendor lock-in, no shared-pool reputation, no per-email markup. Designed for the 2024+ Gmail and Yahoo enforcement rules.
Not just an SMTP relay. Listonosh handles the full lifecycle — DNS setup, IP warm-up, bounce parsing, suppression lists, webhook fan-out.
Before you create a domain, Listonosh resolves your existing TXT and MX records and warns about clashing SPF includes, strict DMARC policies, and existing inbound MX — so you don't accidentally break production.
Connect a Cloudflare API token once. From any domain page, push your SPF / DKIM / DMARC / return-path records to the zone with a single click. Existing records are updated, never duplicated.
Brand-new IPs hit greylisting and spam folders. Listonosh has built-in warm-up plans that ramp daily limits over weeks, with provider-specific quotas and automatic pause on bounce-rate spikes.
Hard bounces and spam complaints automatically populate the suppression list — hardcoded RFC 8058 one-click unsubscribe, 2-day SLA, < 0.3% complaint rate by design. Required for Gmail bulk sender compliance.
One endpoint, one auth scheme. Auto-generated Go and TypeScript clients
straight from the schema (/v1/rpc/api.ts). OpenRPC spec
available for any language.
Every event — accepted, delivered, bounced, complained, opened — is POSTed to your endpoint with a SHA-256 HMAC signature. Per-endpoint DLQ if your service is down; retries up to 24 hours.
Add a domain. Generate a DKIM keypair with one button. Listonosh shows you exactly which records to add — and live-resolves each one to tell you if it's already in place.
┌──────────────┬──────┬─────────────────────┬───────────┐ │ KIND │ TYPE │ HOST │ STATUS │ ├──────────────┼──────┼─────────────────────┼───────────┤ │ SPF │ TXT │ send │ ● present │ │ DKIM (s5a..) │ TXT │ s5a.._domainkey │ ● present │ │ DMARC │ TXT │ _dmarc │ ● present │ │ Return-path │ MX │ send │ ● present │ │ Inbound │ MX │ inbound │ ○ misaligned └──────────────┴──────┴─────────────────────┴───────────┘ # Cache TTL: 30s — refreshes automatically # Verification: passing ✓
const res = await fetch('https://api.listonosh.com/v1/rpc/', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.LNS_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'messages.send', params: { from: { email: 'noreply@acme.com' }, to: { email: 'user@example.com' }, subject: 'Order #3214 confirmed', body: { html: '<p>Thanks!</p>' }, idempotencyKey: 'order-3214-v1', }, }), }) const { result } = await res.json() console.log(result.id) // → 01926d4f-7a0e-7c8e-...
Call messages.send twice with the same
idempotencyKey — the second call returns the same message ID.
Safe to retry. No double-sends.
X-RateLimit-Remaining headersmessages:write, events:read, etc.Production-ready in a weekend. One Postgres database, one binary, your DNS — and you're sending compliant, signed mail from your own IPs.