Facturación por API
Integrá la facturación electrónica de Uruguay con la API incluida en Bigu: emisión, consulta, reintentos y cupo de la tarifa profesional.
Con Bigu Facturas, conectá tu ERP o tienda sin registrar cada venta en la interfaz de Bigu.
El alta del negocio, certificado, numeración y habilitación fiscal se completan
una vez en Tu negocio › Facturación. El consumo diario puede ser sólo por API.
En Facturas, las emisiones API quedan en el registro fiscal del servicio sin crear ventas, caja ni stock; el ERP conserva el registro comercial. En Integra, cada e-Ticket o e-Factura pedido por API crea su venta en Bigu y emite desde ella. La respuesta conserva el estado fiscal, CAE, serie, número y archivos, y suma sale_id para consultar la venta.
| Etapa | Operaciones | Resultado que tenés que comprobar |
|---|---|---|
| Conectar | Clave con permisos y consulta de capacidades | El negocio y el alcance son los correctos |
| Preparar sin emitir | Guardar y validar un borrador | Receptor, bases, IVA y total revisados |
| Emitir | Enviar una identidad estable con contenido definitivo | Pedido registrado; 202 todavía no es aceptación |
| Seguir y entregar | Consultar el estado, descargar y enviar | Aceptación fiscal y entrega verificadas por separado |
Si buscás el recorrido de pantalla, seguí Preparar, revisar y emitir un comprobante. Esta referencia describe la integración para quienes desarrollan el sistema que llama a Bigu.
Primeros pasos
1. Creá la clave
Abrí Tu negocio › Facturación. En la tarjeta Conectá tu sistema, elegí la fila API de facturación para abrir su modal. Quien administra la facturación del negocio puede crear la clave con el permiso Administrar facturación electrónica (fiscal.manage): no depende sólo de ser propietario.
Escribí el Nombre de la integración, dejá Consultar comprobantes y archivos marcado y marcá Emitir comprobantes. Si querés probar sin emitir, marcá también Preparar borradores, clientes y conceptos. Después elegí Crear clave. Al crearla, Bigu muestra la clave una sola vez y el aviso Guardá esta clave en tu servidor. Se muestra una sola vez. Guardala antes de cerrar con Ya la guardé.
Configurá BIGU_API_KEY como variable de entorno del servidor de tu integración. Los comandos siguientes leen esa variable; no escribas la clave en el comando, en el navegador ni en el repositorio.
2. Emití un comprobante
Antes de enviar, completá el alta fiscal y reemplazá la fecha, el receptor, los conceptos y los importes del ejemplo por los del comprobante real. Cada emisión se transmite a DGI. Elegí un external_id por comprobante y conservá el mismo pedido para recuperarlo.
Este pedido emite un comprobante real en producción. Consume numeración y cupo. Para anular el comprobante emitido, tenés que emitir una nota de crédito, que también consume numeración y cupo.
Como primera prueba segura, guardá un borrador con POST /api/v1/fiscal/borradores y validá su revisión con POST /api/v1/fiscal/borradores/validar. Ambas operaciones requieren fiscal:prepare; no emiten, no reservan numeración ni consumen cupo. Seguí Borradores y revisión fiscal para preparar el UUID, el documento y la revisión.
: "${BIGU_API_KEY:?Configurá BIGU_API_KEY en tu servidor}"
curl --include --request POST 'https://bigu.ai/api/v1/facturas' \
--header "Authorization: Bearer $BIGU_API_KEY" \
--header 'Content-Type: application/json' \
--data-binary @- <<'JSON'
{
"external_id": "venta-2026-001",
"tipo_cfe": 111,
"fecha": "2026-10-06",
"contado": true,
"moneda": "UYU",
"receptor": {
"tipo_documento": 2,
"documento": "214844360018",
"razon_social": "Receptor de ejemplo",
"direccion": "Domicilio del receptor",
"ciudad": "Montevideo"
},
"lineas": [
{
"nombre": "Servicio",
"cantidad": 1,
"unidad_medida": "un",
"precio_unitario": 100000,
"categoria_iva": "tasa_basica"
}
]
}
JSONLa respuesta de ejemplo es HTTP 202. Confirma que se encoló el pedido; todavía no significa aceptación de DGI. nueva distingue un envío nuevo de un reintento.
{
"external_id": "venta-2026-001",
"estado": "pendiente",
"nueva": true
}3. Consultá el estado
Usá el mismo identificador y la misma clave para consultar:
curl --include 'https://bigu.ai/api/v1/facturas/venta-2026-001' \
--header "Authorization: Bearer $BIGU_API_KEY"Esta es una respuesta de ejemplo HTTP 200 cuando DGI ya aceptó el comprobante. serie y numero los asigna el motor fiscal; no los elegís al emitir. Una consulta devuelve nueva: false.
{
"external_id": "venta-2026-001",
"estado": "aceptada",
"nueva": false,
"serie": "A",
"numero": 123
}Mientras esté pendiente, firmada o enviada, consultá cada cinco segundos y después con espera creciente. Revisá motivo cuando haya observaciones o un rechazo; un estado en_duda requiere conciliación antes de repetir o entregar el comprobante.
Planes y límites
La API está incluida junto con la web en Bigu Facturas, sin un adicional por usar ambos canales. La oferta estándar no tiene límite de comprobantes; la tarifa profesional incluye hasta cinco por mes calendario, compartidos con la web, el asistente y las tareas programadas. Consultá las condiciones y precios vigentes.
En Integra, cada nuevo e-Ticket o e-Factura pedido por API genera una venta y se emite desde ella, también si sólo incluye servicios. La emisión y su consulta devuelven además sale_id: abrí esa venta en Bigu para consultar su cuenta, cobros y comprobante. El mismo external_id conserva una sola venta y un solo comprobante, incluso si DGI falla o rechaza el envío. En Factura, siguen siendo comprobantes sueltos.
Con contado: true, la venta cobra sólo en UYU, con el medio de pago y la caja o cuenta por defecto de Nueva venta, si ese medio está habilitado. Si no puede registrar el cobro —otra moneda, efectivo con la caja sin su primera apertura o un cheque sin sus datos— queda a cobrar. Con contado: false, queda a cobrar en la cuenta del cliente. Si no hay cobro y falta el receptor, responde 409 sale_credit_customer_required sin guardar la venta ni el comprobante. Un e-Ticket sin receptor se admite cuando queda totalmente cobrado.
El receptor se busca por RUT o CI; si no existe, se crea. Si su nombre ya corresponde a otro cliente sin teléfono, se distingue con el documento, por ejemplo María Rodríguez · CI 12345678. Si ese nombre completo también está ocupado, devuelve 409 customer_name_already_exists: revisá la ficha existente.
Las notas de crédito y débito por API quedan como comprobantes sueltos en Integra, incluidos los originales históricos y las facturas externas. Si referencias[0] apunta a un comprobante que tiene venta, devuelve 409 sale_required: corregí desde esa venta para mantener sus saldos y stock. Al anular un comprobante suelto histórico, su nota conserva la sucursal fiscal del original. Las facturas programadas requieren receptor y generan una venta por fecha, sin registrar un cobro.
Si efactura falla después de guardar la venta, la emisión responde 503, con retryable: true, el código del servicio y sale_id. La venta y su posible cobro ya existen: reintentá con el mismo external_id y contenido. Cambiar la identidad puede duplicar la operación. Si falta numeración, resolvé el CAE antes de reintentar. El GET de un CFE todavía sin transmitir responde 200 desde el espejo, con estado: pendiente, sale_id y el motivo; ese estado no confirma que efactura lo haya recibido.
El reintento sólo transmite un comprobante en borrador cuya venta sigue confirmada; los otros estados se devuelven desde el espejo. Si anulaste la venta, responde 409 venta_anulada, con sale_id y retryable: false, sin llamar a efactura. Consultá la venta de origen: cargar un CAE o recuperar el servicio no habilita su emisión.
fecha define la fecha del CFE y el cálculo de los plazos. La venta y el cobro se registran con la hora real; una fecha fiscal de ayer no modifica la caja de ayer.
En otra moneda, el comprobante conserva su moneda y cotización y la venta registra sus importes en UYU. Las correcciones parciales y los comprobantes fiscales de cobranza sobre esas facturas todavía no están disponibles; los cobros comerciales siguen registrándose en la venta.
Cupo de la tarifa profesional
409 fiscal_monthly_limit_reached indica que el negocio alcanzó los cinco comprobantes del mes calendario en su zona horaria. El sexto envío nuevo queda bloqueado antes de transmitir y no cambia la tarifa ni genera un cobro. La persona dueña puede revisar el uso en Ventas y confirmar el cambio a Facturas sin límite desde Suscripción.
El cupo incluye notas de crédito y débito y se comparte entre todos los canales. Los borradores y las vistas previas no consumen cupo; los envíos pendientes reservan su lugar. Un reintento con el mismo identificador y contenido conserva su lugar original. Este cupo comercial es distinto del límite técnico de solicitudes por minuto: una consulta de estado no consume un comprobante.
Acceso
El endpoint de emisión es https://bigu.ai/api/v1/facturas. Consultá el OpenAPI para ver todos los campos y operaciones. El acceso al endpoint no reemplaza el alta fiscal ni los permisos de emisión del negocio.
Abrí Tu negocio › Facturación. En la tarjeta Conectá tu sistema, elegí la fila API de facturación para abrir su modal. Quien administra la facturación del negocio crea la clave allí. La clave se muestra
una vez, se almacena como hash y vence a los 90 días. Se envía únicamente
como Authorization: Bearer $BIGU_API_KEY. No la incluyas en URLs, código del navegador
ni repositorios. Creá una segunda clave antes de revocar la anterior para rotar
sin interrupciones.
Cada clave accede sólo a su negocio; no se admite business_id en el cuerpo.
Límite: 120 solicitudes/minuto por clave, compartido por todas las réplicas.
Un 429 incluye Retry-After. Las respuestas no se cachean.
Elegí los permisos de la clave
En el modal API de facturación, que abrís desde la tarjeta Conectá tu sistema, escribí el Nombre de la integración y revisá Permisos de esta conexión antes de elegir Crear clave. Una clave nueva empieza con consulta: para emitir, también tenés que marcar Emitir comprobantes. Guardá la clave en tu servidor antes de cerrar el aviso con Ya la guardé.
| Permiso | Para qué lo necesita la integración |
|---|---|
fiscal:read | Consultar comprobantes, estados y archivos |
fiscal:prepare | Preparar borradores, clientes y conceptos |
fiscal:issue | Emitir comprobantes |
fiscal:deliver | Enviar comprobantes por correo |
fiscal:payments | Registrar cobros ya recibidos |
fiscal:rules | Programar emisión y entrega automáticas |
Elegí los permisos que requiere esa integración. Si recibís 403 insufficient_scope, revisá qué operación está intentando; no se corrige repitiendo la misma solicitud. Creá una clave con el alcance necesario, actualizá la integración y después revocá la anterior.
Revocar o rotar una clave
En el modal API de facturación, que abrís desde la tarjeta Conectá tu sistema, localizá la integración por su nombre, prefijo y vencimiento. Elegí Revocar para quitarle acceso y comprobá Clave revocada. Esa integración ya no puede acceder. No es necesario esperar a que venza: las solicitudes siguientes dejan de estar autorizadas.
Para rotar sin interrumpir tu sistema, creá otra clave con sus permisos, guardala donde corre la integración, comprobá la conexión y recién después revocá la anterior. Una clave guardada no vuelve a mostrarse; si perdiste el secreto, necesitás crear otra. Quien administra la facturación puede revocar la clave incluso cuando se restringe el acceso operativo del negocio.
Emitir
Los importes son enteros en centésimos y los precios incluyen IVA: 100000 = $1.000, salvo con precios_sin_iva (más abajo).
Las cantidades admiten hasta tres decimales. Máximo 200 líneas y 256 KiB por solicitud.
Tipos: 101 e-Ticket; 111 e-Factura; 102/112 notas de crédito; 103/113 notas de débito.
En e-Factura y sus notas son obligatorios el RUT, razón social, dirección y ciudad del receptor.
Las notas usan una referencia con tipo_cfe, serie, numero, fecha y razon del original. El original debe estar aceptado en este negocio y tener la misma moneda y familia. El crédito acumulado, incluidas notas pendientes, no puede superar su importe. Las referencias globales no están disponibles en esta API.
El motor valida las reglas fiscales; la API no permite elegir serie, número ni firma.
Categorías IVA: tasa_basica, tasa_minima, exento, no_facturable, exportacion.
Monedas: UYU, USD, EUR, ARS, BRL. Fuera de UYU enviá tipo_cambio como string decimal (por ejemplo "40.500"), la cotización fiscal en pesos por unidad, con hasta tres decimales. Consultá el esquema OpenAPI para los campos opcionales.
Código del catálogo y sucursal opcionales
El contrato OpenAPI 1.5.0, bajo las mismas rutas /api/v1, conserva estos campos opcionales y agrega sale_id a los errores de transmisión de una venta registrada:
| Campo | Uso |
|---|---|
lineas[].codigo | En Integra, código exacto del catálogo del negocio: SKU o código de barras para un producto, UUID para un servicio. Cuando coincide, el nombre sale del catálogo aunque envíes otro nombre. Los productos usan su unidad del catálogo; los servicios conservan la unidad_medida pedida, por ejemplo 1,5 hora. categoria_iva tiene que coincidir con el ítem: si difiere, responde 409 catalog_tax_mismatch con la tasa del catálogo, sin venta ni CFE. Si es producto, mueve stock como Nueva venta. Completá nombre, precio y demás campos requeridos. Sin código, o sin coincidencia, usa la descripción, precio e IVA enviados como concepto y no crea un producto. Los productos de stock requieren cantidad entera; un código ambiguo se rechaza. |
sucursal | UUID de la sucursal activa del negocio, para la venta y la emisión. Sin ella usa la principal. Otra sucursal o una inactiva devuelve 400 invalid_branch. Su código y domicilio fiscal se leen de Bigu; no se envían en el pedido. Una sucursal sin datos de DGI no puede emitir. |
Por ejemplo, podés sumar "codigo": "SKU-001" a una línea y "sucursal": "UUID_DE_TU_SUCURSAL" al documento. Conservá ambos campos al reintentar; cambiar cualquiera con el mismo external_id devuelve 409 idempotency_conflict.
Precios sin IVA
El contrato OpenAPI 1.6.0 agrega precios_sin_iva, opcional. Con "precios_sin_iva": true, precio_unitario y descuento de cada línea van sin IVA y el comprobante suma el IVA de cada tasa, calculado una sola vez sobre la suma de sus líneas y redondeado al centésimo. El comprobante muestra tu precio sin IVA y el IVA aparte. Sin el campo, los precios llevan el IVA adentro, como siempre, aunque en Bigu hayas elegido Mis precios son sin IVA. En Integra, la venta que se registra guarda esos precios sin IVA y su total incluye el IVA sumado. Conservá el campo al reintentar: cambiarlo con el mismo external_id devuelve 409 idempotency_conflict.
Reintentos sin duplicados
Si se pierde la respuesta del pedido venta-2026-001, conservá ese identificador y el mismo contenido. Cambiar a venta-2026-002 sería otro pedido, no la recuperación del primero.
Un pedido de emisión · external_id: venta-2026-001
- Identidad
- venta-2026-001
- Precio con IVA
- 100000 centésimos · $ 1.000 UYU
- Respuesta recibida
- Ninguna: conexión interrumpida
- Identidad
- venta-2026-001, la misma
- Contenido
- El mismo que se envió
- Resultado a consultar
- El estado del pedido original
external_id es obligatorio: 1–80 letras, números, guiones o guiones bajos. Conservá un identificador por comprobante, incluso si rotás la clave. La primera solicitud válida reserva el identificador y congela su contenido. Repetir el mismo pedido devuelve la misma emisión; cambiar el contenido devuelve 409 idempotency_conflict. Si la red falla o devuelve 503, reintentá el MISMO pedido. No generes un external_id nuevo para resolver un timeout: duplicaría la operación. Si corregís datos de un pedido reservado que nunca se emitió, usá una identidad nueva sólo después de conciliar su estado. Una fecha omitida se resuelve cuando el motor acepta el pedido; enviá fecha explícita para preservar la fecha comercial.
Consultar y descargar
202 significa encolado, NO aceptado por DGI. La respuesta contiene external_id,
estado, nueva y, cuando existen, serie, numero y motivo.
En Integra también contiene sale_id, la venta generada por ese pedido.
Consultá GET /api/v1/facturas/EXTERNAL_ID cada 5 segundos y luego con espera creciente.
Estados en curso: pendiente, firmada, enviada.
Otros estados: aceptada, observada, rechazada, invalida, en_duda.
No entregues como aceptado un comprobante pendiente, rechazado o en_duda.
Cobros, saldos, entregas y exportación por esta API admiten sólo el estado aceptada. Un comprobante observada queda fuera de esas operaciones y no cambia esperando: revisá el motivo y conciliá la corrección necesaria. Un estado en_duda requiere conciliación antes de entregar o repetir el envío.
No hay webhooks en v1; la integración consulta el estado.
GET /api/v1/facturas/EXTERNAL_ID/pdf descarga la representación impresa. GET /api/v1/facturas/EXTERNAL_ID/xml descarga los bytes exactos del XML firmado. Ambas rutas exigen la misma autenticación. Antes de firmar devuelven 409. El XML puede descargarse para diagnóstico aunque DGI lo rechace: disponer del archivo no demuestra aceptación. El PDF conserva el logo y presentación del negocio.
Errores
Las respuestas de error usan este formato. Por ejemplo, cambiar el contenido de un pedido reservado devuelve HTTP 409:
{
"ok": false,
"error": {
"code": "idempotency_conflict",
"message": "Ese external_id ya pertenece a otro contenido. Reintentá el pedido original o usá uno nuevo.",
"retryable": false,
"reference": "solicitud-001"
}
}retryable: true indica que podés reintentar la misma solicitud con espera creciente, conservando la identidad y el contenido. Un 429 incluye Retry-After: 60: esperá ese tiempo. retryable: false exige revisar la causa antes de volver a enviar; esperar por sí solo no corrige los datos, el permiso ni el plan. Si estás esperando la firma o aceptación, consultá el estado antes de repetir la operación.
La tabla reúne los códigos de la API y los que conserva del servicio fiscal y de los controles compartidos. El HTTP es el que recibe tu integración; un problema de autorización entre Bigu y el servicio fiscal se informa como 503, aunque tu clave sea válida.
Cuando falla la transmisión de una venta ya guardada, el mismo código fiscal puede llegar con 503, retryable: true y sale_id. Antes de que exista la venta, conserva su HTTP de validación. Guiate por el HTTP y retryable de esa respuesta y recuperá siempre la misma identidad.
Al emitir con POST /api/v1/facturas, un RUT inválido devuelve 400 invalid_request. 422 invalid_customer_rut corresponde a la preparación de clientes o reglas fiscales, no a esa emisión directa.
| Código | HTTP | Qué significa | retryable | Qué hacer |
|---|---|---|---|---|
bad_json | 400 | El cuerpo no es JSON válido. | false | Corregí la sintaxis y enviá Content-Type: application/json. |
invalid_request | 400 | Los campos o sus combinaciones no cumplen el contrato. | false | Revisá el OpenAPI, el RUT y la cotización; no agregues campos fuera del esquema. |
invalid_id | 400 | El external_id de la ruta no es válido. | false | Usá entre 1 y 80 letras, números, guiones o guiones bajos. |
invalid_query | 400 | Los filtros o el límite no son válidos. | false | Revisá fechas, filtros y el límite de la consulta. |
invalid_cursor | 400 | El cursor no se puede interpretar. | false | Usá el next_cursor de la respuesta anterior y conservá los filtros. |
invalid_draft_request | 400 | El UUID, la revisión o el cuerpo del borrador no son válidos. | false | Revisá id, revision y document; consultá el borrador actual. |
invalid_draft | 400 | El borrador no tiene todos los datos fiscales o una fecha explícita. | false | Completá el documento y fecha antes de validar. |
invalid_customer | 400 | La ficha de cliente asociada no pertenece al negocio o no admite una nueva asociación. | false | Revisá la ficha y elegí un cliente activo del negocio; no modifiques el receptor histórico para resolver la asociación. |
catalog_product_unavailable | 400 | El producto identificado por product:UUID no está disponible en el negocio. | false | Volvé a consultar el catálogo y revisá la línea antes de emitir. |
fiscal_rule_document_unsupported | 400 | La plantilla no es un e-Ticket o una e-Factura sin referencias. | false | Programá un tipo 101 o 111 sin referencias; prepará las notas y correcciones manualmente desde el original. |
rule_currency_unsupported | 400 | La regla usa una moneda que no admite la emisión automática. | false | Usá UYU o USD; prepará las otras monedas por borrador con su cotización. |
rule_exchange_rate_owned | 400 | La regla en USD trae una cotización fija. | false | Omití tipo_cambio; cada ocurrencia obtiene la cotización del BCU. |
rule_date_owned | 400 | La plantilla define identidad, emisión o vencimiento de una ocurrencia. | false | Omití external_id, fecha y fecha_vencimiento dentro de document; usá el calendario de la regla. |
rule_ended | 400 | La fecha final no deja ninguna ocurrencia futura. | false | Revisá las fechas del calendario. |
unauthorized | 401 | La clave no es válida, venció o fue revocada. | false | Revisá la variable de entorno y el encabezado Bearer; creá otra clave si hace falta. |
insufficient_scope | 403 | La clave no tiene el permiso de la operación. | false | Creá una clave con el permiso necesario, actualizá la integración y revocá la anterior. |
rule_owner_required | 403 | No se pudo verificar al autor de la regla con permiso fiscal vigente. | false | Revisá el acceso y el permiso de quien creó la clave o la regla. |
not_found | 404 | El comprobante o borrador no existe en el negocio de la clave. | false | Comprobá el identificador y el negocio; buscá el pedido antes de crear otro. |
delivery_not_found | 404 | No existe esa entrega en el negocio. | false | Consultá con el UUID original de la entrega. |
business_missing | 404 | El negocio no está disponible para preparar la entrega. | false | Revisá el acceso al negocio y contactá a soporte con la referencia. |
rule_not_found | 404 | No existe esa regla fiscal en el negocio. | false | Recuperá la regla por su UUID original. |
sale_required | 409 | La referencia de la nota identifica un comprobante con venta en Integra. | false | Corregí desde la venta de origen. |
service_correction_required | 409 | La nota referencia un comprobante vinculado a una venta o trabajo. | false | Prepará la corrección desde esa venta o trabajo para conservar sus efectos operativos. |
fiscal_correction_origin_unavailable | 409 | No se pudo verificar un único original vigente del mismo negocio y de la familia fiscal correspondiente. | false | Revisá tipo, serie y número; volvé a preparar la nota desde el original. No cambies el identificador para reintentar. |
fiscal_correction_receiver_changed | 409 | El receptor de la nota difiere del receptor guardado en el original. | false | Conservá los datos históricos del receptor; volvé a preparar la nota desde el comprobante original. |
fiscal_correction_branch_changed | 409 | La sucursal elegida difiere de la sucursal fiscal del original. | false | Prepará la nota desde el original para conservar su sucursal fiscal. |
fiscal_correction_customer_changed | 409 | La asociación de cliente de la nota difiere de la del original. | false | Volvé a preparar la nota desde el original; conservá su asociación, incluso cuando no tiene una ficha de cliente. |
sale_credit_customer_required | 409 | Falta receptor para una venta sin cobro o una factura programada integrada. | false | Completá el receptor antes de emitir o activar la regla. |
catalog_tax_mismatch | 409 | El IVA pedido no coincide con el ítem identificado por código. | false | Usá la tasa del catálogo indicada en el mensaje o revisá el ítem antes de facturar. |
invalid_branch | 400 | La sucursal no está activa o no pertenece al negocio de la clave. | false | Usá el UUID de una sucursal activa del negocio u omití el campo para usar la principal. |
sale_customer_archived | 409 | El receptor coincide con un cliente archivado. | false | Reactivalo desde Clientes antes de venderle. |
idempotency_conflict | 409 | El external_id ya está reservado para otro contenido. | false | Consultá el estado y recuperá el pedido original; no cambies la identidad para resolver un timeout. |
emitter_missing | 409 | Falta el emisor fiscal del negocio. | false | Completá el alta en Tu negocio › Facturación. |
fiscal_document_authority_changed | 409 | La identidad o el acceso fiscal actual no coincide con el pedido guardado. | false | Conservá el identificador original y revisá el acceso antes de reintentar. |
fiscal_test_access_inactive, consumidor_no_habilitado | 409 | El acceso delegado de un entorno de prueba está revocado o ya no corresponde a la identidad habilitada. | false | Revisá el acceso de prueba; no cambies el identificador ni vuelvas a crear el pedido. |
fiscal_test_branch_unavailable, consumidor_sucursal_no_permitida | 400 | Un acceso delegado de prueba recibió una sucursal distinta de la casa principal del emisor. | false | Omití la sucursal. Este acceso no permite modificar los locales del emisor. |
fiscal_test_business_required, consumo_solo_prueba | 403 | La solicitud no cumple las restricciones del acceso delegado de prueba. | false | Revisá el entorno y el negocio autorizado. Estos códigos no habilitan una función de producción. |
consumidor_no_existe | 404 | No se pudo verificar la delegación de prueba para ese negocio y emisor. | false | Consultá a soporte con la referencia del error; no uses la identidad de otro negocio. |
draft_revision_conflict | 409 | El borrador cambió, no está validado o ya se envió. | false | Consultá la revisión actual; volvé a validar sólo si corresponde y recuperá el mismo envío si ya comenzó. |
service_payment_required | 409 | El comprobante pertenece a una venta o trabajo cuyos cobros se gestionan desde su operación. | false | Consultá o registrá el cobro desde la venta, el trabajo o A cobrar. |
document_not_accepted | 409 | El estado no es aceptada, el único admitido para cobros, saldos y entregas. | false | Si sigue pendiente, consultá su estado. Si está observada, esperar no lo resuelve: revisá el motivo y conciliá la corrección necesaria. |
payment_idempotency_conflict | 409 | El UUID del pago ya corresponde a otros datos. | false | Recuperá el pago original y conciliá el saldo. |
payment_outside_balance | 409 | El pago usa otra moneda o supera el saldo del comprobante. | false | Corregí moneda e importe después de consultar el saldo. |
delivery_idempotency_conflict | 409 | El UUID de entrega ya corresponde a otro comprobante o destinatario. | false | Consultá la entrega original antes de preparar una distinta. |
rule_idempotency_conflict | 409 | El UUID ya corresponde a otra regla o plantilla. | false | Consultá la regla original antes de autorizar otra. |
fiscal_monthly_limit_reached | 409 | Se agotó el cupo de comprobantes del mes calendario. | false | Revisá el uso y el cambio a Facturas sin límite en Suscripción; los reintentos conservan su lugar. |
body_too_large | 413 | El cuerpo supera el tamaño permitido. | false | Reducí el pedido; la emisión admite hasta 256 KiB y 200 líneas. |
attachments_too_large | 413 | Los adjuntos superan el límite de 12 MiB de entrega por correo. | false | Revisá los archivos y el logo del emisor; contactá a soporte si no podés reducirlos. |
invalid_customer_rut | 422 | El RUT del cliente o de la plantilla de una regla fiscal no es válido. | false | Corregí el RUT y su dígito verificador antes de guardar o autorizar la regla; la emisión directa devuelve 400 invalid_request. |
customer_document_required | 422 | El e-Ticket pasa el tope de DGI para no identificar al cliente: 5.000 UI de neto, con la UI de la fecha del comprobante. | false | Mandá el receptor con la cédula u otro documento que no sea RUT; con RUT corresponde una e-Factura. No se reservó nada. |
receptor_country_required | 422 | El receptor trae un pasaporte, un DNI u otro documento extranjero sin receptor.pais. | false | Mandá receptor.pais con el código del país que emitió el documento: Bigu no usa el país del negocio. No se reservó nada. |
receptor_country_invalid | 422 | El DNI del receptor viene con un país que no emite DNI. | false | Revisá receptor.pais o el tipo de documento. No se reservó nada. |
rate_limited | 429 | La clave superó 120 solicitudes por minuto. | true | Esperá Retry-After y reintentá con la misma identidad y contenido. |
unavailable | 503 | No se pudo completar la solicitud. | true | Consultá el estado y reintentá el mismo pedido con espera creciente. |
email_not_configured | 503 | El servicio de correo no está configurado. | true | Contactá a soporte y conservá el UUID de la entrega para recuperarla. |
fiscal_exchange_rate_unavailable | 503 | No se pudo verificar la cotización del BCU. | true | Reintentá más tarde con el mismo UUID de regla. |
datos_invalidos | 400, 503 | El motor fiscal rechazó los datos del comprobante. | false en 400; true en 503 | Revisá los campos, impuestos, receptor y referencias del pedido. |
no_existe | 404, 503 | El servicio fiscal no encuentra el comprobante. | false en 404; true en 503 | Recuperá el estado del pedido; contactá a soporte si Bigu conserva el registro. |
emisor_no_habilitado, ingreso_no_autorizado, familia_fiscal_no_lista | 409, 503 | Falta habilitación fiscal del emisor o de la familia de comprobantes. | false en 409; true en 503 | Revisá los requisitos pendientes en Tu negocio › Facturación. |
emisor_dado_de_baja | 409, 503 | El emisor está dado de baja. | false en 409; true en 503 | Contactá a soporte para revisar su reactivación. |
cae_tipo_sin_rango | 409, 503 | El tipo de comprobante no tiene un rango CAE. | false en 409; true en 503 | Gestioná y cargá la numeración correspondiente antes de emitir. |
cae_tipo_vencido | 409, 503 | El CAE del tipo de comprobante venció. | false en 409; true en 503 | Cargá un CAE vigente para ese tipo. |
cae_tipo_agotado | 409, 503 | Se agotó el rango CAE del tipo de comprobante. | false en 409; true en 503 | Gestioná un nuevo rango y revisá la numeración. |
cae_tipo_no_disponible | 409, 503 | El rango CAE no está disponible para emitir. | false en 409; true en 503 | Revisá la vigencia y disponibilidad de la numeración. |
referencia_invalida | 409, 503 | La nota no corresponde a un original aceptado o excede su importe disponible. | false en 409; true en 503 | Revisá negocio, moneda, familia, referencia y crédito acumulado del original. |
fecha_regimen_faltante | 409 | Falta la fecha de incorporación o resolución DGI para el PDF. | false | Completá ese dato en la presentación del emisor y volvé a descargar. |
not_signed, todavia_no | 409 | Aún no hay XML firmado o el estado no permite obtener el archivo. | false | Consultá el estado; si fue rechazado o inválido, revisá el motivo. |
sin_numeracion, no_habilitado | 503 | El servicio usa un código fiscal anterior para numeración o habilitación faltante. | true | Resolvé el requisito fiscal y reintentá con el mismo external_id; si trae sale_id, la venta ya está registrada. |
readiness_no_disponible, servicio_caido | 503 | No se pudo consultar o completar una operación del servicio fiscal. | true | Consultá el estado y reintentá la misma solicitud con espera creciente. |
permiso_insuficiente, no_autorizado | 503 | El servicio fiscal rechazó el acceso de Bigu. | true | Contactá a soporte con la referencia; rotar tu clave no corrige esa conexión. |
salesperson_unavailable | 403 | El vendedor elegido no está activo en el equipo del negocio. | false | Elegí una persona activa con vendedor_persona_id. |
customer_archived, customer_not_found | 403 | El cliente está archivado o ya no existe. | false | Revisá su ficha y el UUID antes de actualizarlo. |
customer_phone_already_exists | 403 | El teléfono del cliente coincide con otra ficha activa o archivada. | false | Revisá el cliente existente antes de cambiar o fusionar datos. |
customer_email_already_exists | 403 | Sin teléfono, el email del cliente coincide con otra ficha activa o archivada. | false | Revisá el cliente existente antes de cambiar o fusionar datos. |
customer_name_already_exists | 409 | Sin teléfono ni email, el nombre, incluso desambiguado con el documento, coincide con otro cliente sin teléfono. | false | Revisá esa ficha antes de cambiar o fusionar datos. |
customer_identity_changed | 403 | La identidad del cliente cambió mientras POST /api/v1/fiscal/clientes lo editaba. | false | Volvé a consultar la ficha y enviá tu actualización sobre la identidad vigente. |
product_not_found | 403 | El concepto que se intenta actualizar ya no existe. | false | Consultá el catálogo y revisá el UUID del concepto. |
fiscal_subscription_missing | 403 | Falta el contrato comercial para reservar el comprobante. | false | Revisá la suscripción del negocio antes de emitir. |
commercial_feature_missing | 403 | El plan no incluye la operación. | false | Revisá los permisos comerciales de tu plan en Suscripción. |
commercial_feature_writes_disabled | 403 | La suscripción está disponible sólo para consulta. | false | Revisá Suscripción y contactá a soporte antes de intentar nuevas escrituras. |
sale_product_not_found, product_not_offered, sale_service_unavailable, service_not_offered | 403 | Un ítem de catálogo ya no está disponible para venderlo en esa sucursal. | false | Revisá el catálogo y su disponibilidad en la sucursal antes de emitir. |
sale_credit_limit_exceeded | 403 | La venta supera el tope de fiado del cliente. | false | Registrá el cobro recibido o revisá el tope del cliente. |
stock_location_required | 403 | No hay una ubicación de stock activa única para la sucursal. | false | Revisá las ubicaciones de la sucursal; la API no elige entre varias. |
sucursal_sin_codigo_dgi | 403 | Falta el código o domicilio fiscal de la sucursal. | false | Completá los datos fiscales del local antes de emitir. |
venta_anulada | 409 | La venta del comprobante ya está anulada; la respuesta incluye sale_id. | false | Consultá la venta de origen; no reintentes su emisión. |
capability_inactive, capability_needs_setup, capability_paused | 403 | Una herramienta necesaria para registrar la venta o su cobro no está operativa. | false | Activala, completá su preparación o retomala desde Tu negocio › Herramientas; para efectivo, abrí la caja del día. |
capability_entitlement_missing, capability_writes_disabled, capability_disabled, capability_not_published, capability_not_in_rollout | 403 | Una función de la venta integrada no está disponible para nuevas operaciones. | false | Revisá el plan y la disponibilidad de la herramienta con soporte. |
forbidden, business_access_removed | 403 | Falta el acceso o permiso vigente de la persona que autoriza la operación. | false | Revisá el acceso y los permisos del equipo. |
business_suspended, account_suspended | 403 | El negocio o la cuenta está suspendido. | false | Contactá a soporte para revisar el acceso. |
policy_missing_profile, policy_catalog_mismatch | 403 | Falta el perfil del negocio o no coincide con el catálogo vigente. | false | Contactá a soporte para revisar el perfil antes de volver a enviar. |
policy_invalid_configuration, policy_invalid_capability_states, policy_invalid_lifecycle | 403 | La configuración de la función no permite autorizar la operación. | false | Contactá a soporte con la referencia de la solicitud. |
policy_invalid_commercial_plan, policy_invalid_entitlement_grant, policy_invalid_subscription, policy_missing_commercial_contract | 403 | El control comercial del negocio no pudo validar su contrato. | false | Revisá Suscripción y contactá a soporte si los datos parecen correctos. |
policy_persistence_unavailable | 403 | No se pudo leer el estado necesario para autorizar la operación. | false | Contactá a soporte; este código no habilita un reintento automático. |
Guardá x-request-id y error.reference para soporte. No registres la clave ni datos fiscales en logs públicos. Si recibís un código más específico del servicio fiscal, conservá también el HTTP, message y retryable al consultar a soporte.
Descubrir y recuperar
GET /api/v1/fiscal/capacidades informa los permisos de la clave y las operaciones disponibles.
GET /api/v1/fiscal/emisor consulta la habilitación actual, certificado y requisitos por tipo de comprobante.
Un fallo del servicio se informa como error; nunca se interpreta como habilitación.
GET /api/v1/facturas?query=CLIENTE&limit=20 busca por identificador externo, documento o razón social.
La respuesta contiene items y next_cursor. Pasá el cursor en la consulta siguiente conservando
los filtros. from es la fecha de registro inclusiva y to exclusiva, ambas ISO 8601 con zona horaria.
El listado incluye pedidos conservados antes de transmitir: consultá su status_url para conocer
el resultado fiscal. La presencia en el listado no demuestra emisión ni aceptación.
Las claves anteriores conservan consulta y emisión. Una clave restringida a fiscal:read
puede consultar y descargar, pero una emisión devuelve 403 insufficient_scope sin reservar el pedido.
Borradores y revisión fiscal
Los borradores se comparten entre la web, la API y el MCP del mismo negocio. Guardar no emite ni reserva numeración. Podés guardar contenido incompleto; validar exige todos los datos fiscales y fecha explícita en formato YYYY-MM-DD. fecha_vencimiento es opcional y no puede ser anterior a la emisión.
- Generá un UUID y conservá ese
idantes de llamar aPOST /api/v1/fiscal/borradores. Enviá{ "id": "UUID", "revision": 0, "document": { ... } }. El documento usa los campos del pedido de emisión; Bigu asignaexternal_idcomodraft_UUID. - Para editar, enviá el mismo
idy la últimarevisiondevuelta. Cada guardado aumenta la revisión e invalida la revisión fiscal anterior. - Llamá a
POST /api/v1/fiscal/borradores/validarconidyrevision. Obtendrás bases, IVA y total en centésimos, calculados por el motor fiscal real. Esta respuesta no significa emisión ni aceptación de DGI. - Emití con
POST /api/v1/fiscal/borradores/emitir, usando el mismoidyrevision. El contenido queda congelado antes del envío al servicio fiscal. - Confirmá el resultado en
GET /api/v1/facturas/draft_UUID. Ante una interrupción, consultá y reintentá la misma identidad; no crees otro borrador para repetir el envío.
GET /api/v1/fiscal/borradores lista borradores con limit y cursor; continuá con next_cursor para recuperar todos. GET /api/v1/fiscal/borradores/UUID recupera el contenido y la revisión actual. Un 409 draft_revision_conflict exige volver a consultar: puede haber una edición concurrente, una revisión sin validar o una emisión ya iniciada. Un borrador enviado no se edita.
Guardar y validar requieren fiscal:prepare; emitir requiere fiscal:issue; consultar requiere fiscal:read. Las claves anteriores conservan sus permisos originales de consulta y emisión; creá una nueva clave con preparación para usar borradores.
Observaciones y vencimiento
nota permite hasta 1000 caracteres de observaciones comerciales por comprobante. Queda congelada al emitir y aparece en el PDF; no forma parte del XML fiscal ni cambia los impuestos. La nota general del negocio se configura por separado en la presentación del emisor.
fecha_vencimiento se conserva en el CFE y se muestra en su PDF. Tanto la fecha como las observaciones se revisan antes de emitir; editar un borrador invalida su revisión anterior.
Clientes y conceptos
La API permite buscar y mantener los clientes y conceptos del negocio con permisos de preparación fiscal. Reutiliza el catálogo y las identidades existentes sin conceder stock ni gestión general.
GET y POST /api/v1/fiscal/clientes consultan o guardan destinatarios; GET y POST /api/v1/fiscal/conceptos hacen lo mismo con los conceptos. Para recuperar una escritura consultá el mismo id; para recorrer una búsqueda, conservá sus filtros y continuá hasta agotar next_cursor. El detalle de campos, actualización parcial y permisos está en la guía enlazada.
Al crear o editar un cliente sin teléfono, un email repetido devuelve customer_email_already_exists sin guardar el cambio: revisá la ficha existente o usá otro email. Si esa ficha está archivada, reactivala antes de elegirla. Esta regla corresponde al alta y la edición; el traspaso de planillas y otros sistemas conserva sus propias reglas de conciliación.
Entrega, cobros y resúmenes
La guía de cobros y entrega cubre el formato y la recuperación de estas operaciones:
| Operación | Ruta y resultado |
|---|---|
| Registrar un pago recibido | POST /api/v1/fiscal/cobros, con UUID estable, importe, moneda y fecha con zona horaria |
| Consultar cobros y saldo | GET /api/v1/fiscal/saldos?external_id=ID, para ese comprobante |
| Leer los importes firmados | GET /api/v1/fiscal/resumen?external_id=ID, desde el XML histórico |
| Exportar por moneda e impuesto | GET /api/v1/fiscal/exportar, recorriendo todas las páginas con sus filtros |
| Preparar una entrega por correo | POST /api/v1/fiscal/entregas, con UUID, comprobante aceptado y destinatario |
| Seguir o conciliar la entrega | GET /api/v1/fiscal/entregas?id=UUID, antes de decidir si hace falta recuperar el envío |
Cada efecto requiere su scope específico y un identificador estable. Un correo recibido por el proveedor todavía no equivale a entrega confirmada. Registrar un pago anota dinero que ya recibiste y no ejecuta una cobranza.
Reglas y ocurrencias automáticas
Con fiscal:rules, POST /api/v1/fiscal/reglas guarda una plantilla y autoriza su calendario semanal o mensual. Conservá un UUID por regla y revisá los campos de fecha, zona horaria, vencimiento y correo en Facturación automática antes de activarla.
POST /api/v1/fiscal/reglas/estado recibe el id y status: paused o active para pausar o reanudar. Pausar impide trabajo nuevo; una ocurrencia ya iniciada puede terminar. Revocar la clave que creó la regla no la pausa.
En Integra, la regla exige receptor. Las reglas antiguas activas con fechas vencidas quedan pausadas en este despliegue y sus ocurrencias pendientes anteriores quedan omitidas, con motivo. Reanudar lleva la próxima fecha a hoy o después, respetando la frecuencia y la última fecha: no emite esos períodos atrasados. Factura conserva su recorrido anterior.
GET /api/v1/fiscal/reglas permite listar o recuperar por id. GET /api/v1/fiscal/reglas/ocurrencias consulta el progreso de las fechas y acepta id para filtrar una regla. Ambas consultas usan limit, cursor y next_cursor. Agotá las páginas y consultá el comprobante de cada ocurrencia antes de darla por emitida o aceptada. Las consultas requieren fiscal:read.