Automatiza la facturación electrónica VeriFactu desde Django, FastAPI o cualquier script Python. Guía paso a paso con ejemplos reales.
La API REST de InvoCash es compatible con cualquier proyecto Python 3.7+. Con la popular librería requests (o httpx para proyectos async) puedes autenticarte, crear facturas y consultar estados VeriFactu en pocas líneas.
Ideal para backends Django, APIs FastAPI, scripts de automatización o microservicios que necesiten generar facturas electrónicas homologadas sin gestionar la normativa fiscal internamente.
requests es la librería más popular. Importa y empieza a llamar a la API en segundos.
Con Celery y signals, integra facturación asíncrona sin bloquear tu aplicación.
InvoCash gestiona firma, hashes y envío a la AEAT. Tu código solo crea facturas.
Desde scripts puntuales hasta miles de facturas diarias. Sin cambios en tu código.
Obtén el Bearer token con POST /api/auth/login o usa la API Key directamente en el header.
import requests
BASE_URL = "https://{su-tenant}.invo.cash/api"
# Opción 1: JWT (para sesiones de usuario)
auth = requests.post(f"{BASE_URL}/auth/login", json={
"email": "usuario@empresa.com",
"password": "tu_contraseña",
})
token = auth.json()["access_token"]
headers = {"Authorization": f"Bearer {token}"}
# Opción 2: API Key (recomendado para integraciones automáticas)
headers = {"X-API-Key": "tu_api_key"}Calcula tax_base, tax_amount y total antes de enviar — la API no los calcula automáticamente.
def crear_factura(headers, customer_id, descripcion, precio, iva=21):
tax_base = precio
tax_amount = round(tax_base * iva / 100, 2)
factura = {
"customer_id": customer_id,
"verifactu_issuer_territory": "MAINLAND",
"simplified": False,
"lines": [{
"description": descripcion,
"quantity": 1,
"unit_price": precio,
"tax_base": tax_base,
"tax_pctge": iva,
"tax_amount": tax_amount,
"tax_withholding_pctge": 0,
"tax_withholding_amount": 0,
"tax_type": "IVA",
"clave_regimen": "01",
"qualification_operation": "S1",
"exempt_operation": None,
"total": tax_base,
}],
"total": round(tax_base + tax_amount, 2),
}
r = requests.post(f"{BASE_URL}/invoices", json=factura, headers=headers)
return r.json()["data"][0]r = requests.get(f"{BASE_URL}/invoice/{invoice_id}/verifactu", headers=headers)
estado = r.json()
print(estado["verifactu_status"]) # 'validated' | 'pending' | 'error'# Descargar PDF
pdf = requests.get(f"{BASE_URL}/invoice/{invoice_id}/downloadPdf", headers=headers)
with open("factura.pdf", "wb") as f:
f.write(pdf.content)
# Enviar por email al cliente
requests.post(f"{BASE_URL}/invoice/{invoice_id}/communicate/email", headers=headers)VeriFactu incluido automáticamente: todas las facturas creadas mediante la API de InvoCash se procesan con el sistema VeriFactu de la AEAT. Cumplimiento de la Ley Antifraude y el RD 1007/2023 sin ningún desarrollo adicional por tu parte.
¿Dudas durante la integración?
Nuestro equipo técnico te da respuesta ágil dentro del horario laboral. No hace falta que seas cliente.
Los endpoints que usarás con más frecuencia en tu integración. La documentación completa está disponible dentro de la plataforma.
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/auth/login | Autenticar y obtener token JWT |
| GET | /api/customers | Listar clientes |
| POST | /api/invoices | Crear una o varias facturas |
| GET | /api/invoices | Listar facturas (paginado, con filtros) |
| GET | /api/invoice/{id} | Detalle de una factura |
| PUT | /api/invoice/{id} | Actualizar factura (solo si no está validada) |
| GET | /api/invoice/{id}/verifactu | Estado de validación VeriFactu en la AEAT |
| GET | /api/invoice/{id}/downloadPdf | Descargar el PDF de la factura |
| POST | /api/invoice/{id}/communicate/email | Enviar la factura por email al cliente |
| POST | /api/invoice/{id}/validate | Enviar manualmente a VeriFactu |
Un SaaS B2B en Django registra el pago de una suscripción. Una señal post_save encola una tarea de Celery que llama a la API de InvoCash para crear la factura, validarla con VeriFactu y enviar el PDF por email al cliente — sin bloquear el hilo principal de Django y con reintentos automáticos si falla la llamada.
Nuestro equipo técnico te acompaña en todo el proceso. Sin compromiso.