SIFENDE
Herramientas

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 con python directo)
  • 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-cli

El 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.json

make 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.json

Configuración

La CLI busca tu API key en este orden (gana el primero que la encuentre):

  1. Flag --api-key en la línea de comandos
  2. Variable de entorno SIFENDE_API_KEY
  3. Archivo .env en el directorio actual
  4. Archivo .env en 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

VariableDefault
SIFENDE_API_KEY(requerido)
SIFENDE_BASE_URLhttps://api.sifende.com.py/api/v1/
SIFENDE_TIMEOUT_S30

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ónMakePython
Emitir desde archivomake emitir FILE=factura.jsonpython sifende.py emitir --file factura.json
Emitir interactivomake emitir-ipython sifende.py emitir
Consultar estadomake estado CDC=<cdc>python sifende.py estado <cdc>
Descargar KuDEmake kude CDC=<cdc> OUT=factura.pdfpython sifende.py kude <cdc> --out factura.pdf
Cancelarmake cancelar CDC=<cdc> MOTIVO="..."python sifende.py cancelar <cdc> --motivo "..."
Inutilizarmake 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 HTTPmake debug FILE=factura.jsonpython sifende.py --debug emitir --file factura.json

Flags globales

Estos flags funcionan en todos los comandos:

FlagQué hace
--api-key <key>Pisa la API key resuelta del entorno
--base-url <url>Pisa la URL base de la API
--quietSolo imprime el dato esencial (CDC, estado)
--jsonImprime la respuesta cruda como JSON
--debugTraza 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 descargado

Esto 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.pdf

Ejemplo: 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íntomaCausa probableCómo resolverlo
SIFENDE_API_KEY no configuradaEl .env está vacío o no se cargóVerificá .env en el directorio actual o pasá --api-key
401 Invalid or expired API keyKey revocada o pegada con espaciosRotá la credencial desde el panel → Configuración → API Keys
400 validation-errorPayload mal armadoCorré con --debug y revisá errores en la respuesta
422 SIFEN 1108Timbrado vencido o mal cargadoRenová el timbrado en SET y resincronizá en el panel
make: command not foundNo tenés Make instaladoUsá la forma python sifende.py ...

Para errores de SIFEN (códigos 1xxx, 2xxx, 3xxx), revisá Rechazos SIFEN.

Recursos

On this page