Operación sign-cfe

Referencia técnica para operación sign-cfe dentro del cliente local.

Objetivo

POST /sign-cfe es la operación principal para numerar y firmar un CFE con respuesta inmediata.

Se usa cuando el sistema integrador necesita el resultado en la misma llamada.

Endpoint

POST /sign-cfe

Cuándo usarlo

Campos de request

CampoObligatoriedadDescripción
tipo_cfeobligatorioTipo de comprobante a emitir
uuidobligatorioIdentificador externo estable del comprobante
xmlobligatorioXML base sin firma
cod_comerciocondicionalObligatorio si se enruta por punto de emisión
cod_terminalcondicionalObligatorio si se enruta por punto de emisión
adendaopcionalTexto adicional asociado al comprobante
emailsopcionalDestinatarios asociados al flujo
impresoraopcionalParámetros de impresión si el flujo lo requiere
send_nowopcionalIndica el comportamiento posterior al firmado

Ejemplo de request

curl -X POST http://127.0.0.1:18787/sign-cfe \
  -H 'Content-Type: application/json' \
  -d '{
    "tipo_cfe": 101,
    "uuid": "venta-pos-000123",
    "cod_comercio": "1",
    "cod_terminal": "1",
    "xml": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><CFE xmlns=\"http://cfe.dgi.gub.uy\" version=\"1.0\"><eTck>...</eTck></CFE>",
    "adenda": "Pago contado",
    "emails": ["[email protected]"],
    "send_now": false
  }'

Campos de response

CampoCuándo apareceDescripción
uuidsiempreUUID recibido
tipo_cfesiempreTipo de comprobante procesado
serieéxitoSerie asignada
numeroéxitoNúmero asignado
codigo_respuestasiempreResultado funcional
mensaje_respuestasiempreMensaje complementario
codigo_terminalsiempreTerminal utilizada
codigo_comerciosiempreComercio utilizado
numero_inicial_caeéxitoInicio del rango CAE usado
numero_final_caeéxitoFin del rango CAE usado
vencimiento_caeéxitoVencimiento del CAE
cfe_firmadoéxitoXML final firmado
datos_codigo_qréxitoURL o datos del QR
codigo_seguridadéxitoCódigo de seguridad fiscal
fecha_firma_cfeéxitoFecha y hora de firma
imagen_qropcionalImagen QR si el runtime la devuelve

Ejemplo de response exitosa

{
  "uuid": "venta-pos-000123",
  "tipo_cfe": "101",
  "serie": "A",
  "numero": "301",
  "codigo_respuesta": "00",
  "mensaje_respuesta": "CFE firmado localmente",
  "codigo_terminal": "1",
  "codigo_comercio": "1",
  "numero_inicial_cae": "301",
  "numero_final_cae": "400",
  "vencimiento_cae": "2028-01-01",
  "cfe_firmado": "<CFE>...</CFE>",
  "datos_codigo_qr": "https://...",
  "codigo_seguridad": "ZmCpqT",
  "fecha_firma_cfe": "2026-04-29T19:00:00Z",
  "imagen_qr": null
}

Ejemplo de response con error funcional

{
  "uuid": "venta-pos-000123",
  "tipo_cfe": "101",
  "serie": null,
  "numero": null,
  "codigo_respuesta": "31",
  "mensaje_respuesta": "error de validacion: el XML fue rechazado por el validador local: TOT_MNTTOTAL_INVALID: MntTotal no coincide con la suma esperada",
  "codigo_terminal": "1",
  "codigo_comercio": "1",
  "numero_inicial_cae": null,
  "numero_final_cae": null,
  "vencimiento_cae": null,
  "cfe_firmado": null,
  "datos_codigo_qr": null,
  "codigo_seguridad": null,
  "fecha_firma_cfe": null,
  "imagen_qr": null
}

Códigos funcionales relevantes

CódigoInterpretación
00Éxito
31Rechazo de validación o XML rechazado
96Error interno, firma, rango, persistencia o SOAP

Cuando el rechazo viene del validador local, mensaje_respuesta incluye los motivos concretos encontrados. Si hay muchos errores, se devuelven los primeros motivos y un contador de errores adicionales.

Códigos HTTP relevantes

HTTPInterpretación
200Operación procesada; revisar codigo_respuesta
422Request inválido o XML rechazado tempranamente
500Error interno del daemon

Escenarios de error típicos

XML inválido

Resultado esperado:

uuid faltante

Resultado esperado:

tipo_cfe inválido

Resultado esperado:

ruteo incompleto

Resultado esperado:

Regla de integración

Considerar emisión exitosa solo si: