Maildeno ships official SDKs for JavaScript/TypeScript and Python. Both expose an identical conceptual surface — only the language idioms differ.

Since v2.0 the SDKs render in-process: they fetch a template’s JSON from Maildeno once via GET /v1/sdk/template/{id}, cache it locally (memory or disk), and render HTML / React Email / MJML on your own server. Your merge tags and visibility context never leave your infrastructure. See JS Caching / Python Caching for the caching model.

Available SDKs

Language Package Version Minimum runtime

JavaScript / TypeScript

maildeno on npm

2.1.0

Node.js 18+ (or any runtime with native fetch)

Python

maildeno on PyPI

2.0.0

Python 3.9+

Quick comparison

Feature JavaScript SDK Python SDK

Async support

Native (async/await, Promise-based)

AsyncMaildenoClient (asyncio / httpx)

Sync support

N/A (JS is async by nature)

MaildenoClient (blocking httpx)

Transport

Native fetch

httpx (bring-your-own client supported)

Type safety

Full TypeScript types exported

Full PEP 561 type stubs (mypy / pyright)

Error type

MaildenoError

MaildenoError

Validation errors

err.issues: ValidationIssue[]

err.issues: list[ValidationIssue]

Rendering

In-process (embedded engine)

In-process (embedded Wasm engine)

Caching

Memory (default) or disk, with stale-on-error fallback

Memory (default) or disk, with stale-on-error fallback

Render methods

Both SDKs expose the same methods:

Method Returns

render(options)

Full result object (output, target, templateId)

renderHtml(id, data?) / render_html(id, data)

Rendered HTML string

renderReact(id, data?) / render_react(id, data)

Rendered React/TSX string

renderMjml(id, data?) / render_mjml(id, data)

Rendered MJML string

Where to go next