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.
Tu certificado de firma .p12
Cargado en la cuenta de pruebas.
Tus datos de emisor
RUC, establecimiento y punto de emisión configurados en tu cuenta.
Paso 1 · Instala las dependencias
pip install fastapi uvicorn httpx
export FLASHPI_API_KEY="tu_api_key_de_pruebas"Paso 2 · Escribe la aplicación
# 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
uvicorn main:app --reloadPaso 4 · Pruébala
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íntoma | Causa probable | Qué hacer | Referencia |
|---|---|---|---|
401 Unauthorized | API key ausente, inválida o de otro ambiente. | Revisa el header Authorization y que uses la key del ambiente correcto. | Ver detalle |
422 Esquema XML | Algún campo no cumple la estructura esperada. | Lee el detalle del error y corrige el campo indicado. | Ver detalle |
SRI 43 | Clave de acceso ya registrada. | No reenvíes: consulta el estado del comprobante por su clave de acceso. | Ver detalle |
SRI 70 | Clave de acceso en procesamiento. | Espera unos segundos y consulta el estado. No reenvíes el comprobante. | Ver detalle |