API 1.20.0 - Tipo de emisión por solicitud (biométrica o documental)
Aquí resumimos lo que cambió para los integradores desde la entrada 1.19.5. La novedad principal es el tipo de emisión por solicitud (issuance_flow): biométrica o documental, con precios, compras y cupos separados por tipo. Incluye también las versiones 1.19.6 a 1.19.10. Las rutas siguen bajo el prefijo /api/v1.
Todo es aditivo: si tu integración no cambia nada, sigue creando solicitudes, comprando y consultando el saldo como hasta ahora (ver «Compatibilidad»). Revisa sobre todo los puntos de abajo.
issuance_providerpuede valerdualy ya no lleganull: en el login, enGET /companyy enGET /quota/statusvaleviafirma,mailodual.dualsignifica que tu empresa puede elegir el tipo de emisión en cada solicitud. Si en el futuro llega un valor distinto deviafirma,mailydual, no lo trates comomail: no crees solicitudes y contacta a soporte.- Decide por la solicitud, no por la empresa: cada solicitud trae
issuance_flow(BIOMETRICoDOCUMENTARY). Úsalo para saber si la emisión arranca sola, si hay verificación de identidad o si debes llamar a/issue. Una empresadualtiene solicitudes de los dos tipos. - El cupo es por tipo de emisión: una solicitud solo consume certificados de su mismo tipo. Sin cupo, el
402trae ahoraerror_code=QUOTA_EXHAUSTED, unmessageque nombra el tipo (No tiene certificados disponibles de tipo Documental (sin biometría) para vigencia de 1 año(s)…),issuance_flow,vigenciayavailable_in_other_flows. Si comparabas el texto del mensaje, guíate porerror_code. postpaiddeGET /quota/statusahora suma todos los cupos pospago vigentes del tipo, yexpires_ates el vencimiento más próximo. Antes mostraba solo el cupo pospago más reciente, así que el número puede subir.POST /orderssin rango de precios responde422conerror_code=PRICING_TIER_NOT_FOUND. Antes respondía500.- Empresas
viafirmacuando la emisión biométrica no está disponible:POST /certificate-requestresponde400conerror_code=ISSUANCE_FLOW_UNAVAILABLEy la solicitud no se crea ni consume cupo. Antes la solicitud se creaba y fallaba después, al emitir.
Cambios de comportamiento
Tipo de emisión de cada solicitud
issuance_flow | Qué significa | Cómo se tramita |
|---|---|---|
BIOMETRIC | Biométrica (con verificación de identidad) | Exige legal_rep_email, legal_rep_first_name y legal_rep_last_name; los adjuntos son opcionales. Nace en PROCESSING y la emisión arranca sola |
DOCUMENTARY | Documental (sin biometría) | Exige 2 a 3 adjuntos en Base64. Nace en DRAFT y se envía a emisión con POST /certificate-request/{id}/issue |
Los tipos que puede usar tu empresa dependen de issuance_provider:
issuance_provider | Tipos permitidos | Sin issuance_flow en la petición |
|---|---|---|
viafirma | BIOMETRIC | BIOMETRIC (como antes) |
mail | DOCUMENTARY | DOCUMENTARY (como antes) |
dual | BIOMETRIC y DOCUMENTARY | DOCUMENTARY. Para una emisión biométrica envía "issuance_flow": "BIOMETRIC" |
Desaparece el caso issuance_provider = null y sus reglas especiales de validación.
-
POST /certificate-request: nuevo campo opcionalissuance_flow. Las reglas de validación dependen del tipo elegido, no de la empresa. La respuesta traedataRecords.issuance_flow. Nuevos errores400conerror_code(sinsuccess, como los demás400de este endpoint) y el motivo enmessage:INVALID_ISSUANCE_FLOW: el valor no esBIOMETRICniDOCUMENTARY.ISSUANCE_FLOW_NOT_ALLOWED: tu empresa no tiene habilitado ese tipo.ISSUANCE_FLOW_UNAVAILABLE: la emisión biométrica no está disponible en este momento.
Si tu empresa es
dualy no envíasissuance_flowni adjuntos,errors.attachmentsañadeLa empresa admite ambos flujos; envíe issuance_flow=BIOMETRIC para emisión biométrica. -
PUT /certificate-request/{id}: el tipo no se puede cambiar. No envíesissuance_flow; si llega uno distinto del que tiene la solicitud, responde400ISSUANCE_FLOW_IMMUTABLE. Para usar otro tipo, elimina la solicitud (solo enDRAFToREJECTED) y crea otra. -
Listados y detalle:
GET /certificate-requestyGET /certificate-request/{id}traenissuance_flowen cada solicitud. Las solicitudes anteriores ya traen su tipo. El listado acepta el filtro?issuance_flow=BIOMETRIC|DOCUMENTARY; otro valor responde422INVALID_ISSUANCE_FLOW. -
POST /certificate-request/{id}/issue: el proveedor lo decide el tipo de la solicitud. Unprovideren el cuerpo que no corresponde a ese tipo responde422ISSUANCE_PROVIDER_MISMATCH: no envíesprovider. Si envíasrequest_statusouser_of_changeen el cuerpo de/issuesobre una solicitudBIOMETRIC, responde409ISSUANCE_FLOW_ACTION_NOT_ALLOWED: no envíes esos campos. -
Descargas, verificación de identidad, rechazo, revocación y renovación no cambian. La renovación sigue disponible solo para certificados biométricos.
Detalle en Solicitudes de certificado y Emisión de certificados.
Precios, compras y cupos por tipo de emisión
GET /pricing: nuevo parámetro opcional?issuance_flow=; sin él, el tipo por defecto de tu empresa. Cada rango y la cotización (quantity+vigencia) traenissuance_flow, y la cotización añadetier_name. Un tipo no válido o no habilitado responde422(INVALID_ISSUANCE_FLOWoISSUANCE_FLOW_NOT_ALLOWED); sin rango para la cantidad,422PRICING_TIER_NOT_FOUND. En esta versión los dos tipos se cotizan con las mismas tarifas; desde la 1.21.0 cada tipo tiene las suyas.POST /orders: nuevo campo opcionalissuance_flow(sin él, el tipo por defecto). Los certificados comprados solo se usan en solicitudes de ese tipo. La respuesta, dentro dedata, añadeissuance_flowytier.GET /ordersyGET /orders/{uuid}añadenissuance_flowypricing_tier_id; una orden antigua puede traerissuance_flow=null.GET /quota/status: nuevosissuance_provider,has_quota_any_flowyby_flow, con un bloque por tipo (BIOMETRIC/DOCUMENTARY) que traeselectable,postpaid,prepaid_items_available,prepaid_1_year,prepaid_2_year,available_1_year,available_2_yearyhas_quota.available_N_yeares pospago más prepago para esa vigencia. Un tipo con saldo que tu empresa ya no puede usar llega conselectable: false. Las claves de primer nivel describen el tipo por defecto de tu empresa (condual,DOCUMENTARY).- Consumo de cupo: una solicitud usa primero el pospago vigente de su tipo (el que vence antes) y, si no hay, un certificado prepago de su tipo y su vigencia. Si eliminas la solicitud (en
DRAFToREJECTED), la rechazas con/issuance/rejecto se cancela porque venció la verificación de identidad, el certificado vuelve al mismo saldo del que salió. Pasarla aCANCELLEDconPUT /certificate-request/{id}/statusno devuelve el cupo.
Detalle en Precios, Órdenes y Cupos.
Estadísticas por tipo de emisión
GET /consume/{year}, GET /consume/{year}/{month}, GET /certificate-request/stats/{companyId} y GET /certificates/expiring aceptan ?issuance_flow=BIOMETRIC|DOCUMENTARY y traen el desglose por tipo:
/consume/*: cada fila traeby_flow({"BIOMETRIC": n, "DOCUMENTARY": m}) y la respuesta indica enissuance_flowel filtro aplicado./certificate-request/stats/{companyId}: cada año traeby_flowcontotalystatusespor tipo; ademásgrand_total_by_flow,issuance_flowyquota.by_flow./certificates/expiring: cada certificado traeissuance_flow; ademástotal_by_floweissuance_flow.
Sin el filtro, las cifras y claves existentes no cambian. Un issuance_flow vacío cuenta como si no lo enviaras; otro valor responde 422 INVALID_ISSUANCE_FLOW con errors.issuance_flow. Detalle en Consumo y Notificaciones.
Webhooks
| Evento | Novedad |
|---|---|
certificate_request.created | data.issuance_flow |
certificate_request.status_changed | data.issuance_flow (null solo si la solicitud se eliminó antes de la entrega) |
payment.approved / payment.failed | Se define su contenido (order_id con el UUID de la orden, issuance_flow, quantity y vigencia de la compra), pero en esta versión se aceptan en la suscripción y todavía no generan entregas: el resultado de un pago se consulta con GET /orders/{uuid}. Empiezan a entregarse en la 1.21.1 |
certificate.expiring | Sin cambios: se acepta en la suscripción y todavía no genera entregas |
La firma, las cabeceras, el tiempo de espera y la desactivación tras 10 fallos no cambian.
Configuración general y cuenta (1.19.6 a 1.19.10)
PUT /company/settingsya guarda los cambios: actualizavaluede los parámetros indicados por suid(el deGET /company/settings). Corrige lo indicado en la entrada 1.19.5, donde esta operación respondía500. Detalle en Empresa.- Nueva operación
DELETE /profile: el titular elimina su propia cuenta confirmando su contraseña actual. Revoca todos sus tokens (incluidos los Personal Access Tokens) y anonimiza sus datos personales; la empresa, sus solicitudes, pedidos y pagos se conservan. No se puede deshacer. Límite: 5 peticiones por minuto. Detalle en Perfil.
Compatibilidad
| Si tu integración… | Resultado |
|---|---|
No envía issuance_flow al crear | Usa el tipo por defecto: el de siempre con viafirma y mail; DOCUMENTARY con dual |
No envía issuance_flow en /pricing u /orders | Cotiza y compra en el tipo por defecto |
Lee solo las claves de primer nivel de /quota/status | Recibe el saldo del tipo por defecto, coherente con lo que consumirá una solicitud sin issuance_flow |
Trata dual como mail | Funciona: sin issuance_flow la solicitud es DOCUMENTARY, igual que con mail. Pero no podrás emitir solicitudes biométricas y mostrarás mal las que ya existan: actualiza la integración para reconocer dual y decidir por el issuance_flow de cada solicitud |
| Ignora los campos nuevos de webhooks y estadísticas | Sin efecto |
Documentación
- La referencia de la API documenta
issuance_flow, los nuevos errores y los campos por tipo de emisión en Solicitudes, Emisión, Precios, Órdenes, Cupos, Consumo, Notificaciones y Webhooks. - Las guías y la colección de Postman se actualizaron con el tipo de emisión por solicitud y el saldo por tipo.
¿Vas a actualizar una integración existente? Revisa la guía paso a paso, los casos de uso y la solución de problemas.