Requisitos previos
- Cuenta de desarrollador y una app configurada para OAuth 2.0
- Token de acceso de usuario con
dm.read,dm.write,tweet.readyusers.read
1. Instala las dependencias
- Python
- TypeScript
- Rust
- Go
- C#
- Java
chatxdk; impórtalo como chat_xdk. Requiere Python 3.10+.- Python
- TypeScript
- Rust
- Go
- C#
- Java
2. Inicializa el Chat XDK con claves existentes
Este paso carga claves que ya tienes—úsalo cuando esta identidad ya completó la configuración inicial:- Copia de seguridad segura de claves: construye el SDK con el
juicebox_configde tu registro de clave pública y luego usaunlockcon tu código de acceso para recuperar las claves privadas (por ejemplo, en un dispositivo nuevo). - Blob de claves:
import_keyscon un blob que exportaste previamente medianteexport_keys.
public_key_version en tu registro).
¿Configuras por primera vez? Construye el SDK de la misma forma pero omite unlock/import_keys y continúa en el paso 3 para crear, respaldar y registrar tus claves.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
export_keys / import_keys). Las apps cliente suelen usar la copia de seguridad segura de claves (setup / unlock con un código de acceso). Consulta la referencia del Chat XDK para ambos caminos.
¿Traes tus propias claves?
import_keys solo acepta el blob opaco que produce export_keys del Chat XDK—es una serialización privada y versionada del estado completo de las claves, no claves P-256 en bruto ni codificadas en PEM. No puedes construir este blob por tu cuenta: genera las claves con generate_keypairs (paso 3), exporta el blob una vez y guárdalo codificado en base64. Los blobs hechos a mano o modificados fallan al importarse.3. Crea y registra las claves (configuración inicial)
Omite este paso si cargaste claves existentes en el paso 2. De lo contrario, la configuración inicial de una identidad nueva hace tres cosas:- Crear los pares de claves —
generate_keypairsproduce los pares de claves de identidad y de firma. - Registrar las claves públicas — envía el payload de registro con POST al endpoint add-public-key para que otros puedan cifrar hacia ti y verificar tus firmas.
- Guardar las claves privadas —
setupcon un código de acceso las escribe en la copia de seguridad segura de claves (clientes), oexport_keysdevuelve un blob de claves para que lo guardes de forma segura (servidores y bots).
- Python
- TypeScript
- Rust
- Go
- C#
- Java
4. Configura las claves de conversación
Llama aprepare_conversation_key_change con tu ID de usuario, tu versión de clave de firma y la clave pública de identidad de cada participante. Una sola llamada genera una nueva clave de conversación, la cifra para cada participante y firma el cambio. Envía el resultado con POST al endpoint add conversation keys (POST /2/chat/conversations/{id}/keys)—el cuerpo necesita conversation_key_version, conversation_participant_keys (SDK encrypted_key → API encrypted_conversation_key) y action_signatures (obligatorio; la API rechaza la llamada sin ellas). Conserva la clave de conversación en bruto para enviar.
La respuesta devuelve el id canónico de la conversación (data.conversation_id—el par unido con guión para un 1:1, o el id con prefijo g para un grupo) y el data.sequence_id del cambio de clave. Usa ese id devuelto para solicitudes posteriores en lugar de reconstruirlo en el cliente. La misma llamada también rota las claves más adelante: pasa el id de conversación existente a prepare_conversation_key_change y haz POST con la versión de clave más reciente. Rota cuando sospeches que la clave de conversación quedó expuesta—la rotación protege mensajes futuros únicamente; los mensajes cifrados bajo versiones anteriores de la clave siguen siendo legibles para cualquiera que tenga esas versiones.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
5. Envía un mensaje
Cifra con los bytes en bruto de la clave de conversación. En la solicitud de envío, mapea:
Usa un id de conversación con guión en la ruta URL cuando la API lo requiera (
: → -). El propio SDK es flexible: encrypt_message y encrypt_reply aceptan el id en cualquier forma que tengas—A:B de eventos, A-B de listados o rutas URL (en cualquier orden), o solo el id de usuario del destinatario—y lo canonicalizan antes de firmar. Los ids de grupo (con prefijo g) pasan sin cambios.
- Python
- TypeScript
- Rust
- Go
- C#
- Java
6. Recibe y descifra
Usa webhooks o el activity stream para el tráfico en vivo, o pagina los events de la conversación para el historial.- Campos de payload en vivo:
encoded_event,conversation_key_change_eventopcional - Historial:
GET /2/chat/conversations/{id}/events— prefieredecrypt_eventssobre todos los eventos másmeta.conversation_key_events - Pasa las claves públicas del remitente al descifrar para la verificación de la firma (mapea los campos de la API a
SigningKeyEntry; consulta Chat XDK) - JavaScript usa tipos de evento en camelCase (
message); los demás lenguajes usan"Message"y campos snake_case en JSON
- Python
- TypeScript
- Rust
- Go
- C#
- Java
Buenas prácticas
- Cachea las claves de conversación en bruto y las claves públicas de los remitentes; refréscalas ante fallos de verificación de firma
- Deduplica las entregas en vivo con
event_uuid - Pagina el historial de eventos hasta completar la paginación para no perder metadatos de cambio de clave
- No registres códigos de acceso, claves privadas ni el texto plano de mensajes en producción
- En apps web, mantén los tokens de OAuth (y la emisión de tokens de realm de la copia de seguridad de claves) en un servidor; procura mantener las claves privadas solo en el Chat XDK del cliente
Próximos pasos
Chat XDK
Métodos y tipos para todos los bindings de lenguaje
Multimedia
Imágenes y archivos adjuntos cifrados
Grupos
Conversaciones y metadatos con múltiples participantes
Eventos en tiempo real
Webhooks y entrega de actividad