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 responde404 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 422contract_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:Evento de finalización
Suscríbete acontract_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.
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. Elverify_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:
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
¿Puede firmar una cuenta persona?
¿Puede firmar una cuenta persona?
No. Debe ser una cuenta empresa activa con KYB aprobado y el firmante debe
ser miembro owner u operator.
¿Puedo mandar el OTP en el JSON?
¿Puedo mandar el OTP en el JSON?
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.¿Qué pasa si el PDF tiene un campo vacío?
¿Qué pasa si el PDF tiene un campo vacío?
El sobre responde
contract_unfillable; CBPay nunca emite un PDF firmado
con un dato obligatorio sin resolver.¿Se puede voidar un sobre completado?
¿Se puede voidar un sobre completado?
No.
completed es terminal. Solo se puede voidar pending_client con un
motivo y luego emitir otro sobre.¿Puedo reintentar la firma?
¿Puedo reintentar la firma?
Sí, con el mismo sobre y un OTP nuevo. El claim atómico impide una segunda
firma; un sobre completado responde
contract_invalid_state.El link de verificación responde 404. ¿Se perdió mi contrato?
El link de verificación responde 404. ¿Se perdió mi contrato?
No. HTTP 404 con
this verification code does not correspond to any contract issued by this platform significa que el código se copió mal o
pertenece a otro sobre. Lee verify_code de nuevo desde el detalle del
sobre o escanea el QR impreso en la página de firmas; el oráculo jamás
confirma ni niega la existencia de otros sobres.¿El código de verificación expira?
¿El código de verificación expira?
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 devuelveavailable_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.
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
?El PDF traducido vale como contrato firmado?
?El PDF traducido vale como contrato firmado?
No. Es una contrapartida de lectura. El PDF del idioma de emisi?n sigue siendo el documento firmado y su hash es la referencia.
?Por qu? no veo ingl?s?
?Por qu? no veo ingl?s?
El ingl?s exige counsel y plantilla vigente. Revisa
available_langs; el portal habilita los botones desde ese campo.