Skip to main content
El Contrato Marco Grupo CB es un documento prellenado que CBPay emite para una cuenta empresa verificada. CBPay resuelve la identidad legal, dirección verificada, servicios activos, comisiones y firma vigente de CBPay antes de crear el sobre. Si falta un dato obligatorio verificable, el sobre no se crea. La ceremonia la completa una persona humana con rol owner u operator de la cuenta empresa. Exige consentimiento explícito y un OTP fresco de un solo uso. Las API keys no pueden firmar. Para solicitudes de prueba usa https://cryptobank.qbank.cl/platform; https://api.qbank.cl/platform corresponde solo a producción.

Elegibilidad y estados

La cuenta debe ser empresa activa con KYB aprobado. El sobre está acotado a la organización y cuenta; un ID ajeno responde 404 not_found. No existen los estados draft ni pending. Para lang=en, la organización debe tener contract_counsel_approved_en=true. La emisión en español no requiere ese gate de counsel en inglés. La plantilla es v13.3; el hash y la versión de firma de CBPay quedan congelados en el snapshot del sobre.

Cobertura de precios y cifras mostradas

El endpoint de emisión de la organización comprueba la cobertura de precios antes de crear el sobre. Si un servicio habilitado no tiene una fila de fee efectiva, responde HTTP 422 contract_unfillable con un array missing que usa valores de la forma pricing:<flag>. Una fila explícita de cero por ciento y cero fijo es una configuración gratuita válida. transfers y swaps están exentos de este gate de filas de fee. Operativamente, el cuerpo v13.3 ya no incluye una tabla plana de precios fijos. El Anexo A apunta al Programa de Comisiones vigente del Cliente y agrupa las entradas aplicables con labels localizados como Pagos fiat, Compliance, Tarjetas, Banking, Wallets y Otros, igual que el tablero de precios. Rige la configuración efectiva capturada al emitir; el admin debe corregir una cobertura faltante y emitir un sobre nuevo. Los márgenes internos fx_spread, settlement_spread y swap_spread no aparecen en el fill_snapshot visible para la cuenta ni en el apéndice de precios del PDF. La vista org-admin conserva el snapshot completo para auditoría.

Ceremonia

1

Lista y abre el sobre

Usa GET /v1/me/contracts/envelopes y luego GET /v1/me/contracts/envelopes/{envelopeID}. La lista usa page y page_size (default 50, máximo 200). La respuesta de lista usa items; el detalle incluye events append-only y el nombre de cada evento en event.
2

Descarga el documento antes de firmar

GET /v1/me/contracts/{envelopeID}/pdf devuelve bytes PDF. Guarda el archivo y revisa razón social, dirección, servicios y comisiones. El documento ya viene prefirmado por CBPay, pero permanece pending_client hasta completar la ceremonia.
3

Declara identidad y consentimiento

Envía nombre y cargo del firmante en JSON. El consentimiento debe ser el booleano JSON true. Incluye la firma manuscrita del cliente en signature_png, como PNG codificado en Base64. Se acepta opcionalmente el prefijo data:image/png;base64,. El OTP no es un campo JSON code: envía el token fresco de un solo uso en el header X-OTP-Token.
4

Confirma la finalización

La respuesta exitosa devuelve el sobre en completed. Vuelve a leer el recurso y descarga el PDF para guardar el final_hash. El evento contract_envelope_completed llega a la audiencia org-admin. El claim completado también registra automáticamente el hito de Client Journey contract_signed con actor system:contract-ceremony; no es un hito manual del admin.

Imagen de firma del cliente

signature_png es obligatorio en toda solicitud de firma. La API acepta PNG codificado en Base64 con o sin el prefijo data:image/png;base64,. Antes de reclamar el sobre, decodifica y valida la imagen: máximo 700.000 caracteres Base64, máximo 512 KiB decodificados, dimensiones mínimas de 64×16 píxeles y al menos 200 píxeles con tinta. Si falla, responde HTTP 422 invalid_signature_image; el mensaje identifica la causa de validación. Después de una firma exitosa, el PNG se incrusta en el bloque de firma del Cliente en el PDF final. Las respuestas de lista y detalle solo exponen el booleano has_client_signature; nunca devuelven los bytes ni la llave de storage. Los sobres anteriores sin imagen siguen renderizando el bloque textual.

Notificación de firma

Al emitir o reemitir un sobre, la cuenta recibe un email de notificación con el PDF prefirmado adjunto. Cuando está configurada la URL del portal, incluye el botón Ir a firmar y el mismo deep-link /contracts/{id} en texto plano. La entrega del email es best-effort: la fuente de verdad es el recurso y sus eventos.

Ejemplos de respuesta

Respuesta de lista:
Respuesta completada:

Evento de finalización

Suscríbete a contract_envelope_completed para actualizar la bandeja del admin de la organización. El evento es solo org-admin; la cuenta recibe el PDF final por email y puede leerlo en sus endpoints de sobres.
La hora de firma y el idioma siguen disponibles en el detalle del sobre. No infieras la finalización desde el email: usa el evento y el estado.

Errores y solución

Verificación pública del contrato

Todo PDF final lleva en la página de firmas un bloque de verificación: un código QR con la URL pública del oráculo más un caption con la misma URL y el hash corto del documento (12 hex). Cualquiera con el código puede confirmar que el documento es genuino, sin cuenta ni API key. El verify_code viaja en el detalle del sobre (GET /v1/me/contracts/envelopes/{envelopeID}) y en el detalle organization-admin, así el cliente siempre puede recuperar el link. El código empieza con K, seguida de la identidad del sobre y un HMAC truncado (1+32+20 caracteres); no se puede falsificar ni enumerar. Los navegadores reciben una tarjeta HTML brandeada; los clientes API envían Accept: application/json (o ningún header Accept) y reciben JSON:
El oráculo expone solo hechos de verificación: validez, clase, estado del sobre, emisor, nombre legal del cliente, versión de plantilla, idioma, ID corto del sobre, ambos hashes, timestamps y qué firmas están presentes. Términos, precios, domicilios, emails y cualquier otro dato operativo jamás salen del servidor. Un código alterado o inventado responde HTTP 404 con el mensaje genérico this verification code does not correspond to any contract issued by this platform; las peticiones tienen rate-limit por IP (429 too_many_attempts).

Preguntas frecuentes

No. Debe ser una cuenta empresa activa con KYB aprobado y el firmante debe ser miembro owner u operator.
No. El handler consume un token fresco de un solo uso en X-OTP-Token. Un campo JSON code no forma parte del contrato vigente.
El sobre responde contract_unfillable; CBPay nunca emite un PDF firmado con un dato obligatorio sin resolver.
No. completed es terminal. Solo se puede voidar pending_client con un motivo y luego emitir otro sobre.
Sí, con el mismo sobre y un OTP nuevo. El claim atómico impide una segunda firma; un sobre completado responde contract_invalid_state.
No. El código sigue válido durante la vida del sobre. Si el sobre se anula, el mismo código responde failed en vez de ok.

Descarga en ambos idiomas

El detalle del sobre devuelve available_langs, empezando por el idioma de emisión — ["es"] o ["es", "en"] para un sobre emitido en español (espejado si se emitió en inglés). Este campo es la fuente de verdad de los botones del portal. El ingl?s exige aprobaci?n de counsel y plantilla vigente.
La respuesta PDF es binaria y usa contrato-marco-<short>.pdf en espa?ol o master-agreement-<short>.pdf en ingl?s. Pedir el otro idioma renderiza el mismo sobre desde su snapshot congelado; no se almacena ni hashea aparte. La portada identifica el PDF firmado, sus hashes, la prevalencia del espa?ol bajo ?11 y la URL del or?culo. La contrapartida no es un segundo documento firmado.
Los emails de emisi?n y firma mencionan el otro idioma del portal solo cuando es servible; sin counsel se omite ingl?s.

FAQ

No. Es una contrapartida de lectura. El PDF del idioma de emisi?n sigue siendo el documento firmado y su hash es la referencia.
El ingl?s exige counsel y plantilla vigente. Revisa available_langs; el portal habilita los botones desde ese campo.
Última modificación el 12 de octubre de 2026