API de Facturación Electrónica
Documentación completa para la integración con SIFEN Paraguay
Inicio Rápido: Formato Plano
La forma más simple de integrar es enviar un raw JSON con claves en mayúsculas al endpoint index.php. Sin estructura compleja, sin conocer todos los códigos internos de SIFEN.
application/json y dejar que el servidor convierta automáticamente al formato experto.Body JSON listo para enviar
[
{
"API_KEY": "TU_API_KEY_AQUI",
"TENANT_ID": "tu_empresa",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "2830501-9",
"RAZON_SOCIAL": "MARCIAL ESTECHE",
"CODIGO": "1",
"DIRECCION": "ITAPUA, ENCARNACION, IRRAZABAL 144",
"CORREO": "[email protected]",
"TELEFONO": "0981123456",
"CONDICION": "CONTADO",
"PLAZO": "",
"PERSONA": "FISICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"FORMATO": "TICKET",
"MONEDA": "USD",
"CAMBIO": 6500,
"ITEMS": [
{ "CODIGO": "1", "DESCRIPCION": "SERVICIO TECNICO", "CANTIDAD": 1, "PRECIO": 25000, "IVA": 10 }
]
}
]
Ejemplos de envío por lenguaje
' Requiere: Proyecto → Referencias → Microsoft WinHTTP Services, version 5.1
Public Function EnviarFactura() As String
Dim http As WinHttp.WinHttpRequest
Dim json As String
' Construir JSON — comillas dobles se escriben dobles dentro del string
json = "[{" & _
"""API_KEY"":""TU_API_KEY_AQUI""," & _
"""TENANT_ID"":""tu_empresa""," & _
"""ESTABLECIMIENTO"":1," & _
"""PUNTO"":1," & _
"""RUC"":""2830501-9""," & _
"""RAZON_SOCIAL"":""MARCIAL ESTECHE""," & _
"""CODIGO"":""1""," & _
"""CORREO"":""[email protected]""," & _
"""TELEFONO"":""0981123456""," & _
"""CONDICION"":""CONTADO""," & _
"""PERSONA"":""FISICA""," & _
"""CONTRIBUYENTE"":""SI""," & _
"""ENTIDAD_DE_GOBIERNO"":""NO""," & _
"""FORMATO"":""TICKET""," & _
"""MONEDA"":""USD""," & _
"""CAMBIO"":6500," & _
"""ITEMS"":[" & _
"{""CODIGO"":""1"",""DESCRIPCION"":""SERVICIO TECNICO""," & _
"""CANTIDAD"":1,""PRECIO"":25000,""IVA"":10}" & _
"]}]"
Set http = New WinHttp.WinHttpRequest
http.Open "POST", "https://oietema.com/fact_elect/index.php", False
http.SetRequestHeader "Content-Type", "application/json; charset=utf-8"
http.Send json
EnviarFactura = http.ResponseText
End Function
Private Sub Command1_Click()
MsgBox EnviarFactura()
End Sub
' ── Si tenés ñ o tildes, usar esta función auxiliar y enviar así:
' http.Send ToUtf8Bytes(json)
Public Function ToUtf8Bytes(ByVal s As String) As Byte()
Dim ado As Object
Set ado = CreateObject("ADODB.Stream")
ado.Type = 2 : ado.Charset = "utf-8" : ado.Open
ado.WriteText s
ado.Position = 0 : ado.Type = 1 : ado.Position = 3
ToUtf8Bytes = ado.Read
ado.Close
End Function
curl -X POST "https://oietema.com/fact_elect/index.php" \
-H "Content-Type: application/json" \
-d '[
{
"API_KEY": "TU_API_KEY_AQUI",
"TENANT_ID": "tu_empresa",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "2830501-9",
"RAZON_SOCIAL": "MARCIAL ESTECHE",
"CODIGO": "1",
"DIRECCION": "ITAPUA, ENCARNACION, IRRAZABAL 144",
"CORREO": "[email protected]",
"TELEFONO": "0981123456",
"CONDICION": "CONTADO",
"PLAZO": "",
"PERSONA": "FISICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"FORMATO": "TICKET",
"MONEDA": "USD",
"CAMBIO": 6500,
"ITEMS": [
{ "CODIGO": "1", "DESCRIPCION": "SERVICIO TECNICO", "CANTIDAD": 1, "PRECIO": 25000, "IVA": 10 }
]
}
]'
const payload = [
{
API_KEY: "TU_API_KEY_AQUI",
TENANT_ID: "cnid",
ESTABLECIMIENTO: 1,
PUNTO: 1,
RUC: "2830501-9",
RAZON_SOCIAL: "MARCIAL ESTECHE",
CODIGO: "1",
DIRECCION: "ITAPUA, ENCARNACION, IRRAZABAL 144",
CORREO: "[email protected]",
TELEFONO: "0981123456",
CONDICION: "CONTADO",
PLAZO: "",
PERSONA: "FISICA",
CONTRIBUYENTE: "SI",
ENTIDAD_DE_GOBIERNO: "NO",
FORMATO: "TICKET",
MONEDA: "USD",
CAMBIO: 6500,
ITEMS: [
{ CODIGO: "1", DESCRIPCION: "SERVICIO TECNICO", CANTIDAD: 1, PRECIO: 25000, IVA: 10 }
]
}
];
const resp = await fetch("https://oietema.com/fact_elect/index.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
const texto = await resp.text();
console.log(texto);
import requests
url = "https://oietema.com/fact_elect/index.php"
payload = [
{
"API_KEY": "TU_API_KEY_AQUI",
"TENANT_ID": "tu_empresa",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "2830501-9",
"RAZON_SOCIAL": "MARCIAL ESTECHE",
"CODIGO": "1",
"DIRECCION": "ITAPUA, ENCARNACION, IRRAZABAL 144",
"CORREO": "[email protected]",
"TELEFONO": "0981123456",
"CONDICION": "CONTADO",
"PLAZO": "",
"PERSONA": "FISICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"FORMATO": "TICKET",
"MONEDA": "USD",
"CAMBIO": 6500,
"ITEMS": [
{"CODIGO": "1", "DESCRIPCION": "SERVICIO TECNICO", "CANTIDAD": 1, "PRECIO": 25000, "IVA": 10}
]
}
]
r = requests.post(url, json=payload, timeout=30)
print(r.text)
* Requiere: COM → WinHttp.WinHttpRequest
LOCAL oHttp, cUrl, cJson, cResp
cUrl = "https://oietema.com/fact_elect/index.php"
cJson = '[{' + CHR(13)+CHR(10) + ;
' "API_KEY":"TU_API_KEY_AQUI",' + ;
' "TENANT_ID":"tu_empresa",' + ;
' "ESTABLECIMIENTO":1,' + ;
' "PUNTO":1,' + ;
' "RUC":"2830501-9",' + ;
' "RAZON_SOCIAL":"MARCIAL ESTECHE",' + ;
' "CODIGO":"1",' + ;
' "CORREO":"[email protected]",' + ;
' "TELEFONO":"0981123456",' + ;
' "CONDICION":"CONTADO",' + ;
' "PERSONA":"FISICA",' + ;
' "CONTRIBUYENTE":"SI",' + ;
' "ENTIDAD_DE_GOBIERNO":"NO",' + ;
' "ITEMS":[' + ;
' {"CODIGO":"1","DESCRIPCION":"SERVICIO TECNICO",' + ;
' "CANTIDAD":1,"PRECIO":25000,"IVA":10}' + ;
' ]' + ;
'}]'
oHttp = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
oHttp.Open("POST", cUrl, .F.)
oHttp.SetRequestHeader("Content-Type", "application/json; charset=utf-8")
oHttp.Send(cJson)
cResp = oHttp.ResponseText
MESSAGEBOX(cResp, 0, "Respuesta SIFEN")
uses
IdHTTP, IdSSLOpenSSL, SysUtils;
function EnviarFactura: string;
var
Http: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Body: TStringStream;
Json: string;
begin
Json :=
'[{' +
'"API_KEY":"TU_API_KEY_AQUI",' +
'"TENANT_ID":"tu_empresa",' +
'"ESTABLECIMIENTO":1,' +
'"PUNTO":1,' +
'"RUC":"2830501-9",' +
'"RAZON_SOCIAL":"MARCIAL ESTECHE",' +
'"CODIGO":"1",' +
'"CORREO":"[email protected]",' +
'"TELEFONO":"0981123456",' +
'"CONDICION":"CONTADO",' +
'"PERSONA":"FISICA",' +
'"CONTRIBUYENTE":"SI",' +
'"ENTIDAD_DE_GOBIERNO":"NO",' +
'"ITEMS":[' +
' {"CODIGO":"1","DESCRIPCION":"SERVICIO TECNICO",' +
' "CANTIDAD":1,"PRECIO":25000,"IVA":10}' +
']}]';
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Http := TIdHTTP.Create(nil);
try
Http.IOHandler := SSL;
Http.Request.ContentType := 'application/json; charset=utf-8';
Body := TStringStream.Create(Json, TEncoding.UTF8);
try
Result := Http.Post('https://oietema.com/fact_elect/index.php', Body);
finally
Body.Free;
end;
finally
Http.Free;
SSL.Free;
end;
end;
// Llamada:
// ShowMessage(EnviarFactura);
libssl-3.dll / libeay32.dll) en la carpeta del ejecutable para HTTPS.<?php
$url = "https://oietema.com/fact_elect/index.php";
$payload = [
[
"API_KEY" => "TU_API_KEY_AQUI",
"TENANT_ID" => "cnid",
"ESTABLECIMIENTO" => 1,
"PUNTO" => 1,
"RUC" => "2830501-9",
"RAZON_SOCIAL" => "MARCIAL ESTECHE",
"CODIGO" => "1",
"DIRECCION" => "ITAPUA, ENCARNACION, IRRAZABAL 144",
"CORREO" => "[email protected]",
"TELEFONO" => "0981123456",
"CONDICION" => "CONTADO",
"PLAZO" => "",
"PERSONA" => "FISICA",
"CONTRIBUYENTE" => "SI",
"ENTIDAD_DE_GOBIERNO" => "NO",
"ITEMS" => [
["CODIGO" => "1", "DESCRIPCION" => "SERVICIO TECNICO", "CANTIDAD" => 1, "PRECIO" => 25000, "IVA" => 10]
]
]
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$respuesta = curl_exec($ch);
curl_close($ch);
echo $respuesta;
using System.Net.Http;
using System.Text;
var url = "https://oietema.com/fact_elect/index.php";
var json = """
[
{
"API_KEY": "TU_API_KEY_AQUI",
"TENANT_ID": "tu_empresa",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "2830501-9",
"RAZON_SOCIAL": "MARCIAL ESTECHE",
"CODIGO": "1",
"DIRECCION": "ITAPUA, ENCARNACION, IRRAZABAL 144",
"CORREO": "[email protected]",
"TELEFONO": "0981123456",
"CONDICION": "CONTADO",
"PLAZO": "",
"PERSONA": "FISICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"ITEMS": [
{ "CODIGO": "1", "DESCRIPCION": "SERVICIO TECNICO", "CANTIDAD": 1, "PRECIO": 25000, "IVA": 10 }
]
}
]
""";
using var http = new HttpClient();
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var resp = await http.PostAsync(url, content);
var texto = await resp.Content.ReadAsStringAsync();
Console.WriteLine(texto);
Formato Plano (Simplificado)
El formato plano es una alternativa al JSON experto diseñada para integradores simples (VB6, sistemas legados, etc.) que no necesitan conocer los códigos internos de SIFEN. Solo hay un tipo de entrada: JSON con claves en mayúsculas.
data incluyendo credenciales, sin necesidad de parámetros POST adicionales (apiKey, tenantId, tenantPunto, cliente, email).Envío desde Postman / cURL / VB6
Enviar el body como raw JSON (Content-Type: application/json). No se necesitan campos de formulario adicionales.
Campos disponibles
| Campo | Tipo | Obligatorio | Valores aceptados | Notas |
|---|---|---|---|---|
API_KEY | string | ✅ | Tu clave de API | Puede venir en el JSON o en el POST field apiKey |
TENANT_ID | string | ✅ | ej: oietema | Identificador de la empresa |
ESTABLECIMIENTO | número | ✅ | 1, 2… | Puede reemplazarse con TENANT_PUNTO ej: "001-001" |
PUNTO | número | ✅ | 1, 2… | Punto de expedición |
RUC | string | ✅ | "2830501-9", cédula, "XX" | Con o sin DV. XX para venta innominada |
RAZON_SOCIAL | string | ✅ | Nombre completo | |
PERSONA | string | ✅ | FISICA / JURIDICA | Ignora acentos y mayúsculas |
CONTRIBUYENTE | string | ✅ | SI / NO | ¿Tiene RUC activo en SIFEN? |
ENTIDAD_DE_GOBIERNO | string | Opcional | SI / NO | Solo aplica a personas jurídicas. Nunca con FISICA. Default: NO |
CONDICION | string | ✅ | CONTADO / CREDITO | |
PLAZO | string | Condicional | "30 dias", "60 dias" | Requerido si CONDICION=CREDITO |
CODIGO | string | Opcional | Código interno del cliente | |
DIRECCION | string | Opcional | Texto libre | Se concilia automáticamente contra la BD de lugares |
CORREO / EMAIL | string | Opcional | Email válido | Para envío del KUDE al cliente |
TELEFONO / CELULAR | string | Opcional | Solo dígitos, opcional + al inicio. Long. 6–15 | Teléfono del receptor para notificaciones (WhatsApp/SMS). Caracteres no numéricos se eliminan automáticamente. |
DOCUMENTO_ASOCIADO | string | Opcional | FACTURA / NOTA DE REMISION | Documento al que referencia esta factura |
FORMATO | string | Opcional | TICKET / A4 | Formato del KUDE PDF. TICKET = 80 mm para impresoras térmicas. Si se omite, se genera A4. |
MONEDA | string | Opcional | USD | Si se omite o tiene otro valor, se factura en PYG (Guaraní) por defecto. Usar USD para facturar en dólares. |
CAMBIO | número | Condicional | ej: 6500 | Tipo de cambio (1 USD = X PYG). Requerido cuando MONEDA=USD. Debe ser mayor a 0. |
ITEMS | array | ✅ | Ver tabla de items | Al menos un elemento |
Campos de cada item en ITEMS[]
| Campo | Tipo | Obligatorio | Notas |
|---|---|---|---|
CODIGO | string/número | Opcional | Si es numérico se rellena con ceros hasta 7 dígitos (1 → 0000001). Si falta se genera automáticamente. |
DESCRIPCION | string | ✅ | Descripción del producto o servicio |
CANTIDAD | número | ✅ | Debe ser mayor a 0 |
PRECIO | número | ✅ | Precio unitario. Puede ser 0. |
IVA | número | Opcional | 0 = Exento, 5 = 5%, 10 = 10%. Default: 10 |
IVA: 0 se interpreta siempre como Exento. No hay distinción entre exento y exonerado en el formato plano.Ejemplos JSON completos
Contado · Persona Física · Contribuyente
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "2830501-9",
"RAZON_SOCIAL": "MARCIAL ESTECHE",
"CODIGO": "1",
"DIRECCION": "CENTRAL, ASUNCION, CALLE SAN BLAZ 1250",
"CORREO": "[email protected]",
"TELEFONO": "0981123456",
"CONDICION": "CONTADO",
"PERSONA": "FISICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"ITEMS": [
{ "CODIGO": "1", "DESCRIPCION": "PEPINO EL KILO", "CANTIDAD": 100, "PRECIO": 5000, "IVA": 5 },
{ "CODIGO": "2", "DESCRIPCION": "HARINA EL KILO", "CANTIDAD": 10, "PRECIO": 9000, "IVA": 10 },
{ "CODIGO": "3", "DESCRIPCION": "AYUDA COMUNITARIA", "CANTIDAD": 1, "PRECIO": 50000, "IVA": 0 }
]
}]
Crédito · Persona Jurídica · Contribuyente
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "80029277-4",
"RAZON_SOCIAL": "EMPRESA EJEMPLO S.A.",
"CORREO": "[email protected]",
"TELEFONO": "0981123456",
"CONDICION": "CREDITO",
"PLAZO": "30 dias",
"PERSONA": "JURIDICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"ITEMS": [
{ "CODIGO": "1", "DESCRIPCION": "SERVICIO MENSUAL", "CANTIDAD": 1, "PRECIO": 500000, "IVA": 10 }
]
}]
Entidad de Gobierno · Crédito
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "11001001-0",
"RAZON_SOCIAL": "MUNICIPALIDAD DE ASUNCION",
"CONDICION": "CREDITO",
"PLAZO": "60 dias",
"PERSONA": "JURIDICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "SI",
"ITEMS": [
{ "CODIGO": "1", "DESCRIPCION": "MATERIALES DE CONSTRUCCION", "CANTIDAD": 10, "PRECIO": 200000, "IVA": 10 }
]
}]
No contribuyente · Venta innominada (XX)
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "XX",
"RAZON_SOCIAL": "Sin Nombre",
"CONDICION": "CONTADO",
"PERSONA": "FISICA",
"CONTRIBUYENTE": "NO",
"ITEMS": [
{ "DESCRIPCION": "VARIOS", "CANTIDAD": 1, "PRECIO": 15000, "IVA": 10 }
]
}]
Ejemplo VB6 (raw JSON)
WinHttp.WinHttpRequest. No se usan campos de formulario. Requiere referencia: Microsoft WinHTTP Services, version 5.1.' Requiere: Proyecto → Referencias → Microsoft WinHTTP Services, version 5.1
Public Function EnviarFacturaPlana() As String
Dim http As WinHttp.WinHttpRequest
Dim json As String
Dim url As String
url = "https://oietema.com/fact_elect/index.php"
' Construir JSON. Las comillas dobles dentro de VB6 se escriben como ""
json = "[{" & _
"\"API_KEY\":\"TU_API_KEY\"," & _
"\"TENANT_ID\":\"oietema\"," & _
"\"ESTABLECIMIENTO\":1," & _
"\"PUNTO\":1," & _
"\"RUC\":\"2830501-9\"," & _
"\"RAZON_SOCIAL\":\"MARCIAL ESTECHE\"," & _
"\"CONDICION\":\"CONTADO\"," & _
"\"PERSONA\":\"FISICA\"," & _
"\"CONTRIBUYENTE\":\"SI\"," & _
"\"ENTIDAD_DE_GOBIERNO\":\"NO\"," & _
"\"ITEMS\":[" & _
"{\"CODIGO\":\"1\",\"DESCRIPCION\":\"PEPINO EL KILO\",\"CANTIDAD\":100,\"PRECIO\":5000,\"IVA\":5}," & _
"{\"CODIGO\":\"2\",\"DESCRIPCION\":\"HARINA EL KILO\",\"CANTIDAD\":10,\"PRECIO\":9000,\"IVA\":10}" & _
"]" & _
"}]"
Set http = New WinHttp.WinHttpRequest
http.Open "POST", url, False
http.SetRequestHeader "Content-Type", "application/json; charset=utf-8"
http.Send json
EnviarFacturaPlana = http.ResponseText
End Function
' Uso:
Private Sub Command1_Click()
MsgBox EnviarFacturaPlana()
End Sub
ToUtf8Bytes() para convertir el string antes de enviarlo y evitar corrupciones de codificación.
Función auxiliar UTF-8 para VB6:
Public Function ToUtf8Bytes(ByVal s As String) As Byte()
Dim ado As Object
Set ado = CreateObject("ADODB.Stream")
ado.Type = 2 : ado.Charset = "utf-8" : ado.Open
ado.WriteText s
ado.Position = 0 : ado.Type = 1 : ado.Position = 3
ToUtf8Bytes = ado.Read
ado.Close
End Function
' Luego: http.Send ToUtf8Bytes(json)
Mensajes de error del formato plano
Si la validación falla, la respuesta es texto plano con el listado de errores. Ningún número de factura se consume si hay errores de validación.
ERROR en los datos enviados (formato plano):
- CONDICION=CREDITO requiere el campo PLAZO (ej.: "30 dias", "60 dias").
Corrija los datos y reintente. Ningún documento fue enviado a SIFEN.
ERROR en los datos enviados (formato plano):
- Una PERSONA FISICA no puede ser ENTIDAD DE GOBIERNO. Verifique los datos.
Corrija los datos y reintente. Ningún documento fue enviado a SIFEN.
Si SIFEN devuelve un error tras la emisión, se muestra el mensaje de SIFEN al integrador y se registra en la carpeta /bug/ del servidor con el contexto completo (tenant, número, CDC, JSON enviado, XML generado) para diagnóstico posterior.
Tabla de reglas cruzadas
| PERSONA | CONTRIBUYENTE | ENTIDAD_DE_GOBIERNO | iTiOpe generado | Válido |
|---|---|---|---|---|
| FISICA | SI | NO | 1 (B2B) | ✅ |
| FISICA | NO | NO | 2 (B2C) | ✅ |
| FISICA | SI / NO | SI | — | ❌ Error: persona física no puede ser entidad de gobierno |
| JURIDICA | SI | NO | 1 (B2B) | ✅ |
| JURIDICA | SI | SI | 3 (B2G) | ✅ |
| JURIDICA | NO | SI | — | ❌ Error: entidad de gobierno debe ser contribuyente |
| cualquiera | NO | NO | 2 (B2C) | ✅ |
Información General
- URL Base
https://tu-dominio.com/fact_elect/- Método
- POST
- Content-Type
application/json(recomendado) oapplication/x-www-form-urlencoded- Autenticación
- API Key por empresa
Endpoints Disponibles
1. Emisión de Factura Electrónica
Parámetros POST (form-data)
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
apiKey |
string | ✅ | Clave API de la empresa |
tenantId |
string | ✅ | Identificador del tenant/empresa (ej: puchi) |
tenantPunto |
string | Condicional | Establecimiento-Punto de expedición (ej: 001-001). Puede omitirse si data[0].establecimiento y data[0].punto vienen dentro del JSON. |
cliente |
string | Condicional | Nombre del cliente. Puede omitirse si viene en data[0].cliente.razonSocial. |
email |
string | Condicional | Email del cliente (para envío del KUDE). Puede omitirse si viene en data[0].cliente.email. |
data |
string (JSON) | ✅ | Datos de la factura en formato JSON (ver estructura abajo) |
tenantPunto, cliente y email son condicionales: son requeridos sólo si no están presentes dentro del JSON data. Esto permite integrar sistemas que ya envían todos los datos en el JSON sin necesidad de duplicarlos en los parámetros POST.
Respuesta
Texto plano con formato:
Cliente: NOMBRE DEL CLIENTE
Estado: ok
Mensaje: Factura creada exitosamente...
NUM: 59-CDC: 01042287731001001000005912026041314432884104
Cliente: NOMBRE DEL CLIENTE
Estado: error
Mensaje: Error de SIFEN: [descripción del error]
NUM: 59-CDC: No disponible
2. Estructura del JSON (data)
El campo data es un array JSON con un solo elemento [{...}].
Ejemplo: Cliente Contribuyente (B2B)
[
{
"tipoDocumento": 1,
"tipoTransaccion": 1,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "80000004-2",
"razonSocial": "EMPRESA IMPORTADORA S.A.",
"tipoContribuyente": 2,
"tipoOperacion": 1,
"direccion": "AV. MARISCAL LOPEZ 1234",
"numeroCasa": "1234",
"departamento": 11,
"departamentoDescripcion": "CENTRAL",
"distrito": 1,
"distritoDescripcion": "ASUNCION (DISTRITO)",
"ciudad": 1,
"ciudadDescripcion": "ASUNCION (DISTRITO)",
"telefono": "021555123",
"email": "[email protected]",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"codigo": "CLI001"
},
"items": [
{
"codigo": "0000001",
"descripcion": "Jabón en Pan Cuñataí 180g",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 1986,
"iva": 5,
"ivaTipo": 1,
"ivaBase": 100
},
{
"codigo": "0000002",
"descripcion": "Arroz Paquete 1Kg",
"unidadMedida": 77,
"cantidad": 3,
"precioUnitario": 8500,
"iva": 10,
"ivaTipo": 1,
"ivaBase": 100
}
],
"condicion": {
"tipo": 1,
"entregas": [
{
"tipo": 1,
"monto": 29472,
"moneda": "PYG",
"monedaDescripcion": "Guarani"
}
]
},
"factura": {
"presencia": 1
}
}
]
Ejemplo: Cliente No Contribuyente (B2C)
[
{
"tipoDocumento": 1,
"tipoTransaccion": 1,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": false,
"tipoOperacion": 2,
"documentoTipo": 1,
"documentoNumero": "3456789",
"razonSocial": "HECTOR ANTONIO BENITEZ VALDEZ",
"direccion": "CALLE PRINCIPAL C/ SEGUNDA",
"numeroCasa": "456",
"departamento": 8,
"departamentoDescripcion": "ITAPUA",
"distrito": 89,
"distritoDescripcion": "CAMBYRETA",
"ciudad": 2600,
"ciudadDescripcion": "CAMBYRETA",
"telefono": "0975123456",
"email": "[email protected]",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"codigo": "00180"
},
"items": [
{
"codigo": "0000001",
"descripcion": "Jabón en Pan Cuñataí 180g",
"unidadMedida": 77,
"cantidad": 1,
"precioUnitario": 1986,
"iva": 5,
"ivaTipo": 1,
"ivaBase": 100
},
{
"codigo": "0000002",
"descripcion": "Jabón en Pan Cuñataí 270g",
"unidadMedida": 77,
"cantidad": 1,
"precioUnitario": 2900,
"iva": 0,
"ivaTipo": 1,
"ivaBase": 100
},
{
"codigo": "0000003",
"descripcion": "Bandera Paraguaya C/Mastil",
"unidadMedida": 77,
"cantidad": 1,
"precioUnitario": 8500,
"iva": 10,
"ivaTipo": 1,
"ivaBase": 100
}
],
"condicion": {
"tipo": 1,
"entregas": [
{
"tipo": 1,
"monto": 13386,
"moneda": "PYG",
"monedaDescripcion": "Guarani"
}
]
},
"factura": {
"presencia": 1
}
}
]
documentoTipo + documentoNumero en lugar de ruc. El tipoOperacion debe ser 2 (B2C).Ejemplo: Venta a Crédito
[
{
"tipoDocumento": 1,
"tipoTransaccion": 1,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "80000004-2",
"razonSocial": "EMPRESA IMPORTADORA S.A.",
"tipoContribuyente": 2,
"tipoOperacion": 1,
"direccion": "AV. MARISCAL LOPEZ 1234",
"numeroCasa": "1234",
"departamento": 11,
"departamentoDescripcion": "CENTRAL",
"distrito": 1,
"distritoDescripcion": "ASUNCION (DISTRITO)",
"ciudad": 1,
"ciudadDescripcion": "ASUNCION (DISTRITO)",
"email": "[email protected]",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"codigo": "CLI001"
},
"items": [
{
"codigo": "0000001",
"descripcion": "Producto Ejemplo",
"unidadMedida": 77,
"cantidad": 10,
"precioUnitario": 50000,
"iva": 10,
"ivaTipo": 1,
"ivaBase": 100
}
],
"condicion": {
"tipo": 2,
"credito": {
"tipo": 1,
"plazo": "30 días",
"cuotas": 1,
"infoCuotas": [
{
"moneda": "PYG",
"monedaDescripcion": "Guarani",
"monto": 500000,
"vencimiento": "2026-05-13"
}
]
}
},
"factura": {
"presencia": 1
}
}
]
Ejemplos prácticos por tipo de cliente y condición de pago
Los siguientes ejemplos reflejan los casos reales de uso. La diferencia clave entre ellos está en los campos contribuyente, tipoContribuyente, tipoOperacion y la sección condicion.
contribuyente: false · tipoOperacion: 2 (B2C) · tipoContribuyente: 0 · identificar con documentoTipo: 1 (Cédula) y documentoNumero[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:20:49",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": false,
"ruc": "2830501",
"razonSocial": "MARCIAL ESTECHE",
"nombreFantasia": "MARCIAL ESTECHE",
"tipoOperacion": 2,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 0,
"documentoTipo": 1,
"documentoNumero": "2830501",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 1,
"entregas": [{
"tipo": 1,
"monto": "22400",
"moneda": "PYG",
"monedaDescripcion": "Guarani",
"cambio": 0
}]
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]contribuyente: true · tipoOperacion: 1 (B2B) · tipoContribuyente: 1 (Unipersonal) · documentoTipo: 0 (RUC) · condicion.tipo: 1 (Contado)[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:21:19",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "2830501-9",
"razonSocial": "MARCIAL ESTECHE",
"nombreFantasia": "MARCIAL ESTECHE",
"tipoOperacion": 1,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 1,
"documentoTipo": 0,
"documentoNumero": "2830501-9",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 1,
"entregas": [{
"tipo": 1,
"monto": "22400",
"moneda": "PYG",
"monedaDescripcion": "Guarani",
"cambio": 0
}]
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]contribuyente: true · tipoContribuyente: 1 (Unipersonal) · condicion.tipo: 2 (Crédito) · el nodo credito reemplaza a entregas[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:21:39",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "2830501-9",
"razonSocial": "MARCIAL ESTECHE",
"nombreFantasia": "MARCIAL ESTECHE",
"tipoOperacion": 1,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 1,
"documentoTipo": 0,
"documentoNumero": "2830501-9",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 2,
"credito": {
"tipo": 1,
"plazo": "30"
}
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]contribuyente: true · tipoOperacion: 1 (B2B) · tipoContribuyente: 2 (Persona Jurídica) · condicion.tipo: 1 (Contado)[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:22:19",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "2830501-9",
"razonSocial": "MARCIAL ESTECHE S.A.",
"nombreFantasia": "MARCIAL ESTECHE S.A.",
"tipoOperacion": 1,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 2,
"documentoTipo": 0,
"documentoNumero": "2830501-9",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 1,
"entregas": [{
"tipo": 1,
"monto": "22400",
"moneda": "PYG",
"monedaDescripcion": "Guarani",
"cambio": 0
}]
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]contribuyente: true · tipoContribuyente: 2 (Persona Jurídica) · condicion.tipo: 2 (Crédito)[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:22:38",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "2830501-9",
"razonSocial": "MARCIAL ESTECHE S.A.",
"nombreFantasia": "MARCIAL ESTECHE S.A.",
"tipoOperacion": 1,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 2,
"documentoTipo": 0,
"documentoNumero": "2830501-9",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 2,
"credito": {
"tipo": 1,
"plazo": "30"
}
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]contribuyente: true · tipoOperacion: 3 (B2G — Entidad de Gobierno) · tipoContribuyente: 2 · condicion.tipo: 1 (Contado)[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:23:01",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "2830501-9",
"razonSocial": "MINISTERIO DE HACIENDA",
"nombreFantasia": "MINISTERIO DE HACIENDA",
"tipoOperacion": 3,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 2,
"documentoTipo": 0,
"documentoNumero": "2830501-9",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 1,
"entregas": [{
"tipo": 1,
"monto": "22400",
"moneda": "PYG",
"monedaDescripcion": "Guarani",
"cambio": 0
}]
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]contribuyente: true · tipoOperacion: 3 (B2G) · tipoContribuyente: 2 · condicion.tipo: 2 (Crédito)[{
"tipoDocumento": 1,
"establecimiento": 1,
"punto": "1",
"numero": 12,
"descripcion": "Aparece en el documento",
"observacion": "...",
"fecha": "2026-04-22T10:23:22",
"tipoEmision": 1,
"tipoTransaccion": 3,
"tipoImpuesto": 1,
"moneda": "PYG",
"cliente": {
"contribuyente": true,
"ruc": "2830501-9",
"razonSocial": "MINISTERIO DE HACIENDA",
"nombreFantasia": "MINISTERIO DE HACIENDA",
"tipoOperacion": 3,
"direccion": "Itapua, Encarnacion, 14 de mayo 1500",
"numeroCasa": "",
"departamento": 0,
"departamentoDescripcion": "",
"distrito": 0,
"distritoDescripcion": "",
"ciudad": 0,
"ciudadDescripcion": "",
"pais": "PRY",
"paisDescripcion": "Paraguay",
"tipoContribuyente": 2,
"documentoTipo": 0,
"documentoNumero": "2830501-9",
"telefono": "0994850808",
"celular": "0994850808",
"email": "[email protected]",
"codigo": "0001"
},
"usuario": {
"documentoTipo": 1,
"documentoNumero": "",
"nombre": "",
"cargo": "Vendedor"
},
"factura": { "presencia": 1 },
"condicion": {
"tipo": 2,
"credito": {
"tipo": 1,
"plazo": "30"
}
},
"items": [{
"codigo": "0000001",
"descripcion": "Martillo",
"unidadMedida": 77,
"cantidad": 2,
"precioUnitario": 11200.00,
"ivaTipo": 1,
"ivaBase": 100,
"iva": 10
}]
}]3. Referencia de Campos
Objeto cliente
| Campo | Tipo | Obligatorio | Descripción | Valores |
|---|---|---|---|---|
contribuyente |
boolean | ✅ | ¿Es contribuyente? | true / false |
ruc |
string | Solo contribuyente | RUC con dígito verificador | "80000004-2" |
tipoContribuyente |
integer | Solo contribuyente | Tipo de contribuyente | 1=Persona Física, 2=Persona Jurídica |
tipoOperacion |
integer | ✅ | Tipo de operación | 1=B2B, 2=B2C, 3=B2G, 4=B2F |
documentoTipo |
integer | Solo no contribuyente | Tipo de documento de identidad | Ver tabla abajo |
documentoNumero |
string | Solo no contribuyente | Número de documento | "3456789" |
razonSocial |
string | ✅ | Nombre o razón social del cliente | |
direccion |
string | ✅ | Dirección del cliente | |
numeroCasa |
string | Recomendado | Número de casa | "1234", "0" si no aplica |
departamento |
integer | Recomendado | Código de departamento SIFEN | Ver tabla de departamentos |
departamentoDescripcion |
string | Recomendado | Nombre del departamento | "ITAPUA", "CENTRAL" |
distrito |
integer | Recomendado | Código de distrito SIFEN | |
distritoDescripcion |
string | Recomendado | Nombre del distrito | |
ciudad |
integer | Recomendado | Código de ciudad SIFEN | |
ciudadDescripcion |
string | Recomendado | Nombre de la ciudad | |
telefono |
string | Opcional | Teléfono | |
email |
string | Recomendado | Email del receptor | |
pais |
string | Opcional | Código ISO país | "PRY" (defecto) |
paisDescripcion |
string | Opcional | Nombre del país | "Paraguay" (defecto) |
codigo |
string | Opcional | Código interno de cliente (VB6) | "00180" |
Tipos de Documento de Identidad (documentoTipo)
| Código | Descripción |
|---|---|
1 | Cédula paraguaya |
2 | Pasaporte |
3 | Cédula extranjera |
4 | Carnet de residencia |
5 | Innominado (ventas menores) |
9 | Otro |
Reglas Importantes del Cliente
contribuyente: true): Requiere ruc, tipoContribuyente y tipoOperacion: 1 (B2B).No contribuyente (
contribuyente: false): Requiere documentoTipo, documentoNumero y tipoOperacion: 2 (B2C). No enviar ruc.Si se omite
departamento/distrito/ciudad, el servidor intenta autocompletar a partir de direccion.
Objeto items[]
| Campo | Tipo | Obligatorio | Descripción | Valores |
|---|---|---|---|---|
codigo |
string | ✅ | Código interno del producto | "0000001" |
descripcion |
string | ✅ | Descripción del producto/servicio | |
unidadMedida |
integer | Recomendado | Código unidad de medida SIFEN | 77=Unidad (defecto) |
cantidad |
number | ✅ | Cantidad vendida | |
precioUnitario |
number | ✅ | Precio unitario con IVA incluido | |
iva |
number | ✅ | Tasa de IVA | 0, 5 o 10 |
ivaTipo |
integer | ✅ | Tipo de afectación IVA | 1=Gravado, 2=Exonerado, 3=Exento |
ivaBase |
number | Recomendado | Proporción gravada (%) | 100 (defecto) |
Reglas del IVA
| Escenario | iva |
ivaTipo |
ivaBase |
Resultado SIFEN |
|---|---|---|---|---|
| Gravado 10% | 10 |
1 |
100 |
IVA 10% sobre el total |
| Gravado 5% | 5 |
1 |
100 |
IVA 5% sobre el total |
| Exento | 0 |
1 |
100 |
Se convierte a Exento (afecIVA=3) |
| Exonerado | 0 |
2 |
0 |
Exonerado - Art. 100 Ley 6380/2019 |
| Parcialmente gravado | 10 |
1 |
60 |
60% gravado al 10%, 40% exento |
precioUnitario siempre es con IVA incluido. El servidor calcula automáticamente la base gravada y la liquidación de IVA según las fórmulas NT13 del SIFEN.Objeto condicion
| Campo | Tipo | Obligatorio | Descripción | Valores |
|---|---|---|---|---|
tipo |
integer | ✅ | Tipo de condición | 1=Contado, 2=Crédito |
entregas |
array | Solo contado | Detalle de pagos | Ver abajo |
credito |
object | Solo crédito | Datos del crédito | Ver abajo |
Entregas (pagos en contado)
| Campo | Tipo | Obligatorio | Descripción | Valores |
|---|---|---|---|---|
tipo |
integer | ✅ | Forma de pago | 1=Efectivo, 2=Cheque, 3=Tarjeta crédito, 4=Tarjeta débito |
monto |
number | ✅ | Monto del pago | Si es 0, se completa automáticamente con el total |
moneda |
string | Opcional | Moneda | "PYG" (defecto) |
monedaDescripcion |
string | Opcional | Descripción moneda | "Guarani" (defecto) |
Crédito
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
tipo |
integer | ✅ | 1=Plazo, 2=Cuota |
plazo |
string | ✅ | Descripción del plazo ("30 días") |
cuotas |
integer | Si tipo=2 | Cantidad de cuotas |
infoCuotas |
array | Si tipo=2 | Detalle de cada cuota |
Objeto factura
| Campo | Tipo | Obligatorio | Descripción | Valores |
|---|---|---|---|---|
presencia |
integer | Opcional | Indicador de presencia | 1=Presencial (defecto), 2=No presencial, 3=Internet, 9=No corresponde |
4. Ejemplo de Envío desde VB6
' ============================================
' Ejemplo de envío de Factura Electrónica
' desde Visual Basic 6 (VB6)
' ============================================
Private Sub EnviarFactura()
Dim http As New MSXML2.XMLHTTP60
Dim url As String
Dim postData As String
Dim jsonData As String
url = "https://tu-dominio.com/fact_elect/index.php"
' Construir el JSON con los datos de la factura
jsonData = "[{" & _
"""tipoDocumento"":1," & _
"""tipoTransaccion"":1," & _
"""tipoImpuesto"":1," & _
"""moneda"":""PYG""," & _
"""cliente"":{" & _
"""contribuyente"":true," & _
"""ruc"":""80000004-2""," & _
"""razonSocial"":""EMPRESA IMPORTADORA S.A.""," & _
"""tipoContribuyente"":2," & _
"""tipoOperacion"":1," & _
"""direccion"":""AV. MARISCAL LOPEZ 1234""," & _
"""numeroCasa"":""1234""," & _
"""departamento"":11," & _
"""departamentoDescripcion"":""CENTRAL""," & _
"""distrito"":1," & _
"""distritoDescripcion"":""ASUNCION (DISTRITO)""," & _
"""ciudad"":1," & _
"""ciudadDescripcion"":""ASUNCION (DISTRITO)""," & _
"""email"":""[email protected]""," & _
"""pais"":""PRY""," & _
"""paisDescripcion"":""Paraguay""," & _
"""codigo"":""CLI001""" & _
"}," & _
"""items"":[" & _
"{""codigo"":""0000001""," & _
"""descripcion"":""Producto Ejemplo""," & _
"""unidadMedida"":77," & _
"""cantidad"":2," & _
"""precioUnitario"":15000," & _
"""iva"":10," & _
"""ivaTipo"":1," & _
"""ivaBase"":100}" & _
"]," & _
"""condicion"":{""tipo"":1,""entregas"":[{""tipo"":1,""monto"":30000,""moneda"":""PYG"",""monedaDescripcion"":""Guarani""}]}," & _
"""factura"":{""presencia"":1}" & _
"}]"
' Construir datos POST
postData = "apiKey=" & API_KEY & _
"&tenantId=" & TENANT_ID & _
"&tenantPunto=001-001" & _
"&cliente=" & UrlEncode("EMPRESA IMPORTADORA S.A.") & _
"&email=" & UrlEncode("[email protected]") & _
"&data=" & UrlEncode(jsonData)
' Enviar POST
http.Open "POST", url, False
http.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.send postData
' Procesar respuesta
Dim respuesta As String
respuesta = http.responseText
' Parsear respuesta
' Formato: "Cliente: ...\nEstado: ok\nMensaje: ...\nNUM: 59-CDC: 0104..."
If InStr(respuesta, "Estado: ok") > 0 Then
MsgBox "Factura enviada correctamente"
' Extraer CDC para consultas posteriores
Dim cdc As String
cdc = Mid(respuesta, InStr(respuesta, "CDC: ") + 5)
Else
MsgBox "Error: " & respuesta
End If
End Sub
5. Cancelación de Factura Electrónica
Permite cancelar una factura previamente emitida enviando el evento de cancelación a SIFEN.
Parámetros POST
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
apiKey |
string | ✅ | Clave API de la empresa |
tenantId |
string | ✅ | Identificador del tenant (ej: puchi) |
cdc |
string | ✅ | CDC de 44 dígitos de la factura a cancelar |
motivo |
string | ✅ | Texto libre con el motivo de la cancelación |
Ejemplo PHP (cliente que llama al servidor)
<?php
$url = 'https://tu-dominio.com/fact_elect/cancelar_api.php';
$apiKey = 'MiClaveSecreta';
$tenantId = 'puchi';
$cdc = '01800292774001001000005422026031919322167553';
$motivo = 'Error en el monto facturado';
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'apiKey' => $apiKey,
'tenantId' => $tenantId,
'cdc' => $cdc,
'motivo' => $motivo,
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
]);
$respuesta = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
echo "Error cURL: $error";
} else {
$json = json_decode($respuesta, true);
// $json['status'] => 'ok' o 'error'
// $json['message'] => descripción
// $json['protocolo'] => número de protocolo SIFEN (si ok)
print_r($json);
}
Respuesta JSON
{
"status": "ok",
"message": "Cancelación procesada exitosamente",
"protocolo": "123456789"
}
{
"status": "error",
"message": "CDC inválido: debe contener exactamente 44 dígitos numéricos."
}
5b. Visualización del KUDE (kude.php)
Genera la representación gráfica (HTML imprimible) del Documento Electrónico a partir de su CDC. Soporta dos formatos de impresión.
Método y URL
GET kude.php?cdc={CDC44}&formato={FORMATO}
Parámetros GET
| Parámetro | Tipo | Obligatorio | Valores | Descripción |
|---|---|---|---|---|
cdc |
string | ✅ | 44 dígitos numéricos | Código de Control del Documento Electrónico |
formato |
string | Opcional | ticket / (omitir para A4) |
Formato del KUDE. ticket = 80 mm para impresoras térmicas. Si se omite, se genera en A4. También se acepta el alias format. |
Ejemplos de URL
GET kude.php?cdc=01142345687001001000006612026051910238751318
GET kude.php?cdc=01142345687001001000006612026051910238751318&formato=ticket
6. Ejemplo con cURL
curl -X POST https://tu-dominio.com/fact_elect/index.php \
-d "apiKey=TU_API_KEY" \
-d "tenantId=puchi" \
-d "tenantPunto=001-001" \
-d "cliente=EMPRESA IMPORTADORA S.A." \
-d "[email protected]" \
--data-urlencode 'data=[{"tipoDocumento":1,...}]'
7. Departamentos de Paraguay
| Código | Departamento |
|---|---|
1 | CONCEPCION |
2 | SAN PEDRO |
3 | CORDILLERA |
4 | GUAIRA |
5 | CAAGUAZU |
6 | CAAZAPA |
7 | ITAPUA |
8 | MISIONES |
9 | PARAGUARI |
10 | ALTO PARANA |
11 | CENTRAL |
12 | ÑEEMBUCU |
13 | AMAMBAY |
14 | CANINDEYU |
15 | PRESIDENTE HAYES |
16 | BOQUERON |
17 | ALTO PARAGUAY |
18 | CAPITAL |
direccion.8. Unidades de Medida Comunes
| Código | Descripción |
|---|---|
77 | Unidad (UNI) |
83 | Kilogramo (KG) |
79 | Litro (LT) |
80 | Metro (MT) |
81 | Metro cuadrado (M2) |
82 | Metro cúbico (M3) |
85 | Pieza |
86 | Docena |
9. Tipos de Transacción
| Código | Descripción |
|---|---|
1 | Venta de mercadería |
2 | Prestación de servicios |
3 | Mixto (mercadería y servicios) |
4 | Venta de activo fijo |
5 | Venta de divisas |
6 | Compra de divisas |
7 | Promoción o entrega de muestras |
8 | Donación |
9 | Anticipo |
10 | Compra de productos |
11 | Compra de servicios |
13 | Otro |
10. Notas Importantes
- El número de factura se asigna automáticamente por el servidor. No se envía en el JSON.
- El precio unitario es siempre con IVA incluido. El servidor calcula la base gravada y el IVA.
- Si
iva=0conivaTipo=1, el servidor asume automáticamente que es Exento (afecIVA=3). - Para no contribuyentes, no enviar campo
ruc. UsardocumentoTipo+documentoNumero. - El campo
datadebe ir URL-encoded ya que se envía como form-data. - La dirección es autoconciliada: si no se envían códigos de departamento/distrito/ciudad, el servidor busca coincidencias automáticas.
- Si el monto de la entrega es
0en condición contado, se autocompletará con el total de la factura. - Los reintentos por duplicado son automáticos: si SIFEN rechaza por número duplicado, el servidor incrementa y reintenta (hasta 3 veces).
11. Configuración Previa (Admin)
Antes de usar la API, la empresa debe estar configurada en el panel de administración (/admin/):
- Empresa registrada con RUC, certificado digital (.p12) y CSC.
- Punto de expedición creado (ej:
001-001). - API Key generada para la empresa.
- Numeración inicializada en la tabla
numero_fact.