Guía por stack Python 3.9+ httpx · Pydantic

Cómo integrar facturación electrónica en Python con FastAPI

Crea un endpoint en FastAPI que recibe los datos de una venta y emite la factura electrónica del SRI. Validas la entrada con Pydantic y Flashpi se encarga del XML, la firma y el SRI.

LO QUE VAS A HACER5 pasos

  1. Instala las dependencias
  2. Escribe la aplicación
  3. Ejecútala
  4. Pruébala
  5. Maneja la lentitud del SRI

Antes de empezar

Python 3.9 o superior

Una API key de pruebas de Flashpi

Guárdala en una variable de entorno, nunca en el código ni en el repositorio.

Solicítala aquí

Tu certificado de firma .p12

Cargado en la cuenta de pruebas.

Cargar el certificado

Tus datos de emisor

RUC, establecimiento y punto de emisión configurados en tu cuenta.

Paso 1 · Instala las dependencias

bashterminal
pip install fastapi uvicorn httpx
export FLASHPI_API_KEY="tu_api_key_de_pruebas"

Paso 2 · Escribe la aplicación

pythonmain.py
# main.py
import os

import httpx
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

BASE_URL = "https://api.flashpi.ec/v1"
API_KEY = os.environ["FLASHPI_API_KEY"]

app = FastAPI()


class Comprador(BaseModel):
    tipo_identificacion: str
    identificacion: str
    razon_social: str
    email: str


class Detalle(BaseModel):
    descripcion: str
    cantidad: float
    precio_unitario: float


class FacturaIn(BaseModel):
    comprador: Comprador
    detalles: list[Detalle]


@app.post("/facturar")
async def facturar(factura: FacturaIn):
    async with httpx.AsyncClient(timeout=30) as client:
        res = await client.post(
            f"{BASE_URL}/facturas",
            headers={"Authorization": f"Bearer {API_KEY}"},
            json=factura.model_dump(),
        )

    if res.status_code >= 400:
        raise HTTPException(status_code=res.status_code, detail=res.json())

    return res.json()

model_dump() es de Pydantic 2. Si usas Pydantic 1, usa .dict().

Paso 3 · Ejecútala

bashterminal
uvicorn main:app --reload

Paso 4 · Pruébala

bashPOST /facturar
curl -X POST http://localhost:8000/facturar \
  -H "Content-Type: application/json" \
  -d '{
  "comprador": {
    "tipo_identificacion": "cedula",
    "identificacion": "0102030405",
    "razon_social": "Cliente de ejemplo",
    "email": "[email protected]"
  },
  "detalles": [
    { "descripcion": "Servicio de ejemplo", "cantidad": 1, "precio_unitario": 25.00 }
  ]
}'

También puedes abrir http://localhost:8000/docs para probarla desde la interfaz que FastAPI genera sola.

Paso 5 · Maneja la lentitud del SRI

Si recibes EN_PROCESAMIENTO, no reenvíes: consulta el estado en GET /comprobantes/{clave_acceso}. Para volumen alto, usa BackgroundTasks o una cola (Celery, RQ) y webhooks en vez de esperar la respuesta.

Errores frecuentes

SíntomaCausa probableQué hacerReferencia
401 UnauthorizedAPI key ausente, inválida o de otro ambiente.Revisa el header Authorization y que uses la key del ambiente correcto.Ver detalle
422 Esquema XMLAlgún campo no cumple la estructura esperada.Lee el detalle del error y corrige el campo indicado.Ver detalle
SRI 43Clave de acceso ya registrada.No reenvíes: consulta el estado del comprobante por su clave de acceso.Ver detalle
SRI 70Clave de acceso en procesamiento.Espera unos segundos y consulta el estado. No reenvíes el comprobante.Ver detalle

Siguientes pasos

Empieza hoy

Obtén tu API key y prueba el ejemplo

Prueba la API en el ambiente de pruebas del SRI y pasa a producción cuando estés listo.