Fixed - API de Integración
Versión 1.0.0. API de Fixed para integradores externos. Autenticación con x-api-key y x-api-secret provistos por Fixed. La empresa se resuelve automáticamente en el servidor; no se envía RUT ni id interno en los requests.
URL de producción: https://southamerica-east1-fixedproduccion-fiv2q.cloudfunctions.net/apiFixed
URL de testing: https://southamerica-east1-fixedtesting-10ce2.cloudfunctions.net/apiFixed
Autenticación
x-api-key (header)x-api-secret (header)
Endpoints
POST /ventaCrear
Ventas
Emite un Comprobante Fiscal Electrónico (CFE). En Swagger: Try it out → elegí un ejemplo del dropdown → editá los campos → Execute.
La respuesta incluye tres opciones para imprimir o mostrar el comprobante:
urlA4: comprobante A4 en PDF.urlTicket: ticket térmico en PDF (formato estrecho).htmlTicket: ticket en HTML (útil para preview o impresión web).
Identificación del cliente
Cómo identifica Fixed a un cliente ya existente (para actualizarlo) en vez de crear uno nuevo, dentro de la misma empresa y mismo tipoDocumento:
- Si documento no viene vacío: busca por documento. Si encuentra, actualiza ese cliente. Si no encuentra ningún cliente con ese documento, busca por mailEnvioFactura (ver punto 2); si tampoco encuentra por mail, crea un cliente nuevo con ese documento.
- Si documento viene vacío pero mailEnvioFactura no: busca por mailEnvioFactura (sin distinguir mayúsculas/minúsculas ni espacios). Si encuentra, actualiza ese cliente. Si no encuentra, crea uno nuevo.
- Si tanto documento como mailEnvioFactura vienen vacíos: siempre crea un cliente nuevo.
Esto permite, por ejemplo, facturar a nombre de clientes de e-commerce que en un primer pedido no informan documento (solo mail), y que si en un pedido posterior sí lo informan, Fixed complete el documento en la misma ficha de cliente en vez de duplicarla.
Límites de caracteres
Estos campos tienen un largo máximo; si se supera, la request se rechaza con un error (no se trunca en silencio):
cliente.razonSocial: 150 caracteres (E18).cliente.nombreComercial: 150 caracteres (E18).lineasVenta[].descripcion: 80 caracteres (E24).lineasVenta[].descripcionLarga: 500 caracteres (E24).
Reintentos seguros (idempotencia)
Si no recibiste la respuesta de un llamado anterior (por ejemplo por un corte de red) y no sabés si la venta se llegó a emitir, no reintentes a ciegas: mandá el campo idempotencyKey la primera vez que intentás emitir esa venta, y reusá exactamente el mismo valor, con exactamente los mismos datos, para reintentar esa misma venta. Fixed te devuelve la misma respuesta de la primera vez (sea éxito o error) en vez de reprocesar.
Una idempotencyKey queda asociada para siempre a los datos de esa venta puntual: no se puede reusar para una venta distinta, ni para reintentar la misma venta con datos corregidos. Si mandás la misma idempotencyKey con datos diferentes a los originales, Fixed devuelve el error E23. Para emitir una venta distinta, o la misma venta con datos corregidos, generá una idempotencyKey nueva.
Cómo generar la idempotencyKey: tiene que identificar el intento de emisión en sí, nunca derivarse del contenido de la venta. Si la generás a partir de los datos de la venta (por ejemplo un hash de sus campos), dos ventas distintas que coincidan en todos sus datos (mismo cliente, mismo importe, etc.) van a chocar contra la misma key, y la segunda no se va a emitir: va a recibir de vuelta el resultado de la primera.
- Recomendado: un UUID v4 generado justo antes de intentar emitir esa venta puntual.
- También válido: tu propio ID de pedido/orden interno, si ya tenés uno único por venta.
idempotencyKey es opcional: si no lo mandás, el comportamiento es el de siempre, sin protección contra reintentos duplicados.
Body
IAPIFixedVentaCrearEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
cliente | IAPIFixedCliente | sí | | |
fecha | string | sí | Fecha del comprobante en formato dd/mm/aaaa. | 23/06/2026 |
moneda | string | sí | Código ISO de la moneda del comprobante (UYU, USD, EUR, etc.). | UYU |
montoBruto | 0 | 1 | sí | 0=precios sin IVA (neto), 1=precios con IVA incluido. | 1 |
lineasVenta | IAPIFixedVentaLineaCrearEntrada[] | sí | Líneas del comprobante (al menos una). | |
observaciones | string | sí | Observaciones del comprobante. | |
totalAPagar | number (double) | sí | Total a pagar calculado por el integrador; debe coincidir con el calculado por Fixed. | 120 |
redondear | boolean | sí | Si se aplica redondeo al total. | false |
local | string | | Id de local (opcional). Consultar /localesListado. | |
formaDePago | "contado" | "credito" | | Forma de pago (opcional, default "contado"). | contado |
cotizacion | number (double) | | Cotización del dólar a usar cuando moneda es "USD" (opcional). Si no se envía, se usa la cotización BCU vigente de la empresa. Se ignora si moneda es "UYU". | |
idempotencyKey | string | | Clave de idempotencia (opcional). Si reintentás un llamado a /ventaCrear (por ejemplo porque no recibiste la respuesta anterior por un corte de red) usando la misma idempotencyKey y exactamente los mismos datos, Fixed devuelve el mismo resultado de la primera vez (éxito o error) en vez de reprocesar. Reusarla con datos distintos devuelve el error E23. Ver sección "Reintentos seguros (idempotencia)" en la descripción de POST /ventaCrear, especialmente cómo generar este valor correctamente. | a1b2c3d4-e5f6-4a1b-9c2d-1234567890ab |
No se aceptan campos adicionales.
IAPIFixedCliente
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
tipoDocumento | number (double) | sí | Tipo de documento: 2=RUT, 3=CI, 4=Otros, 5=Pasaporte, 6=DNI, 7=NIFE. | 2 |
documento | string | sí | Número de documento (RUT, CI, etc.). Obligatorio para tipoDocumento 2 (RUT); opcional para el resto. Ver sección "Identificación del cliente" en la descripción de POST /ventaCrear. | 219314970014 |
pais | string | | Código ISO de país (2 letras). Obligatorio para tipoDocumento 4 (Otros), 5 (Pasaporte), 6 (DNI) y 7 (NIFE). Para tipoDocumento 6 (DNI) solo se admite AR, BR, CL o PY. | AR |
razonSocial | string | sí | Razón social del cliente. | Panadería El Buen Pan S.A. |
nombreComercial | string | sí | Nombre comercial. | El Buen Pan |
domicilio | string | sí | Domicilio fiscal. | Av. Italia 1234 |
localidad | string | sí | Localidad. | Montevideo |
departamento | string | sí | Departamento. | Montevideo |
domicilioEntrega | string | sí | Domicilio de entrega. | Av. Italia 1234 |
mailEnvioFactura | string | sí | Email para envío de factura. Si no se envía documento, se usa para identificar al cliente (ver sección "Identificación del cliente" en la descripción de POST /ventaCrear). | facturacion@ejemplo.com |
telefono | string | sí | Teléfono de contacto. | 099123456 |
observaciones | string | sí | Observaciones del cliente. | |
No se aceptan campos adicionales.
IAPIFixedVentaLineaCrearEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
cantidad | number (double) | sí | Cantidad de unidades vendidas. | 1 |
descripcion | string | sí | Nombre corto del ítem en el comprobante. | Pan francés |
descripcionLarga | string | sí | Detalle adicional de la línea. | Pan francés artesanal |
rubro | string | sí | Nombre o id del rubro de servicios; se crea si no existe. | Panadería |
tasaIva | CfeDgiTasaIva | sí | Valor cfeDgi de la tasa de IVA configurada en Fixed. Debe ser exactamente uno de los valores del enum CfeDgiTasaIva. | Basic |
descuentoMonto | number (double) | sí | Monto de descuento en la línea (no porcentaje). | 0 |
precioUnitario | number (double) | sí | Precio unitario según montoBruto. | 120 |
codigo | string | | Código del ítem (opcional), por ejemplo código de barras o código interno. Se guarda bajo el primer tipo de código que la empresa tenga configurado para impresión en Fixed (o "Código" si no tiene ninguno configurado), y así viaja en el comprobante fiscal igual que si se hubiera cargado a mano. | 7791234567890 |
No se aceptan campos adicionales.
CfeDgiTasaIva
Valor del campo cfeDgi de la tasa de IVA configurada en Fixed.
Debe coincidir exactamente con uno de estos valores (sensible a mayúsculas):
- Basic: Tasa básica (22%)
- Min: Tasa mínima (10%)
- Exe: Exento de IVA
- Exp: Exportación
- Otro: Otras tasas
- NoFac: No facturable
- Suspenso: Suspenso
- Percibido: Percibido
- literalE: Literal E
Valores: "Basic", "Exp", "Min", "Exe", "Otro", "NoFac", "Suspenso", "Percibido", "literalE", ""
Ejemplos
Venta a consumidor final
Sin cliente identificado. Una línea en UYU con IVA incluido en precio.
{
"cliente": null,
"fecha": "23/06/2026",
"moneda": "UYU",
"montoBruto": 1,
"lineasVenta": [
{
"cantidad": 1,
"descripcion": "Pan francés",
"descripcionLarga": "Pan francés artesanal",
"rubro": "Panadería",
"tasaIva": "Basic",
"descuentoMonto": 0,
"precioUnitario": 120
}
],
"observaciones": "",
"totalAPagar": 120,
"redondear": false
}
Venta con múltiples líneas
Caso típico en POS/e-commerce: varias líneas con distintos rubros y tasas de IVA. Ajustá tasaIva según lo configurado en Fixed (Basic=22%, Min=10%, Exe=0%).
{
"cliente": null,
"fecha": "23/06/2026",
"moneda": "UYU",
"montoBruto": 1,
"lineasVenta": [
{
"cantidad": 2,
"descripcion": "Pan francés",
"descripcionLarga": "Pan francés artesanal",
"rubro": "Panadería",
"tasaIva": "Basic",
"descuentoMonto": 0,
"precioUnitario": 120
},
{
"cantidad": 1,
"descripcion": "Leche entera",
"descripcionLarga": "Leche entera 1 litro",
"rubro": "Lácteos",
"tasaIva": "Min",
"descuentoMonto": 0,
"precioUnitario": 55
},
{
"cantidad": 3,
"descripcion": "Bolsa reciclable",
"descripcionLarga": "Bolsa biodegradable",
"rubro": "Accesorios",
"tasaIva": "Exe",
"descuentoMonto": 0,
"precioUnitario": 10
}
],
"observaciones": "",
"totalAPagar": 325,
"redondear": false
}
Venta con cliente identificado
Cliente con RUT. Si ya existe, se actualizan sus datos.
{
"cliente": {
"tipoDocumento": 2,
"documento": "219314970014",
"razonSocial": "Panadería El Buen Pan S.A.",
"nombreComercial": "El Buen Pan",
"domicilio": "Av. Italia 1234",
"localidad": "Montevideo",
"departamento": "Montevideo",
"domicilioEntrega": "Av. Italia 1234",
"mailEnvioFactura": "facturacion@ejemplo.com",
"telefono": "099123456",
"observaciones": ""
},
"fecha": "23/06/2026",
"moneda": "UYU",
"montoBruto": 1,
"lineasVenta": [
{
"cantidad": 2,
"descripcion": "Docena de medialunas",
"descripcionLarga": "Medialunas de manteca",
"rubro": "Panadería",
"tasaIva": "Basic",
"descuentoMonto": 0,
"precioUnitario": 450
}
],
"observaciones": "Pedido mostrador",
"totalAPagar": 900,
"redondear": false,
"local": ""
}
Venta en dólares
Comprobante en USD. Verificar cotización vigente de la empresa.
{
"cliente": null,
"fecha": "23/06/2026",
"moneda": "USD",
"montoBruto": 1,
"lineasVenta": [
{
"cantidad": 1,
"descripcion": "Servicio exportación",
"descripcionLarga": "",
"rubro": "Servicios",
"tasaIva": "Exp",
"descuentoMonto": 0,
"precioUnitario": 50
}
],
"observaciones": "",
"totalAPagar": 50,
"redondear": false
}
Venta a crédito
Igual a una venta simple, pero con formaDePago: "credito" en vez del default "contado".
{
"cliente": null,
"fecha": "23/06/2026",
"moneda": "UYU",
"montoBruto": 1,
"lineasVenta": [
{
"cantidad": 1,
"descripcion": "Pan francés",
"descripcionLarga": "Pan francés artesanal",
"rubro": "Panadería",
"tasaIva": "Basic",
"descuentoMonto": 0,
"precioUnitario": 120
}
],
"observaciones": "",
"totalAPagar": 120,
"redondear": false,
"formaDePago": "credito"
}
Venta con descuento en una línea
descuentoMonto es un importe (no un porcentaje): se resta del precioUnitario x cantidad de esa línea antes de calcular el IVA.
{
"cliente": null,
"fecha": "23/06/2026",
"moneda": "UYU",
"montoBruto": 1,
"lineasVenta": [
{
"cantidad": 2,
"descripcion": "Docena de medialunas",
"descripcionLarga": "Medialunas de manteca",
"rubro": "Panadería",
"tasaIva": "Basic",
"descuentoMonto": 100,
"precioUnitario": 450
}
],
"observaciones": "Descuento por pronto pago",
"totalAPagar": 800,
"redondear": false
}
Respuestas
HTTP 200
CFE emitido. Respuesta incluye urlA4, urlTicket y htmlTicket
IAPIFixedVentaCrearSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
idCFE | string | sí | | |
numero | number (double) | sí | | |
serie | string | sí | | |
tipoCFE | number (double) | string | sí | | |
comprobante | string | sí | | |
urlA4 | string | sí | URL del PDF del comprobante en formato A4. | |
urlVerificarCFE | string | sí | | |
idVenta | string | | | |
urlTicket | string | | URL del ticket térmico en PDF. Formato estrecho para impresoras de ticket. | |
htmlTicket | string | | Ticket en HTML. Útil para preview en pantalla o impresión desde el navegador. | |
pdfBase64 | string | | PDF del comprobante en formato A4, en base64. | |
xml | string | | | |
observaciones | string | | | |
No se aceptan campos adicionales.
HTTP 500
Error de validación o negocio (ver codigoError)
Example 1
{
"descripcion": "Moneda incorrecta",
"codigoError": "E02",
"idCFE": "",
"numero": 0,
"serie": "",
"tipoCFE": "",
"comprobante": "",
"urlA4": "",
"urlVerificarCFE": ""
}
POST /ventaDevolucionTotalCrear
Ventas
Emite una nota de crédito por devolución total de un CFE existente.
Solo se admiten devoluciones totales: no es posible devolver un importe parcial. totalADevolver debe coincidir exactamente con el total de la factura original.
Admite idempotencyKey para reintentos seguros, con el mismo comportamiento que en POST /ventaCrear (ver esa sección para el detalle, incluyendo cómo generar la key correctamente): mismos datos + misma key devuelve el resultado cacheado; datos distintos con la misma key devuelve E23.
Body
IAPIFixedVentaDevolucionTotalEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
idCFE | string | sí | idCFE de la venta original a devolver. | REEMPLAZAR_CON_ID_CFE |
fecha | string | sí | Fecha de la nota de crédito en formato dd/mm/aaaa. | 23/06/2026 |
cotizacion | number (double) | sí | Cotización para USD; 1 usa la cotización original de la venta. | 1 |
ordenCompra | string | sí | Número de orden de compra (opcional). | |
local | string | sí | Id de local; vacío usa el de la venta original. | |
adenda | string | sí | Texto de adenda (opcional). | |
totalADevolver | number (double) | sí | Importe total a devolver; debe coincidir con el total de la factura original. | 120 |
idempotencyKey | string | | Clave de idempotencia (opcional). Si reintentás un llamado a /ventaDevolucionTotalCrear (por ejemplo porque no recibiste la respuesta anterior por un corte de red) usando la misma idempotencyKey y exactamente los mismos datos, Fixed devuelve el mismo resultado de la primera vez (éxito o error) en vez de reprocesar. Reusarla con datos distintos devuelve el error E23. Ver sección "Reintentos seguros (idempotencia)" en la descripción de POST /ventaCrear, especialmente cómo generar este valor correctamente. | a1b2c3d4-e5f6-4a1b-9c2d-1234567890ab |
No se aceptan campos adicionales.
Ejemplos
Devolución total de un CFE
Reemplazá idCFE y totalADevolver con los de la venta original.
{
"idCFE": "REEMPLAZAR_CON_ID_CFE",
"fecha": "23/06/2026",
"cotizacion": 1,
"ordenCompra": "",
"local": "",
"adenda": "",
"totalADevolver": 120
}
Devolución de una venta en USD
cotizacion: 1 usa la cotización original de la venta (recomendado). Solo poné otro valor si necesitás forzar una cotización distinta.
{
"idCFE": "REEMPLAZAR_CON_ID_CFE",
"fecha": "23/06/2026",
"cotizacion": 1,
"ordenCompra": "",
"local": "",
"adenda": "",
"totalADevolver": 50
}
Respuestas
HTTP 200
Nota de crédito emitida correctamente
IAPIFixedVentaDevolucionTotalCrearSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
idCFE | string | sí | | |
numero | number (double) | sí | | |
serie | string | sí | | |
tipoCFE | number (double) | string | sí | | |
comprobante | string | sí | | |
urlA4 | string | sí | URL del PDF del comprobante en formato A4. | |
urlVerificarCFE | string | sí | | |
idVenta | string | | | |
htmlTicket | string | | | |
pdfBase64 | string | | PDF del comprobante en formato A4, en base64. | |
xml | string | | | |
observaciones | string | | | |
No se aceptan campos adicionales.
HTTP 500
Error de validación o negocio
Example 1
{
"descripcion": "Moneda incorrecta",
"codigoError": "E02",
"idCFE": "",
"numero": 0,
"serie": "",
"tipoCFE": "",
"comprobante": "",
"urlA4": "",
"urlVerificarCFE": ""
}
POST /ventaConsulta
Ventas
Consulta el estado y datos de un CFE emitido previamente.
Body
IAPIFixedVentaConsultaEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
idCFE | string | sí | Identificador del CFE devuelto por /ventaCrear. | REEMPLAZAR_CON_ID_CFE |
No se aceptan campos adicionales.
Ejemplos
Consultar estado de un CFE
{
"idCFE": "REEMPLAZAR_CON_ID_CFE"
}
Respuestas
HTTP 200
Datos del CFE
IAPIFixedVentaConsultaSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
idCFE | string | sí | | |
numero | number (double) | sí | | |
serie | string | sí | | |
tipoCFE | number (double) | string | sí | | |
comprobante | string | sí | | |
urlA4 | string | sí | URL del PDF del comprobante en formato A4. | |
urlVerificarCFE | string | sí | | |
estadoDGI | string | | | |
motivoRechazoDGI | string | | | |
No se aceptan campos adicionales.
HTTP 500
CFE no encontrado u otro error
Example 1
{
"descripcion": "El idCFE no existe para la empresa",
"codigoError": "C08",
"idCFE": "",
"estadoDGI": "",
"motivoRechazoDGI": "",
"numero": 0,
"serie": "",
"tipoCFE": "",
"comprobante": "",
"urlA4": "",
"urlVerificarCFE": ""
}
POST /consultaFacturacionDia
Ventas
Lista los comprobantes emitidos en una fecha.
Body
IAPIFixedConsultaFacturacionDiaEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
fecha | string | sí | Fecha a consultar en formato dd/mm/aaaa. | 23/06/2026 |
No se aceptan campos adicionales.
Ejemplos
Comprobantes de un día
{
"fecha": "23/06/2026"
}
Respuestas
HTTP 200
Listado de comprobantes del día
IAPIFixedConsultaFacturacionDiaSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
comprobantes | ConsultaFacturacion[] | sí | | |
No se aceptan campos adicionales.
ConsultaFacturacion
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
formaDePago | "contado" | "credito" | sí | | |
fechaComprobante | string | sí | | |
fechaCreacion | string | sí | | |
comprobante | string | sí | | |
documenoCliente | string | sí | | |
nombreCliente | string | sí | | |
idCFE | string | sí | | |
tipoCFE | number (double) | sí | | |
serie | string | sí | | |
numero | number (double) | sí | | |
importe | number (double) | sí | | |
moneda | "UYU" | "USD" | sí | | |
cotizacion | number (double) | sí | | |
tipo | "venta" | "devolucion" | sí | | |
creadaDesde | "web" | "FixedTesting" | "Fixed_API" | "Otro" | sí | | |
motivoRechazoDGI | string | sí | | |
estadoDGI | "aceptado" | "rechazado" | "sinrespuesta" | sí | | |
No se aceptan campos adicionales.
HTTP 500
Error de validación
Example 1
{
"descripcion": "Formato fecha inválida",
"codigoError": "E08",
"comprobantes": []
}
POST /imprimirCFE
Ventas
Genera o regenera las URLs e HTML de impresión de un CFE emitido. Útil si el CFE ya existe pero se necesita volver a obtener sus URLs de impresión.
La respuesta incluye:
urlA4: comprobante A4 en PDF.urlTicket: ticket térmico en PDF (formato estrecho).htmlTicket: ticket en HTML (útil para preview o impresión web).
Body
Ejemplos
Obtener ticket y PDF de un CFE
Devuelve urlA4, urlTicket (ticket térmico) y htmlTicket para imprimir o mostrar el comprobante.
{
"idCFE": "REEMPLAZAR_CON_ID_CFE"
}
Respuestas
HTTP 200
CFE encontrado. Respuesta incluye urlA4, urlTicket y htmlTicket
IAPIFixedImprimirCFESalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
idCFE | string | sí | | |
numero | number (double) | sí | | |
serie | string | sí | | |
tipoCFE | number (double) | string | sí | | |
comprobante | string | sí | | |
urlA4 | string | sí | URL del PDF del comprobante en formato A4. | |
urlVerificarCFE | string | sí | | |
estadoDGI | string | | | |
motivoRechazoDGI | string | | | |
urlTicket | string | | URL del ticket térmico en PDF. Formato estrecho para impresoras de ticket. | |
htmlTicket | string | | Ticket en HTML. Útil para preview en pantalla o impresión desde el navegador. | |
pdfBase64 | string | | PDF del comprobante en formato A4, en base64. | |
xml | string | | | |
No se aceptan campos adicionales.
HTTP 500
CFE no encontrado u otro error
Example 1
{
"descripcion": "El idCFE no existe para la empresa",
"codigoError": "C08",
"idCFE": "",
"estadoDGI": "",
"motivoRechazoDGI": "",
"numero": 0,
"serie": "",
"tipoCFE": "",
"comprobante": "",
"urlA4": "",
"urlVerificarCFE": ""
}
POST /obtenerProximoNumero
Ventas
Consulta la serie y el próximo número que se usaría al emitir, sin emitir nada. El tipo de comprobante se deriva de tipoDocumento y tipo (venta/devolución): RUT es e-Factura / e-Factura Nota de Crédito, el resto es e-Ticket / e-Ticket Nota de Crédito. No contempla comprobantes de exportación.
Es solo informativo: el número puede cambiar si otro comprobante se emite entre esta consulta y el llamado real a ventaCrear (no reserva el número).
Body
IAPIFixedObtenerProximoNumeroEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
tipoDocumento | number (double) | sí | Tipo de documento del cliente a facturar: 2=RUT, 3=CI, 4=Otros, 5=Pasaporte, 6=DNI, 7=NIFE. Determina, junto con tipo, qué tipo de comprobante (CFE) se va a emitir y por lo tanto a qué CAE consultar: RUT (2) es e-Factura, el resto es e-Ticket. | 2 |
tipo | "venta" | "devolucion" | sí | Si se va a emitir una venta o una devolución (nota de crédito). | venta |
No se aceptan campos adicionales.
Respuestas
HTTP 200
Serie y próximo número a usar
IAPIFixedObtenerProximoNumeroSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
serie | string | sí | Serie del CAE que se va a usar. | A |
numero | number (double) | sí | Próximo número a usar dentro de esa serie. | 1523 |
tcfe | number (double) | sí | Tipo de comprobante consultado. | 111 |
No se aceptan campos adicionales.
HTTP 500
Error de validación o negocio (ver codigoError)
Example 1
{
"descripcion": "No existe un CAE disponible para el tipo de comprobante 111.",
"codigoError": "E02",
"serie": "",
"numero": 0,
"tcfe": 111
}
GET /keepAlive
General
Verifica que la API esté activa. No requiere autenticación ni body.
Respuestas
HTTP 200
API activa
POST /validarCredenciales
General
Verifica que el par x-api-key / x-api-secret sea válido y devuelve los datos no sensibles de la empresa asociada. Recomendado como primer paso al integrar.
Respuestas
HTTP 200
Credenciales válidas
IAPIFixedValidarCredencialesSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
rut | string | sí | RUT de la empresa autenticada. | |
nombreEmpresa | string | sí | Nombre de la empresa autenticada. | |
No se aceptan campos adicionales.
HTTP 401
Credenciales inválidas
Example 1
{
"descripcion": "API key inválida o inactiva",
"codigoError": "A02",
"rut": "",
"nombreEmpresa": ""
}
POST /consultarCFERecibidos
Compras
Consulta los CFEs recibidos (comprobantes de compra) emitidos por otras empresas hacia la empresa, dentro de un rango de fechas, opcionalmente filtrados por el RUT del emisor/proveedor.
fechaDesde y fechaHasta son formato dd/mm/aaaa, inclusive. El rango entre ambos no puede superar los 31 días.
Por default, solo consulta lo que Fixed ya tiene guardado. Con consultarNuevos: true se fuerza además una consulta en vivo a DGI por CFEs nuevos en ese rango (igual que el botón "Consultar en DGI nuevos CFEs recibidos" de la web) — puede demorar bastante más, y depende de que el mail con el comprobante ya le haya llegado a Fixed para poder guardarlo (DGI solo informa metadatos, no el XML). Si esa consulta falla por cualquier motivo, la respuesta igual incluye los datos ya guardados, con una advertencia en descripcion.
Body
IAPIFixedConsultarCFERecibidosEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
rut | string | | RUT del emisor/proveedor a filtrar (opcional). Si no se envía, devuelve todos los CFEs recibidos en el rango de fechas. | 219314970014 |
fechaDesde | string | sí | Fecha desde (inclusive), formato dd/mm/aaaa. El rango entre fechaDesde y fechaHasta no puede superar los 31 días. | 01/06/2026 |
fechaHasta | string | sí | Fecha hasta (inclusive), formato dd/mm/aaaa. El rango entre fechaDesde y fechaHasta no puede superar los 31 días. | 30/06/2026 |
consultarNuevos | boolean | | Si es true, antes de responder Fixed consulta a DGI en vivo por CFEs nuevos en el rango indicado (mismo mecanismo que el botón "Consultar en DGI nuevos CFEs recibidos" de la web). Importante: DGI solo informa metadatos del comprobante, no el XML — un CFE recién reportado por DGI solo se guarda si el mail con el XML adjunto ya le llegó a Fixed. Si ese mail no llegó todavía, no va a aparecer en el resultado por más que se use este parámetro. Puede demorar bastante más que una consulta normal. Si falla (sin firma electrónica vigente, timeout, o error de DGI), igual se devuelven los datos ya guardados en Fixed, con una advertencia en descripcion. Opcional, default false. | false |
No se aceptan campos adicionales.
Respuestas
HTTP 200
Listado de CFEs recibidos en el rango de fechas
IAPIFixedConsultarCFERecibidosSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
cfesRecibidos | IAPIFixedCFERecibido[] | sí | | |
No se aceptan campos adicionales.
IAPIFixedCFERecibido
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
idCFE | string | sí | Id interno del CFE recibido en Fixed. | |
emisorNombre | string | sí | Nombre del emisor/proveedor. | |
rutEmisor | string | sí | RUT del emisor/proveedor. | |
tipo | "compra" | "recibo" | "remito" | "resguardo" | sí | Tipo de documento recibido. | |
tcfe | number (double) | sí | Tipo de CFE (código numérico DGI). | |
numero | number (double) | sí | | |
serie | string | sí | | |
comprobante | string | sí | | |
fechaComprobante | number (double) | sí | Fecha del comprobante, timestamp en milisegundos (epoch). | |
moneda | string | sí | | |
total | number (double) | sí | | |
formaPago | "contado" | "credito" | "" | sí | | |
estado | "aceptado" | "rechazado" | "sinRespuesta" | sí | Estado de la respuesta ante DGI. | |
anulado | boolean | sí | | |
xml | string | sí | XML del comprobante. | |
No se aceptan campos adicionales.
HTTP 500
Error de validación (ver codigoError)
Example 1
{
"descripcion": "El rango entre fechaDesde y fechaHasta no puede superar los 31 días.",
"codigoError": "E02",
"cfesRecibidos": []
}
POST /clienteMostrar
Clientes
Busca un cliente activo por tipo y número de documento.
Body
IAPIFixedClienteMostrarEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
tipoDocumento | number (double) | sí | 2 = RUT, 3 = cédula de identidad. | 3 |
documento | string | sí | Número de documento sin puntos ni guiones. | 12345678 |
No se aceptan campos adicionales.
Ejemplos
Buscar cliente por RUT
{
"tipoDocumento": 2,
"documento": "219314970014"
}
Buscar cliente por cédula
{
"tipoDocumento": 3,
"documento": "12345678"
}
Respuestas
HTTP 200
Cliente encontrado o null si no existe
IAPIFixedClienteMostrarSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
cliente | Cliente | sí | | |
No se aceptan campos adicionales.
Cliente
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
id | string | sí | | |
tipoDocumento | number (double) | sí | | |
documento | string | sí | | |
razonSocial | string | sí | | |
pais | string | sí | | |
nombreComercial | string | sí | | |
direccion | string | sí | | |
latitud | number (double) | sí | | |
longitud | number (double) | sí | | |
localidad | string | sí | | |
departamento | string | sí | | |
direccionEntrega | string | sí | | |
descuento | string | sí | | |
emails | string[] | sí | | |
mailDgi | string | sí | | |
mailCopiaXml | string[] | sí | | |
vendedorId | string | sí | | |
rubroServiciosVentaId | string | sí | | |
listaPrecioServicios | string[] | sí | | |
listaPrecioProductos | string[] | sí | | |
formaDePago | string | sí | | |
activo | boolean | sí | | |
campoExtra | object | sí | | |
saldoCuentas | object | sí | | |
topeCuentas | object | sí | | |
buscablePor | string[] | sí | | |
comentarios | string | sí | | |
claveAnalisisDeuda | string | sí | | |
infoAdicional | string | sí | | |
whatsApp | string | sí | | |
No se aceptan campos adicionales.
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
HTTP 500
Error al buscar cliente
Example 1
{
"descripcion": "No existe cliente con documento y/o tipo documento indicado",
"codigoError": "0",
"cliente": null
}
POST /consultarRUTDGI
Clientes
Consulta los datos de un RUT en DGI (razón social, domicilio fiscal y tipo de contribuyente), útil para prellenar los datos de un cliente antes de emitir un comprobante. Requiere que la empresa cuente con firma electrónica vigente en Fixed.
Límite: 20 consultas por minuto por empresa. Si se supera, responde 429.
Body
IAPIFixedConsultarRUTDGIEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
rut | string | sí | RUT a consultar en DGI. | 219314970014 |
No se aceptan campos adicionales.
Respuestas
HTTP 200
Datos del RUT encontrados en DGI
IAPIFixedConsultarRUTDGISalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
razonSocial | string | sí | Razón social del contribuyente según DGI. | Panadería El Buen Pan S.A. |
domicilioFiscal | string | sí | Domicilio fiscal tal cual lo devuelve DGI (dirección y localidad juntas, sin separar). | Av. Italia 1234 - Montevideo |
tipoContribuyente | string | sí | Tipo de contribuyente según DGI. | IVA MINIMO |
No se aceptan campos adicionales.
HTTP 500
Error al consultar el RUT (ver codigoError)
Example 1
{
"descripcion": "El RUT '219314970014' no fue encontrado en DGI.",
"codigoError": "E03",
"razonSocial": "",
"domicilioFiscal": "",
"tipoContribuyente": ""
}
POST /localesListado
Catálogos
Listado de locales de la empresa. No requiere body.
Respuestas
HTTP 200
Listado de locales de la empresa
IAPIFixedLocalesListadoSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
locales | IAPIFixedLocal[] | | | |
No se aceptan campos adicionales.
IAPIFixedLocal
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
id | string | sí | | |
nombreComercial | string | sí | | |
nombre | string | sí | | |
direccion | string | sí | | |
localidad | string | sí | | |
departamento | string | sí | | |
codigoDgi | number (double) | sí | | |
activo | boolean | sí | | |
No se aceptan campos adicionales.
HTTP 500
Error al obtener catálogo
Example 1
{
"descripcion": "Empresa no encontrada",
"codigoError": "E02"
}
POST /serviciosRubrosListado
Catálogos
Listado de rubros de servicios. No requiere body.
Respuestas
HTTP 200
Listado de rubros de servicios
IAPIFixedServiciosRubrosListadoSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
rubrosServicios | ServiciosRubro[] | | | |
No se aceptan campos adicionales.
ServiciosRubro
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
version | number (double) | sí | | |
id | string | sí | | |
codigo | string | sí | | |
nombre | string | sí | | |
padreId | string | sí | | |
nombreCompleto | string | sí | | |
activo | boolean | sí | | |
esHoja | boolean | sí | | |
ultimaEdicion | number (double) | sí | | |
No se aceptan campos adicionales.
HTTP 500
Error al obtener catálogo
Example 1
{
"descripcion": "Empresa no encontrada",
"codigoError": "E02"
}
POST /consultaCAE
Catálogos
Consulta los CAE (autorizaciones de numeración) de la empresa, con su información completa.
Con soloDisponibles: true devuelve solo los vigentes (disponible == true y no vencidos). Sin ese campo, o en false, devuelve todos los CAE cargados, vencidos o agotados incluidos.
Body
IAPIFixedConsultaCAEEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
soloDisponibles | boolean | | Si es true, devuelve solo los CAE vigentes (disponibles y no vencidos). Si es false o no se envía, devuelve todos los CAE cargados en el sistema. | false |
No se aceptan campos adicionales.
Respuestas
HTTP 200
Listado de CAE
IAPIFixedConsultaCAESalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
caes | IAPIFixedCAE[] | sí | | |
No se aceptan campos adicionales.
IAPIFixedCAE
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
tcfe | number (double) | sí | Tipo de CFE (código numérico DGI). | |
serie | string | sí | | |
desdeNumero | number (double) | sí | | |
hastaNumero | number (double) | sí | | |
numeroAutorizacion | string | sí | | |
fechaAutorizacion | string | sí | Formato dd/mm/aaaa. | |
fechaVencimiento | string | sí | Formato dd/mm/aaaa. | |
caeEspecial | "0" | "1" | "2" | "3" | "4" | sí | 0=ninguno, 1=exonerado, 2=Literal E, 3=Monotributo, 4=Monotributo MIDES. | |
disponible | boolean | sí | | |
ultimoUsado | number (double) | sí | | |
numerosDisponibles | number (double) | sí | Cantidad de números todavía disponibles en este CAE. | |
xml | string | sí | XML de autorización del CAE emitido por DGI. | |
No se aceptan campos adicionales.
HTTP 500
Error de validación
Example 1
{
"descripcion": "Empresa no encontrada",
"codigoError": "E01",
"caes": []
}
POST /serviciosRubrosAgregarEditar
Catálogos
Crea o edita un rubro de servicios.
Body
IAPIFixedServiciosRubrosAgregarEditarEntrada
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
rubro | ServiciosRubro | sí | Rubro a crear o modificar. | |
accion | "agregar" | "editar" | sí | "agregar" crea un rubro nuevo; "editar" actualiza uno existente. | agregar |
No se aceptan campos adicionales.
Ejemplos
Agregar rubro de servicios
{
"accion": "agregar",
"rubro": {
"version": 1,
"id": "",
"codigo": "PAN",
"nombre": "Panadería",
"padreId": null,
"nombreCompleto": "Panadería",
"activo": true,
"esHoja": true,
"ultimaEdicion": 0
}
}
Editar rubro existente
Usá el id del rubro obtenido desde /serviciosRubrosListado.
{
"accion": "editar",
"rubro": {
"version": 1,
"id": "REEMPLAZAR_CON_ID_RUBRO",
"codigo": "PAN",
"nombre": "Panadería y confitería",
"padreId": null,
"nombreCompleto": "Panadería y confitería",
"activo": true,
"esHoja": true,
"ultimaEdicion": 0
}
}
Respuestas
HTTP 200
Rubro creado o editado correctamente
IAPIFixedServiciosRubrosAgregarEditarSalida
| Campo | Tipo | Requerido | Descripción | Ejemplo |
|---|
descripcion | string | sí | | |
codigoError | string | sí | | |
rubro | ServiciosRubro | sí | | |
No se aceptan campos adicionales.
HTTP 500
Error de validación
Example 1
{
"descripcion": "Acción no es correcta, debe ser agregar o editar",
"codigoError": "E01",
"rubro": null
}