← RFC Reference

RFC 8620: JMAP — Protocolo de Aplicación Meta JSON

Standards Track Mail Access Protocols Published March 2026
ELI5: IMAP fue diseñado en los años 90 cuando los clientes se comunicaban con servidores a través de sockets TCP sin procesar con un protocolo de texto personalizado. JMAP es la misma idea — acceder a tu buzón, gestionar carpetas, sincronizar cambios — pero usando las herramientas que todo desarrollador ya conoce: JSON sobre HTTPS. Es una API similar a REST para correo electrónico. Sin gestión de sockets, sin análisis de respuestas de texto extrañas, sin negociación de extensiones. Solo envía una solicitud JSON, obtén una respuesta JSON.

Por Qué Existe

IMAP funciona, pero lleva décadas de complejidad:

JMAP resuelve todo esto. Es sin estado (cada solicitud es independiente), usa HTTPS (funciona a través de cualquier proxy y cortafuegos), usa JSON (cada lenguaje tiene un analizador), y define notificaciones push como una característica de primera clase a través de EventSource o Web Push.

Cómo Funciona

Descubrimiento de Servicios

Un cliente descubre el punto final de JMAP a través de un URI conocido:

GET https://example.com/.well-known/jmap
{
  "capabilities": {
    "urn:ietf:params:jmap:core": { ... },
    "urn:ietf:params:jmap:mail": { ... }
  },
  "apiUrl": "https://jmap.example.com/api/",
  "uploadUrl": "https://jmap.example.com/upload/{accountId}/",
  "downloadUrl": "https://jmap.example.com/download/{accountId}/{blobId}/{name}",
  "eventSourceUrl": "https://jmap.example.com/events/"
}

Hacer Llamadas de API

Todas las operaciones JMAP se envían como un POST único a la URL de la API. El cuerpo de la solicitud contiene una matriz de llamadas de método, y la respuesta contiene los resultados correspondientes:

POST https://jmap.example.com/api/
{
  "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"],
  "methodCalls": [
    ["Mailbox/get", { "accountId": "u1234", "ids": null }, "a"]
  ]
}

{
  "methodResponses": [
    ["Mailbox/get", {
      "accountId": "u1234",
      "state": "m42",
      "list": [
        { "id": "mb1", "name": "Inbox", "totalEmails": 142 },
        { "id": "mb2", "name": "Sent", "totalEmails": 87 },
        { "id": "mb3", "name": "Archive", "totalEmails": 4210 }
      ]
    }, "a"]
  ]
}

Lotes y Referencias Inversas

Múltiples llamadas de método pueden agruparse en una única solicitud. Las referencias inversas permiten que una llamada use los resultados de una llamada anterior:

"methodCalls": [
  ["Email/query", {
    "accountId": "u1234",
    "filter": { "inMailbox": "mb1", "after": "2025-03-01T00:00:00Z" },
    "sort": [{ "property": "receivedAt", "isAscending": false }],
    "limit": 10
  }, "q"],
  ["Email/get", {
    "accountId": "u1234",
    "#ids": { "resultOf": "q", "name": "Email/query", "path": "/ids" },
    "properties": ["from", "subject", "receivedAt", "preview"]
  }, "g"]
]

Esto busca en la bandeja de entrada y obtiene los 10 resultados principales en un único viaje HTTP, algo que requeriría múltiples comandos IMAP.

Detalles Técnicos Clave

Cadenas de Estado y Sincronización

Cada respuesta JMAP /get incluye una cadena state. Para sincronizar cambios, el cliente llama a /changes con el último estado conocido:

["Email/changes", { "accountId": "u1234", "sinceState": "e789" }, "c"]

["Email/changes", {
  "oldState": "e789",
  "newState": "e801",
  "created": ["em500", "em501"],
  "updated": ["em480"],
  "destroyed": ["em312"]
}, "c"]

El cliente luego obtiene solo los elementos creados/actualizados. Esto es más eficiente que CONDSTORE de IMAP porque funciona en todos los buzones simultáneamente y no requiere una conexión persistente.

Notificaciones Push

JMAP define dos mecanismos de push:

El Patrón Foo/get, Foo/set, Foo/query

JMAP utiliza un patrón de método uniforme para cada tipo de dato:

Método Propósito
Foo/get Obtener objetos por ID
Foo/changes Obtener IDs de objetos cambiados desde un estado
Foo/set Crear, actualizar o destruir objetos
Foo/query Buscar/filtrar y ordenar, devolviendo IDs coincidentes
Foo/queryChanges Actualizaciones incrementales a un resultado de consulta anterior

Para correo electrónico, Foo es Email, Mailbox, Thread, EmailSubmission, etc. Esta consistencia significa que una vez que entiendes un tipo de dato, los entiendes todos.

Errores Comunes

Impacto en la Entregabilidad

Related RFCs