Primeros Pasos

defnd.email utiliza cifrado de extremo a extremo. Tu clave privada nunca sale de tu dispositivo. No podemos leer tus datos — por diseño.

Después del registro, tu navegador genera un par de claves. La clave pública se almacena en nuestros servidores. La clave privada se queda contigo.

1. Crear cuenta

Regístrate en defnd.email/auth/register. Elige tu nombre de usuario — esto se convierte en tu dirección de correo.

2. Guardar frase de recuperación

Recibirás una frase de recuperación de 24 palabras. Guárdala de forma segura — es la única manera de recuperar el acceso si olvidas tu contraseña.

3. Comenzar a usar

Accede a Correo, Calendario, Notas y Contraseñas — todo cifrado con tus claves.

Correo

Email cifrado E2E con dirección @defnd.email.

  • Solo cliente web (el cifrado requiere navegador)
  • Enviar mensajes cifrados a destinatarios externos
  • Recibir y descifrar correo entrante
  • Archivos adjuntos cifrados del lado del cliente

Calendario

Calendario cifrado con eventos, recordatorios y categorías.

  • Todos los datos de eventos cifrados del lado del cliente
  • Soporte para eventos recurrentes
  • Categorías con colores
  • Soporte sin conexión

Notas

Notas seguras con carpetas y etiquetas.

  • Contenido de notas cifrado antes del almacenamiento
  • Organizar con carpetas y etiquetas
  • Anclar notas importantes
  • Edición sin conexión

Contraseñas

Bóveda de contraseñas de conocimiento cero.

  • Todas las credenciales cifradas localmente
  • Generador de contraseñas
  • Importar desde otros gestores (CSV)
  • Organizar con carpetas

Seguridad

Características de seguridad para proteger tu cuenta.

Autenticación de Dos Factores

Activa la autenticación de dos factores en Configuración. Soportamos aplicaciones TOTP (Google Authenticator, Authy, etc.).

Cifrado

  • Intercambio de claves: X25519 (Curve25519)
  • Cifrado: XChaCha20-Poly1305
  • Derivación de claves: Argon2id
  • Recuperación: BIP39 (24 words)

API

Enviar emails cifrados vía REST API (plan Pro).

Getting started

  1. Add a domain and verify it (DNS) under Domains.
  2. Add a verified sender identity (a From address on that domain).
  3. Create an API key for the domain under API — copy it once; only its hash is stored.

Authentication

Pass your key as a Bearer token. Base URL: https://api.defnd.email/v1.

Authorization: Bearer dfnd_xxxxxxxx...

Send an email

from and reply_to must be verified sender identities on a domain your key is scoped to.

curl -X POST https://api.defnd.email/v1/emails \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "from": "hello@yourdomain.com", "reply_to": "hello@yourdomain.com", "to": "recipient@example.com", "subject": "Hello", "html": "<p>Message content</p>", "text": "Message content" }'

Idempotency

Pass an Idempotency-Key header (any unique string, max 255 chars) on POST /v1/emails to make retries safe: a repeated key within 24 hours returns the original response — marked with Idempotency-Replayed: true — instead of sending a duplicate. While the first request is still in flight, duplicates get 409 with Retry-After.

-H "Idempotency-Key: order-42-confirmation"

Other endpoints

  • POST /v1/emails/batch — send up to 100 messages in one request ({"emails":[ ... ]}).
  • GET /v1/emails, GET /v1/emails/{id} — list and check delivery status.
  • GET/POST /v1/templates, POST /v1/templates/{id}/render — reusable templates with {{variable}} placeholders.
  • GET/POST /v1/webhooksemail.queued / delivered / opened / clicked / bounced / unsubscribed events (HMAC-signed; HTTPS only).
  • GET /v1/suppressions, DELETE /v1/suppressions/{email} — bounce/complaint suppression list.
  • GET /v1/domains, GET /v1/domains/{domain}/stats — domains and sending stats.

Keys are scoped: requests are limited to the scopes you grant (transactional:send, transactional:read, templates:read, templates:write, webhooks:manage) and to the key's verified domains.

Webhook signatures

Every webhook request carries X-Defnd-Signature: sha256=<hex> — an HMAC-SHA256 of the raw request body with your webhook's secret. Verify it before trusting the event (the Node/Go SDKs ship a verifyWebhookSignature helper).