Sifende CLI
CLI en Python para emitir documentos electrónicos, consultar estado, descargar KuDE, cancelar e inutilizar contra la API de Sifende desde la terminal.
Sifende CLI es un cliente de línea de comandos que envuelve la API REST de Sifende. Sirve para ejecutar los flujos típicos (emitir, consultar estado, descargar KuDE, cancelar e inutilizar) contra https://api.sifende.com.py/api/v1/ sin escribir código.
Va bien para probar tu API key, validar payloads, reproducir bugs y armar scripts puntuales. Solo depende de la stdlib de Python y de requests.
La CLI no reemplaza una integración. Para producción, integrá la API REST directamente desde tu backend siguiendo la Referencia.
Requisitos
- Python 3.9 o superior
make(opcional; todo se puede correr conpythondirecto)- Una API key de Sifende. Si no tenés una, seguí Paso 1: Credenciales
Instalación
Cloná el repositorio y entrá al directorio del CLI:
git clone https://github.com/ithdev/sifende-cli.git
cd sifende-cliEl repo trae un sample_factura.json listo para emitir, así que podés probar todo antes de armar tu propio payload.
Quickstart en 3 comandos
make setup # crea venv, instala deps, copia .env.example a .env
nano .env # o tu editor preferido; poné tu SIFENDE_API_KEY
make emitir FILE=sample_factura.jsonmake setup crea un entorno virtual en .venv/, instala las dependencias y copia .env.example a .env si todavía no existe. Después abrís .env y pegás tu SIFENDE_API_KEY.
Si todo salió bien, vas a ver el cdc impreso en consola y un directorio documentos/{cdc}/ con payload.json, response.json y, una vez aprobado, kude.pdf.
Sin Make
python3 -m venv .venv
source .venv/bin/activate # Windows PowerShell: .venv\Scripts\Activate.ps1
pip install -r requirements.txt
cp .env.example .env # editá .env con tu API key
python sifende.py emitir --file sample_factura.jsonConfiguración
La CLI busca tu API key en este orden (gana el primero que la encuentre):
- Flag
--api-keyen la línea de comandos - Variable de entorno
SIFENDE_API_KEY - Archivo
.enven el directorio actual - Archivo
.enven la raíz del paquete CLI
La API key nunca se ecoa, ni en logs ni en mensajes de error. El header Authorization se omite explícitamente al renderizar errores HTTP. Podés correr --debug con tranquilidad.
Variables soportadas en .env
| Variable | Default |
|---|---|
SIFENDE_API_KEY | (requerido) |
SIFENDE_BASE_URL | https://api.sifende.com.py/api/v1/ |
SIFENDE_TIMEOUT_S | 30 |
Cambiá SIFENDE_BASE_URL solo si te diéramos un ambiente alternativo. Para QA y producción usá el valor por defecto.
Comandos
Cada operación está disponible en dos formas: con make (más corto, ideal para uso interactivo) o con python sifende.py (más explícito, ideal para scripts).
emitir espera la confirmación de SIFEN antes de retornar: la CLI hace polling automático del estado hasta que el documento quede APROBADO o RECHAZADO. Si querés solo enviar y no esperar, pasá --no-wait. Para polling manual sobre un CDC ya emitido, usá estado.
| Operación | Make | Python |
|---|---|---|
| Emitir desde archivo | make emitir FILE=factura.json | python sifende.py emitir --file factura.json |
| Emitir interactivo | make emitir-i | python sifende.py emitir |
| Consultar estado | make estado CDC=<cdc> | python sifende.py estado <cdc> |
| Descargar KuDE | make kude CDC=<cdc> OUT=factura.pdf | python sifende.py kude <cdc> --out factura.pdf |
| Cancelar | make cancelar CDC=<cdc> MOTIVO="..." | python sifende.py cancelar <cdc> --motivo "..." |
| Inutilizar | make inutilizar TIPO=1 EST=001 PE=001 TIMBRADO=<t> DESDE=1 HASTA=3 MOTIVO="..." | python sifende.py inutilizar --tipo-documento 1 --establecimiento 001 --punto-expedicion 001 --numero-timbrado <t> --desde 1 --hasta 3 --motivo "..." |
| Debug HTTP | make debug FILE=factura.json | python sifende.py --debug emitir --file factura.json |
Flags globales
Estos flags funcionan en todos los comandos:
| Flag | Qué hace |
|---|---|
--api-key <key> | Pisa la API key resuelta del entorno |
--base-url <url> | Pisa la URL base de la API |
--quiet | Solo imprime el dato esencial (CDC, estado) |
--json | Imprime la respuesta cruda como JSON |
--debug | Traza HTTP completa con headers (la API key queda enmascarada) |
Con make se reenvían como EXTRA="...":
make emitir FILE=factura.json EXTRA="--json --quiet"Comportamiento al aprobar
Al confirmarse la aprobación de un documento, la CLI guarda automáticamente:
documentos/
└── {cdc}/
├── payload.json # request enviado
├── response.json # respuesta de la API
└── kude.pdf # KuDE descargadoEsto te da un audit trail local para cada emisión sin trabajo extra.
Ejemplo: emitir y descargar el KuDE
# 1. Emitir desde el archivo de muestra
make emitir FILE=sample_factura.json
# Salida:
# CDC: 01800123451001001000000122026050910000000001
# Estado: PENDIENTE → APROBADO
# 2. Consultar estado por CDC
make estado CDC=01800123451001001000000122026050910000000001
# 3. Descargar el KuDE PDF
make kude CDC=01800123451001001000000122026050910000000001 OUT=factura.pdfEjemplo: cancelar un documento aprobado
make cancelar \
CDC=01800123451001001000000122026050910000000001 \
MOTIVO="Error en datos del receptor"Recordá que cancelar tiene 48 horas de plazo desde la emisión. Pasado ese tiempo, tenés que emitir una Nota de Crédito.
Ejemplo: inutilizar un rango de numeración
Si saltaste números (por ejemplo, una falla puntual te dejó huecos del 5 al 8), inutilizalos antes de seguir emitiendo:
make inutilizar \
TIPO=1 \
EST=001 \
PE=001 \
TIMBRADO=12345678 \
DESDE=5 \
HASTA=8 \
MOTIVO="Salto de numeración por incidente"Para entender cuándo y cómo usar este flujo, revisá Inutilizar Numeración.
Estructura del payload
El archivo JSON que pasás a emitir --file es exactamente el mismo cuerpo que envía la API REST. El repositorio incluye sample_factura.json con un caso B2C completo. Para armar otros tipos de documento, ver:
Solución de problemas
| Síntoma | Causa probable | Cómo resolverlo |
|---|---|---|
SIFENDE_API_KEY no configurada | El .env está vacío o no se cargó | Verificá .env en el directorio actual o pasá --api-key |
401 Invalid or expired API key | Key revocada o pegada con espacios | Rotá la credencial desde el panel → Configuración → API Keys |
400 validation-error | Payload mal armado | Corré con --debug y revisá errores en la respuesta |
422 SIFEN 1108 | Timbrado vencido o mal cargado | Renová el timbrado en SET y resincronizá en el panel |
make: command not found | No tenés Make instalado | Usá la forma python sifende.py ... |
Para errores de SIFEN (códigos 1xxx, 2xxx, 3xxx), revisá Rechazos SIFEN.
Recursos
- Repositorio: github.com/ithdev/sifende-cli (código fuente, ejemplos y
CHANGELOG.md) - Issues: reportá bugs o pedí mejoras
- Referencia API: Documentos Electrónicos
- Inicio Rápido: Paso 2: Tu Primera Factura