Mailack documentation.
Quickstart, product API and SDKs. Certified email with NOM-151 evidence, exposed as HTTP API and MCP.
API key → send → status → proof-bundle → verify → MCP
Quickstart
API key, first message, status, proof bundle, offline verify and MCP.
POST /v1/domainsSending domains
Register your domain, publish the TXT challenge and verify From.
email.*Webhooks
Lifecycle events signed with Mailack-Signature (HMAC-SHA256).
{{var}}Templates
Subject and body with {{variables}} and send via template_id.
/v1/messages/batch · /v1/ratesAPI: batch, rates and errors
Bulk ingest, deliverability dashboard and error codes.
official clientsSDKs
Go, Rust, JavaScript, Node/TS, Python, Java and C#.
screen guideClient portal
Dashboard, keys, messages, evidence and billing in the UI.
GmailChrome extension
Send NOM-151 certified email from the Gmail compose window, with tracking and proof.
- 01environment variables
Authenticate with an API key
Export the portal key (mlk_ prefix). Every machine /v1/* route requires Authorization: Bearer. The tenant is resolved on the server from the key.
environment variables export MAILACK_API_KEY="mlk_..." export MAILACK_API_URL="https://api.mailack.com" # Cada petición lleva la clave en Authorization. curl -s "$MAILACK_API_URL/v1/messages" \ -H "Authorization: Bearer $MAILACK_API_KEY" \ -H "Accept: application/json" - 02POST /v1/messages
Send the first message
POST /v1/messages with Idempotency-Key. Keep the id from the response for later steps. Retrying with the same key is safe (replay).
POST /v1/messages MESSAGE_ID=$(curl -s -X POST "$MAILACK_API_URL/v1/messages" \ -H "Authorization: Bearer $MAILACK_API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "from": "noreply@acme.mx", "to": "cliente@ejemplo.com", "subject": "Primer mensaje", "html": "<p>Hola desde mailack.</p>" }' | jq -r .id) echo "$MESSAGE_ID" - 03GET /v1/messages/{id}
Check its status
GET /v1/messages/{id} returns delivery status, events and message metadata.
GET /v1/messages/{id} curl -s "$MAILACK_API_URL/v1/messages/$MESSAGE_ID" \ -H "Authorization: Bearer $MAILACK_API_KEY" | jq . - 04GET /v1/messages/{id}/proof-bundle
Download the proof bundle
GET /v1/messages/{id}/proof-bundle. Includes the canonical hash, Merkle inclusion proof and, when present, the PSC Codex certificate.
GET /v1/messages/{id}/proof-bundle curl -s "$MAILACK_API_URL/v1/messages/$MESSAGE_ID/proof-bundle" \ -H "Authorization: Bearer $MAILACK_API_KEY" \ -o bundle.json # Campos de la constancia del PSC Codex en el bundle: # certificate_id, serial_number, policy_oid, algorithm_oid, sealed_at jq '{certificate_id, serial_number, sealed_at}' bundle.json - 05POST /v1/verify
Verify it
POST /v1/verify recomputes the Merkle inclusion proof and answers valid: true|false. And without an account, anyone can check the bundle at mailack.com/verificar: the check runs in their browser and the file never leaves their device.
POST /v1/verify curl -s -X POST "$MAILACK_API_URL/v1/verify" \ -H "Authorization: Bearer $MAILACK_API_KEY" \ -H "Content-Type: application/json" \ -d "{\"message_id\": \"$MESSAGE_ID\"}" | jq . # → {"valid": true, "merkle_root": "…", "certificate_id": "…", "sealed_at": "…"} # Sin cuenta: bundle.json en mailack.com/verificar (todo en el navegador) - 06mcpServers.mailack
Connect the MCP server
Register mailack-mcp in your MCP client. The agent can send, query, verify and manage domains/webhooks through the exposed tools.
mcpServers.mailack { "mcpServers": { "Mailack": { "command": "./bin/mailack-mcp", "env": { "MAILACK_API_KEY": "mlk_...", "MAILACK_API_URL": "https://api.mailack.com" } } } }
OpenAPI reference
The formal contract lives in the Mailack repository (docs/openapi.yaml). These pages are the product guide and the shortest path to a first verified proof bundle.