# Facturas

> Emitir una factura electrónica por la API de Trevol, corregirla si la DIAN la rechaza, consultarla y descargar sus archivos.

Fuente: https://platform.trevol.si/docs/facturas

La factura electrónica de venta se pide con `POST /v1/invoices`. Trevol valida los datos, calcula los impuestos y los totales, numera con la resolución de la empresa, firma, envía a la DIAN y **responde apenas la DIAN valida**.

## Emitir una factura

`POST /v1/invoices` (`createInvoice`)

#### cURL

```bash
curl -X POST "https://api.trevol.si/v1/invoices" \
  -H "Authorization: Bearer $TREVOL_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "external_id": "VENTA-2026-000123",
  "customer": {
    "document_type": "31",
    "document_number": "900123456",
    "name": "COMERCIALIZADORA ANDINA SAS",
    "person_type": "legal",
    "email": "facturacion@comercializadoraandina.example",
    "address": "Calle 72 # 10-34, Oficina 501",
    "municipality_code": "11001"
  },
  "items": [
    {
      "code": "LIC-ANUAL",
      "description": "Licencia anual de software",
      "quantity": "2",
      "unit_price": "150000",
      "taxes": [
        {
          "code": "01",
          "rate": "19"
        }
      ]
    },
    {
      "code": "SOP-MES",
      "description": "Soporte técnico mensual",
      "quantity": "1",
      "unit_price": "80000",
      "taxes": [
        {
          "code": "01",
          "rate": "19"
        }
      ]
    }
  ],
  "payment": {
    "form": "credit",
    "term_days": 30
  },
  "notes": [
    "Gracias por su compra"
  ]
}'
```

[Probar en el Playground](https://platform.trevol.si/playground?op=createInvoice&ejemplo=venta)

- **Consumidor final:** `"customer": {"final_consumer": true}`.
- **Calcular sin emitir:** `POST /v1/invoices/preview` con el mismo cuerpo (no numera ni pide `Idempotency-Key`).
- **Precios sin impuestos:** `unit_price` va antes de IVA; Trevol calcula impuestos, retenciones y totales.
- La factura cubre todo lo del Anexo técnico 1.9: impuestos porcentuales y nominales, descuentos y recargos, retenciones, muestras gratis, anticipos y redondeo, y también la exportación, la moneda extranjera, el AIU, los mandatos, el transporte de carga, los notarios, las divisas y el sector salud ([Operaciones especiales](/docs/operaciones-especiales)). Quedan fuera la contingencia 03 y 04 de la factura y los eventos RADIAN 035 a 051.

`POST /v1/invoices/preview` (`previewInvoice`)

#### cURL

```bash
curl -X POST "https://api.trevol.si/v1/invoices/preview" \
  -H "Authorization: Bearer $TREVOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "external_id": "VENTA-2026-000123",
  "customer": {
    "document_type": "31",
    "document_number": "900123456",
    "name": "COMERCIALIZADORA ANDINA SAS",
    "person_type": "legal",
    "email": "facturacion@comercializadoraandina.example",
    "address": "Calle 72 # 10-34, Oficina 501",
    "municipality_code": "11001"
  },
  "items": [
    {
      "code": "LIC-ANUAL",
      "description": "Licencia anual de software",
      "quantity": "2",
      "unit_price": "150000",
      "taxes": [
        {
          "code": "01",
          "rate": "19"
        }
      ]
    },
    {
      "code": "SOP-MES",
      "description": "Soporte técnico mensual",
      "quantity": "1",
      "unit_price": "80000",
      "taxes": [
        {
          "code": "01",
          "rate": "19"
        }
      ]
    }
  ],
  "payment": {
    "form": "credit",
    "term_days": 30
  },
  "notes": [
    "Gracias por su compra"
  ]
}'
```

[Probar en el Playground](https://platform.trevol.si/playground?op=previewInvoice&ejemplo=venta)

> **Qué responde:** `201` cuando la DIAN valida, `422 dian_rejected` con `document` cuando la rechaza, `422 validation_error` si Trevol la rechaza antes de numerar (no se gasta ningún número), `402` sin saldo, y con la DIAN sin contestar un `202 processing` (versión 2026-10-22) o un `503 dian_unavailable` (2026-10-21). Todo está en [Estados y respuestas](/docs/respuestas). `Idempotency-Key` es obligatoria ([Idempotencia](/docs/idempotencia)) y `external_id` es opcional.

## Rechazos y reintentos

- **Rechazado por la DIAN:** corrige con `PUT /v1/invoices/{id}` (cuerpo completo, nueva `Idempotency-Key`). Sale con el mismo número. Un rechazo no bloquea los demás envíos.

`PUT /v1/invoices/{id}` (`correctInvoice`)

#### cURL

```bash
curl -X PUT "https://api.trevol.si/v1/invoices/inv_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b" \
  -H "Authorization: Bearer $TREVOL_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "external_id": "VENTA-2026-000123",
  "customer": {
    "document_type": "31",
    "document_number": "900123456",
    "name": "COMERCIALIZADORA ANDINA SAS",
    "person_type": "legal",
    "email": "facturacion@comercializadoraandina.example",
    "address": "Calle 72 # 10-34, Oficina 501",
    "municipality_code": "11001"
  },
  "items": [
    {
      "code": "LIC-ANUAL",
      "description": "Licencia anual de software",
      "quantity": "2",
      "unit_price": "150000",
      "taxes": [
        {
          "code": "01",
          "rate": "19"
        }
      ]
    },
    {
      "code": "SOP-MES",
      "description": "Soporte técnico mensual",
      "quantity": "1",
      "unit_price": "80000",
      "taxes": [
        {
          "code": "01",
          "rate": "19"
        }
      ]
    }
  ],
  "payment": {
    "form": "credit",
    "term_days": 30
  },
  "notes": [
    "Gracias por su compra"
  ]
}'
```

[Probar en el Playground](https://platform.trevol.si/playground?op=correctInvoice&ejemplo=venta)

- **Pendiente o en error:** `POST /v1/invoices/{id}/send` lo vuelve a enviar (por ejemplo, después de recargar saldo).

`POST /v1/invoices/{id}/send` (`sendInvoice`)

#### cURL

```bash
curl -X POST "https://api.trevol.si/v1/invoices/inv_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b/send" \
  -H "Authorization: Bearer $TREVOL_API_KEY"
```

[Probar en el Playground](https://platform.trevol.si/playground?op=sendInvoice)

- **Validado:** ya no se cambia; se corrige con una [nota crédito o débito](/docs/notas).

## Consultar y listar

`GET /v1/invoices/{id}` (`retrieveInvoice`)

#### cURL

```bash
curl "https://api.trevol.si/v1/invoices/inv_3f0c1a2b3f0c1a2b3f0c1a2b3f0c1a2b" \
  -H "Authorization: Bearer $TREVOL_API_KEY"
```

[Probar en el Playground](https://platform.trevol.si/playground?op=retrieveInvoice)

`GET /v1/invoices` lista por cursor (`limit`, `starting_after`, y los filtros `status`, `external_id`, `created_from` y `created_to`); ver [Paginación](/docs/paginacion). `GET /v1/dian/acquirer?document_type=31&document_number=…` devuelve lo que la DIAN tiene del adquiriente (nombre y correo).

## Archivos

`GET /v1/invoices/{id}/pdf`, `/xml`, `/zip` y `/dian_response` entregan los archivos en binario ([Archivos](/docs/archivos)).

## Más documentos

Todo lo que Trevol emite se pide igual: `POST` con `Idempotency-Key`, los mismos estados, errores, webhooks y archivos. Cada familia tiene su página: [notas crédito y débito](/docs/notas), [documento soporte](/docs/documento-soporte), [documento equivalente](/docs/documento-equivalente), [nómina electrónica](/docs/nomina) y [eventos RADIAN](/docs/eventos-radian).
