Emite un CFE
POST /v1/cfe/emitir
Emite un Comprobante Fiscal Electrónico (CFE) y lo envía a DGI.
Este es el endpoint recomendado para integraciones nuevas: el cuerpo es un JSON estructurado y Host Factura se encarga de armar el XML, firmarlo, asignar CAE, manejar la numeración y enviarlo a DGI.
Tipos de CFE soportados
Ver la sección “Tipos de Comprobante Fiscal Electrónico (CFE) soportados” en la introducción para la tabla completa con los 24 tipos (códigos 101 a 153).
Los más usados son:
| Código | Descripción | Receptor |
|---|---|---|
| 101 | e-Ticket | Opcional (consumidor final) |
| 102 | Nota de Crédito de e-Ticket | Heredado de la referencia |
| 103 | Nota de Débito de e-Ticket | Heredado de la referencia |
| 111 | e-Factura | Obligatorio |
| 112 | Nota de Crédito de e-Factura | Heredado de la referencia |
| 113 | Nota de Débito de e-Factura | Heredado de la referencia |
| 121-123 | e-Factura Exportación y sus Notas | Obligatorio + exportacionInfo |
| 124 | e-Remito Exportación | Obligatorio + remitoInfo |
| 181 | e-Remito | Obligatorio + remitoInfo |
| 182 | e-Resguardo | Obligatorio + códigos de retención |
Ítems
Cada elemento de items[] puede ser:
- De catálogo: solo
{ id, quantity }. Los datos del producto se toman del catálogo de la cuenta. - Ad-hoc:
{ name, quantity, price, billingIndex, description?, unit?, code? }.billingIndexes obligatorio:1=Exento,2=10%,3=22%,4=Otras.
Emisión de Notas de Crédito y Notas de Débito
Las Notas se usan para modificar el monto de un Comprobante Fiscal Electrónico previamente emitido. No hay que volver a enviar los datos del receptor ni la fecha original — todo eso se hereda automáticamente del CFE referenciado.
Notas de Crédito (102, 112, 122, 132, 142, 152): reducen el monto del comprobante original. Casos típicos:
- Devolución de mercadería por parte del cliente.
- Error de facturación (monto mal cargado, ítem facturado por error).
- Descuento aplicado posteriormente.
- Bonificación comercial.
Notas de Débito (103, 113, 123, 133, 143, 153): aumentan el monto del comprobante original. Casos típicos:
- Intereses por mora.
- Cargos adicionales no facturados originalmente (flete, envasado, etc.).
- Ajustes de precio por diferencias detectadas posteriormente.
Reglas de correspondencia entre el tipo de la Nota y el del CFE referenciado:
| Tipo de Nota | Puede referenciar |
|---|---|
| 102 (Nota de Crédito de e-Ticket) / 103 (Nota de Débito de e-Ticket) | e-Ticket (101) |
| 112 (Nota de Crédito de e-Factura) / 113 (Nota de Débito de e-Factura) | e-Factura (111) |
| 122 / 123 (Notas de e-Factura Exportación) | e-Factura Exportación (121) |
| 132 / 133 (Notas de e-Ticket por Cuenta Ajena) | e-Ticket por Cuenta Ajena (131) |
| 142 / 143 (Notas de e-Factura por Cuenta Ajena) | e-Factura por Cuenta Ajena (141) |
| 152 / 153 (Notas de e-Boleta de Entrada) | e-Boleta de Entrada (151) |
Cómo emitirla: enviá el tipo correspondiente y referenciaId con el UUID del CFE original. Los items[] representan las líneas que se están acreditando/debitando — no son los ítems originales.
CFE de Cobranza (e-Recibo)
Para documentar el cobro de una venta a crédito (o un adelanto de precios), emití un e-Ticket (101) o e-Factura (111) con esCobranza: true (A-C20 IndCobPropia=1). Reglas:
- Todas las líneas deben ser no facturables:
billingIndex6(no facturable) o7(no facturable negativo). La operación ya se gravó al emitir la factura original, así que la cobranza no vuelve a generar IVA. - La representación impresa lleva la leyenda “Cobranza” (requisito DGI).
referenciaId(opcional) apunta a la factura a crédito cobrada y arma la Referencia (Zona F).- Admite cobros parciales: el monto cobrado es el de las líneas.
- Documentar la cobranza es opcional según DGI; la forma de pago de la factura original es solo informativa y no obliga a emitir un recibo posterior.
Moneda extranjera
Cuando moneda != "UYU", cambio es obligatorio. Obtené el tipo de cambio vigente con GET /v1/cotizaciones (caché 24h, datos del BCU).
Pre-requisitos de la cuenta
Para que la emisión funcione, la cuenta debe tener: certificado de facturación electrónica vigente, CAE vigente para el tipo+serie+sucursal, y datos básicos de empresa cargados. Si falta algo, recibirás 409 CERTIFICADO_NO_VIGENTE, 409 NO_CAE_VIGENTE u otro error específico, antes de consumir numeración. Mientras la empresa tramita el certificado podés probar tus comprobantes con POST /v1/cfe/validar-cfe.
Metadatos personalizados
El campo opcional metadata adjunta datos propios del negocio (no fiscales) al CFE: número de transacción de pago, método de pago, referencia externa, etc. Las claves deben corresponder a campos ya definidos para la cuenta desde el panel web (Configuración → Campos personalizados); no existe un endpoint público para crearlos ni listarlos. Claves desconocidas o valores fuera de tipo devuelven 422 METADATA_INVALIDA (detalle en error.details). Se devuelven de vuelta en data.metadata, tanto en esta respuesta como en GET /v1/cfe/info/{id}. No soportado en POST /v1/cfe/emitir-xml. Editar los metadatos de un CFE ya emitido solo es posible desde el panel web, no por esta API. Guía completa: Metadatos personalizados.
Alcance requerido:
cfe:emitir. Si la credencial no lo tiene, la respuesta es403 API_ALCANCE_INSUFICIENTEcon la lista enerror.requerido. Las credenciales creadas antes del modelo de alcances (alcances: null) conservan acceso total.
Autorizaciones
Sección titulada «Autorizaciones »Parámetros
Sección titulada « Parámetros »Parámetros de header
Sección titulada «Parámetros de header »Ejemplo
0199d1b0-0000-7000-8000-000000000000Sólo para credenciales de cuenta proveedora (revendedor). UUID de la subcuenta de la cartera sobre la que se quiere operar: la cuenta efectiva del request pasa a ser esa.
Una credencial que no es de proveedor, o una subcuenta que no está en su cartera, recibe 403 API_CUENTA_FUERA_DE_CARTERA. Sin la cabecera, la cuenta es siempre la de la credencial.
Sucursal contra la que operar, cuando la credencial es global. Si la credencial está fijada a una sucursal y esta cabecera indica otra, la respuesta es 403 API_ACCESS_BRANCH_MISMATCH. Sin la cabecera se asume la casa central.
Punto de emisión dentro de la sucursal resuelta. Obligatorio cuando la sucursal tiene 2 o más puntos activos (400 PUNTO_EMISION_REQUERIDO si falta); con uno solo se selecciona automáticamente.
Ejemplo
venta-000123Clave de idempotencia de la emisión (8 a 128 caracteres de A-Za-z0-9._:~-). Muy recomendada: sin ella, reintentar tras un timeout puede emitir el mismo comprobante dos veces en DGI.
Usá una clave por comprobante (por ejemplo, el id de tu venta) y repetila en cada reintento, con el mismo cuerpo:
- Emisión terminada: el reintento devuelve el mismo CFE con
meta.reusada: true, sin volver a emitir. - Emisión todavía en curso:
409 CFE_IDEMPOTENCY_EN_CURSO; reintentá en unos segundos. - Error antes de llegar a DGI (validación, CAE, rechazo explícito de DGI): la clave se libera y podés corregir y reintentar con la MISMA clave.
- El envío a DGI no se confirmó (timeout o corte):
409 CFE_EMISION_INCIERTA. No reintentes con otra clave: revisá el listado de emitidos o contactá a soporte.
La misma clave con otro cuerpo u otro endpoint devuelve 409 CFE_IDEMPOTENCY_KEY_CONFLICTO; una clave con formato inválido, 400 CFE_IDEMPOTENCY_KEY_INVALIDA. Si no se puede registrar la clave, 503 CFE_IDEMPOTENCIA_NO_DISPONIBLE y no se emite. La ventana es de 24 horas (7 días para una emisión incierta).
Cuerpo de la solicitud
Sección titulada «Cuerpo de la solicitud »Datos del CFE a emitir
object
object
A-C12 Fecha de vencimiento del pago (AAAA-MM-DD). Pensada para ventas a crédito (formaPago=2).
A-C5.1 FchValor (AAAA-MM-DD) — fecha valor, EXCLUSIVA del e-Resguardo (182): la usan los organismos del Estado cuando la fecha en que se hace efectiva la retención difiere de la fecha contable de emisión. Debe caer en el MISMO MES que fchEmis (DGI exige que coincida el AAAAMM) y su año no puede pasar de 2050. En cualquier otro tipo devuelve 422.
Emite un CFE de Cobranza (e-Recibo, A-C20 IndCobPropia=1): solo e-Ticket (101) o e-Factura (111), con todas las líneas no facturables (billingIndex 6 o 7) y la leyenda “Cobranza” en la representación impresa. Opcionalmente, referenciaId apunta a la factura a crédito cobrada (Referencia Zona F).
object
object
object
CompraID — estandar DGI para el nº de orden de compra / ID de pago del RECEPTOR. Viaja en el bloque Receptor del XML. Hasta 50 caracteres. No lo admite el e-Resguardo (182).
Venta por cuenta ajena (131/132/133 y 141/142/143): datos del mandante, es decir, por cuenta de quién se vende. Van en la zona K (Complemento Fiscal) del CFE; el RUC emisor de esa zona es siempre el de tu cuenta. Obligatorio en esos tipos, notas incluidas, y prohibido en el resto (422).
object
K-C2 TipoDocMdte — tipo de documento del mandante: 1=NIE, 2=RUC, 3=CI, 4=Otros, 5=Pasaporte, 6=DNI (Argentina, Brasil, Chile o Paraguay), 7=NIFE.
K-C3 Pais — código ISO 3166-1 alfa-2 del país emisor del documento (ej. UY).
K-C4 DocMdte — número de documento del mandante (hasta 20 caracteres). Si es RUC o CI uruguayos se valida el dígito verificador.
K-C5 NombreMdte — nombre o razón social del mandante (hasta 150 caracteres).
Metadatos personalizados de la cuenta (campos NO fiscales definidos desde el panel web, Configuración → Campos personalizados). Las claves deben coincidir con las definidas para la cuenta; valores fuera de tipo/formato son rechazados con 422 METADATA_INVALIDA. Cada valor es un texto, un número, un booleano, una lista de textos o null (que borra el valor del campo). No soportado en POST /v1/cfe/emitir-xml.
object
object
B-C20 CodRet — código de la tabla de Retención/Percepción de DGI, formato FFFF-LLL (ej. “2183-010”). Consultable en GET /cfe/retenciones. Los códigos del formulario 2181 son CRÉDITOS FISCALES (A-C127): su importe suma a mntTotCredFisc (A-C125.1), NO a mntTotRetenido (A-C125).
B-C21 Tasa (%) aplicada. Opcional.
B-C22 MntSujetoaRet — base imponible sobre la que se retiene. Debe ser mayor a 0.
B-C23 ValRetPerc — importe retenido/percibido.
B-C22.1 InfoAdicionalRet — leyenda normativa de la línea (hasta 150 caracteres). Cuando se envía, la representación impresa del e-Resguardo la imprime debajo del concepto: DGI lo exige (Formato CFE v25).
object
Marca la línea como AJUSTE (B-C4 IndFact=9): sus importes RESTAN del agregado por código (A-C128) y por lo tanto de mntTotRetenido/mntTotCredFisc. Exige referenciaId apuntando al e-Resguardo que se ajusta.
Tabla de Retención/Percepción de esta línea de detalle (Item_Resg admite hasta 5).
object
B-C20 CodRet — código de la tabla de Retención/Percepción de DGI, formato FFFF-LLL (ej. “2183-010”). Consultable en GET /cfe/retenciones. Los códigos del formulario 2181 son CRÉDITOS FISCALES (A-C127): su importe suma a mntTotCredFisc (A-C125.1), NO a mntTotRetenido (A-C125).
B-C21 Tasa (%) aplicada. Opcional.
B-C22 MntSujetoaRet — base imponible sobre la que se retiene. Debe ser mayor a 0.
B-C23 ValRetPerc — importe retenido/percibido.
B-C22.1 InfoAdicionalRet — leyenda normativa de la línea (hasta 150 caracteres). Cuando se envía, la representación impresa del e-Resguardo la imprime debajo del concepto: DGI lo exige (Formato CFE v25).
A-C125 MntTotRetenido — total RETENIDO del e-Resguardo. Solo los códigos que NO son del formulario 2181: los 2181xxx son créditos fiscales y van a A-C125.1 mntTotCredFisc. Si se omite, se deriva de la suma (con signo: las líneas de ajuste restan) de los importes no-2181; si se envía, debe coincidir con esa suma. Puede ser 0 (resguardo que solo documenta créditos fiscales) o negativo (resguardo de ajuste).
Ejemplos
e-Ticket a consumidor final (sin datos de receptor)
Caso típico de POS: venta de bajo monto a consumidor final, sin RUT ni datos del cliente. Para tipo 101 (e-Ticket), si el monto neto en UI no supera el tope (~10.000 UI), el receptor es opcional.
{ "tipo": 101, "moneda": "UYU", "formaPago": 1, "items": [ { "name": "Café americano", "quantity": 2, "price": 90, "billingIndex": 3 }, { "name": "Medialuna", "quantity": 1, "price": 60, "billingIndex": 3 } ]}e-Factura a empresa (RUT)
Emisión a una empresa identificada por RUT (tipoDocumento=2). Mezcla un ítem de catálogo (solo con id y quantity) con un ítem ad-hoc. compraId (opcional, máx. 50) es el estándar DGI para el nº de orden de compra / ID de pago del receptor: viaja en el bloque Receptor del XML del CFE.
{ "tipo": 111, "moneda": "UYU", "formaPago": 2, "cliente": { "tipoDocumento": 2, "documento": "219999830019", "razonSocial": "EMPRESA EJEMPLO S.A.", "direccion": "18 DE JULIO 1234", "ciudad": "MONTEVIDEO", "estado": "MONTEVIDEO", "pais": "UY", "email": "facturacion@empresa-ejemplo.com.uy" }, "items": [ { "id": "3f1a5c80-7b22-4e8d-9f1c-2b3a4c5d6e7f", "quantity": 3 }, { "name": "Servicio de consultoría — Septiembre", "quantity": 1, "price": 12500, "billingIndex": 3, "description": "Horas: 40 — Hora: $312.50" } ], "compraId": "OC-2026-00845", "adenda": "Forma de pago: transferencia BROU 001-1234567-89"}e-Factura por cuenta ajena (141) con mandante
Venta B2B que tu cuenta realiza por cuenta y orden de un tercero (consignación, comisionista, plataforma que factura en nombre de un vendedor). mandante identifica a ese tercero y viaja en la zona K (Complemento Fiscal) del CFE. Es obligatorio en 131/132/133 y 141/142/143 y se rechaza en cualquier otro tipo. Las Notas (142/143) llevan referenciaId y también su propio mandante.
{ "tipo": 141, "moneda": "UYU", "formaPago": 2, "cliente": { "tipoDocumento": 2, "documento": "219999830019", "razonSocial": "EMPRESA EJEMPLO S.A.", "direccion": "18 DE JULIO 1234", "ciudad": "MONTEVIDEO", "pais": "UY" }, "mandante": { "tipoDocumento": 2, "pais": "UY", "documento": "215521750017", "razonSocial": "PRODUCTOR EJEMPLO S.R.L." }, "items": [ { "name": "Lote de mercadería en consignación", "quantity": 10, "price": 1500, "billingIndex": 3 } ]}e-Factura en USD (cambio obligatorio)
Cuando la moneda es distinta de UYU, el campo cambio (TC al día) es obligatorio. Usalo en conjunto con GET /v1/cotizaciones para obtener el TC vigente del BCU.
{ "tipo": 111, "moneda": "USD", "cambio": 39.85, "formaPago": 2, "cliente": { "tipoDocumento": 2, "documento": "219999830019", "razonSocial": "EXPORTADORA EJEMPLO S.A.", "pais": "UY" }, "items": [ { "name": "Producto X", "quantity": 10, "price": 100, "billingIndex": 3 } ]}Nota de Crédito de un e-Ticket previo
Para reducir el monto de un CFE previamente emitido (por devolución, error de cobro, descuento posterior, etc.), emití una Nota de Crédito: tipo 102 si el original es e-Ticket, tipo 112 si el original es e-Factura. Enviá referenciaId con el UUID del CFE original; la fecha y los datos del receptor se heredan automáticamente.
{ "tipo": 102, "moneda": "UYU", "referenciaId": "8a7b6c5d-4e3f-2a1b-9c8d-7e6f5a4b3c2d", "items": [ { "name": "Devolución por error de cobro", "quantity": 1, "price": 240, "billingIndex": 3 } ]}Nota de Débito por intereses por mora
Para aumentar el monto de un CFE previamente emitido (intereses por mora, cargos adicionales, ajustes de precio, etc.), emití una Nota de Débito: tipo 103 si el original es e-Ticket, tipo 113 si el original es e-Factura. Enviá referenciaId con el UUID del CFE original; la fecha y los datos del receptor se heredan automáticamente.
{ "tipo": 113, "moneda": "UYU", "referenciaId": "8a7b6c5d-4e3f-2a1b-9c8d-7e6f5a4b3c2d", "items": [ { "name": "Intereses por mora — atraso 45 días", "quantity": 1, "price": 1830, "billingIndex": 3, "description": "TNA 12% sobre saldo $15.250" } ]}e-Factura de Cobranza (e-Recibo) de una venta a crédito
Documenta el cobro de una venta a crédito previa. Es un e-Ticket (101) o e-Factura (111) con esCobranza: true (A-C20 IndCobPropia=1): todas las líneas van como no facturable (billingIndex 6 o 7), porque la operación ya se gravó al emitir la factura original — la cobranza solo documenta el ingreso de dinero y no vuelve a generar IVA. La representación impresa lleva la leyenda “Cobranza”. referenciaId es OBLIGATORIO y apunta a la factura a crédito cobrada: DGI exige la referencia (Zona F) cuando IndCobPropia=1 y rechaza con E05 si falta. Admite cobros parciales (el monto cobrado es el de las líneas).
{ "tipo": 111, "moneda": "UYU", "formaPago": 1, "esCobranza": true, "referenciaId": "8a7b6c5d-4e3f-2a1b-9c8d-7e6f5a4b3c2d", "cliente": { "tipoDocumento": 2, "documento": "219999830019", "razonSocial": "EMPRESA EJEMPLO S.A.", "pais": "UY" }, "items": [ { "name": "Cobranza Factura A-123", "quantity": 1, "price": 12200, "billingIndex": 6 } ], "adenda": "Cancelación de Factura A-123 — Transferencia BROU 001-1234567-89"}e-Ticket con metadatos personalizados
El campo metadata adjunta datos propios del negocio (no fiscales) al CFE: número de transacción de pago, método de pago, referencia externa, etc. Las claves deben corresponder a campos personalizados ya definidos para la cuenta desde el panel web (Configuración → Campos personalizados); no hay endpoint público para crearlos ni listarlos. Valores fuera de tipo o claves no configuradas devuelven 422 METADATA_INVALIDA con el detalle en error.details. No soportado en POST /v1/cfe/emitir-xml.
{ "tipo": 101, "moneda": "UYU", "formaPago": 1, "items": [ { "name": "Cuota mensual — Plan Premium", "quantity": 1, "price": 1490, "billingIndex": 3 } ], "metadata": { "numero_transaccion": "TXN-8827461", "metodo_pago": "tarjeta", "referencia_externa": "sub_9F2K1" }}Respuestas
Sección titulada « Respuestas »CFE emitido. Verificá el campo data.estado (aceptado/pendiente/rechazado/observado).
object
object
CompraID — identificador de compra del receptor (nº de orden de compra o de pago) declarado al emitir
E-Resguardo (182): tabla de Retencion/Percepcion declarada al emitir. null en el resto de los tipos
object
Descripcion oficial del codigo en la tabla DGI
B-C22 MntSujetoaRet — base imponible
B-C23 ValRetPerc — importe retenido/percibido
true para los codigos del formulario 2181: suman a mntTotCredFisc, no a mntTotRetenido
B-C4 IndFact=9: la linea RESTA del agregado. valor se mantiene positivo, igual que en el XML
A-C125 — total retenido (solo codigos que NO son del formulario 2181). Es el total del e-Resguardo
A-C125.1 — total de creditos fiscales (solo codigos 2181xxx)
Cliente del catalogo, si el CFE se emitio contra uno
object
Tipo de documento como texto: RUC, CI, Pasaporte, …
Canal por el que se emitio (trazabilidad del integrador)
requestId de la llamada que lo emitio, para correlacionar logs
Metadatos personalizados capturados en la emisión. {} si la cuenta no tiene campos configurados o no se enviaron valores.
object
Ejemplos
CFE emitido y aceptado por DGI
{ "data": { "id": "8a7b6c5d-4e3f-2a1b-9c8d-7e6f5a4b3c2d", "tipo": 111, "tipoDescripcion": "e-Factura", "serie": "A", "numero": 1234, "rutEmisor": "210000000000", "moneda": "UYU", "tipoCambio": 1, "subtotal": 12500, "iva": 2750, "total": 15250, "adenda": "Forma de pago: transferencia BROU 001-1234567-89", "compraId": "OC-2026-00845", "retenciones": null, "mntTotRetenido": null, "mntTotCredFisc": null, "anulado": false, "estado": "aceptado", "estadoDgi": "A", "fechaEstadoDgi": "2026-05-17T13:42:11.000Z", "motivoRechazo": null, "codigoRespuesta": "00", "codigoSucursalDgi": 1, "clienteId": null, "cliente": { "tipoDocumento": "RUC", "documento": "219999830019", "denominacion": "EMPRESA EJEMPLO S.A.", "direccion": null, "ciudad": null, "departamento": null, "pais": "UY" }, "cuentaId": "1d2e3f4a-5b6c-7d8e-9f0a-1b2c3d4e5f6a", "sucursalId": null, "puntoEmisionId": null, "referenciaId": null, "uuidReferencia": "9b8a7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d", "sobreId": "2a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d", "reporteDiarioId": null, "cfeRecurrenteId": null, "origen": "api_v1", "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c", "fechaCreacion": "2026-05-17T13:42:10.000Z", "fechaActualizacion": "2026-05-17T13:42:11.000Z", "metadata": {} }}Datos inválidos. El cuerpo no pasa la validación, o el CFE no es construible.
Códigos posibles:
CLIENT_CI_INVALID— Cédula uruguaya con dígito verificador incorrecto.NOTA_REFERENCE_UNDEFINED— Es una Nota de Crédito o Nota de Débito y faltareferenciaId.EXPORTACION_INFO_REQUIRED— Es CFE de exportación y faltaexportacionInfo.REMITO_INFO_REQUIRED— Es e-Remito y faltaremitoInfo.ITEM_INVALIDO— Un ítem no tiene nombre o unidad.PUNTO_EMISION_REQUERIDO— Sucursal con múltiples puntos sinx-point-id.SUCURSAL_INVALIDA—x-branch-idno pertenece a la cuenta.CFE_IDEMPOTENCY_KEY_INVALIDA— la cabeceraIdempotency-Keyno tiene el formato válido.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Cédula uruguaya con dígito verificador inválido
{ "error": { "code": "CLIENT_CI_INVALID", "message": "La cédula uruguaya del cliente no es válida (dígito verificador incorrecto)" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Sucursal con múltiples puntos sin x-point-id
{ "error": { "code": "PUNTO_EMISION_REQUERIDO", "message": "La sucursal tiene múltiples puntos de emisión activos: x-point-id es requerido" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}No autenticado. La API_KEY no fue enviada, no es válida o la credencial está desactivada.
Códigos posibles: API_AUTH_HEADER_MISSING, API_AUTH_HEADER_INVALID, API_ACCESS_INVALID.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Falta header Authorization
{ "error": { "code": "API_AUTH_HEADER_MISSING", "message": "Se esperaba la cabecera Authorization con esquema Bearer" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Secret key inválida o revocada
{ "error": { "code": "API_ACCESS_INVALID", "message": "Acceso no autorizado" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Acceso prohibido. La credencial es válida pero algo del contexto lo impide. Las cinco causas se corrigen de forma distinta y ninguna se arregla reintentando:
| Code | Qué pasó | Cómo se corrige |
|---|---|---|
API_FEATURE_DISABLED | La cuenta no tiene la API habilitada en su plan | Pedir la habilitación a soporte o al proveedor |
API_ALCANCE_INSUFICIENTE | La credencial no tiene el alcance de la operación (va en error.requerido) | Editar la credencial en Integraciones → API |
API_ALCANCE_NO_DISPONIBLE | La credencial tiene el alcance pero la cuenta no lo admite: sin cobros habilitados (pagos:*), sin facturación (cfe:*) o no es cuenta proveedora (webhooks:gestionar). Va en error.details | Pedir la habilitación a soporte o al proveedor |
API_ACCESS_BRANCH_MISMATCH | x-branch-id distinto de la sucursal fijada en la credencial | Quitar la cabecera o usar otra credencial |
API_CUENTA_FUERA_DE_CARTERA | x-cuenta-id apunta a una cuenta que no es de la cartera | Revisar el UUID de la subcuenta |
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Falta el alcance
{ "error": { "code": "API_ALCANCE_INSUFICIENTE", "message": "La credencial de API no tiene ninguno de los alcances necesarios para esta operación (pagos:cobrar)", "requerido": [ "pagos:cobrar" ] }, "requestId": "3f6b1c2e-9a4d-4f80-bc11-7e2d5a8f0c31"}La cuenta no admite el alcance
{ "error": { "code": "API_ALCANCE_NO_DISPONIBLE", "message": "Disponible sólo para cuentas proveedoras. La credencial tiene el permiso, pero la cuenta no puede usarlo.", "details": { "alcances": [ "webhooks:gestionar" ], "motivo": "SOLO_REVENDEDOR" } }, "requestId": "3f6b1c2e-9a4d-4f80-bc11-7e2d5a8f0c31"}La cuenta no tiene la API habilitada
{ "error": { "code": "API_FEATURE_DISABLED", "message": "El plan de esta cuenta no tiene habilitado el acceso a la API" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Header x-branch-id distinto al fijo del ApiAccess
{ "error": { "code": "API_ACCESS_BRANCH_MISMATCH", "message": "El ApiAccess está fijado a otra sucursal y no coincide con x-branch-id" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}x-cuenta-id fuera de la cartera
{ "error": { "code": "API_CUENTA_FUERA_DE_CARTERA", "message": "La cuenta indicada en 'x-cuenta-id' no pertenece a la cartera de esta credencial" }, "requestId": "3f6b1c2e-9a4d-4f80-bc11-7e2d5a8f0c31"}Recurso referenciado no existe.
CLIENTE_NO_ENCONTRADO—clienteIdno existe en la cuenta.CFE_REFERENCIA_NO_EXISTE—referenciaIdno existe (al emitir una Nota de Crédito o Nota de Débito).
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Cliente referenciado no existe
{ "error": { "code": "CLIENTE_NO_ENCONTRADO", "message": "Cliente no encontrado (uuid)" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Conflicto con el estado actual (certificado o CAE). No consume numeración: corregí la configuración de la empresa y reintentá.
CERTIFICADO_NO_VIGENTE— La empresa no tiene un certificado de facturación electrónica vigente y en uso.NO_CAE_VIGENTE— No hay CAE activo para el tipo solicitado.CAE_RANGE_EXHAUSTED— Se agotó el rango de numeración del CAE.SUCURSAL_INACTIVA— La sucursal resuelta está deshabilitada.
Con Idempotency-Key:
CFE_IDEMPOTENCY_EN_CURSO— la emisión con esa clave todavía está en curso; reintentá con la misma clave.CFE_EMISION_INCIERTA— el envío a DGI de esa clave no se confirmó. No reintentes con otra clave.CFE_IDEMPOTENCY_KEY_CONFLICTO— la clave ya se usó con otro cuerpo u otro endpoint.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
La empresa no tiene certificado de facturación electrónica vigente
{ "error": { "code": "CERTIFICADO_NO_VIGENTE", "message": "No es posible emitir el comprobante: la empresa no tiene un certificado de facturación electrónica vigente." }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}No hay CAE vigente para el tipo solicitado
{ "error": { "code": "NO_CAE_VIGENTE", "message": "No hay CAE vigente para eTck" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Rango de numeración del CAE agotado
{ "error": { "code": "CAE_RANGE_EXHAUSTED", "message": "Se agotó el rango del CAE A para eTck" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Metadatos personalizados inválidos (metadata).
METADATA_INVALIDA— una o más claves no están definidas para la cuenta, o el valor no cumple el tipo/formato configurado. El detalle campo por campo va enerror.details.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Metadatos personalizados inválidos
{ "error": { "code": "METADATA_INVALIDA", "message": "Metadatos inválidos: metodo_pago: valor no permitido; nro_transaccion: requerido", "details": [ "metodo_pago: valor no permitido", "nro_transaccion: requerido" ] }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Rate limit excedido. Esperá los segundos del header Retry-After. La cuota va por credencial: 60 req/min en cuentas estándar, 600 en cuentas proveedor.
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Excediste el rate limit
{ "error": { "code": "API_RATE_LIMITED", "message": "Se superó el límite de requests para esta API key" }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}Headers
Sección titulada «Headers »Ejemplo
42Segundos hasta que se libera la ventana de rate limit
No se pudo registrar la Idempotency-Key (CFE_IDEMPOTENCIA_NO_DISPONIBLE). El comprobante no se emitió. Reintentá con la misma clave (cabecera Retry-After).
object
object
Identificador estable del error en SCREAMING_SNAKE_CASE
Mensaje legible en español. No parsearlo: puede cambiar
object
object
Sólo en 403 API_ALCANCE_INSUFICIENTE: alcances que habilitan la operación
UUID de correlación; mismo valor que el header X-Request-ID
Ejemplos
Almacén de idempotencia no disponible
{ "error": { "code": "CFE_IDEMPOTENCIA_NO_DISPONIBLE", "message": "No se pudo registrar la Idempotency-Key y el comprobante NO se emitió. Reintentá en unos segundos con la misma clave." }, "requestId": "5b2c7c8a-1f6e-4d29-9a0b-7c3a8d1e2f4c"}