> ## Documentation Index
> Fetch the complete documentation index at: https://docs.facture.ar/llms.txt
> Use this file to discover all available pages before exploring further.

# Integración de Facturear con ERP: guía técnica

> Cómo integrar la API de Facturear con sistemas ERP (SAP, Odoo, Tango, etc.) para automatizar la facturación electrónica en Argentina desde tu sistema de gestión.

# Integración de Facturear con ERP

Integrar Facturear a tu sistema ERP permite emitir facturas electrónicas directamente desde tu sistema de gestión, sin entrar al portal de ARCA. Esta guía cubre los patrones de integración más comunes.

***

## Arquitectura de integración

```
┌────────────────┐     API REST      ┌────────────────┐     WSFE      ┌──────────┐
│   Tu ERP /     │ ──────────────→   │   Facturear    │ ──────────→   │  ARCA    │
│   Sistema de   │ ←──────────────   │   API          │ ←──────────   │  WSFE    │
│   Gestión      │   JSON + CAE      └────────────────┘   CAE         └──────────┘
└────────────────┘
```

Tu sistema envía los datos de la factura a `POST https://www.facture.ar/api/invoices`. Facturear la encola, se comunica con ARCA y obtiene el CAE; tu sistema consulta el resultado con el `batchId` que recibió al enviarla.

***

## Flujo de integración típico

<Steps>
  El ERP genera un pedido de factura al cerrar una venta o servicio

  El ERP llama a la API de Facturear con los datos del comprobante

  Facturear valida los datos, encola la factura y responde con un `batchId`

  Facturear contacta a ARCA y obtiene el CAE

  El ERP consulta `GET /api/invoices/batches/{batchId}` y obtiene el CAE, su vencimiento y el número de comprobante

  El ERP almacena el CAE y actualiza el registro de la factura

  El ERP muestra o envía el PDF de la factura al cliente
</Steps>

***

## Datos mínimos para la integración

Tu ERP debe proveer estos datos para cada factura. Van todos en el primer nivel, con los nombres que usa ARCA (ver [Primera factura con Facturear](/es/guides/primera-factura) para el detalle de cada campo):

```json theme={null}
{
  "cuit": "20123456789",
  "ptoVta": 1,
  "invoiceType": 6,
  "concepto": 2,
  "docTipo": 99,
  "docNro": 0,
  "condicionIVAReceptorId": 5,
  "clientName": "Consumidor Final",
  "impNeto": 100000,
  "impIVA": 21000,
  "impTotal": 121000,
  "iva": [
    { "id": 5, "baseImp": 100000, "importe": 21000 }
  ],
  "fchServDesde": "20260901",
  "fchServHasta": "20260930",
  "fchVtoPago": "20261010",
  "items": [
    {
      "description": "Producto o servicio",
      "quantity": 1,
      "unitPrice": 100000,
      "discount": 0,
      "ivaRate": 21,
      "subtotal": 100000
    }
  ]
}
```

`ptoVta`, `invoiceType` y `concepto` pueden salir de los [defaults del CUIT](/es/guides/configurar-defaults-cuit), y si mandás un array de hasta 500 facturas se procesan como un [lote](/es/guides/facturacion-lotes).

***

## Integración con sistemas comunes

### Odoo

Odoo tiene un módulo de facturación electrónica argentina. Podés usar la API de Facturear como backend de facturación creando un módulo personalizado:

```python theme={null}
# Ejemplo simplificado de módulo Odoo
import time
import requests

API = "https://www.facture.ar/api"

class AccountMove(models.Model):
    _inherit = 'account.move'

    def action_post(self):
        result = super().action_post()
        if self._es_factura_electronica():
            self._emitir_con_facturear()
        return result

    def _emitir_con_facturear(self):
        headers = {"x-api-key": self.company_id.facturear_api_key}
        payload = self._build_facturear_payload()  # campos como en el ejemplo de arriba

        response = requests.post(f"{API}/invoices", json=payload, headers=headers)
        response.raise_for_status()
        batch_id = response.json()["batchId"]

        # La emisión es asincrónica: consultar el lote hasta que termine
        while True:
            batch = requests.get(f"{API}/invoices/batches/{batch_id}", headers=headers).json()
            if batch["status"] in ("completed", "completed_with_errors", "error"):
                break
            time.sleep(2)

        item = batch["items"][0]
        if item["status"] != "completed":
            raise UserError(f"ARCA rechazó la factura: {item['responseBody']}")

        body = item["responseBody"]
        det = body["fecaesolicitarResult"]["FeDetResp"]["FECAEDetResponse"][0]
        self.write({
            'l10n_ar_afip_auth_code': det['CAE'],
            'l10n_ar_afip_auth_code_due': det['CAEFchVto'],  # YYYYMMDD
        })
```

<Tip>
  En producción, no bloquees la confirmación de la factura esperando a ARCA: guardá el `batchId` y consultalo desde una tarea programada (ver [Cola de trabajo](#cola-de-trabajo-para-alta-disponibilidad)).
</Tip>

### Tango Gestión

Para Tango, la integración se hace mediante:

1. El módulo de **Exportación de Facturación** de Tango
2. Un script que lee los archivos exportados y llama a la API de Facturear
3. Un script que importa los resultados (CAE) de vuelta a Tango

### SAP

Para SAP (B1 o S/4HANA), la integración se implementa mediante:

* Un **Add-on** o extensión de SAP
* O un proceso de middleware (usando herramientas como MuleSoft, Boomi, o un servicio propio)

***

## Manejo de errores en la integración

Hay dos momentos en que una factura puede fallar: al enviarla (la API responde `400` si los datos no son válidos, o `403` con `code: "SUBSCRIPTION_LIMIT_EXCEEDED"` si superaste el límite de tu plan) y al procesarla (el ítem del lote queda en `error` con los mensajes de ARCA en `responseBody`).

```javascript theme={null}
const API = 'https://www.facture.ar/api';

async function emitirFactura(facturaData) {
  try {
    const response = await fetch(`${API}/invoices`, {
      method: 'POST',
      headers: { 'x-api-key': apiKey, 'Content-Type': 'application/json' },
      body: JSON.stringify(facturaData)
    });

    if (!response.ok) {
      const error = await response.json();
      // Registrar el error para revisión manual
      await registrarErrorFacturacion(facturaData, error);
      throw new Error(`Factura rechazada (${response.status}): ${error.error}`);
    }

    // La factura quedó encolada: guardá el batchId para consultar el CAE
    const { batchId } = await response.json();
    return batchId;

  } catch (err) {
    // No dejar facturas sin CAE sin registrar
    console.error('Error al emitir factura:', err);
    throw err;
  }
}
```

***

## Cola de trabajo para alta disponibilidad

Para producción, implementá un sistema de cola:

1. El ERP encola la factura en lugar de llamar directamente a la API
2. Un worker procesa la cola y llama a Facturear
3. Si falla, el worker reintenta con backoff exponencial, mandando siempre el mismo header `Idempotency-Key` para esa factura: si el primer intento sí había llegado, Facturear devuelve el mismo `batchId` en vez de encolarla otra vez. Ver [Reintentar sin duplicar facturas](/es/guides/idempotencia)
4. El ERP consulta el lote con `GET /api/invoices/batches/{batchId}` o recibe el resultado por webhook (`invoice.completed`/`invoice.failed`)
5. Si un ítem falló por un error transitorio (ARCA caído, timeout), reintentalo con `POST /api/invoices/batches/{batchId}/items/{itemId}/retry`

***

## Notificaciones asíncronas

Consultá el lote o suscribite a `invoice.completed`/`invoice.failed` con [webhooks](/es/guides/webhook-integracion): el ERP recibe el CAE (o los errores de ARCA) apenas la factura se procesa, sin hacer polling. Con `batch.completed` te enterás cuando termina un lote entero. Verificá la firma de cada envío y usá el `id` del evento para no procesarlo dos veces.

***

## Recursos relacionados

* [API Keys y autenticación](/es/guides/api-keys)
* [Integración con e-commerce](/es/guides/integracion-ecommerce)
* [Webhooks en Facturear](/es/guides/webhook-integracion)
* [Facturación en lotes](/es/guides/facturacion-lotes)

***

<Card title="Integrá tu ERP con Facturear" icon="rocket" href="https://facture.ar">
  Conectá tu sistema de gestión a la API de Facturear y automatizá la facturación electrónica desde tu ERP.
</Card>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.