---
title: Factura TicketBAI a una administración pública con FacturaE
description: Cuerpo JSON de una factura TicketBAI que también genera el XML FacturaE para una administración pública.
---

El ejemplo corresponde a una persona jurídica de Bizkaia que presta un
servicio de consultoría a una administración pública. La misma petición genera
la factura TicketBAI y el XML FacturaE. Envía este cuerpo mediante
[`POST /invoicing/invoices`](/api#tag/facturas/POST/invoicing/invoices).

:::warning[Adapta los datos antes del envío]
Todos los datos del ejemplo son ficticios. El NIF, la dirección y el territorio
del emisor deben corresponder a la empresa identificada por
`X-Qbikode-ClientApiKey`; la API comprueba específicamente que coincidan el NIF
y el territorio. Usa la fecha y hora reales de emisión y sustituye los códigos
DIR3 por los facilitados por la administración destinataria.
:::

## Cuerpo de la petición

```json
{
  "sender_data": {
    "sender_ticketbai_territory_id": "b4039144-5069-4584-88e1-7086c9f01adc",
    "sender_is_individual": false,
    "sender_full_name": "Empresa Consultora Ejemplo S.L.",
    "sender_id_card_number": "B12345674",
    "sender_address": "Gran Vía de Don Diego López de Haro 1",
    "sender_postal_code": "48001",
    "sender_town": "Bilbao",
    "sender_province": "Bizkaia"
  },
  "recipients": [
    {
      "tax_id_number": "P1234567D",
      "full_name": "Ayuntamiento de Ejemplo",
      "postal_code": "48002",
      "address": "Plaza del Ayuntamiento 1",
      "is_legal_entity": true,
      "town": "Municipio de Ejemplo",
      "province": "Bizkaia",
      "facturae_country_code": "ESP",
      "administrative_centers": [
        {
          "role": "01",
          "code": "L01234567",
          "name": "Oficina Contable de Ejemplo",
          "address": "Plaza del Ayuntamiento 1",
          "postal_code": "48002",
          "town": "Municipio de Ejemplo",
          "province": "Bizkaia",
          "facturae_country_code": "ESP"
        },
        {
          "role": "02",
          "code": "L01234568",
          "name": "Órgano Gestor de Ejemplo",
          "address": "Plaza del Ayuntamiento 1",
          "postal_code": "48002",
          "town": "Municipio de Ejemplo",
          "province": "Bizkaia",
          "facturae_country_code": "ESP"
        },
        {
          "role": "03",
          "code": "L01234569",
          "name": "Unidad Tramitadora de Ejemplo",
          "address": "Plaza del Ayuntamiento 1",
          "postal_code": "48002",
          "town": "Municipio de Ejemplo",
          "province": "Bizkaia",
          "facturae_country_code": "ESP"
        }
      ]
    }
  ],
  "invoice_data": {
    "fiscal_year": 2026,
    "series_code": "FAC",
    "invoice_number": "2026-001",
    "invoice_datetime": "2026-07-22 15:00:00",
    "description": "Servicios de consultoría técnica",
    "total_amount": 12100,
    "vat_keys": [
      {
        "transaction_of_tax_significance_code": "01"
      }
    ],
    "concepts": [
      {
        "description": "Servicios de consultoría técnica",
        "quantity": 100,
        "unit_price": 10000000000,
        "total_price": 12100,
        "vat_rate": 2100
      }
    ],
    "local_subject_not_exempt_items": [
      {
        "vat_not_exempt_type": "S1",
        "vat_breakdown_items": [
          {
            "taxable_amount": 10000,
            "tax_rate": 2100,
            "tax_quota": 2100
          }
        ]
      }
    ]
  },
  "generate_facturae": true,
  "async_mode": "none"
}
```

:::note[Una petición, dos XML]
KubiBAI genera, firma y remite a la Hacienda Foral de Bizkaia el XML TicketBAI.
Además, `generate_facturae: true` genera el XML FacturaE 3.2.1 y lo devuelve
codificado en Base64. KubiBAI no envía este segundo XML a FACe ni al
destinatario: el integrador debe gestionar su entrega.
:::

:::note[Datos adicionales de FacturaE]
Al activar FacturaE se vuelven obligatorios los datos postales del emisor y del
destinatario, `is_legal_entity`, `town`, `province`,
`facturae_country_code`, `invoice_data.concepts` y el `vat_rate` de cada
concepto.

Aunque en Bizkaia `invoice_data.concepts` puede omitirse en una factura
TicketBAI ordinaria, en esta petición es obligatorio porque se genera también
FacturaE.

El ejemplo no incluye recargo de equivalencia ni retención porque no se aplican
a la operación. `special_taxable_event_code` y
`special_taxable_event_reason` solo son necesarios en conceptos exentos o no
sujetos, cuyo `vat_rate` es `0`.
:::

:::note[Centros administrativos]
`administrative_centers` es opcional en la API, pero suele ser necesario al
facturar a una administración pública. Los roles del ejemplo son:

- `01`: oficina contable o fiscal.
- `02`: órgano gestor o receptor.
- `03`: unidad tramitadora o pagadora.

Los códigos `L01234567`, `L01234568` y `L01234569` son ficticios. Utiliza los
códigos DIR3 comunicados por la administración destinataria. El rol `04` puede
emplearse cuando sea necesario identificar un órgano proponente.
:::

:::note[Factura completa]
FacturaE solo se genera para facturas completas. No envíes
`generate_facturae: true` en una factura simplificada: actualmente la petición
puede superar la validación, pero KubiBAI no genera el XML FacturaE.
:::

:::note[Importes del concepto]
`quantity: 100` representa 1,00 unidad y `unit_price: 10000000000` representa
100,00000000 € sin impuestos. `total_price: 12100` incluye los 21,00 € de IVA.
FacturaE debe producir el mismo total de 121,00 € indicado en `total_amount`.
:::

## Recuperar el XML FacturaE

Con `async_mode: "none"`, la respuesta síncrona contiene el XML en
`data.facturae_xml_contents`. El valor Base64 se abrevia en este fragmento:

```json
{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "series_code": "FAC",
    "invoice_number": "2026-001",
    "facturae_xml_contents": "{FACTURAE_XML_BASE64}",
    "tbai_post_status": "success"
  }
}
```

Si guardas la respuesta completa en `respuesta.json`, puedes decodificar el
contenido en Linux con:

```bash
jq -r '.data.facturae_xml_contents' respuesta.json \
  | base64 --decode > facturae.xml
```

En macOS, sustituye `base64 --decode` por `base64 -D`.

:::note[XML FacturaE sin firma propia]
`facturae_xml_contents` contiene el XML FacturaE sin una firma electrónica
propia. La firma que realiza KubiBAI en este flujo corresponde al XML
TicketBAI.
:::

:::note[Alcance actual]
La petición de creación de facturas no expone campos específicos de FacturaE
para indicar el método de pago, el vencimiento, el IBAN, el BIC o adjuntos. No
añadas estos datos al cuerpo mientras no formen parte de la referencia de la
API.
:::

:::note[Primera factura de la cadena]
El ejemplo no incluye `previous_invoice_data` porque representa la primera
factura de esta entidad. En facturas posteriores, incluye los datos de la
factura anterior o activa el encadenamiento automático.
:::
