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) | ✅ |
Nota de Remisión — Formato Plano
El endpoint remision.php acepta el campo data en dos formatos: el JSON experto de siempre (con cliente/receptor anidados y códigos SIFEN) y el formato plano, pensado para que el integrador envíe solo los datos de negocio y el servidor complete todo lo demás: emisor, timbrado, numeración, ubicaciones, fecha de emisión y transporte por defecto.
data (credenciales incluidas), sin parámetros POST adicionales (apiKey, tenantId, tenantPunto, cliente, email).Reglas básicas
RUC,RAZON_SOCIAL,CONTRIBUYENTE, dirección y contacto son del receptor (destinatario de la mercadería). Los datos del emisor nunca se envían: salen delTENANT_IDen la base de datos.- Si
CONTRIBUYENTE=SI, elRUCdebe llevar dígito verificador (NNNNNNNN-D); se valida módulo 11 antes de tocar SIFEN. Si no es contribuyente:CONTRIBUYENTE=NOy la cédula enRUC(oXXsi es innominado). - Los
ITEMSno llevan precio ni IVA (la remisión no tiene valores): soloDESCRIPCIONyCANTIDAD;CODIGOes opcional. - La fecha de emisión la sella siempre el servidor. Si falta algo o es inválido, la API responde la lista de errores en texto claro antes de numerar ni enviar a SIFEN.
- La respuesta es la misma de siempre:
Cliente / Estado / Mensaje / NUM-CDC.
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 | ✅ | "80012345-6", cédula, "XX" | Con DV si es contribuyente. XX para destinatario innominado |
RAZON_SOCIAL | string | ✅ | Nombre del destinatario | |
CONTRIBUYENTE | string | ✅ | SI / NO | ¿Tiene RUC activo en SIFEN? |
PERSONA | string | Opcional | FISICA / JURIDICA | Default: JURIDICA. Ignora acentos y mayúsculas |
CORREO / EMAIL | string | Opcional | Email válido | Para envío del KUDE al destinatario |
TELEFONO / CELULAR | string | Opcional | Texto libre | |
DIRECCION | string | Opcional | Texto libre | Dirección del receptor; también es el lugar de entrega por defecto |
CIUDAD | string | Opcional | Texto libre, ej: "Caaguazú" | El servidor la concilia al catálogo oficial SIFEN (departamento/distrito/ciudad) |
MOTIVO | número/string | Opcional | 1–14, 99 o texto ("VENTAS", "DEVOLUCION"…) | Motivo del traslado (E501). Default: 1 = Traslado por ventas. Ver tabla abajo |
RESPONSABLE | número/string | Opcional | 1–5 o texto | Responsable de la emisión (E505). Default: 1 = Emisor de la factura |
KMS | número | Requerido | ej: 25 | Km estimados de recorrido (dKmR). SIFEN lo exige en toda nota de remisión; debe ser mayor a 0 |
FECHA_FACTURA | string | Condicional | YYYY-MM-DD | Fecha de la factura vinculada (dFecEm). Requerido si MOTIVO=1 (Traslado por ventas); opcional con los demás motivos. No puede ser posterior a hoy |
TRANSPORTE | string | Opcional | PROPIO / TERCEROS | Default: PROPIO. Con TERCEROS exige TRANSPORTISTA_* |
MODALIDAD | string | Opcional | TERRESTRE / FLUVIAL / AEREO / MULTIMODAL | Default: TERRESTRE |
RESPONSABLE_FLETE | string/número | Opcional | EMISOR / RECEPTOR / TERCERO / AGENTE | Default: EMISOR |
TRANSPORTISTA_NOMBRE | string | Condicional | Razón social del transportista | Requerido si TRANSPORTE=TERCEROS |
TRANSPORTISTA_RUC | string | Condicional | "80098765-4" | Requerido si TRANSPORTE=TERCEROS. Con DV: NNNNNNNN-D |
TRANSPORTISTA_DIRECCION | string | Opcional | Texto libre | Domicilio fiscal del transportista |
VEHICULO | string | ✅ | Chapa / matrícula, ej: "ABC 123" (máx. 20 caracteres) | Obligatorio: SIFEN rechaza la nota de remisión sin el bloque de vehículo |
VEHICULO_TIPO | string | Opcional | ej: "Camión", "Camioneta", "Furgoneta" | Default: Camioneta. SIFEN admite 4 a 10 caracteres: textos más largos se acortan ("Camión de carga" → Camión, "Tractocamión" → Camión) |
VEHICULO_MARCA | string | ✅ | ej: "Scania" (máx. 10 caracteres) | Obligatorio (SIFEN exige la marca del vehículo) |
CHOFER_NOMBRE | string | ✅ | Nombre completo (máx. 60) | Obligatorio: SIFEN exige el chofer en toda nota de remisión. Con transporte propio (sin TRANSPORTISTA_*) el servidor emite gCamTrans con el chofer como no contribuyente |
CHOFER_DOCUMENTO | string | ✅ | Cédula del chofer (máx. 20) | Obligatorio (SIFEN exige el documento del chofer) |
SALIDA_DIRECCION / SALIDA_CIUDAD | string | Opcional | Texto libre | Si no se envían, no se emite gCamSal (se asume el local del emisor, ya conocido por el tenant) |
ENTREGA_DIRECCION / ENTREGA_CIUDAD | string | Opcional | Texto libre | Vacíos → el servidor los rellena con DIRECCION + CIUDAD del receptor |
FORMATO | string | Opcional | TICKET / A4 | Formato del KUDE PDF. Si se omite, se genera A4. |
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 (123 → 0000123). Si falta se genera automáticamente. |
DESCRIPCION | string | ✅ | Descripción de la mercadería |
CANTIDAD | número | ✅ | Debe ser mayor a 0 |
Valores de MOTIVO (E501)
| Código | Descripción | Código | Descripción |
|---|---|---|---|
| 1 | Traslado por ventas | 8 | Traslado de bienes por transformación |
| 2 | Traslado por consignación | 9 | Traslado de bienes por reparación |
| 3 | Exportación | 10 | Traslado por emisor móvil |
| 4 | Traslado por compra | 11 | Exhibición o demostración |
| 5 | Importación | 12 | Participación en ferias |
| 6 | Traslado por devolución | 13 | Traslado de encomienda |
| 7 | Traslado entre locales de la empresa | 14 / 99 | Decomiso / Otro |
Ejemplos JSON — 3 variantes
Variante A — Súper compacta (mínimo indispensable)
Solo datos obligatorios. El servidor asume: motivo 1 (Traslado por ventas), transporte propio terrestre, salida = local del emisor. Como el motivo es 1, FECHA_FACTURA es obligatoria; KMS, vehículo y chofer los exige SIFEN en toda remisión.
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "80012345-6",
"RAZON_SOCIAL": "Juan Pérez",
"CONTRIBUYENTE": "SI",
"FECHA_FACTURA": "2026-09-17",
"KMS": 25,
"VEHICULO": "ABC 123",
"VEHICULO_MARCA": "Toyota",
"CHOFER_NOMBRE": "Pedro López",
"CHOFER_DOCUMENTO": "4123456",
"ITEMS": [
{"DESCRIPCION": "Cajas de yerba", "CANTIDAD": 10}
]
}]
Variante B — Compacta (uso habitual)
Agrega contacto y dirección del receptor (que el servidor usa también como lugar de entrega), vehículo y chofer para el caso típico de transporte propio.
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "80012345-6",
"RAZON_SOCIAL": "Juan Pérez",
"CONTRIBUYENTE": "SI",
"CORREO": "[email protected]",
"TELEFONO": "0981...",
"DIRECCION": "Ruta 2 km 30",
"CIUDAD": "Caaguazú",
"MOTIVO": 1,
"FECHA_FACTURA": "2026-09-17",
"KMS": 25,
"VEHICULO": "ABC 123",
"CHOFER_NOMBRE": "Pedro López",
"CHOFER_DOCUMENTO": "4123456",
"ITEMS": [
{"DESCRIPCION": "Cajas de yerba", "CANTIDAD": 10, "CODIGO": "123"}
]
}]
Variante C — Extensa (todas las opciones, incluido transporte de terceros)
Todos los campos soportados. Si un campo opcional va vacío o no se envía, el servidor aplica el default indicado (ver tabla de defaults más abajo).
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"RUC": "80012345-6",
"RAZON_SOCIAL": "Juan Pérez",
"CONTRIBUYENTE": "SI",
"CORREO": "[email protected]",
"TELEFONO": "0981...",
"DIRECCION": "Ruta 2 km 30",
"CIUDAD": "Caaguazú",
// MOTIVO: opcional, default = 1. Acepta número (1-14, 99) o texto
// ("VENTAS", "DEVOLUCION", "CONSIGNACION", ...). Ver tabla E501 arriba.
"MOTIVO": 1,
// RESPONSABLE: opcional, default = 1. 1 = Emisor de la factura
// 2 = Poseedor 3 = Empresa transportista 4 = Despachante 5 = Agente
"RESPONSABLE": 1,
"KMS": 25, // requerido, mayor a 0: SIFEN exige dKmR en toda remisión
// FECHA_FACTURA: requerido si MOTIVO = 1 (Traslado por ventas); es la
// fecha de la factura que respalda el traslado (dFecEm). Con los demás
// motivos es opcional. No puede ser posterior a hoy.
"FECHA_FACTURA": "2026-09-17",
// ─────────── TRANSPORTE ───────────
// TRANSPORTE: opcional, default = "PROPIO".
// "PROPIO" → vehículo de la empresa emisora (iTipTrans=1)
// "TERCEROS" → transportista contratado (iTipTrans=2)
"TRANSPORTE": "TERCEROS",
// MODALIDAD: opcional, default = "TERRESTRE".
// TERRESTRE | FLUVIAL | AEREO | MULTIMODAL
"MODALIDAD": "TERRESTRE",
// ── Solo si TRANSPORTE="TERCEROS" (obligatorios en ese caso) ──
// Si faltan, el servidor rechaza con error claro.
"TRANSPORTISTA_NOMBRE": "Translog S.A.",
"TRANSPORTISTA_RUC": "80098765-4", // con DV: NNNNNNNN-D
"TRANSPORTISTA_DIRECCION": "Av. Eusebio Ayala 1234", // opcional
// ── Vehículo. Opcional en ambos casos ──
// Vacío o ausente → el bloque de vehículo no se emite en el XML.
"VEHICULO": "ABC 123", // chapa / matrícula
"VEHICULO_TIPO": "Camión", // opcional, default = "Camioneta"
"VEHICULO_MARCA": "Scania", // opcional
// ── Chofer. Opcional ──
// Con TRANSPORTE="PROPIO" (sin transportista), el servidor igual emite
// el bloque gCamTrans como no-contribuyente con estos datos.
"CHOFER_NOMBRE": "Pedro López",
"CHOFER_DOCUMENTO": "4123456",
// ── Salida. Opcional ──
// Sin SALIDA_DIRECCION → no se emite; se asume el local del emisor.
"SALIDA_DIRECCION": "Depósito central, Ruta 1 km 20",
"SALIDA_CIUDAD": "San Lorenzo", // texto libre; se concilia al catálogo SIFEN
// ── Entrega. Opcional ──
// Vacíos → el servidor los rellena con DIRECCION + CIUDAD del receptor.
"ENTREGA_DIRECCION": "",
"ENTREGA_CIUDAD": "",
// ITEMS: obligatorio, al menos 1. Sin precios ni IVA.
// CODIGO opcional: si falta se autogenera (0000001, 0000002, ...)
"ITEMS": [
{"DESCRIPCION": "Cajas de yerba", "CANTIDAD": 10, "CODIGO": "123"}
]
}]
¿Qué rellena el servidor cuando un campo va vacío?
| Campo | Si viene vacío o ausente |
|---|---|
MOTIVO | 1 (Traslado por ventas) |
RESPONSABLE | 1 (Emisor de la factura) |
TRANSPORTE | PROPIO |
MODALIDAD | TERRESTRE |
SALIDA_* | No se emite (se asume el local del emisor) |
ENTREGA_* | DIRECCION + CIUDAD del receptor |
VEHICULO, CHOFER_* | Sin default: son obligatorios (SIFEN rechaza la remisión sin vehículo ni chofer) |
TRANSPORTISTA_* | Con PROPIO no se emite; con TERCEROS son obligatorios (junto con CHOFER_NOMBRE y CHOFER_DOCUMENTO) |
CODIGO del item | Se autogenera (0000001, 0000002, ...) |
CIUDAD / *_CIUDAD | Texto libre: el servidor lo concilia al catálogo oficial SIFEN |
| Fecha de emisión | Siempre la del servidor (se ignora la del integrador) |
| Número, timbrado, emisor | Siempre desde el tenant en la base de datos |
Mensajes de error
Si la validación falla, la respuesta es texto plano con el listado de errores. Ningún número de remisión se consume si hay errores de validación.
ERROR en los datos enviados (formato plano remisión):
- TRANSPORTE=TERCEROS requiere TRANSPORTISTA_RUC (formato NNNNNNNN-D).
- El dígito verificador del RUC '80012345-9' no es válido. Para el RUC '80012345' el DV correcto es '6'.
Nota de Crédito y Nota de Débito — Formato Plano
Las notas de crédito (NC) y de débito (ND) se emiten por el mismo endpoint que la factura (index.php, campo data) y con el mismo formato plano. La única diferencia es el campo TIPO_DOCUMENTO más dos datos obligatorios: el MOTIVO y la identificación de la factura original.
1101 — Número de timbrado inválido, aunque ese mismo timbrado facture sin problemas. No es un error del sistema ni del payload: hay que solicitar la habilitación a la SET.Reglas básicas
TIPO_DOCUMENTOaceptaNOTA_DE_CREDITO(aliasNC,NOTA_CREDITO) oNOTA_DE_DEBITO(aliasND,NOTA_DEBITO). Si se omite, se asumeFACTURA.MOTIVOes obligatorio: un número del1al8o su texto equivalente.- Hay que identificar la factura original: con
FACTURA_CDCsi es electrónica, o conFACTURA_TIMBRADO+FACTURA_NUMERO+FACTURA_FECHAsi es impresa o de otro emisor. - La nota debe ir en la misma moneda que la factura original. Si no es
PYG,CAMBIOes obligatorio. CONDICIONsigue siendo obligatorio para el validador; si esCREDITOhay que enviarPLAZO. SIFEN no imprime la condición en NC/ND, pero el validador la exige.- Los
ITEMSson los del concepto que se acredita o debita, no necesariamente los de la factura. En una ND por interés se manda un solo ítem con ese importe: repetir los ítems de la factura haría una nota por el total de la factura. - La numeración es independiente por tipo de documento: factura, NC y ND llevan su propio correlativo y cada una arranca en
0000001. - Si el envío es rechazado, no se consume numeración: la operación se revierte completa.
Campos propios de NC / ND
Todos los campos del formato plano de factura (API_KEY, TENANT_ID, ESTABLECIMIENTO, PUNTO, RUC, RAZON_SOCIAL, PERSONA, CONTRIBUYENTE, ENTIDAD_DE_GOBIERNO, CONDICION, PLAZO, MONEDA, CAMBIO, EMAIL, ITEMS…) se usan igual. Estos son los que se agregan o cambian:
| Campo | Tipo | Obligatorio | Valores aceptados | Notas |
|---|---|---|---|---|
TIPO_DOCUMENTO | string | ✅ | NOTA_DE_CREDITO / NOTA_DE_DEBITO | Alias aceptados: NC, NOTA_CREDITO, ND, NOTA_DEBITO. Sin este campo se emite una factura |
MOTIVO | número/string | ✅ | 1–8 o texto | Motivo de emisión (E401). Ver tabla abajo |
FACTURA_CDC | string | Condicional | CDC de 44 dígitos | Requerido si la factura original es electrónica. Excluyente con el bloque de factura impresa |
FACTURA_TIMBRADO | string | Condicional | ej: "12557896" | Requerido si la factura original es impresa o de otro emisor |
FACTURA_NUMERO | string | Condicional | ej: "0001234" | Requerido junto con FACTURA_TIMBRADO |
FACTURA_FECHA | string | Condicional | YYYY-MM-DD | Fecha de emisión de la factura impresa |
FACTURA_ESTABLECIMIENTO | string | Opcional | ej: "001" | Default: 001. Solo para factura impresa |
FACTURA_PUNTO | string | Opcional | ej: "001" | Default: 001. Solo para factura impresa |
MONEDA | string | Opcional | PYG / USD… | Debe coincidir con la moneda de la factura original |
CAMBIO | número | Condicional | ej: 7300 | Requerido si MONEDA no es PYG. Guaraníes por 1 unidad de la moneda |
Motivos de emisión (campo MOTIVO)
La misma tabla vale para NC y para ND. Se puede enviar el número o el texto.
| Código | Descripción SIFEN | Texto aceptado | Uso típico |
|---|---|---|---|
1 | Devolución y ajuste de precios | DEVOLUCION_Y_AJUSTE | NC — anular una factura completa |
2 | Devolución | DEVOLUCION | NC — el cliente devolvió mercadería |
3 | Descuento | DESCUENTO | NC — descuento otorgado después de facturar |
4 | Bonificación | BONIFICACION | NC — bonificación comercial |
5 | Crédito incobrable | CREDITO_INCOBRABLE | NC — deuda que no se va a cobrar |
6 | Recupero de costo | RECUPERO_DE_COSTO | ND — costo trasladado al cliente |
7 | Recupero de gasto | RECUPERO_DE_GASTO | ND — flete, seguro, gasto adelantado |
8 | Ajuste de precio | AJUSTE_DE_PRECIO | ND — interés por mora, ajuste hacia arriba |
gCamNCDE para los dos documentos. La columna «uso típico» es orientativa, no una restricción del sistema.Ejemplos JSON
Nota de Débito — interés por mora sobre una factura electrónica
Un solo ítem con el importe que se cobra de más. La factura original se identifica por su CDC.
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"TIPO_DOCUMENTO": "NOTA_DE_DEBITO",
"MOTIVO": 8,
"FACTURA_CDC": "01142345687001001000020612026081217825299084",
"RUC": "80012345-6",
"RAZON_SOCIAL": "Comercial Ejemplo SA",
"PERSONA": "JURIDICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"CONDICION": "CONTADO",
"MONEDA": "PYG",
"EMAIL": "[email protected]",
"ITEMS": [
{"CODIGO": "INT", "DESCRIPCION": "Interes por mora", "CANTIDAD": 1, "PRECIO": 55000, "IVA": 10}
]
}]
Nota de Débito en moneda extranjera
Cuando la factura original está en dólares, la ND también. CAMBIO pasa a ser obligatorio.
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "agro_br",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"TIPO_DOCUMENTO": "NOTA_DE_DEBITO",
"MOTIVO": "AJUSTE_DE_PRECIO",
"FACTURA_CDC": "01008447438001001000001512026090212033805740",
"RUC": "80024030-8",
"RAZON_SOCIAL": "LAR SRL",
"PERSONA": "JURIDICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"CONDICION": "CONTADO",
"MONEDA": "USD",
"CAMBIO": 5980,
"ITEMS": [
{"CODIGO": "AJU", "DESCRIPCION": "Ajuste de precio", "CANTIDAD": 1, "PRECIO": 250, "IVA": 5}
]
}]
Nota de Crédito — anular una factura completa
Para dejar sin efecto una factura pasadas las 48 h de la cancelación, se emite una NC con los mismos ítems y el mismo importe que la factura original.
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"TIPO_DOCUMENTO": "NOTA_DE_CREDITO",
"MOTIVO": 1,
"FACTURA_CDC": "01142345687001001000020612026081217825299084",
"RUC": "80012345-6",
"RAZON_SOCIAL": "Comercial Ejemplo SA",
"PERSONA": "JURIDICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"CONDICION": "CONTADO",
"MONEDA": "PYG",
"ITEMS": [
{"CODIGO": "0000001", "DESCRIPCION": "Cartera Vizzano", "CANTIDAD": 1, "PRECIO": 300000, "IVA": 10}
]
}]
Nota de Crédito sobre una factura impresa (de otro emisor)
Sin CDC: se identifica la factura por timbrado, número y fecha.
[{
"API_KEY": "TU_API_KEY",
"TENANT_ID": "oietema",
"ESTABLECIMIENTO": 1,
"PUNTO": 1,
"TIPO_DOCUMENTO": "NOTA_DE_CREDITO",
"MOTIVO": "DEVOLUCION",
"FACTURA_TIMBRADO": "12557896",
"FACTURA_ESTABLECIMIENTO": "002",
"FACTURA_PUNTO": "005",
"FACTURA_NUMERO": "0001234",
"FACTURA_FECHA": "2026-03-15",
"RUC": "80012345-6",
"RAZON_SOCIAL": "Comercial Ejemplo SA",
"PERSONA": "JURIDICA",
"CONTRIBUYENTE": "SI",
"ENTIDAD_DE_GOBIERNO": "NO",
"CONDICION": "CONTADO",
"MONEDA": "PYG",
"ITEMS": [
{"DESCRIPCION": "Devolucion de mercaderia", "CANTIDAD": 1, "PRECIO": 90000, "IVA": 10}
]
}]
Mensajes de error frecuentes
El validador responde antes de numerar y de enviar a SIFEN, así que estos errores no consumen numeración.
| Mensaje | Causa | Solución |
|---|---|---|
TIPO_DOCUMENTO=NOTA_DE_DEBITO requiere el campo MOTIVO | Falta MOTIVO | Enviar un número del 1 al 8 o su texto |
… requiere identificar la factura original | No vino FACTURA_CDC ni FACTURA_TIMBRADO+FACTURA_NUMERO | Agregar uno de los dos bloques |
FACTURA_CDC debe tener exactamente 44 caracteres | CDC incompleto o con separadores | Enviar los 44 dígitos, sin espacios ni guiones |
Campo TIPO_DOCUMENTO debe ser FACTURA, NOTA_DE_CREDITO o NOTA_DE_DEBITO | Valor no reconocido | Usar uno de los valores o alias de la tabla |
MONEDA=USD requiere el campo CAMBIO | Moneda extranjera sin cotización | Agregar CAMBIO con los guaraníes por unidad |
CONDICION=CREDITO requiere el campo PLAZO | Condición a crédito sin plazo | Agregar PLAZO, ej: "30 dias" |
No hay registro de numeración para … tipo_documento: 5 (o 6) | El punto de expedición no tiene el contador de NC/ND | Se crea automáticamente al dar de alta empresas y puntos; si el punto es viejo, avisar al administrador |
Error de SIFEN: Número de timbrado inválido (1101) | El timbrado no está habilitado para ese tipo de documento | Solicitar a la SET la habilitación de nota de crédito / débito para el timbrado |
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": "595994858410",
"celular": "595994858410",
"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": "595994858410",
"celular": "595994858410",
"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": "595994858410",
"celular": "595994858410",
"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": "595994858410",
"celular": "595994858410",
"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": "595994858410",
"celular": "595994858410",
"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": "595994858410",
"celular": "595994858410",
"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": "595994858410",
"celular": "595994858410",
"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.