Saltearse al contenido

Tutorial: Generar nota de crédito libre (devolución)

¡Hola! Te voy a explicar paso a paso cómo generar una nota de crédito electrónica libre por devolución usando nuestra API. Este flujo es ideal cuando querés emitir una nota de crédito por devolución, porque el endpoint final arma todo en una sola solicitud.

La idea es que primero prepares todos los datos y luego hagas una única llamada a la API.


URL base: https://api.guarani.app

Necesitás un token válido en el encabezado x-api-key: Bearer <access_token> para todas las llamadas.


  1. Consultar el timbrado (autorización de la SET).
  2. Preparar los datos del cliente.
  3. Preparar las mercaderías y/o servicios con sus precios vigentes.
  4. Definir los campos de la nota de crédito.
  5. Emitir la nota con la API.
  6. Consultar el estado del documento electrónico.

  • Timbrado vigente y asociado al establecimiento/punto de expedición.
  • Identificadores de ciudad, unidades de medida, marcas y clasificaciones listos.
  • Motivo entre 6 y 30 caracteres (motivo_descripcion).

¿Por qué necesitás consultar el timbrado?

Sección titulada «¿Por qué necesitás consultar el timbrado?»

El timbrado es la autorización que te da la SET (Secretaría de Estado de Tributación) para emitir documentos electrónicos. Contiene información importante que necesitás incluir en cada nota de crédito:

  • numero_timbrado: El número de autorización de la SET
  • numero_establecimiento: El código de tu local o sucursal
  • punto_expedicion: El punto desde donde emitís los documentos

Hacé una consulta al endpoint de timbrados:

Ventana de terminal
curl -X GET "https://api.guarani.app/timbrados?page=1&limit=100" \
-H "x-api-key: Bearer <access_token>" \
-H "Accept: application/json" | jq

Nota: Reemplazá <access_token> con un token JWT válido proporcionado por el equipo Guarani.

Para más información sobre timbrados, consultá la documentación completa en Obtener lista de timbrados.


Aunque la API arma todo en una sola solicitud, es buena práctica validar los datos del cliente previamente (o crearlo en el sistema para reutilizarlo).

Estructura de cliente que vas a enviar dentro de la nota

Sección titulada «Estructura de cliente que vas a enviar dentro de la nota»
CampoRequeridoDescripción
tipo_personaTipo de persona. Ver tabla de tipos de personas
tipo_documentoTipo de documento de identidad. Ver tabla de tipos de documentos
documentoNúmero de CI o RUC.
nombreNombre completo o razón social.
nombre_fantasiaNoNombre comercial (si aplica).
nacionalidadCódigo ISO 3166-1 alfa-3 (ej: PRY).
fecha_nacimientoFormato DD/MM/YYYY.
whatsappNúmero en formato internacional.
emailCorreo del cliente.
direccionDirección física.
numero_casaNoNúmero de casa.
barrioNoBarrio/zona.
ciudad_idUUID de la ciudad. Ver como obtener la lista de ciudades

La API admite arrays de mercaderias y servicios. Podés enviar solo uno de los dos o ambos combinados.

CampoRequeridoDescripción
codigo_internoCódigo interno de la mercadería. Ver tabla de código interno.
codigo_originalNoCódigo original de la mercadería.
codigo_barraNoCódigo de barras de la mercadería.
codigo_fabricanteNoCódigo del fabricante de la mercadería.
descripcionDescripción de la mercadería.
descripcion_largaNoDescripción extendida de la mercadería.
observacionNoObservaciones de la mercadería.
unidad_medida_venta_idUUID de la unidad de medida de venta.
marcaNoMarca de la mercadería.
clasificacionObjeto { codigo, nombre } con la clasificación SIFEN.
cantidadCantidad devuelta.
precio_unitario_originalPrecio original facturado.
precio_unitarioObjeto con montos por IVA (0, 5, 10).
CampoRequeridoDescripción
codigo_internoCódigo interno del servicio. Ver tabla de código interno.
descripcionNoDescripción del servicio.
descripcion_largaNoDescripción extendida del servicio.
observacionNoObservaciones del servicio.
unidad_medida_venta_idUUID de la unidad de medida de venta.
clasificacionObjeto { codigo, nombre } con la clasificación SIFEN.
cantidadCantidad devuelta.
precio_unitario_originalPrecio original facturado.
precio_unitarioObjeto IVA (0, 5, 10).
  • Mercaderías
{
"mercaderias": [
{
"codigo_interno": "01-1234567",
"codigo_original": "672",
"codigo_barra": "1234567890",
"codigo_fabricante": "1234567890",
"descripcion": "Mercadería de ejemplo",
"descripcion_larga": "Descripción larga de la mercadería",
"observacion": "Observación de la mercadería",
"unidad_medida_venta_id": "5f49c6c1-d622-4f5b-9d8b-2d1636b584ab",
"marca": "Marca de ejemplo",
"clasificacion": {
"codigo": "99",
"nombre": "Sin Definir"
},
"cantidad": 1,
"precio_unitario_original": 100000,
"precio_unitario": {
"0": 0,
"5": 0,
"10": 100000
}
}
]
}
  • Servicios
{
"servicios": [
{
"codigo_interno": "02-1234567",
"descripcion": "Servicio de ejemplo",
"unidad_medida_venta_id": "5f49c6c1-d622-4f5b-9d8b-2d1636b584ab",
"clasificacion": {
"codigo": "99",
"nombre": "Sin Definir"
},
"cantidad": 1,
"precio_unitario_original": 150000,
"precio_unitario": {
"0": 0,
"5": 0,
"10": 150000
}
}
]
}

Paso 4: Definir los campos de la nota de crédito electronica completa

Sección titulada «Paso 4: Definir los campos de la nota de crédito electronica completa»

Campos de la nota de crédito electronica completa

Sección titulada «Campos de la nota de crédito electronica completa»
CampoTipoRequeridoDescripción
monedastringCódigo ISO de la moneda (PYG, USD, etc.). Debe coincidir con la moneda del documento original.
cotizacionnumberCotización respecto al guaraní. Para operaciones en PYG, enviá 1.
clienteobjectDatos completos del receptor (ver Paso 2).
motivo_descripcionstringMotivo comercial entre 6 y 30 caracteres. Se imprime en la nota y lo valida la SET.
numero_timbradostringTimbrado electrónico activo de tu empresa.
numero_establecimientostringEstablecimiento (3 dígitos) asociado al timbrado.
punto_expedicionstringPunto de expedición (3 dígitos) desde el cual emitís la nota.
totalnumberTotal Debe ser igual a la suma de los ítems de la suma de todos los precios unitarios por su cantidad.

Tip: mantené moneda y cotizacion iguales a los de la factura original y asegurate de que total coincida con el desglose de ítems para evitar rechazos.

CampoTipoRequeridoDescripción
tipo_documento_asociadonumberTipo de documento asociado. Ver tabla de tipos de documentos asociados.
impresoobjectCondicionalSe envía cuando tipo = 2. Contiene la información del comprobante físico.
electronicoobjectCondicionalSe envía cuando tipo = 1. Incluye el CDC y datos del documento electrónico original. Ver como obtener el CDC.
impreso (requerido si tipo_documento_asociado = 2)
Sección titulada «impreso (requerido si tipo_documento_asociado = 2)»
CampoTipoRequeridoDescripción
numero_timbrado_documento_asociadostringTimbrado del documento impreso original.
numero_establecimiento_documento_asociadostringEstablecimiento del documento impreso original (3 dígitos).
punto_expedicion_documento_asociadostringPunto de expedición del documento impreso original (3 dígitos).
fecha_emision_documento_asociadostringFecha de emisión en formato DD/MM/YYYY.
numero_documento_asociadostringNúmero del documento (ej.: 0000001).
tipo_documento_impresonumberCódigo SIFEN del tipo de documento. Ver tabla de tipos de documentos
electronico (requerido si tipo_documento_asociado = 1)
Sección titulada «electronico (requerido si tipo_documento_asociado = 1)»
CampoTipoRequeridoDescripción
cdcstringCDC del documento electrónico original. Ver como obtener el CDC.
CampoTipoRequeridoDescripción
mercaderiasarrayOpcionalLista de mercaderías acreditadas. Cada elemento sigue la estructura explicada en el Paso 3.
serviciosarrayOpcionalLista de servicios acreditados. Usa también la estructura del Paso 3.
  • Podés enviar solo mercaderías, solo servicios o ambos.
  • Las cantidades no pueden exceder lo facturado originalmente.
  • No mezcles ítems de distintos carritos/facturas porque la API lo rechaza.
CampoTipoRequeridoDescripción
jsonDEbooleanNoBandera opcional en la raíz del payload. Si la enviás en true, la respuesta incluye el XML transformado a JSON.

Si omitís este campo se asume false.

⚠️ Importante: El campo total debe coincidir EXACTAMENTE con la suma de todos los ítems de la suma de todos los precios unitarios por su cantidad o la emisión será rechazada.


A continuación tenés un ejemplo completo que crea la nota con cliente, mercaderías, servicios, motivo en un solo paso.

Ejemplo completo con documento físico asociado:

Ventana de terminal
curl -X POST 'https://api.guarani.app/simplificado/notas/credito/devolucion/libre' \
-H 'Content-Type: application/json' \
-H 'x-api-key: Bearer <access_token>' \
-d '{
"jsonDE": false,
"nota_credito": {
"moneda": "PYG",
"cotizacion": 1,
"cliente": {
"tipo_persona": 1,
"tipo_documento": 1,
"documento": "1234567",
"nombre": "Cliente de ejemplo",
"nombre_fantasia": "",
"nacionalidad": "PRY",
"fecha_nacimiento": "01/01/1990",
"whatsapp": "",
"email": "[email protected]",
"direccion": "Dirección de ejemplo",
"numero_casa": "",
"barrio": "Barrio de ejemplo",
"ciudad_id": "67ef2e9f-0fa7-43e7-ad5e-87a694e56341"
},
"motivo_descripcion": "Devolución",
"numero_timbrado": "80158040",
"numero_establecimiento": "001",
"punto_expedicion": "002",
"total": 250000
},
"documentos_asociados": {
"tipo_documento_asociado": 2,
"impreso": {
"numero_timbrado_documento_asociado": "12345678",
"numero_establecimiento_documento_asociado": "001",
"punto_expedicion_documento_asociado": "001",
"fecha_emision_documento_asociado": "22/03/2025",
"numero_documento_asociado": "0000001",
"tipo_documento_impreso": 1
}
},
"items": {
"mercaderias": [
{
"codigo_interno": "01-1234567",
"codigo_original": "123",
"codigo_barra": "",
"codigo_fabricante": "",
"descripcion": "Mercadería de ejemplo",
"descripcion_larga": "",
"observacion": "",
"unidad_medida_venta_id": "5f49c6c1-d622-4f5b-9d8b-2d1636b584ab",
"marca": "Marca de ejemplo",
"clasificacion": {
"codigo": "01",
"nombre": "Clasificación de ejemplo"
},
"cantidad": 1,
"precio_unitario_original": 100000,
"precio_unitario": {
"0": 0,
"5": 0,
"10": 100000
}
}
],
"servicios": [
{
"codigo_interno": "02-1234567",
"descripcion": "Servicio de ejemplo",
"unidad_medida_venta_id": "5f49c6c1-d622-4f5b-9d8b-2d1636b584ab",
"clasificacion": {
"codigo": "01",
"nombre": "Clasificación de ejemplo"
},
"cantidad": 1,
"precio_unitario_original": 150000,
"precio_unitario": {
"0": 0,
"5": 0,
"10": 150000
}
}
]
}
}' | jq
{
"success": true,
"codigo": "200",
"message": "Operación realizada correctamente.",
"data": {
"numero_timbrado": "80158040",
"numero_documento": "001-002-0000105",
"serie": "AA",
"cdc": "05801580404001002000010512025111211819934403",
"estado_sifen": {
"estado": "Aprobado",
"mensaje": "Autorización del DE satisfactoria"
},
"xml": "https://api.guarani.app/sifen/xml/05801580404001002000010512025111211819934403",
"qr": "https://ekuatia.set.gov.py/consultas/qr?nVersion=150&Id=05801580404001002000010512025111211819934403&dFeEmiDE=323032352d31312d31325431303a32383a3338&dNumIDRec=5839704&dTotGralOpe=250000.00000000&dTotIVA=22727.27272727&cItems=2&DigestValue=4563624b7237443345517171417a525659455453552b526674694c48503065555652326c76702f674f74413d&IdCSC=0001&cHashQR=51682d1c7b7125e8bab601dd6a77d70ba0dca530c4a21bce773f652d5eb3ddaf"
}
}

Ejemplo completo con documento electrónico asociado:

Ventana de terminal
curl -X POST 'https://api.guarani.app/simplificado/notas/credito/devolucion/libre' \
-H 'Content-Type: application/json' \
-H 'x-api-key: Bearer <access_token>' \
-d '{
"jsonDE": false,
"nota_credito": {
"moneda": "PYG",
"cotizacion": 1,
"cliente": {
"tipo_persona": 1,
"tipo_documento": 1,
"documento": "1234567",
"nombre": "Cliente de ejemplo",
"nombre_fantasia": "",
"nacionalidad": "PRY",
"fecha_nacimiento": "01/01/1990",
"whatsapp": "",
"email": "[email protected]",
"direccion": "Dirección de ejemplo",
"numero_casa": "",
"barrio": "Barrio de ejemplo",
"ciudad_id": "67ef2e9f-0fa7-43e7-ad5e-87a694e56341"
},
"motivo_descripcion": "Devolución",
"numero_timbrado": "80158040",
"numero_establecimiento": "001",
"punto_expedicion": "002",
"total": 250000
},
"documentos_asociados": {
"tipo_documento_asociado": 1,
"electronico": {
"cdc": "05801580404001002000009212025111112609055674"
}
},
"items": {
"mercaderias": [
{
"codigo_interno": "01-1234567",
"codigo_original": "123",
"codigo_barra": "",
"codigo_fabricante": "",
"descripcion": "Mercadería de ejemplo",
"descripcion_larga": "",
"observacion": "",
"unidad_medida_venta_id": "5f49c6c1-d622-4f5b-9d8b-2d1636b584ab",
"marca": "Marca de ejemplo",
"clasificacion": {
"codigo": "01",
"nombre": "Clasificación de ejemplo"
},
"cantidad": 1,
"precio_unitario_original": 100000,
"precio_unitario": {
"0": 0,
"5": 0,
"10": 100000
}
}
],
"servicios": [
{
"codigo_interno": "02-1234567",
"descripcion": "Servicio de ejemplo",
"unidad_medida_venta_id": "5f49c6c1-d622-4f5b-9d8b-2d1636b584ab",
"clasificacion": {
"codigo": "01",
"nombre": "Clasificación de ejemplo"
},
"cantidad": 1,
"precio_unitario_original": 150000,
"precio_unitario": {
"0": 0,
"5": 0,
"10": 150000
}
}
]
}
}' | jq

Ejemplo de respuesta (documento electrónico)

Sección titulada «Ejemplo de respuesta (documento electrónico)»
{
"success": true,
"codigo": "200",
"message": "Operación realizada correctamente.",
"data": {
"numero_timbrado": "80158040",
"numero_documento": "001-002-0000109",
"serie": "AA",
"cdc": "05801580404001002000010912025111213769126114",
"estado_sifen": {
"estado": "Aprobado",
"mensaje": "Autorización del DE satisfactoria"
},
"xml": "https://api.guarani.app/sifen/xml/05801580404001002000010912025111213769126114",
"qr": "https://ekuatia.set.gov.py/consultas/qr?nVersion=150&Id=05801580404001002000010912025111213769126114&dFeEmiDE=323032352d31312d31325431313a32313a3136&dNumIDRec=5839704&dTotGralOpe=250000.00000000&dTotIVA=22727.27272727&cItems=2&DigestValue=4f7266346672626241487933597a62756c2f564c564869582f394369684644426f4c49534b6a75754437673d&IdCSC=0001&cHashQR=0ff17fd2025cd7e4ced8b037f60cd45d51c9195e0a179e336ef445477e11727c"
}
}

Paso 6: Consultar el estado del documento electrónico

Sección titulada «Paso 6: Consultar el estado del documento electrónico»

Esperá unos 10 minutos y consultá:

GET /sifen/consultas/estado/cdc/{cdc}
Ventana de terminal
curl -X GET "https://api.guarani.app/sifen/consultas/estado/cdc/05801580404001002000009212025111112609055674" \
-H "x-api-key: Bearer <access_token>" \
-H "Accept: application/json" | jq

estado: "Aprobado" confirma que SIFEN aceptó el documento. Si ves Rechazado, revisá el mensaje devuelto para corregirlo y emitir nuevamente.


  1. Consultás el timbrado para obtener numero_timbrado, numero_establecimiento y punto_expedicion.
  2. Preparás cliente, mercaderías/servicios, motivo y documento asociado (si es necesario).
  3. Enviás todo completo a la API en un solo paso con POST /simplificado/notas/credito/devolucion/libre.
  4. Verificás el estado del documento electrónico con GET /sifen/consultas/estado/cdc/{cdc}.