--- title: Cómo generar los archivos del Libro IVA Digital de ARCA description: Qué es el Libro IVA Digital, qué archivos acepta Portal IVA y cómo generar e importar el Libro IVA Ventas desde tu sistema. category: [ARCA] pubDate: jul 29, 2026 cover: /images/blog/como-generar-archivos-libro-iva-digital-arca.webp ---
# Cómo generar los archivos del Libro IVA Digital de ARCA
El **Libro IVA Digital** no es solamente un archivo: es el régimen de registración electrónica en el que se informan las ventas, compras, cesiones, exportaciones e importaciones de cada período mensual.
ARCA muestra en Portal IVA los comprobantes que ya conoce, pero permite incorporar, modificar o eliminar información mediante carga manual o por importación de archivos. Para importar las ventas de un sistema propio se necesitan dos archivos de texto:
| Archivo | Contenido | Longitud de cada registro |
| --- | --- | ---: |
| `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt` | Una cabecera por comprobante | 266 bytes |
| `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt` | Una fila por cada alícuota de IVA del comprobante | 62 bytes |
Cada línea es un registro de **ancho fijo**. No lleva encabezados, comas, punto y coma ni otro separador.
> Esta guía se concentra en ventas ordinarias. Compras, importaciones, TURIVA, bienes usados y comprobantes anulados tienen archivos o validaciones adicionales.
> Los generadores de esta serie aplican a responsables inscriptos que importan ventas en la Registración Electrónica de Operaciones de IVA Simple. Los sujetos exentos tienen un [diseño de registro específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), con cantidad de alícuotas `0` y sin el archivo de alícuotas; no deben usar estos ejemplos sin adaptarlos a ese diseño.
## Libro IVA Digital e IVA Simple
Desde el período fiscal noviembre de 2025, los responsables inscriptos presentan obligatoriamente su declaración mediante **IVA Simple**. Dentro de Portal IVA, su módulo de Registración Electrónica de Operaciones continúa permitiendo importar los diseños de ventas y compras publicados por ARCA.
Los sujetos exentos alcanzados por la RG 4597 continúan utilizando el Libro IVA Digital, salvo las excepciones vigentes. Por eso el nombre histórico permanece en los manuales y en los nombres oficiales de los archivos.
## No es el ZIP de duplicados electrónicos
El **Facturador de ARCA** está destinado a monotributistas, quienes están exceptuados del Libro IVA Digital por la RG 4597. ARCA no lo documenta como generador de estos dos TXT.
En Comprobantes en Línea puede aparecer una opción para exportar **duplicados electrónicos**, pero ese ZIP pertenece a otro diseño de registración y almacenamiento. No reemplaza los archivos de comprobantes y alícuotas que espera la importación de Portal IVA.
Los ejemplos de esta serie generan específicamente los archivos `LIBRO_IVA_DIGITAL_VENTAS_CBTE` y `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS`.
Los diseños oficiales los denominan sin extensión y no establecen una validación del nombre físico exacto. En los ejemplos agregamos `.txt` para que resulte claro que son archivos de texto.
## Elegí tu lenguaje
No hay un Web Service público documentado para presentar el Libro IVA. El código de estas guías genera los archivos localmente; la revisión y presentación se completan en Portal IVA.
## Reglas que deben respetar los archivos
- Los campos numéricos se completan con ceros a la izquierda.
- Los campos alfanuméricos se completan con espacios a la derecha.
- Los importes ocupan 15 posiciones: 13 enteros y 2 decimales, expresados en centavos y sin coma ni punto.
- El tipo de cambio ocupa 10 posiciones: 4 enteros y 6 decimales, también sin separador.
- Los archivos deben usar una codificación ANSI compatible con `Windows-1252` o `ISO-8859-1`.
- Los identificadores, como CUIT y número de comprobante, conviene tratarlos como texto para no perder ceros ni precisión. El número de identificación del comprador es alfanumérico: puede incluir letras, por ejemplo en un pasaporte, y se completa con ceros a la izquierda.
- Los registros de cabecera y alícuotas deben conservar el mismo orden.
- La cantidad informada en el campo `Cantidad de alícuotas de IVA` debe coincidir con las filas del archivo de alícuotas.
- Los códigos no son porcentajes: por ejemplo, la alícuota del 21% se informa como `0005`.
- Los importes se informan, como regla general, en valores positivos. Una nota de crédito se identifica por su tipo de comprobante; no se vuelve negativa automáticamente.
- El CUIT del emisor, el período, el CAE y el detalle de productos no forman parte de estos registros: el CUIT y el período surgen de la sesión y presentación abiertas en Portal IVA.
- Si el período no tiene movimientos, se informa esa situación dentro de Portal IVA: no se genera un registro ficticio con importes en cero.
ARCA permite importar un TXT de hasta 10 MB. También admite un ZIP de hasta 10 MB, siempre que el TXT descomprimido no supere 70 MB.
## Ejemplo de una Factura B
Una Factura B por un neto de `$100` e IVA de `$21` genera:
- una línea de 266 bytes en el archivo de comprobantes;
- una línea de 62 bytes en el archivo de alícuotas;
- el tipo de comprobante `006`;
- el código de alícuota `0005`;
- el total `$121` como `000000000012100`.
Los ejemplos por lenguaje trabajan con importes expresados directamente en centavos para evitar errores de punto flotante.
## De dónde salen los datos
Si emitís con Afip SDK, podés alimentar el generador con los mismos datos normalizados que usaste para autorizar cada comprobante. No alcanza con guardar solamente el CAE o la respuesta final de WSFE:
- la razón social del comprador no siempre está disponible en esa respuesta;
- un importe agregado de tributos no permite separar percepciones nacionales, provinciales, municipales, impuestos internos y otros conceptos;
- el archivo debe conservar los importes efectivos de cada alícuota para respetar los redondeos del comprobante.
Guardá el nombre del cliente, el detalle de alícuotas y la apertura de tributos desde el momento de la emisión. El generador no debe recalcular el IVA a partir de un porcentaje.
Las validaciones incluidas en los ejemplos son estructurales. Portal IVA también controla el período, las tablas de códigos vigentes, los documentos registrados en ARCA, los comprobantes duplicados y otras correlaciones fiscales.
## Cómo importar los archivos
1. Ingresá a Portal IVA y abrí el período correspondiente.
2. Completá los datos iniciales de la registración.
3. En el Libro IVA Ventas, elegí la importación por lote.
4. Indicá si los importes están expresados en pesos argentinos o en la moneda original.
5. Cargá el archivo de comprobantes y el archivo de alícuotas.
6. Revisá los errores, totales y comprobantes antes de confirmar la registración.
La carga de archivos no presenta el libro automáticamente. La confirmación final tiene carácter de declaración jurada.
## Fuentes oficiales
- [Módulo Registración Electrónica de Operaciones y especificaciones de carga](https://www.arca.gob.ar/iva/iva-simple/especificaciones-especiales.asp)
- [Confección y presentación mediante IVA Simple](https://www.arca.gob.ar/iva/iva-simple/confeccion-declaracion.asp)
- [Diseño de registros del Libro IVA Digital](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf)
- [Diseño de registros para sujetos exentos](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf)
- [Especificaciones y validaciones del sistema](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf)
- [Tablas de comprobantes, documentos, monedas y alícuotas](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf)
- [Qué es el Facturador de ARCA](https://www.arca.gob.ar/facturador/caracteristicas-y-funciones/que-es.asp)
- [Resolución General 5705 sobre IVA Simple](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5705%7Co%3A9%7Ca%3A2025%7Cf%3A30%2F05%2F2025)
- [Resolución General 4597 y modificaciones](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A4597%7Co%3A3%7Ca%3A2019%7Cf%3A30%2F09%2F2019)
Antes de usar estos archivos en producción, validá el caso con tu contador y consultá la última versión de los diseños oficiales. Los comprobantes especiales pueden requerir reglas que no aparecen en el ejemplo básico.
---
--- title: Generar los archivos del Libro IVA Digital de ARCA en .NET con C# description: Generá en C# los TXT de ventas y alícuotas que acepta Portal IVA, con ancho fijo y codificación Windows-1252. category: [.NET] pubDate: jul 29, 2026 cover: /images/blog/generar-archivos-libro-iva-digital-arca-en-csharp.webp ---
# Generar los archivos del Libro IVA Digital de ARCA en .NET con C#
En esta guía vamos a generar con C# y .NET los dos archivos de ventas que acepta la importación de Portal IVA:
- `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt`, con una línea de 266 bytes por comprobante;
- `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt`, con una línea de 62 bytes por cada alícuota.
> Este ejemplo es para responsables inscriptos que importan ventas en IVA Simple. Los sujetos exentos tienen un [diseño específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), sin este archivo de alícuotas, y no deben usar el código sin adaptarlo.
Si primero querés entender qué es el Libro IVA, cómo se relaciona con IVA Simple y por qué el ZIP de duplicados electrónicos es diferente, leé la guía general:
## 1. Crear el proyecto
El ejemplo usa solamente clases incluidas en .NET, sin paquetes externos:
```bash
dotnet new console -n LibroIvaDigital
cd LibroIvaDigital
```
## 2. Preparar los datos
Vamos a generar una Factura B por `$121`: `$100` de neto gravado y `$21` de IVA.
El modelo conserva los importes como centavos en valores `long`. Al recibir montos decimales, `ToCents` los convierte de forma exacta: no usa `double`, no redondea silenciosamente y rechaza más de dos decimales. La cotización sigue el mismo criterio, pero con seis decimales.
## 3. Generar los registros de ancho fijo
Reemplazá el contenido de `Program.cs` por este código completo:
```csharp
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
internal static class Program
{
private static readonly CultureInfo ArgentineCulture =
CultureInfo.GetCultureInfo("es-AR");
private static readonly Encoding Windows1252 = CreateWindows1252();
private static void Main()
{
var vouchers = new List
{
new()
{
Date = "20260701",
VoucherType = 6, // 006 = Factura B
PointOfSale = "1",
Number = "123",
NumberTo = "123",
BuyerDocumentType = 80, // 80 = CUIT
BuyerDocumentNumber = "30712345678",
BuyerName = "CLIENTE MUÑOZ S.A.",
TotalCents = ToCents(121.00m, "Importe total"),
NonTaxedCents = 0,
UncategorizedPerceptionCents = 0,
ExemptCents = 0,
NationalTaxPerceptionCents = 0,
GrossIncomePerceptionCents = 0,
MunicipalPerceptionCents = 0,
InternalTaxCents = 0,
Currency = "PES",
ExchangeRateMicros = ToExchangeRateMicros(
1.000000m,
"Tipo de cambio"
),
OperationCode = "0",
OtherTaxesCents = 0,
DueDate = "00000000",
VatBreakdown = new[]
{
new VatLine(
NetCents: ToCents(100.00m, "Neto gravado"),
RateCode: 5, // 0005 = 21%
TaxCents: ToCents(21.00m, "IVA liquidado")
)
}
}
};
var voucherRecords = new List();
var vatRecords = new List();
foreach (var voucher in vouchers)
{
voucherRecords.Add(SalesVoucherRecord(voucher));
foreach (var vat in voucher.VatBreakdown)
{
vatRecords.Add(SalesVatRecord(voucher, vat));
}
}
WriteWindows1252File(
"LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt",
voucherRecords,
266
);
WriteWindows1252File(
"LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt",
vatRecords,
62
);
Console.WriteLine(
$"Generados {voucherRecords.Count} comprobantes y " +
$"{vatRecords.Count} alícuotas"
);
}
private static Encoding CreateWindows1252()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
return Encoding.GetEncoding(
1252,
EncoderFallback.ExceptionFallback,
DecoderFallback.ExceptionFallback
);
}
private static byte[] EncodeWindows1252(string value, string name)
{
try
{
return Windows1252.GetBytes(value);
}
catch (EncoderFallbackException exception)
{
throw new ArgumentException(
$"{name} contiene caracteres incompatibles con Windows-1252",
name,
exception
);
}
}
private static string NumericField(
object value,
int width,
string name
)
{
var text = Convert.ToString(
value,
CultureInfo.InvariantCulture
) ?? string.Empty;
if (text.Length == 0 || text.Any(character =>
character is < '0' or > '9'))
{
throw new ArgumentException(
$"{name} debe contener solamente dígitos",
name
);
}
if (text.Length > width)
{
throw new ArgumentException(
$"{name} supera las {width} posiciones",
name
);
}
return text.PadLeft(width, '0');
}
private static string ZeroPaddedAlphanumericField(
string value,
int width,
string name
)
{
var text = value.Trim().ToUpperInvariant();
if (text.Length == 0 || text.Any(character =>
!(
character is >= '0' and <= '9' ||
character is >= 'A' and <= 'Z'
)))
{
throw new ArgumentException(
$"{name} debe ser alfanumérico",
name
);
}
var byteLength = EncodeWindows1252(text, name).Length;
if (byteLength > width)
{
throw new ArgumentException(
$"{name} supera las {width} posiciones",
name
);
}
return new string('0', width - byteLength) + text;
}
private static string TextField(
string value,
int width,
string name
)
{
var text = Regex
.Replace(
value.Replace('\r', ' ')
.Replace('\n', ' ')
.Replace('\t', ' '),
@"\s+",
" "
)
.Trim()
.ToUpper(ArgentineCulture);
var byteLength = EncodeWindows1252(text, name).Length;
if (byteLength > width)
{
throw new ArgumentException(
$"{name} supera las {width} posiciones",
name
);
}
return text + new string(' ', width - byteLength);
}
private static string AmountField(long cents, string name)
{
var text = cents.ToString(CultureInfo.InvariantCulture);
var isNegative = text.StartsWith(
"-",
StringComparison.Ordinal
);
var absolute = isNegative ? text[1..] : text;
var digitWidth = isNegative ? 14 : 15;
if (absolute.Length > digitWidth)
{
throw new ArgumentException(
$"{name} supera las 15 posiciones",
name
);
}
var digits = absolute.PadLeft(digitWidth, '0');
return isNegative ? $"-{digits}" : digits;
}
private static long ToCents(decimal amount, string name)
{
var scaled = amount * 100m;
if (scaled != decimal.Truncate(scaled))
{
throw new ArgumentException(
$"{name} tiene más de dos decimales",
name
);
}
return checked((long)scaled);
}
private static long ToExchangeRateMicros(
decimal exchangeRate,
string name
)
{
var scaled = exchangeRate * 1_000_000m;
if (scaled != decimal.Truncate(scaled))
{
throw new ArgumentException(
$"{name} tiene más de seis decimales",
name
);
}
return checked((long)scaled);
}
private static string BuildRecord(
IEnumerable parts,
int expectedLength,
string name
)
{
var record = string.Concat(parts);
var byteLength = EncodeWindows1252(record, name).Length;
if (byteLength != expectedLength)
{
throw new ArgumentException(
$"{name} mide {byteLength}; " +
$"ARCA exige {expectedLength}",
name
);
}
return record;
}
private static void ValidateVoucher(Voucher voucher)
{
var vatCount = voucher.VatBreakdown.Count;
if (vatCount is < 1 or > 9)
{
throw new ArgumentException(
"La cantidad de alícuotas debe estar entre 1 y 9"
);
}
long calculatedTotal = 0;
checked
{
calculatedTotal += voucher.NonTaxedCents;
calculatedTotal += voucher.UncategorizedPerceptionCents;
calculatedTotal += voucher.ExemptCents;
calculatedTotal += voucher.NationalTaxPerceptionCents;
calculatedTotal += voucher.GrossIncomePerceptionCents;
calculatedTotal += voucher.MunicipalPerceptionCents;
calculatedTotal += voucher.InternalTaxCents;
calculatedTotal += voucher.OtherTaxesCents;
foreach (var vat in voucher.VatBreakdown)
{
calculatedTotal += vat.NetCents;
calculatedTotal += vat.TaxCents;
}
}
if (calculatedTotal != voucher.TotalCents)
{
throw new ArgumentException(
$"El total informado ({voucher.TotalCents}) no " +
$"coincide con sus componentes ({calculatedTotal})"
);
}
}
private static string SalesVoucherRecord(Voucher voucher)
{
ValidateVoucher(voucher);
return BuildRecord(
new[]
{
NumericField(voucher.Date, 8, "Fecha"),
NumericField(
voucher.VoucherType,
3,
"Tipo de comprobante"
),
NumericField(
voucher.PointOfSale,
5,
"Punto de venta"
),
NumericField(
voucher.Number,
20,
"Número de comprobante"
),
NumericField(
voucher.NumberTo,
20,
"Número de comprobante hasta"
),
NumericField(
voucher.BuyerDocumentType,
2,
"Tipo de documento"
),
ZeroPaddedAlphanumericField(
voucher.BuyerDocumentNumber,
20,
"Documento"
),
TextField(
voucher.BuyerName,
30,
"Nombre del comprador"
),
AmountField(voucher.TotalCents, "Importe total"),
AmountField(
voucher.NonTaxedCents,
"Conceptos no gravados"
),
AmountField(
voucher.UncategorizedPerceptionCents,
"Percepción a no categorizados"
),
AmountField(
voucher.ExemptCents,
"Operaciones exentas"
),
AmountField(
voucher.NationalTaxPerceptionCents,
"Percepciones nacionales"
),
AmountField(
voucher.GrossIncomePerceptionCents,
"Percepciones de Ingresos Brutos"
),
AmountField(
voucher.MunicipalPerceptionCents,
"Percepciones municipales"
),
AmountField(
voucher.InternalTaxCents,
"Impuestos internos"
),
TextField(voucher.Currency, 3, "Moneda"),
NumericField(
voucher.ExchangeRateMicros,
10,
"Tipo de cambio"
),
NumericField(
voucher.VatBreakdown.Count,
1,
"Cantidad de alícuotas"
),
TextField(
voucher.OperationCode,
1,
"Código de operación"
),
AmountField(
voucher.OtherTaxesCents,
"Otros tributos"
),
NumericField(
voucher.DueDate,
8,
"Fecha de vencimiento"
)
},
266,
"Registro de comprobante"
);
}
private static string SalesVatRecord(
Voucher voucher,
VatLine vat
)
{
return BuildRecord(
new[]
{
NumericField(
voucher.VoucherType,
3,
"Tipo de comprobante"
),
NumericField(
voucher.PointOfSale,
5,
"Punto de venta"
),
NumericField(
voucher.Number,
20,
"Número de comprobante"
),
AmountField(vat.NetCents, "Neto gravado"),
NumericField(vat.RateCode, 4, "Alícuota"),
AmountField(vat.TaxCents, "Impuesto liquidado")
},
62,
"Registro de alícuota"
);
}
private static void WriteWindows1252File(
string path,
IReadOnlyCollection records,
int recordWidth
)
{
if (records.Count == 0)
{
throw new ArgumentException(
$"{path} no contiene registros",
nameof(records)
);
}
var content = string.Join("\r\n", records) + "\r\n";
var bytes = EncodeWindows1252(content, path);
var expectedLength = checked(
records.Count * (recordWidth + 2)
);
if (bytes.Length != expectedLength)
{
throw new ArgumentException(
$"{path} mide {bytes.Length}; " +
$"se esperaban {expectedLength} bytes"
);
}
File.WriteAllBytes(path, bytes);
}
}
internal sealed class Voucher
{
public string Date { get; init; } = string.Empty;
public int VoucherType { get; init; }
public string PointOfSale { get; init; } = string.Empty;
public string Number { get; init; } = string.Empty;
public string NumberTo { get; init; } = string.Empty;
public int BuyerDocumentType { get; init; }
public string BuyerDocumentNumber { get; init; } = string.Empty;
public string BuyerName { get; init; } = string.Empty;
public long TotalCents { get; init; }
public long NonTaxedCents { get; init; }
public long UncategorizedPerceptionCents { get; init; }
public long ExemptCents { get; init; }
public long NationalTaxPerceptionCents { get; init; }
public long GrossIncomePerceptionCents { get; init; }
public long MunicipalPerceptionCents { get; init; }
public long InternalTaxCents { get; init; }
public string Currency { get; init; } = string.Empty;
public long ExchangeRateMicros { get; init; }
public string OperationCode { get; init; } = string.Empty;
public long OtherTaxesCents { get; init; }
public string DueDate { get; init; } = string.Empty;
public IReadOnlyList VatBreakdown { get; init; } =
Array.Empty();
}
internal sealed record VatLine(
long NetCents,
int RateCode,
long TaxCents
);
```
Ejecutalo con:
```bash
dotnet run
```
## 4. Validar antes de importar
El programa corta la ejecución si:
- un campo numérico contiene caracteres no permitidos;
- el documento del comprador no es alfanumérico;
- un valor supera el ancho oficial;
- un texto contiene caracteres incompatibles con Windows-1252;
- una cabecera no mide exactamente 266 bytes;
- una alícuota no mide exactamente 62 bytes;
- el total no coincide con el neto, IVA y demás conceptos;
- un importe tiene más de dos decimales o la cotización más de seis;
- se intenta crear un archivo sin registros.
Los archivos se escriben sin BOM, con finales de línea `CRLF`. Cada registro se controla después de codificarlo a Windows-1252, por lo que el ancho validado es el de bytes que recibe ARCA y no la cantidad de caracteres de .NET.
Estas comprobaciones son estructurales. Portal IVA también valida el período seleccionado, las tablas de códigos vigentes, la identificación del comprador, los comprobantes duplicados y las correlaciones fiscales.
## Casos que requieren adaptar el ejemplo
- Varias alícuotas: agregá un `VatLine` por alícuota en `VatBreakdown`.
- Operaciones exentas o no gravadas: usá el código de operación y la alícuota que indique la tabla oficial.
- Notas de crédito: informá su tipo de comprobante y no inviertas los importes automáticamente.
- Moneda extranjera: mantené consistente la moneda, el tipo de cambio y la opción elegida al importar.
- TURIVA, importaciones y comprobantes anulados: usá sus diseños específicos.
## Otras versiones
- [Node.js](/blog/generar-archivos-libro-iva-digital-arca-en-nodejs/)
- [PHP](/blog/generar-archivos-libro-iva-digital-arca-en-php/)
- [Python](/blog/generar-archivos-libro-iva-digital-arca-en-python/)
- [Ruby](/blog/generar-archivos-libro-iva-digital-arca-en-ruby/)
- [Java](/blog/generar-archivos-libro-iva-digital-arca-en-java/)
Consultá siempre el [diseño de registros](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf), las [validaciones](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf) y las [tablas del sistema](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf) vigentes antes de generar archivos productivos.
---
--- title: Generar los archivos del Libro IVA Digital de ARCA en Java description: Generá en Java los TXT de ventas y alícuotas que acepta Portal IVA, con ancho fijo y codificación Windows-1252. category: [Java] pubDate: jul 29, 2026 cover: /images/blog/generar-archivos-libro-iva-digital-arca-en-java.webp ---
# Generar los archivos del Libro IVA Digital de ARCA en Java
En esta guía vamos a generar desde Java los dos archivos de ventas que acepta la importación de Portal IVA:
- `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt`, con una línea de 266 bytes por comprobante;
- `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt`, con una línea de 62 bytes por cada alícuota.
> Este ejemplo es para responsables inscriptos que importan ventas en IVA Simple. Los sujetos exentos tienen un [diseño específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), sin este archivo de alícuotas, y no deben usar el código sin adaptarlo.
Si primero querés entender qué es el Libro IVA, cómo se relaciona con IVA Simple y por qué el ZIP de duplicados electrónicos es diferente, leé la guía general:
## 1. Preparar los datos
El ejemplo usa una Factura B por `$121`: `$100` de neto gravado y `$21` de IVA. Los importes se guardan en **centavos enteros** dentro de valores `long`, no como números decimales.
```java
List vatBreakdown = List.of(
new VatBreakdown(
10_000L,
"5", // 0005 = 21%
2_100L
)
);
Voucher voucher = new Voucher(
"20260701",
"6", // 006 = Factura B
"1",
"123",
"123",
"80", // 80 = CUIT
"30712345678",
"CLIENTE MUÑOZ S.A.",
12_100L,
0L,
0L,
0L,
0L,
0L,
0L,
0L,
"PES",
"1000000", // 1,000000
"0",
0L,
"00000000",
vatBreakdown
);
```
Los identificadores se mantienen como `String` para no perder ceros iniciales. El rango admitido por los campos monetarios oficiales de 15 posiciones entra de forma segura en un `long`.
## 2. Generar los registros de ancho fijo
El ejemplo requiere Java 17 o posterior y usa únicamente la biblioteca estándar. Creá un archivo `GenerarLibroIva.java` con el siguiente contenido completo:
```java
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CodingErrorAction;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public final class GenerarLibroIva {
private static final Charset WINDOWS_1252 =
Charset.forName("windows-1252");
private record VatBreakdown(
long netCents,
String rateCode,
long taxCents
) {}
private record Voucher(
String date,
String voucherType,
String pointOfSale,
String number,
String numberTo,
String buyerDocumentType,
String buyerDocumentNumber,
String buyerName,
long totalCents,
long nonTaxedCents,
long uncategorizedPerceptionCents,
long exemptCents,
long nationalTaxPerceptionCents,
long grossIncomePerceptionCents,
long municipalPerceptionCents,
long internalTaxCents,
String currency,
String exchangeRateMicros,
String operationCode,
long otherTaxesCents,
String dueDate,
List vatBreakdown
) {}
private GenerarLibroIva() {}
private static byte[] windows1252(String value, String name) {
CharsetEncoder encoder = WINDOWS_1252
.newEncoder()
.onMalformedInput(CodingErrorAction.REPORT)
.onUnmappableCharacter(CodingErrorAction.REPORT);
try {
ByteBuffer encoded = encoder.encode(
CharBuffer.wrap(value)
);
byte[] bytes = new byte[encoded.remaining()];
encoded.get(bytes);
return bytes;
} catch (CharacterCodingException error) {
throw new IllegalArgumentException(
name
+ " contiene caracteres incompatibles "
+ "con Windows-1252",
error
);
}
}
private static String numericField(
String value,
int width,
String name
) {
if (value == null || !value.matches("[0-9]+")) {
throw new IllegalArgumentException(
name + " debe contener solamente dígitos"
);
}
if (value.length() > width) {
throw new IllegalArgumentException(
name + " supera las " + width + " posiciones"
);
}
return "0".repeat(width - value.length()) + value;
}
private static String zeroPaddedAlphanumericField(
String value,
int width,
String name
) {
if (value == null) {
throw new IllegalArgumentException(
name + " debe ser alfanumérico"
);
}
String text = value.trim().toUpperCase(Locale.ROOT);
if (!text.matches("[0-9A-Z]+")) {
throw new IllegalArgumentException(
name + " debe ser alfanumérico"
);
}
int byteLength = windows1252(text, name).length;
if (byteLength > width) {
throw new IllegalArgumentException(
name + " supera las " + width + " posiciones"
);
}
return "0".repeat(width - byteLength) + text;
}
private static String textField(
String value,
int width,
String name
) {
if (value == null) {
throw new IllegalArgumentException(
name + " no puede ser nulo"
);
}
String text = value
.toUpperCase(Locale.forLanguageTag("es-AR"))
.replaceAll("[\\r\\n\\t]", " ")
.replaceAll("\\s+", " ")
.trim();
int byteLength = windows1252(text, name).length;
if (byteLength > width) {
throw new IllegalArgumentException(
name + " supera las " + width + " posiciones"
);
}
return text + " ".repeat(width - byteLength);
}
private static String amountField(long cents, String name) {
boolean negative = cents < 0;
String value = Long.toString(cents);
String absolute = negative ? value.substring(1) : value;
int digitWidth = negative ? 14 : 15;
if (absolute.length() > digitWidth) {
throw new IllegalArgumentException(
name + " supera las 15 posiciones"
);
}
String digits =
"0".repeat(digitWidth - absolute.length()) + absolute;
return negative ? "-" + digits : digits;
}
private static String buildRecord(
int expectedLength,
String name,
String... parts
) {
String record = String.join("", parts);
int byteLength = windows1252(record, name).length;
if (byteLength != expectedLength) {
throw new IllegalArgumentException(
name
+ " mide "
+ byteLength
+ "; ARCA exige "
+ expectedLength
);
}
return record;
}
private static long addExact(
long total,
long amount,
String name
) {
try {
return Math.addExact(total, amount);
} catch (ArithmeticException error) {
throw new IllegalArgumentException(
name + " excede el rango de long",
error
);
}
}
private static void validateVoucher(Voucher voucher) {
if (voucher.vatBreakdown() == null) {
throw new IllegalArgumentException(
"El detalle de alícuotas no puede ser nulo"
);
}
int vatCount = voucher.vatBreakdown().size();
if (vatCount < 1 || vatCount > 9) {
throw new IllegalArgumentException(
"La cantidad de alícuotas debe estar entre 1 y 9"
);
}
long calculatedTotal = 0L;
calculatedTotal = addExact(
calculatedTotal,
voucher.nonTaxedCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.uncategorizedPerceptionCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.exemptCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.nationalTaxPerceptionCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.grossIncomePerceptionCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.municipalPerceptionCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.internalTaxCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
voucher.otherTaxesCents(),
"El total"
);
for (VatBreakdown vat : voucher.vatBreakdown()) {
calculatedTotal = addExact(
calculatedTotal,
vat.netCents(),
"El total"
);
calculatedTotal = addExact(
calculatedTotal,
vat.taxCents(),
"El total"
);
}
if (calculatedTotal != voucher.totalCents()) {
throw new IllegalArgumentException(
"El total informado ("
+ voucher.totalCents()
+ ") no coincide con sus componentes ("
+ calculatedTotal
+ ")"
);
}
}
private static String salesVoucherRecord(Voucher voucher) {
validateVoucher(voucher);
return buildRecord(
266,
"Registro de comprobante",
numericField(voucher.date(), 8, "Fecha"),
numericField(
voucher.voucherType(),
3,
"Tipo de comprobante"
),
numericField(
voucher.pointOfSale(),
5,
"Punto de venta"
),
numericField(
voucher.number(),
20,
"Número de comprobante"
),
numericField(
voucher.numberTo(),
20,
"Número de comprobante hasta"
),
numericField(
voucher.buyerDocumentType(),
2,
"Tipo de documento"
),
zeroPaddedAlphanumericField(
voucher.buyerDocumentNumber(),
20,
"Documento"
),
textField(
voucher.buyerName(),
30,
"Nombre del comprador"
),
amountField(
voucher.totalCents(),
"Importe total"
),
amountField(
voucher.nonTaxedCents(),
"Conceptos no gravados"
),
amountField(
voucher.uncategorizedPerceptionCents(),
"Percepción a no categorizados"
),
amountField(
voucher.exemptCents(),
"Operaciones exentas"
),
amountField(
voucher.nationalTaxPerceptionCents(),
"Percepciones nacionales"
),
amountField(
voucher.grossIncomePerceptionCents(),
"Percepciones de Ingresos Brutos"
),
amountField(
voucher.municipalPerceptionCents(),
"Percepciones municipales"
),
amountField(
voucher.internalTaxCents(),
"Impuestos internos"
),
textField(voucher.currency(), 3, "Moneda"),
numericField(
voucher.exchangeRateMicros(),
10,
"Tipo de cambio"
),
numericField(
Integer.toString(voucher.vatBreakdown().size()),
1,
"Cantidad de alícuotas"
),
textField(
voucher.operationCode(),
1,
"Código de operación"
),
amountField(
voucher.otherTaxesCents(),
"Otros tributos"
),
numericField(
voucher.dueDate(),
8,
"Fecha de vencimiento"
)
);
}
private static String salesVatRecord(
Voucher voucher,
VatBreakdown vat
) {
return buildRecord(
62,
"Registro de alícuota",
numericField(
voucher.voucherType(),
3,
"Tipo de comprobante"
),
numericField(
voucher.pointOfSale(),
5,
"Punto de venta"
),
numericField(
voucher.number(),
20,
"Número de comprobante"
),
amountField(vat.netCents(), "Neto gravado"),
numericField(vat.rateCode(), 4, "Alícuota"),
amountField(vat.taxCents(), "Impuesto liquidado")
);
}
private static void writeWindows1252File(
Path path,
List records
) throws IOException {
if (records.isEmpty()) {
throw new IllegalArgumentException(
path + " no contiene registros"
);
}
String content = String.join("\r\n", records) + "\r\n";
Files.write(path, windows1252(content, path.toString()));
}
public static void main(String[] args) throws IOException {
List vouchers = List.of(
new Voucher(
"20260701",
"6",
"1",
"123",
"123",
"80",
"30712345678",
"CLIENTE MUÑOZ S.A.",
12_100L,
0L,
0L,
0L,
0L,
0L,
0L,
0L,
"PES",
"1000000",
"0",
0L,
"00000000",
List.of(
new VatBreakdown(
10_000L,
"5",
2_100L
)
)
)
);
List voucherRecords = new ArrayList<>();
List vatRecords = new ArrayList<>();
for (Voucher voucher : vouchers) {
voucherRecords.add(salesVoucherRecord(voucher));
for (VatBreakdown vat : voucher.vatBreakdown()) {
vatRecords.add(salesVatRecord(voucher, vat));
}
}
writeWindows1252File(
Path.of("LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt"),
voucherRecords
);
writeWindows1252File(
Path.of("LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt"),
vatRecords
);
System.out.printf(
"Generados %d comprobantes y %d alícuotas%n",
voucherRecords.size(),
vatRecords.size()
);
}
}
```
Compilalo y ejecutalo con:
```bash
javac -encoding UTF-8 GenerarLibroIva.java
java GenerarLibroIva
```
## 3. Validar antes de importar
El programa corta la ejecución si:
- un campo numérico contiene caracteres no permitidos;
- el documento del comprador no es alfanumérico;
- un valor supera el ancho oficial;
- un texto contiene caracteres incompatibles con Windows-1252;
- una cabecera no mide exactamente 266 bytes;
- una alícuota no mide exactamente 62 bytes;
- el total no coincide con el neto, IVA y demás conceptos;
- una suma excede el rango de `long`;
- se intenta crear un archivo sin registros.
También escribe finales de línea `CRLF` y genera archivos Windows-1252 sin BOM. Estas validaciones comprueban la estructura: Portal IVA además controla el período, los códigos vigentes, la identificación del comprador, los comprobantes duplicados y las relaciones fiscales entre campos.
## Casos que requieren adaptar el ejemplo
- Varias alícuotas: agregá un objeto `VatBreakdown` por alícuota.
- Operaciones exentas o no gravadas: usá el código de operación y la alícuota que indique la tabla oficial.
- Notas de crédito: informá su tipo de comprobante y no inviertas los importes automáticamente.
- Moneda extranjera: mantené consistente la moneda, el tipo de cambio y la opción elegida al importar.
- TURIVA, importaciones y comprobantes anulados: usá sus diseños específicos.
## Otras versiones
- [Node.js](/blog/generar-archivos-libro-iva-digital-arca-en-nodejs/)
- [PHP](/blog/generar-archivos-libro-iva-digital-arca-en-php/)
- [Python](/blog/generar-archivos-libro-iva-digital-arca-en-python/)
- [Ruby](/blog/generar-archivos-libro-iva-digital-arca-en-ruby/)
- [.NET con C#](/blog/generar-archivos-libro-iva-digital-arca-en-csharp/)
Consultá siempre el [diseño de registros](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf), las [validaciones](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf) y las [tablas del sistema](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf) vigentes antes de generar archivos productivos.
---
--- title: Generar los archivos del Libro IVA Digital de ARCA en Node.js description: Generá en Node.js los TXT de ventas y alícuotas que acepta Portal IVA, con ancho fijo y codificación Windows-1252. category: [Javascript] pubDate: jul 29, 2026 cover: /images/blog/generar-archivos-libro-iva-digital-arca-en-nodejs.webp ---
# Generar los archivos del Libro IVA Digital de ARCA en Node.js
En esta guía vamos a generar desde Node.js los dos archivos de ventas que acepta la importación de Portal IVA:
- `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt`, con una línea de 266 bytes por comprobante;
- `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt`, con una línea de 62 bytes por cada alícuota.
> Este ejemplo es para responsables inscriptos que importan ventas en IVA Simple. Los sujetos exentos tienen un [diseño específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), sin este archivo de alícuotas, y no deben usar el script sin adaptarlo.
Si primero querés entender qué es el Libro IVA, cómo se relaciona con IVA Simple y por qué el ZIP de duplicados electrónicos es diferente, leé la guía general:
## 1. Instalar la dependencia de codificación
Node.js escribe UTF-8 de manera predeterminada, pero ARCA exige una codificación ANSI compatible con Windows-1252 o ISO-8859-1. Vamos a usar `iconv-lite`:
```bash
npm install iconv-lite
```
## 2. Preparar los datos
El ejemplo usa una Factura B por `$121`: `$100` de neto gravado y `$21` de IVA. Los importes se guardan en **centavos enteros**, no como números decimales.
```js
const vouchers = [
{
date: '20260701',
voucherType: 6, // 006 = Factura B
pointOfSale: '1',
number: '123',
numberTo: '123',
buyerDocumentType: 80, // 80 = CUIT
buyerDocumentNumber: '30712345678',
buyerName: 'CLIENTE MUÑOZ S.A.',
totalCents: 12100,
nonTaxedCents: 0,
uncategorizedPerceptionCents: 0,
exemptCents: 0,
nationalTaxPerceptionCents: 0,
grossIncomePerceptionCents: 0,
municipalPerceptionCents: 0,
internalTaxCents: 0,
currency: 'PES',
exchangeRateMicros: 1000000, // 1,000000
operationCode: '0',
otherTaxesCents: 0,
dueDate: '00000000',
vatBreakdown: [
{
netCents: 10000,
rateCode: 5, // 0005 = 21%
taxCents: 2100,
},
],
},
];
```
Podés agregar más comprobantes al arreglo. El generador mantiene el mismo orden en ambos archivos.
## 3. Generar los registros de ancho fijo
Creá un archivo `generar-libro-iva.mjs` con el siguiente contenido completo:
```js
function windows1252(value, name) {
const text = String(value);
const encoded = iconv.encode(text, 'windows-1252');
const decoded = iconv.decode(encoded, 'windows-1252');
if (decoded !== text) {
throw new Error(
`${name} contiene caracteres incompatibles con Windows-1252`,
);
}
return encoded;
}
function numericField(value, width, name) {
const text = String(value);
if (!/^\d+$/.test(text)) {
throw new Error(`${name} debe contener solamente dígitos`);
}
if (text.length > width) {
throw new Error(`${name} supera las ${width} posiciones`);
}
return text.padStart(width, '0');
}
function zeroPaddedAlphanumericField(value, width, name) {
const text = String(value).trim().toUpperCase();
if (!/^[0-9A-Z]+$/.test(text)) {
throw new Error(`${name} debe ser alfanumérico`);
}
const byteLength = windows1252(text, name).length;
if (byteLength > width) {
throw new Error(`${name} supera las ${width} posiciones`);
}
return '0'.repeat(width - byteLength) + text;
}
function textField(value, width, name) {
const text = String(value)
.toLocaleUpperCase('es-AR')
.replace(/[\r\n\t]/g, ' ')
.replace(/\s+/g, ' ')
.trim();
const byteLength = windows1252(text, name).length;
if (byteLength > width) {
throw new Error(`${name} supera las ${width} posiciones`);
}
return text + ' '.repeat(width - byteLength);
}
function amountField(cents, name) {
if (!Number.isSafeInteger(cents)) {
throw new Error(`${name} debe expresarse en centavos enteros`);
}
const absolute = Math.abs(cents).toString();
const digitWidth = cents < 0 ? 14 : 15;
if (absolute.length > digitWidth) {
throw new Error(`${name} supera las 15 posiciones`);
}
const digits = absolute.padStart(digitWidth, '0');
return cents < 0 ? `-${digits}` : digits;
}
function buildRecord(parts, expectedLength, name) {
const record = parts.join('');
const byteLength = windows1252(record, name).length;
if (byteLength !== expectedLength) {
throw new Error(
`${name} mide ${byteLength}; ARCA exige ${expectedLength}`,
);
}
return record;
}
function validateVoucher(voucher) {
const vatCount = voucher.vatBreakdown.length;
if (vatCount < 1 || vatCount > 9) {
throw new Error('La cantidad de alícuotas debe estar entre 1 y 9');
}
const calculatedTotal =
voucher.nonTaxedCents +
voucher.uncategorizedPerceptionCents +
voucher.exemptCents +
voucher.nationalTaxPerceptionCents +
voucher.grossIncomePerceptionCents +
voucher.municipalPerceptionCents +
voucher.internalTaxCents +
voucher.otherTaxesCents +
voucher.vatBreakdown.reduce(
(total, vat) => total + vat.netCents + vat.taxCents,
0,
);
if (calculatedTotal !== voucher.totalCents) {
throw new Error(
`El total informado (${voucher.totalCents}) no coincide con sus componentes (${calculatedTotal})`,
);
}
}
function salesVoucherRecord(voucher) {
validateVoucher(voucher);
return buildRecord(
[
numericField(voucher.date, 8, 'Fecha'),
numericField(voucher.voucherType, 3, 'Tipo de comprobante'),
numericField(voucher.pointOfSale, 5, 'Punto de venta'),
numericField(voucher.number, 20, 'Número de comprobante'),
numericField(voucher.numberTo, 20, 'Número de comprobante hasta'),
numericField(voucher.buyerDocumentType, 2, 'Tipo de documento'),
zeroPaddedAlphanumericField(
voucher.buyerDocumentNumber,
20,
'Documento',
),
textField(voucher.buyerName, 30, 'Nombre del comprador'),
amountField(voucher.totalCents, 'Importe total'),
amountField(voucher.nonTaxedCents, 'Conceptos no gravados'),
amountField(
voucher.uncategorizedPerceptionCents,
'Percepción a no categorizados',
),
amountField(voucher.exemptCents, 'Operaciones exentas'),
amountField(
voucher.nationalTaxPerceptionCents,
'Percepciones nacionales',
),
amountField(
voucher.grossIncomePerceptionCents,
'Percepciones de Ingresos Brutos',
),
amountField(
voucher.municipalPerceptionCents,
'Percepciones municipales',
),
amountField(voucher.internalTaxCents, 'Impuestos internos'),
textField(voucher.currency, 3, 'Moneda'),
numericField(voucher.exchangeRateMicros, 10, 'Tipo de cambio'),
numericField(voucher.vatBreakdown.length, 1, 'Cantidad de alícuotas'),
textField(voucher.operationCode, 1, 'Código de operación'),
amountField(voucher.otherTaxesCents, 'Otros tributos'),
numericField(voucher.dueDate, 8, 'Fecha de vencimiento'),
],
266,
'Registro de comprobante',
);
}
function salesVatRecord(voucher, vat) {
return buildRecord(
[
numericField(voucher.voucherType, 3, 'Tipo de comprobante'),
numericField(voucher.pointOfSale, 5, 'Punto de venta'),
numericField(voucher.number, 20, 'Número de comprobante'),
amountField(vat.netCents, 'Neto gravado'),
numericField(vat.rateCode, 4, 'Alícuota'),
amountField(vat.taxCents, 'Impuesto liquidado'),
],
62,
'Registro de alícuota',
);
}
function writeWindows1252File(path, records) {
if (records.length === 0) {
throw new Error(`${path} no contiene registros`);
}
const content = `${records.join('\r\n')}\r\n`;
writeFileSync(path, windows1252(content, path));
}
const vouchers = [
{
date: '20260701',
voucherType: 6,
pointOfSale: '1',
number: '123',
numberTo: '123',
buyerDocumentType: 80,
buyerDocumentNumber: '30712345678',
buyerName: 'CLIENTE MUÑOZ S.A.',
totalCents: 12100,
nonTaxedCents: 0,
uncategorizedPerceptionCents: 0,
exemptCents: 0,
nationalTaxPerceptionCents: 0,
grossIncomePerceptionCents: 0,
municipalPerceptionCents: 0,
internalTaxCents: 0,
currency: 'PES',
exchangeRateMicros: 1000000,
operationCode: '0',
otherTaxesCents: 0,
dueDate: '00000000',
vatBreakdown: [
{ netCents: 10000, rateCode: 5, taxCents: 2100 },
],
},
];
const voucherRecords = vouchers.map(salesVoucherRecord);
const vatRecords = vouchers.flatMap((voucher) =>
voucher.vatBreakdown.map((vat) => salesVatRecord(voucher, vat)),
);
writeWindows1252File(
'LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt',
voucherRecords,
);
writeWindows1252File(
'LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt',
vatRecords,
);
console.log(
`Generados ${voucherRecords.length} comprobantes y ${vatRecords.length} alícuotas`,
);
```
Ejecutalo con:
```bash
node generar-libro-iva.mjs
```
## 4. Validar antes de importar
El script corta la ejecución si:
- un campo numérico contiene caracteres no permitidos;
- el documento del comprador no es alfanumérico;
- un valor supera el ancho oficial;
- un texto contiene caracteres incompatibles con Windows-1252;
- una cabecera no mide exactamente 266 bytes;
- una alícuota no mide exactamente 62 bytes;
- el total no coincide con el neto, IVA y demás conceptos;
- un importe no fue entregado en centavos enteros;
- se intenta crear un archivo sin registros.
También escribe finales de línea `CRLF` y convierte el contenido a Windows-1252.
## Casos que requieren adaptar el ejemplo
- Varias alícuotas: agregá un objeto por alícuota en `vatBreakdown`.
- Operaciones exentas o no gravadas: usá el código de operación y la alícuota que indique la tabla oficial.
- Notas de crédito: informá su tipo de comprobante y no inviertas los importes automáticamente.
- Moneda extranjera: mantené consistente la moneda, el tipo de cambio y la opción elegida al importar.
- TURIVA, importaciones y comprobantes anulados: usá sus diseños específicos.
## Otras versiones
- [PHP](/blog/generar-archivos-libro-iva-digital-arca-en-php/)
- [Python](/blog/generar-archivos-libro-iva-digital-arca-en-python/)
- [Ruby](/blog/generar-archivos-libro-iva-digital-arca-en-ruby/)
- [Java](/blog/generar-archivos-libro-iva-digital-arca-en-java/)
- [.NET con C#](/blog/generar-archivos-libro-iva-digital-arca-en-csharp/)
Consultá siempre el [diseño de registros](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf), las [validaciones](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf) y las [tablas del sistema](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf) vigentes antes de generar archivos productivos.
---
--- title: Generar los archivos del Libro IVA Digital de ARCA en PHP description: Generá en PHP los TXT de ventas y alícuotas que acepta Portal IVA, con ancho fijo y codificación Windows-1252. category: [PHP] pubDate: jul 29, 2026 cover: /images/blog/generar-archivos-libro-iva-digital-arca-en-php.webp ---
# Generar los archivos del Libro IVA Digital de ARCA en PHP
En esta guía vamos a generar desde PHP los dos archivos de ventas que acepta la importación de Portal IVA:
- `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt`, con una línea de 266 bytes por comprobante;
- `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt`, con una línea de 62 bytes por cada alícuota.
> Este ejemplo es para responsables inscriptos que importan ventas en IVA Simple. Los sujetos exentos tienen un [diseño específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), sin este archivo de alícuotas, y no deben usar el script sin adaptarlo.
Si primero querés entender qué es el Libro IVA, cómo se relaciona con IVA Simple y por qué el ZIP de duplicados electrónicos es diferente, leé la guía general:
## 1. Preparar los datos
El ejemplo usa una Factura B por `$121`: `$100` de neto gravado y `$21` de IVA. Los importes se guardan en **centavos enteros**, no como números decimales.
El script requiere PHP de 64 bits para cubrir todo el rango de los campos de 15 posiciones. En una instalación de 32 bits, representá los importes como strings y operalos con BCMath.
```php
$vouchers = [
[
'date' => '20260701',
'voucher_type' => 6, // 006 = Factura B
'point_of_sale' => '1',
'number' => '123',
'number_to' => '123',
'buyer_document_type' => 80, // 80 = CUIT
'buyer_document_number' => '30712345678',
'buyer_name' => 'CLIENTE MUÑOZ S.A.',
'total_cents' => 12100,
'non_taxed_cents' => 0,
'uncategorized_perception_cents' => 0,
'exempt_cents' => 0,
'national_tax_perception_cents' => 0,
'gross_income_perception_cents' => 0,
'municipal_perception_cents' => 0,
'internal_tax_cents' => 0,
'currency' => 'PES',
'exchange_rate_micros' => 1000000, // 1,000000
'operation_code' => '0',
'other_taxes_cents' => 0,
'due_date' => '00000000',
'vat_breakdown' => [
[
'net_cents' => 10000,
'rate_code' => 5, // 0005 = 21%
'tax_cents' => 2100,
],
],
],
];
```
Podés agregar más comprobantes al arreglo. El generador mantiene el mismo orden en ambos archivos.
## 2. Generar los registros de ancho fijo
La extensión `iconv` debe estar habilitada para convertir el resultado a Windows-1252. Creá un archivo `generar-libro-iva.php` con el siguiente contenido completo:
```php
$width) {
throw new InvalidArgumentException(
"$name supera las $width posiciones"
);
}
return str_pad($text, $width, '0', STR_PAD_LEFT);
}
function zeroPaddedAlphanumericField(
int|string $value,
int $width,
string $name
): string {
$text = strtoupper(trim((string) $value));
if (preg_match('/^[0-9A-Z]+$/D', $text) !== 1) {
throw new InvalidArgumentException(
"$name debe ser alfanumérico"
);
}
$byteLength = strlen(windows1252($text, $name));
if ($byteLength > $width) {
throw new InvalidArgumentException(
"$name supera las $width posiciones"
);
}
return str_pad($text, $width, '0', STR_PAD_LEFT);
}
function textField(string $value, int $width, string $name): string
{
$text = function_exists('mb_strtoupper')
? mb_strtoupper($value, 'UTF-8')
: strtoupper($value);
$text = preg_replace('/[\r\n\t]/', ' ', $text);
$text = preg_replace('/\s+/u', ' ', $text ?? '');
$text = trim($text ?? '');
$byteLength = strlen(windows1252($text, $name));
if ($byteLength > $width) {
throw new InvalidArgumentException(
"$name supera las $width posiciones"
);
}
return $text . str_repeat(' ', $width - $byteLength);
}
function amountField(int $cents, string $name): string
{
$absolute = (string) abs($cents);
$digitWidth = $cents < 0 ? 14 : 15;
if (strlen($absolute) > $digitWidth) {
throw new InvalidArgumentException(
"$name supera las 15 posiciones"
);
}
$digits = str_pad($absolute, $digitWidth, '0', STR_PAD_LEFT);
return $cents < 0 ? "-$digits" : $digits;
}
function buildRecord(
array $parts,
int $expectedLength,
string $name
): string {
$record = implode('', $parts);
$byteLength = strlen(windows1252($record, $name));
if ($byteLength !== $expectedLength) {
throw new RuntimeException(
"$name mide $byteLength" .
"; ARCA exige $expectedLength"
);
}
return $record;
}
function validateVoucher(array $voucher): void
{
$vatCount = count($voucher['vat_breakdown']);
if ($vatCount < 1 || $vatCount > 9) {
throw new InvalidArgumentException(
'La cantidad de alícuotas debe estar entre 1 y 9'
);
}
$vatTotal = array_sum(array_map(
fn (array $vat): int =>
$vat['net_cents'] + $vat['tax_cents'],
$voucher['vat_breakdown']
));
$calculatedTotal =
$voucher['non_taxed_cents'] +
$voucher['uncategorized_perception_cents'] +
$voucher['exempt_cents'] +
$voucher['national_tax_perception_cents'] +
$voucher['gross_income_perception_cents'] +
$voucher['municipal_perception_cents'] +
$voucher['internal_tax_cents'] +
$voucher['other_taxes_cents'] +
$vatTotal;
if ($calculatedTotal !== $voucher['total_cents']) {
throw new InvalidArgumentException(
"El total informado ({$voucher['total_cents']}) " .
"no coincide con sus componentes ($calculatedTotal)"
);
}
}
function salesVoucherRecord(array $voucher): string
{
validateVoucher($voucher);
return buildRecord(
[
numericField($voucher['date'], 8, 'Fecha'),
numericField(
$voucher['voucher_type'],
3,
'Tipo de comprobante'
),
numericField(
$voucher['point_of_sale'],
5,
'Punto de venta'
),
numericField(
$voucher['number'],
20,
'Número de comprobante'
),
numericField(
$voucher['number_to'],
20,
'Número de comprobante hasta'
),
numericField(
$voucher['buyer_document_type'],
2,
'Tipo de documento'
),
zeroPaddedAlphanumericField(
$voucher['buyer_document_number'],
20,
'Documento'
),
textField(
$voucher['buyer_name'],
30,
'Nombre del comprador'
),
amountField($voucher['total_cents'], 'Importe total'),
amountField(
$voucher['non_taxed_cents'],
'Conceptos no gravados'
),
amountField(
$voucher['uncategorized_perception_cents'],
'Percepción a no categorizados'
),
amountField(
$voucher['exempt_cents'],
'Operaciones exentas'
),
amountField(
$voucher['national_tax_perception_cents'],
'Percepciones nacionales'
),
amountField(
$voucher['gross_income_perception_cents'],
'Percepciones de Ingresos Brutos'
),
amountField(
$voucher['municipal_perception_cents'],
'Percepciones municipales'
),
amountField(
$voucher['internal_tax_cents'],
'Impuestos internos'
),
textField($voucher['currency'], 3, 'Moneda'),
numericField(
$voucher['exchange_rate_micros'],
10,
'Tipo de cambio'
),
numericField(
count($voucher['vat_breakdown']),
1,
'Cantidad de alícuotas'
),
textField(
$voucher['operation_code'],
1,
'Código de operación'
),
amountField(
$voucher['other_taxes_cents'],
'Otros tributos'
),
numericField(
$voucher['due_date'],
8,
'Fecha de vencimiento'
),
],
266,
'Registro de comprobante'
);
}
function salesVatRecord(array $voucher, array $vat): string
{
return buildRecord(
[
numericField(
$voucher['voucher_type'],
3,
'Tipo de comprobante'
),
numericField(
$voucher['point_of_sale'],
5,
'Punto de venta'
),
numericField(
$voucher['number'],
20,
'Número de comprobante'
),
amountField($vat['net_cents'], 'Neto gravado'),
numericField($vat['rate_code'], 4, 'Alícuota'),
amountField($vat['tax_cents'], 'Impuesto liquidado'),
],
62,
'Registro de alícuota'
);
}
function writeWindows1252File(string $path, array $records): void
{
if ($records === []) {
throw new InvalidArgumentException(
"$path no contiene registros"
);
}
$content = implode("\r\n", $records) . "\r\n";
$encoded = windows1252($content, $path);
if (file_put_contents($path, $encoded) === false) {
throw new RuntimeException("No se pudo escribir $path");
}
}
$vouchers = [
[
'date' => '20260701',
'voucher_type' => 6,
'point_of_sale' => '1',
'number' => '123',
'number_to' => '123',
'buyer_document_type' => 80,
'buyer_document_number' => '30712345678',
'buyer_name' => 'CLIENTE MUÑOZ S.A.',
'total_cents' => 12100,
'non_taxed_cents' => 0,
'uncategorized_perception_cents' => 0,
'exempt_cents' => 0,
'national_tax_perception_cents' => 0,
'gross_income_perception_cents' => 0,
'municipal_perception_cents' => 0,
'internal_tax_cents' => 0,
'currency' => 'PES',
'exchange_rate_micros' => 1000000,
'operation_code' => '0',
'other_taxes_cents' => 0,
'due_date' => '00000000',
'vat_breakdown' => [
[
'net_cents' => 10000,
'rate_code' => 5,
'tax_cents' => 2100,
],
],
],
];
$voucherRecords = array_map('salesVoucherRecord', $vouchers);
$vatRecords = [];
foreach ($vouchers as $voucher) {
foreach ($voucher['vat_breakdown'] as $vat) {
$vatRecords[] = salesVatRecord($voucher, $vat);
}
}
writeWindows1252File(
'LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt',
$voucherRecords
);
writeWindows1252File(
'LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt',
$vatRecords
);
echo 'Generados ' . count($voucherRecords) .
' comprobantes y ' . count($vatRecords) .
" alícuotas\n";
```
Ejecutalo con:
```bash
php generar-libro-iva.php
```
## 3. Validar antes de importar
El script corta la ejecución si:
- un campo numérico contiene caracteres no permitidos;
- el documento del comprador no es alfanumérico;
- un valor supera el ancho oficial;
- un texto contiene caracteres incompatibles con Windows-1252;
- una cabecera no mide exactamente 266 bytes;
- una alícuota no mide exactamente 62 bytes;
- el total no coincide con el neto, IVA y demás conceptos;
- se intenta crear un archivo sin registros.
También escribe finales de línea `CRLF` y convierte el contenido a Windows-1252 sin BOM.
## Casos que requieren adaptar el ejemplo
- Varias alícuotas: agregá un arreglo por alícuota en `vat_breakdown`.
- Operaciones exentas o no gravadas: usá el código de operación y la alícuota que indique la tabla oficial.
- Notas de crédito: informá su tipo de comprobante y no inviertas los importes automáticamente.
- Moneda extranjera: mantené consistente la moneda, el tipo de cambio y la opción elegida al importar.
- TURIVA, importaciones y comprobantes anulados: usá sus diseños específicos.
## Otras versiones
- [Node.js](/blog/generar-archivos-libro-iva-digital-arca-en-nodejs/)
- [Python](/blog/generar-archivos-libro-iva-digital-arca-en-python/)
- [Ruby](/blog/generar-archivos-libro-iva-digital-arca-en-ruby/)
- [Java](/blog/generar-archivos-libro-iva-digital-arca-en-java/)
- [.NET con C#](/blog/generar-archivos-libro-iva-digital-arca-en-csharp/)
Consultá siempre el [diseño de registros](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf), las [validaciones](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf) y las [tablas del sistema](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf) vigentes antes de generar archivos productivos.
---
--- title: Generar los archivos del Libro IVA Digital de ARCA en Python description: Generá en Python los TXT de ventas y alícuotas que acepta Portal IVA, con ancho fijo y codificación Windows-1252. category: [Python] pubDate: jul 29, 2026 cover: /images/blog/generar-archivos-libro-iva-digital-arca-en-python.webp ---
# Generar los archivos del Libro IVA Digital de ARCA en Python
En esta guía vamos a generar desde Python los dos archivos de ventas que acepta la importación de Portal IVA:
- `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt`, con una línea de 266 bytes por comprobante;
- `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt`, con una línea de 62 bytes por cada alícuota.
> Este ejemplo es para responsables inscriptos que importan ventas en IVA Simple. Los sujetos exentos tienen un [diseño específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), sin este archivo de alícuotas, y no deben usar el script sin adaptarlo.
Si primero querés entender qué es el Libro IVA, cómo se relaciona con IVA Simple y por qué el ZIP de duplicados electrónicos es diferente, leé la guía general:
## 1. Preparar los datos
El ejemplo usa una Factura B por `$121`: `$100` de neto gravado y `$21` de IVA. Los importes se guardan en **centavos enteros**, no como números decimales.
```python
vouchers = [
{
"date": "20260701",
"voucher_type": 6, # 006 = Factura B
"point_of_sale": "1",
"number": "123",
"number_to": "123",
"buyer_document_type": 80, # 80 = CUIT
"buyer_document_number": "30712345678",
"buyer_name": "CLIENTE MUÑOZ S.A.",
"total_cents": 12100,
"non_taxed_cents": 0,
"uncategorized_perception_cents": 0,
"exempt_cents": 0,
"national_tax_perception_cents": 0,
"gross_income_perception_cents": 0,
"municipal_perception_cents": 0,
"internal_tax_cents": 0,
"currency": "PES",
"exchange_rate_micros": 1000000, # 1,000000
"operation_code": "0",
"other_taxes_cents": 0,
"due_date": "00000000",
"vat_breakdown": [
{
"net_cents": 10000,
"rate_code": 5, # 0005 = 21%
"tax_cents": 2100,
}
],
}
]
```
Podés agregar más comprobantes a la lista. El generador mantiene el mismo orden en ambos archivos.
## 2. Generar los registros de ancho fijo
El ejemplo usa únicamente módulos de la biblioteca estándar. Creá un archivo `generar_libro_iva.py` con el siguiente contenido completo:
```python
from pathlib import Path
import re
def numeric_field(value: int | str, width: int, name: str) -> str:
text = str(value)
if re.fullmatch(r"[0-9]+", text) is None:
raise ValueError(f"{name} debe contener solamente dígitos")
if len(text) > width:
raise ValueError(f"{name} supera las {width} posiciones")
return text.zfill(width)
def zero_padded_alphanumeric_field(
value: int | str,
width: int,
name: str,
) -> str:
text = str(value).strip().upper()
if re.fullmatch(r"[0-9A-Z]+", text) is None:
raise ValueError(f"{name} debe ser alfanumérico")
try:
byte_length = len(text.encode("windows-1252"))
except UnicodeEncodeError as error:
raise ValueError(
f"{name} contiene caracteres incompatibles "
"con Windows-1252"
) from error
if byte_length > width:
raise ValueError(f"{name} supera las {width} posiciones")
return ("0" * (width - byte_length)) + text
def text_field(value: str, width: int, name: str) -> str:
text = re.sub(r"[\r\n\t]", " ", str(value).upper())
text = re.sub(r"\s+", " ", text).strip()
try:
byte_length = len(text.encode("windows-1252"))
except UnicodeEncodeError as error:
raise ValueError(
f"{name} contiene caracteres incompatibles "
"con Windows-1252"
) from error
if byte_length > width:
raise ValueError(f"{name} supera las {width} posiciones")
return text + (" " * (width - byte_length))
def amount_field(cents: int, name: str) -> str:
if not isinstance(cents, int):
raise ValueError(f"{name} debe expresarse en centavos enteros")
absolute = str(abs(cents))
digit_width = 14 if cents < 0 else 15
if len(absolute) > digit_width:
raise ValueError(f"{name} supera las 15 posiciones")
digits = absolute.zfill(digit_width)
return f"-{digits}" if cents < 0 else digits
def build_record(
parts: list[str],
expected_length: int,
name: str,
) -> str:
record = "".join(parts)
try:
byte_length = len(record.encode("windows-1252"))
except UnicodeEncodeError as error:
raise ValueError(
f"{name} contiene caracteres incompatibles "
"con Windows-1252"
) from error
if byte_length != expected_length:
raise ValueError(
f"{name} mide {byte_length}; "
f"ARCA exige {expected_length}"
)
return record
def validate_voucher(voucher: dict) -> None:
vat_count = len(voucher["vat_breakdown"])
if not 1 <= vat_count <= 9:
raise ValueError(
"La cantidad de alícuotas debe estar entre 1 y 9"
)
vat_total = sum(
vat["net_cents"] + vat["tax_cents"]
for vat in voucher["vat_breakdown"]
)
calculated_total = (
voucher["non_taxed_cents"]
+ voucher["uncategorized_perception_cents"]
+ voucher["exempt_cents"]
+ voucher["national_tax_perception_cents"]
+ voucher["gross_income_perception_cents"]
+ voucher["municipal_perception_cents"]
+ voucher["internal_tax_cents"]
+ voucher["other_taxes_cents"]
+ vat_total
)
if calculated_total != voucher["total_cents"]:
raise ValueError(
f"El total informado ({voucher['total_cents']}) "
f"no coincide con sus componentes ({calculated_total})"
)
def sales_voucher_record(voucher: dict) -> str:
validate_voucher(voucher)
return build_record(
[
numeric_field(voucher["date"], 8, "Fecha"),
numeric_field(
voucher["voucher_type"],
3,
"Tipo de comprobante",
),
numeric_field(
voucher["point_of_sale"],
5,
"Punto de venta",
),
numeric_field(
voucher["number"],
20,
"Número de comprobante",
),
numeric_field(
voucher["number_to"],
20,
"Número de comprobante hasta",
),
numeric_field(
voucher["buyer_document_type"],
2,
"Tipo de documento",
),
zero_padded_alphanumeric_field(
voucher["buyer_document_number"],
20,
"Documento",
),
text_field(
voucher["buyer_name"],
30,
"Nombre del comprador",
),
amount_field(voucher["total_cents"], "Importe total"),
amount_field(
voucher["non_taxed_cents"],
"Conceptos no gravados",
),
amount_field(
voucher["uncategorized_perception_cents"],
"Percepción a no categorizados",
),
amount_field(
voucher["exempt_cents"],
"Operaciones exentas",
),
amount_field(
voucher["national_tax_perception_cents"],
"Percepciones nacionales",
),
amount_field(
voucher["gross_income_perception_cents"],
"Percepciones de Ingresos Brutos",
),
amount_field(
voucher["municipal_perception_cents"],
"Percepciones municipales",
),
amount_field(
voucher["internal_tax_cents"],
"Impuestos internos",
),
text_field(voucher["currency"], 3, "Moneda"),
numeric_field(
voucher["exchange_rate_micros"],
10,
"Tipo de cambio",
),
numeric_field(
len(voucher["vat_breakdown"]),
1,
"Cantidad de alícuotas",
),
text_field(
voucher["operation_code"],
1,
"Código de operación",
),
amount_field(
voucher["other_taxes_cents"],
"Otros tributos",
),
numeric_field(
voucher["due_date"],
8,
"Fecha de vencimiento",
),
],
266,
"Registro de comprobante",
)
def sales_vat_record(voucher: dict, vat: dict) -> str:
return build_record(
[
numeric_field(
voucher["voucher_type"],
3,
"Tipo de comprobante",
),
numeric_field(
voucher["point_of_sale"],
5,
"Punto de venta",
),
numeric_field(
voucher["number"],
20,
"Número de comprobante",
),
amount_field(vat["net_cents"], "Neto gravado"),
numeric_field(vat["rate_code"], 4, "Alícuota"),
amount_field(vat["tax_cents"], "Impuesto liquidado"),
],
62,
"Registro de alícuota",
)
def write_windows_1252_file(
path: str,
records: list[str],
) -> None:
if not records:
raise ValueError(f"{path} no contiene registros")
content = "\r\n".join(records) + "\r\n"
Path(path).write_bytes(content.encode("windows-1252"))
vouchers = [
{
"date": "20260701",
"voucher_type": 6,
"point_of_sale": "1",
"number": "123",
"number_to": "123",
"buyer_document_type": 80,
"buyer_document_number": "30712345678",
"buyer_name": "CLIENTE MUÑOZ S.A.",
"total_cents": 12100,
"non_taxed_cents": 0,
"uncategorized_perception_cents": 0,
"exempt_cents": 0,
"national_tax_perception_cents": 0,
"gross_income_perception_cents": 0,
"municipal_perception_cents": 0,
"internal_tax_cents": 0,
"currency": "PES",
"exchange_rate_micros": 1000000,
"operation_code": "0",
"other_taxes_cents": 0,
"due_date": "00000000",
"vat_breakdown": [
{
"net_cents": 10000,
"rate_code": 5,
"tax_cents": 2100,
}
],
}
]
voucher_records = [
sales_voucher_record(voucher)
for voucher in vouchers
]
vat_records = [
sales_vat_record(voucher, vat)
for voucher in vouchers
for vat in voucher["vat_breakdown"]
]
write_windows_1252_file(
"LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt",
voucher_records,
)
write_windows_1252_file(
"LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt",
vat_records,
)
print(
f"Generados {len(voucher_records)} comprobantes "
f"y {len(vat_records)} alícuotas"
)
```
Ejecutalo con:
```bash
python generar_libro_iva.py
```
## 3. Validar antes de importar
El script corta la ejecución si:
- un campo numérico contiene caracteres no permitidos;
- el documento del comprador no es alfanumérico;
- un valor supera el ancho oficial;
- un texto contiene caracteres incompatibles con Windows-1252;
- una cabecera no mide exactamente 266 bytes;
- una alícuota no mide exactamente 62 bytes;
- el total no coincide con el neto, IVA y demás conceptos;
- un importe no fue entregado en centavos enteros;
- se intenta crear un archivo sin registros.
También escribe finales de línea `CRLF` y convierte el contenido a Windows-1252 sin BOM.
## Casos que requieren adaptar el ejemplo
- Varias alícuotas: agregá un diccionario por alícuota en `vat_breakdown`.
- Operaciones exentas o no gravadas: usá el código de operación y la alícuota que indique la tabla oficial.
- Notas de crédito: informá su tipo de comprobante y no inviertas los importes automáticamente.
- Moneda extranjera: mantené consistente la moneda, el tipo de cambio y la opción elegida al importar.
- TURIVA, importaciones y comprobantes anulados: usá sus diseños específicos.
## Otras versiones
- [Node.js](/blog/generar-archivos-libro-iva-digital-arca-en-nodejs/)
- [PHP](/blog/generar-archivos-libro-iva-digital-arca-en-php/)
- [Ruby](/blog/generar-archivos-libro-iva-digital-arca-en-ruby/)
- [Java](/blog/generar-archivos-libro-iva-digital-arca-en-java/)
- [.NET con C#](/blog/generar-archivos-libro-iva-digital-arca-en-csharp/)
Consultá siempre el [diseño de registros](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf), las [validaciones](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf) y las [tablas del sistema](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf) vigentes antes de generar archivos productivos.
---
--- title: Generar los archivos del Libro IVA Digital de ARCA en Ruby description: Generá en Ruby los TXT de ventas y alícuotas que acepta Portal IVA, con ancho fijo y codificación Windows-1252. category: [Ruby] pubDate: jul 29, 2026 cover: /images/blog/generar-archivos-libro-iva-digital-arca-en-ruby.webp ---
# Generar los archivos del Libro IVA Digital de ARCA en Ruby
En esta guía vamos a generar desde Ruby los dos archivos de ventas que acepta la importación de Portal IVA:
- `LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt`, con una línea de 266 bytes por comprobante;
- `LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt`, con una línea de 62 bytes por cada alícuota.
> Este ejemplo es para responsables inscriptos que importan ventas en IVA Simple. Los sujetos exentos tienen un [diseño específico](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-de-registro-SUJETOS-EXENTOS.pdf), sin este archivo de alícuotas, y no deben usar el script sin adaptarlo.
Si primero querés entender qué es el Libro IVA, cómo se relaciona con IVA Simple y por qué el ZIP de duplicados electrónicos es diferente, leé la guía general:
## 1. Preparar los datos
El ejemplo usa una Factura B por `$121`: `$100` de neto gravado y `$21` de IVA. Los importes se guardan en **centavos enteros**, no como números decimales.
```ruby
vouchers = [
{
date: "20260701",
voucher_type: 6, # 006 = Factura B
point_of_sale: "1",
number: "123",
number_to: "123",
buyer_document_type: 80, # 80 = CUIT
buyer_document_number: "30712345678",
buyer_name: "CLIENTE MUÑOZ S.A.",
total_cents: 12_100,
non_taxed_cents: 0,
uncategorized_perception_cents: 0,
exempt_cents: 0,
national_tax_perception_cents: 0,
gross_income_perception_cents: 0,
municipal_perception_cents: 0,
internal_tax_cents: 0,
currency: "PES",
exchange_rate_micros: 1_000_000, # 1,000000
operation_code: "0",
other_taxes_cents: 0,
due_date: "00000000",
vat_breakdown: [
{
net_cents: 10_000,
rate_code: 5, # 0005 = 21%
tax_cents: 2_100
}
]
}
]
```
Podés agregar más comprobantes al arreglo. El generador mantiene el mismo orden en ambos archivos.
## 2. Generar los registros de ancho fijo
El ejemplo no requiere gems externas. Creá un archivo `generar_libro_iva.rb` con el siguiente contenido completo:
```ruby
def windows_1252(value, name)
String(value).encode(Encoding::WINDOWS_1252)
rescue Encoding::InvalidByteSequenceError,
Encoding::UndefinedConversionError
raise ArgumentError,
"#{name} contiene caracteres incompatibles con Windows-1252"
end
def numeric_field(value, width, name)
text = String(value)
unless text.match?(/\A\d+\z/)
raise ArgumentError, "#{name} debe contener solamente dígitos"
end
if text.length > width
raise ArgumentError, "#{name} supera las #{width} posiciones"
end
text.rjust(width, "0")
end
def zero_padded_alphanumeric_field(value, width, name)
text = String(value).strip.upcase
unless text.match?(/\A[0-9A-Z]+\z/)
raise ArgumentError, "#{name} debe ser alfanumérico"
end
byte_length = windows_1252(text, name).bytesize
if byte_length > width
raise ArgumentError, "#{name} supera las #{width} posiciones"
end
("0" * (width - byte_length)) + text
end
def text_field(value, width, name)
text = String(value)
.gsub(/[\r\n\t]/, " ")
.gsub(/\s+/, " ")
.strip
.upcase
byte_length = windows_1252(text, name).bytesize
if byte_length > width
raise ArgumentError, "#{name} supera las #{width} posiciones"
end
text + (" " * (width - byte_length))
end
def amount_field(cents, name)
unless cents.is_a?(Integer)
raise ArgumentError,
"#{name} debe expresarse en centavos enteros"
end
absolute = cents.abs.to_s
digit_width = cents.negative? ? 14 : 15
if absolute.length > digit_width
raise ArgumentError, "#{name} supera las 15 posiciones"
end
digits = absolute.rjust(digit_width, "0")
cents.negative? ? "-#{digits}" : digits
end
def build_record(parts, expected_length, name)
record = parts.join
byte_length = windows_1252(record, name).bytesize
if byte_length != expected_length
raise ArgumentError,
"#{name} mide #{byte_length}; " \
"ARCA exige #{expected_length}"
end
record
end
def validate_voucher(voucher)
vat_count = voucher.fetch(:vat_breakdown).length
unless vat_count.between?(1, 9)
raise ArgumentError,
"La cantidad de alícuotas debe estar entre 1 y 9"
end
vat_total = voucher.fetch(:vat_breakdown).sum do |vat|
vat.fetch(:net_cents) + vat.fetch(:tax_cents)
end
calculated_total =
voucher.fetch(:non_taxed_cents) +
voucher.fetch(:uncategorized_perception_cents) +
voucher.fetch(:exempt_cents) +
voucher.fetch(:national_tax_perception_cents) +
voucher.fetch(:gross_income_perception_cents) +
voucher.fetch(:municipal_perception_cents) +
voucher.fetch(:internal_tax_cents) +
voucher.fetch(:other_taxes_cents) +
vat_total
return if calculated_total == voucher.fetch(:total_cents)
raise ArgumentError,
"El total informado (#{voucher.fetch(:total_cents)}) " \
"no coincide con sus componentes (#{calculated_total})"
end
def sales_voucher_record(voucher)
validate_voucher(voucher)
build_record(
[
numeric_field(voucher.fetch(:date), 8, "Fecha"),
numeric_field(
voucher.fetch(:voucher_type),
3,
"Tipo de comprobante"
),
numeric_field(
voucher.fetch(:point_of_sale),
5,
"Punto de venta"
),
numeric_field(
voucher.fetch(:number),
20,
"Número de comprobante"
),
numeric_field(
voucher.fetch(:number_to),
20,
"Número de comprobante hasta"
),
numeric_field(
voucher.fetch(:buyer_document_type),
2,
"Tipo de documento"
),
zero_padded_alphanumeric_field(
voucher.fetch(:buyer_document_number),
20,
"Documento"
),
text_field(
voucher.fetch(:buyer_name),
30,
"Nombre del comprador"
),
amount_field(voucher.fetch(:total_cents), "Importe total"),
amount_field(
voucher.fetch(:non_taxed_cents),
"Conceptos no gravados"
),
amount_field(
voucher.fetch(:uncategorized_perception_cents),
"Percepción a no categorizados"
),
amount_field(
voucher.fetch(:exempt_cents),
"Operaciones exentas"
),
amount_field(
voucher.fetch(:national_tax_perception_cents),
"Percepciones nacionales"
),
amount_field(
voucher.fetch(:gross_income_perception_cents),
"Percepciones de Ingresos Brutos"
),
amount_field(
voucher.fetch(:municipal_perception_cents),
"Percepciones municipales"
),
amount_field(
voucher.fetch(:internal_tax_cents),
"Impuestos internos"
),
text_field(voucher.fetch(:currency), 3, "Moneda"),
numeric_field(
voucher.fetch(:exchange_rate_micros),
10,
"Tipo de cambio"
),
numeric_field(
voucher.fetch(:vat_breakdown).length,
1,
"Cantidad de alícuotas"
),
text_field(
voucher.fetch(:operation_code),
1,
"Código de operación"
),
amount_field(
voucher.fetch(:other_taxes_cents),
"Otros tributos"
),
numeric_field(
voucher.fetch(:due_date),
8,
"Fecha de vencimiento"
)
],
266,
"Registro de comprobante"
)
end
def sales_vat_record(voucher, vat)
build_record(
[
numeric_field(
voucher.fetch(:voucher_type),
3,
"Tipo de comprobante"
),
numeric_field(
voucher.fetch(:point_of_sale),
5,
"Punto de venta"
),
numeric_field(
voucher.fetch(:number),
20,
"Número de comprobante"
),
amount_field(vat.fetch(:net_cents), "Neto gravado"),
numeric_field(vat.fetch(:rate_code), 4, "Alícuota"),
amount_field(vat.fetch(:tax_cents), "Impuesto liquidado")
],
62,
"Registro de alícuota"
)
end
def write_windows_1252_file(path, records)
if records.empty?
raise ArgumentError, "#{path} no contiene registros"
end
content = records.join("\r\n") + "\r\n"
File.binwrite(path, windows_1252(content, path))
end
vouchers = [
{
date: "20260701",
voucher_type: 6,
point_of_sale: "1",
number: "123",
number_to: "123",
buyer_document_type: 80,
buyer_document_number: "30712345678",
buyer_name: "CLIENTE MUÑOZ S.A.",
total_cents: 12_100,
non_taxed_cents: 0,
uncategorized_perception_cents: 0,
exempt_cents: 0,
national_tax_perception_cents: 0,
gross_income_perception_cents: 0,
municipal_perception_cents: 0,
internal_tax_cents: 0,
currency: "PES",
exchange_rate_micros: 1_000_000,
operation_code: "0",
other_taxes_cents: 0,
due_date: "00000000",
vat_breakdown: [
{
net_cents: 10_000,
rate_code: 5,
tax_cents: 2_100
}
]
}
]
voucher_records = vouchers.map do |voucher|
sales_voucher_record(voucher)
end
vat_records = vouchers.flat_map do |voucher|
voucher.fetch(:vat_breakdown).map do |vat|
sales_vat_record(voucher, vat)
end
end
write_windows_1252_file(
"LIBRO_IVA_DIGITAL_VENTAS_CBTE.txt",
voucher_records
)
write_windows_1252_file(
"LIBRO_IVA_DIGITAL_VENTAS_ALICUOTAS.txt",
vat_records
)
puts "Generados #{voucher_records.length} comprobantes " \
"y #{vat_records.length} alícuotas"
```
Ejecutalo con:
```bash
ruby generar_libro_iva.rb
```
## 3. Validar antes de importar
El script corta la ejecución si:
- un campo numérico contiene caracteres no permitidos;
- el documento del comprador no es alfanumérico;
- un valor supera el ancho oficial;
- un texto contiene caracteres incompatibles con Windows-1252;
- una cabecera no mide exactamente 266 bytes;
- una alícuota no mide exactamente 62 bytes;
- el total no coincide con el neto, IVA y demás conceptos;
- un importe no fue entregado en centavos enteros;
- se intenta crear un archivo sin registros.
También escribe finales de línea `CRLF` y genera archivos Windows-1252 sin BOM.
## Casos que requieren adaptar el ejemplo
- Varias alícuotas: agregá un hash por alícuota en `vat_breakdown`.
- Operaciones exentas o no gravadas: usá el código de operación y la alícuota que indique la tabla oficial.
- Notas de crédito: informá su tipo de comprobante y no inviertas los importes automáticamente.
- Moneda extranjera: mantené consistente la moneda, el tipo de cambio y la opción elegida al importar.
- TURIVA, importaciones y comprobantes anulados: usá sus diseños específicos.
## Otras versiones
- [Node.js](/blog/generar-archivos-libro-iva-digital-arca-en-nodejs/)
- [PHP](/blog/generar-archivos-libro-iva-digital-arca-en-php/)
- [Python](/blog/generar-archivos-libro-iva-digital-arca-en-python/)
- [Java](/blog/generar-archivos-libro-iva-digital-arca-en-java/)
- [.NET con C#](/blog/generar-archivos-libro-iva-digital-arca-en-csharp/)
Consultá siempre el [diseño de registros](https://www.arca.gob.ar/iva/documentos/libro-iva-digital-diseno-registros.pdf), las [validaciones](https://www.arca.gob.ar/iva/documentos/Libro-IVA-Digital-Especificaciones.pdf) y las [tablas del sistema](https://www.arca.gob.ar/libro-iva-digital/documentos/Libro-IVA-Digital-Tablas-del-Sistema.pdf) vigentes antes de generar archivos productivos.
---
--- title: Factura A: qué es, IVA y datos obligatorios description: Conocé quién emite una Factura A, cuándo corresponde, qué datos debe incluir y cómo se discrimina el IVA. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/factura-a-datos-obligatorios-iva.webp ---
# Factura A: qué es, IVA y datos obligatorios
La **Factura A** es el comprobante que emite un responsable inscripto en IVA cuando factura una operación interna a otro responsable inscripto o a un monotributista. Expone por separado el importe neto, la alícuota y el monto de IVA.
No toda Factura A es igual: según la habilitación fiscal del emisor puede ser común, llevar la leyenda **“PAGO EN CBU INFORMADA”** o indicar **“OPERACIÓN SUJETA A RETENCIÓN”**.
> Esta guía resume el régimen general vigente al 28 de julio de 2026. El tratamiento fiscal concreto de una operación puede requerir revisar normas sectoriales y la situación de ambas partes.
## Quién emite una Factura A
La emite un sujeto **responsable inscripto en IVA**. Un monotributista o un sujeto exento no emite Factura A: para sus operaciones internas utiliza Factura C.
El receptor de una Factura A puede ser:
- otro responsable inscripto en IVA;
- un monotributista.
Desde el 1 de julio de 2021, los responsables inscriptos también emiten Factura A a monotributistas. La [RG 5003/2021](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-5003-2021-350574/actualizacion) modificó el esquema anterior.
| Emisor responsable inscripto | Comprobante general |
| --- | --- |
| A otro responsable inscripto | Factura A |
| A un monotributista | Factura A |
| A un consumidor final, exento o no alcanzado | Factura B |
| Por una exportación | Factura E |
Podés consultar la relación completa en la [tabla de comprobantes de ARCA](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp).
## Para qué sirve
La Factura A respalda una venta, locación o prestación y muestra de forma separada:
- el precio neto gravado;
- la alícuota de IVA;
- el importe de IVA;
- otros tributos que no integran el neto;
- percepciones, cuando correspondan;
- el total a pagar.
Para un receptor responsable inscripto puede respaldar el cómputo de crédito fiscal, siempre que se cumplan las demás condiciones legales. La letra A, por sí sola, no garantiza que el crédito sea computable.
## Cómo se discrimina el IVA
En una operación gravada al 21%, la presentación básica es:
| Concepto | Importe |
| --- | ---: |
| Neto gravado | $100 |
| IVA 21% | $21 |
| Total | $121 |
La alícuota y el IVA no están contenidos de manera implícita dentro del precio neto: aparecen separados y luego forman el total.
### Factura A a un monotributista
El IVA también se discrimina cuando el receptor es monotributista. El comprobante debe incluir la leyenda prevista por la Ley 27.618, que limita el cómputo de ese crédito fiscal al régimen de transición correspondiente.
Mientras permanece en Monotributo, el receptor no toma ese IVA como crédito fiscal ordinario.
## Datos obligatorios de una Factura A
La [RG 1415 y su Anexo II](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion) fijan los datos mínimos. Pueden existir requisitos adicionales por actividad o modalidad.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio comercial, CUIT, Ingresos Brutos o condición de no contribuyente, condición “IVA RESPONSABLE INSCRIPTO” e inicio de actividades cuando corresponda |
| Comprobante | Letra A, código de tipo, punto de venta, numeración correlativa y fecha de emisión |
| Receptor | Nombre o razón social, domicilio comercial, CUIT y condición frente al IVA o Monotributo |
| Operación | Descripción identificable, cantidades, precios unitarios, importes netos y todo concepto que incida en el total |
| IVA | Neto gravado por alícuota, alícuotas aplicadas, monto del impuesto, exentos y no gravados cuando existan |
| Otros conceptos | Otros tributos, percepciones, descuentos, bonificaciones y condiciones de venta |
| Moneda | Moneda y tipo de cambio utilizado cuando no se factura en pesos |
| Autorización | CAE, CAEA o CAI y su vencimiento, según la modalidad |
| Relaciones | Remitos u otros comprobantes asociados, cuando correspondan |
En factura electrónica, la representación también debe contener el CAE o CAEA correspondiente y el [código QR exigido por ARCA](https://www.arca.gob.ar/fe/qr/conceptos-generales.asp).
## Las tres variantes actuales de Factura A
Desde el 1 de diciembre de 2025, la [RG 5762/2025](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-5762-2025-417981/texto) establece este esquema:
| Variante | Cuándo corresponde | Efecto principal |
| --- | --- | --- |
| Factura A común | El emisor supera los controles y requisitos de habilitación | No agrega condiciones especiales de pago o retención por la RG 5762 |
| A con “PAGO EN CBU INFORMADA” | El emisor no acredita únicamente el requisito de solvencia patrimonial y opta por esta modalidad | El pago debe realizarse mediante depósito o transferencia a la CBU declarada |
| A con “OPERACIÓN SUJETA A RETENCIÓN” | El emisor no supera uno o más requisitos; si sólo incumple solvencia, no opta por “PAGO EN CBU INFORMADA” | Si el receptor es responsable inscripto, debe aplicar las retenciones especiales previstas, salvo las excepciones de la norma |
En una A con **“OPERACIÓN SUJETA A RETENCIÓN”**, el receptor responsable inscripto retiene el 100% del IVA correspondiente y el 6% de Ganancias sobre la base definida por la norma. Se exceptúan las operaciones alcanzadas por regímenes de retención específicos y las exclusiones expresas de la RG 5762. Si el régimen general de la RG 830 determina una retención de Ganancias mayor, se aplica ese importe. Un receptor monotributista no actúa como agente de estas retenciones.
### Qué pasó con la Factura M
Desde el 1 de diciembre de 2025 no se otorgan nuevas autorizaciones electrónicas o de impresión para Factura M. La modalidad fue reemplazada hacia adelante por la Factura A con leyenda **“OPERACIÓN SUJETA A RETENCIÓN”**.
Como transición, los formularios M impresos y autorizados antes del cambio pueden utilizarse hasta el vencimiento de su CAI. Por eso la denominación todavía puede aparecer en documentos válidos, manuales y tablas técnicas, pero no constituye una cuarta alternativa para nuevas autorizaciones.
## ¿Toda Factura A permite tomar crédito fiscal?
No. Para computar crédito fiscal no alcanza con que el documento tenga letra A. Entre otras condiciones, el receptor debe:
- ser responsable inscripto;
- estar correctamente identificado;
- vincular la compra con operaciones que permitan el cómputo;
- contar con un comprobante válido y autorizado;
- respetar las limitaciones, proporcionalidad y requisitos del régimen de IVA.
ARCA puede autorizar una factura con CAE y códigos de observación por inconsistencias del receptor. El IVA discriminado en ese comprobante no puede computarse como crédito fiscal. Las [consideraciones para autorizar comprobantes electrónicos](https://arca.gob.ar/fe/emision-autorizacion/consideraciones.asp) explican ese tratamiento; las partes deben evaluar la anulación y emisión correcta cuando corresponda.
## Diferencias entre Factura A y Factura B
| Tema | Factura A | Factura B |
| --- | --- | --- |
| Emisor | Responsable inscripto | Responsable inscripto |
| Receptor | Responsable inscripto o monotributista | Consumidor final, exento, no alcanzado o no categorizado |
| Precios | Neto gravado separado del IVA | Precio e importe total con IVA incluido |
| IVA visible | Alícuota y monto discriminados | “IVA Contenido” informado dentro del total |
| Crédito fiscal ordinario | Puede respaldarlo para un receptor responsable inscripto | No |
| Código electrónico usual | 001 para A común o con CBU informada; 051 para A sujeta a retención | 006 |
La Factura B también informa el IVA desde el Régimen de Transparencia Fiscal. La diferencia es que lo muestra como impuesto contenido en un precio final, no como un importe que el receptor habitual pueda computar como crédito fiscal.
## Cómo emitir una Factura A electrónica
Para la Factura A común y la A con **“PAGO EN CBU INFORMADA”** se usa el código `001` —o `CbteTipo: 1` en WSFE—. La A con **“OPERACIÓN SUJETA A RETENCIÓN”** utiliza el código `051` —`CbteTipo: 51`—, familia antes usada por la Factura M y reasignada por la normativa vigente.
Antes de emitir, verificá:
1. la condición fiscal vigente del receptor;
2. la variante de Factura A para la que está habilitado el emisor;
3. el punto de venta asociado a factura electrónica;
4. la identificación completa del receptor;
5. la composición del neto, IVA, otros tributos y total;
6. las leyendas y condiciones especiales aplicables;
7. que la representación incluya CAE o CAEA, vencimiento y QR.
En el flujo habitual se solicita el CAE a ARCA. Podés ver una solicitud completa en el [ejemplo de Factura A de Afip SDK](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/factura-a).
## Preguntas frecuentes
### ¿Se emite Factura A a un monotributista?
Sí. Desde julio de 2021, un responsable inscripto emite Factura A a un monotributista e incluye la leyenda especial sobre el crédito fiscal.
### ¿Un monotributista puede emitir Factura A?
No. Un monotributista emite Factura C para sus operaciones internas.
### ¿La Factura A siempre lleva retenciones?
No. La A común no genera por sí sola las retenciones especiales de la RG 5762. La variante “OPERACIÓN SUJETA A RETENCIÓN” sí tiene ese tratamiento cuando el receptor es responsable inscripto, sin perjuicio de otros regímenes aplicables.
### ¿La Factura M sigue vigente?
No se conceden nuevas autorizaciones M desde diciembre de 2025. La reemplaza la A con leyenda “OPERACIÓN SUJETA A RETENCIÓN”, aunque los formularios M impresos previamente pueden utilizarse hasta el vencimiento de su CAI.
## Fuentes oficiales
- [ARCA: clases de comprobantes del régimen general](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp)
- [RG 1415: requisitos y datos de los comprobantes](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion)
- [RG 5003/2021: Factura A a monotributistas](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-5003-2021-350574/actualizacion)
- [RG 5762/2025: variantes y habilitación de comprobantes A](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-5762-2025-417981/texto)
- [RG 4892/2020: código QR en comprobantes electrónicos](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4892-2020-345661/texto)
## También te puede interesar
---
--- title: Factura B: qué es, IVA y datos obligatorios description: Conocé quién emite una Factura B, qué datos debe incluir y cómo se informa el IVA contenido según las reglas vigentes de ARCA. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/factura-b-datos-obligatorios-iva.webp ---
# Factura B: qué es, IVA y datos obligatorios
La **Factura B** documenta ventas, locaciones y prestaciones realizadas por un responsable inscripto en IVA a consumidores finales, exentos, no alcanzados, no responsables y sujetos no categorizados.
Aunque muchas explicaciones todavía dicen que la Factura B “no discrimina IVA”, esa frase quedó desactualizada: el precio y el total continúan expresándose **con IVA incluido**, pero desde 2025 el comprobante también debe informar el monto de **“IVA Contenido”** por el Régimen de Transparencia Fiscal al Consumidor.
> Esta guía resume el régimen general vigente al 28 de julio de 2026. Algunas actividades y regímenes especiales tienen requisitos adicionales.
## Quién emite una Factura B
La emite un sujeto **responsable inscripto en IVA** cuando realiza una operación interna con alguno de estos receptores:
- consumidor final;
- sujeto exento en IVA;
- sujeto no alcanzado o no responsable en IVA;
- sujeto no categorizado;
- turista extranjero, cuando no corresponde un comprobante clase T.
La clase del comprobante no se elige libremente. Depende de la condición fiscal del emisor y del receptor:
| Emisor | Receptor | Comprobante general |
| --- | --- | --- |
| Responsable inscripto | Responsable inscripto | Factura A |
| Responsable inscripto | Monotributista | Factura A |
| Responsable inscripto | Consumidor final, exento, no alcanzado o no categorizado | Factura B |
| Monotributista o exento | Cualquier receptor en una operación interna | Factura C |
| Responsable inscripto, monotributista o exento | Destinatario del exterior en una operación de exportación | Factura E |
Desde julio de 2021, un responsable inscripto debe emitir **Factura A a un monotributista**, no Factura B. La [tabla vigente de comprobantes de ARCA](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp) muestra estas relaciones.
## Para qué sirve
La Factura B respalda fiscal y comercialmente la operación. Permite identificar:
- quién vendió o prestó el servicio;
- quién recibió la operación, cuando corresponde identificarlo;
- qué bienes, obras o servicios se facturaron;
- cuánto se cobró;
- cuánto IVA está contenido en el precio y, en operaciones con consumidores finales, qué otros impuestos nacionales indirectos inciden;
- qué autorización recibió el comprobante.
En factura electrónica, ARCA autoriza el comprobante mediante **CAE o CAEA**, según el procedimiento utilizado. El documento no tiene efectos fiscales frente a terceros hasta obtener esa autorización.
## Datos obligatorios de una Factura B
La [Resolución General 1415 y su Anexo II](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion) establecen los datos mínimos. La modalidad de emisión y la actividad pueden sumar requisitos.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio comercial, CUIT, Ingresos Brutos o condición de no contribuyente, condición frente al IVA e inicio de actividades cuando corresponda |
| Comprobante | Letra B y código de tipo, punto de venta, numeración correlativa y fecha de emisión |
| Receptor | Nombre o razón social, domicilio, identificación y condición fiscal según el tipo de receptor |
| Operación | Descripción identificable, cantidades, precios unitarios y totales, descuentos y todo concepto que modifique el total |
| Moneda | Moneda utilizada y tipo de cambio cuando la operación se expresa en moneda extranjera |
| Impuestos | IVA contenido; en operaciones con consumidores finales, otros impuestos nacionales indirectos; y los demás tributos o percepciones que correspondan |
| Autorización | CAE, CAEA o CAI y su vencimiento, según la modalidad |
| Relaciones | Remitos u otros comprobantes vinculados, cuando existan |
Los comprobantes electrónicos alcanzados por la RG 4291 también deben incorporar el [código QR obligatorio](https://www.arca.gob.ar/fe/qr/conceptos-generales.asp). El QR complementa los datos visibles: no los reemplaza.
## Cómo identificar al consumidor final
La Factura B destinada a un consumidor final siempre debe incluir la leyenda **“A CONSUMIDOR FINAL”**.
Desde el 1 de julio de 2026, la [RG 5866/2026](https://www.argentina.gob.ar/normativa/nacional/norma-427092/texto) exige además:
- si la operación es igual o superior a **$10.000.000**, informar DNI, CUIL o CDI; para una persona extranjera, documento o cédula del país de origen o pasaporte;
- si el comprador necesita computar el gasto como deducción en Ganancias, identificarlo con CUIT cuando lo solicite, sin importar el monto.
El nombre, apellido y domicilio pueden informarse o completarse con `NR` o ceros cuando el sistema de facturación lo requiera. Superar el umbral de identificación **no transforma la Factura B en A**.
## Cómo se muestra el IVA en una Factura B
En una Factura B, los precios unitarios y el total se expresan con el IVA incorporado. A la vez, el comprobante debe mostrar cuánto de ese importe corresponde a IVA.
Por ejemplo, para una operación gravada al 21%:
| Concepto | Importe |
| --- | ---: |
| Valor neto de referencia | $100 |
| IVA contenido | $21 |
| Precio y total de la Factura B | $121 |
Los $21 se muestran como **“IVA Contenido”**, pero no se vuelven a sumar al total de $121.
En operaciones con consumidores finales, el bloque debe identificarse como **“Régimen de Transparencia Fiscal al Consumidor (Ley 27.743)”** e incluir también los **otros impuestos nacionales indirectos** cuando correspondan. La obligación para los sujetos y operaciones alcanzados es general desde el 1 de abril de 2025, según la [RG 5614/2024](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5614%7Co%3A9%7Ca%3A2024%7Cf%3A12%2F12%2F2024).
### ¿El IVA contenido genera crédito fiscal?
No en el régimen general de una Factura B. Mostrar el IVA contenido tiene una finalidad informativa y no cambia la clase del comprobante.
Los receptores habituales de una Factura B no computan ese importe como el crédito fiscal ordinario de un responsable inscripto. Si el comprador es responsable inscripto, en principio corresponde una Factura A y debería solicitar la corrección del comprobante.
## Diferencias entre Factura A y Factura B
| Tema | Factura A | Factura B |
| --- | --- | --- |
| Emisor | Responsable inscripto | Responsable inscripto |
| Receptor | Responsable inscripto o monotributista | Consumidor final, exento, no alcanzado o no categorizado |
| Precios | Neto gravado separado del IVA | Precio e importe total con IVA incluido |
| IVA visible | Alícuota y monto discriminados en el detalle fiscal | “IVA Contenido” informado dentro del total |
| Crédito fiscal ordinario | Puede respaldarlo para un receptor responsable inscripto si se cumplen las condiciones legales | No |
| Código electrónico usual | 001 | 006 |
## Casos que no corresponden a una Factura B
- **El emisor es monotributista:** corresponde Factura C.
- **El receptor es responsable inscripto:** corresponde Factura A.
- **El receptor es monotributista:** corresponde Factura A desde julio de 2021.
- **La operación es una exportación:** corresponde Factura E.
- **Es alojamiento elegible de un turista extranjero con pago del exterior:** puede corresponder un comprobante T.
- **La operación está alcanzada por Factura de Crédito Electrónica MiPyME:** debe utilizarse la modalidad específica.
## Cómo emitir una Factura B electrónica
Para emitirla mediante el web service de factura electrónica se usa habitualmente el código `006` —o `CbteTipo: 6` en WSFE— y se solicita el CAE a ARCA.
Antes de emitir, verificá:
1. la condición fiscal actual del receptor;
2. el punto de venta habilitado para factura electrónica;
3. la identificación exigida según el receptor y el monto;
4. los importes netos, alícuotas e IVA contenido;
5. que la representación entregada incluya CAE o CAEA, vencimiento y QR.
Podés consultar el [ejemplo de Factura B de Afip SDK](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/factura-b) para ver la solicitud técnica.
## Preguntas frecuentes
### ¿Un monotributista puede emitir Factura B?
No. En operaciones internas, un monotributista emite Factura C.
### ¿Una Factura B muestra el IVA?
Sí. El precio y el total incluyen IVA y, además, se informa el monto de “IVA Contenido”. Ese importe es informativo y no se suma otra vez.
### ¿Una venta de más de $10.000.000 pasa a ser Factura A?
No. El monto cambia los datos de identificación exigidos al consumidor final, no la clase del comprobante.
### ¿Qué pasa si la Factura B se emitió a un responsable inscripto?
El emisor debe corregir la operación con una nota de crédito vinculada y emitir el comprobante que corresponda. Un comprobante electrónico autorizado no se edita ni se elimina.
## Fuentes oficiales
- [ARCA: clases de comprobantes del régimen general](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp)
- [RG 1415: requisitos y datos de los comprobantes](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion)
- [RG 5866/2026: identificación del consumidor final](https://www.argentina.gob.ar/normativa/nacional/norma-427092/texto)
- [RG 5614/2024: Transparencia Fiscal al Consumidor](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5614%7Co%3A9%7Ca%3A2024%7Cf%3A12%2F12%2F2024)
- [RG 4892/2020: código QR en comprobantes electrónicos](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4892-2020-345661/texto)
## También te puede interesar
---
--- title: Factura C: qué es, IVA y datos obligatorios description: Conocé quién emite una Factura C, cuándo corresponde, qué datos debe incluir y cómo se informa el IVA. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/factura-c-datos-obligatorios-iva.webp ---
# Factura C: qué es, IVA y datos obligatorios
La **Factura C** es el comprobante que emiten los monotributistas y determinados sujetos exentos, no alcanzados o no responsables frente al IVA por sus operaciones internas.
La letra depende de la condición fiscal del emisor, no de la del comprador. Por eso, quien debe emitir Factura C la utiliza tanto frente a un consumidor final como frente a un responsable inscripto o a otro monotributista.
> Esta guía resume el régimen general vigente al 28 de julio de 2026. Algunas actividades y regímenes especiales pueden exigir comprobantes o datos adicionales.
## Quién emite una Factura C
En el régimen general, emiten Factura C:
- los monotributistas;
- los monotributistas sociales y sujetos adheridos a regímenes promovidos comprendidos;
- los sujetos exentos en IVA;
- los sujetos no alcanzados o no responsables frente al IVA que deben documentar una operación interna.
Un responsable inscripto no emite Factura C. Según el receptor y la operación, utiliza Factura A, B, E o el comprobante especial que corresponda.
La [tabla vigente de comprobantes de ARCA](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp) resume la relación entre la condición del emisor, la del receptor y la clase aplicable.
## Quién puede recibirla
La Factura C puede emitirse a cualquier receptor en una operación interna:
| Receptor | Comprobante del emisor alcanzado |
| --- | --- |
| Responsable inscripto | Factura C |
| Monotributista | Factura C |
| Exento, no alcanzado o no responsable | Factura C |
| Consumidor final | Factura C |
La condición del receptor modifica los datos que deben informarse, pero no convierte la Factura C en A o B.
Si la operación es una exportación, corresponde **Factura E**. La condición de monotributista o exento del emisor no cambia esa regla.
## Para qué sirve
La Factura C documenta fiscal y comercialmente una venta, locación, obra o prestación. Permite identificar:
- al emisor y, cuando corresponde, al receptor;
- los bienes o servicios facturados;
- la cantidad y el precio;
- descuentos, bonificaciones y otros conceptos;
- el importe total;
- la moneda y el tipo de cambio, si corresponde;
- la autorización fiscal del comprobante.
## Cómo se informa el IVA
La Factura C **no discrimina IVA**. Los precios unitarios y el total se expresan sin mostrar una alícuota o un importe de IVA separado.
Esto tiene dos consecuencias prácticas:
- el emisor no agrega una línea de IVA discriminado al importe facturado;
- un receptor responsable inscripto no puede computar crédito fiscal de IVA a partir de esa Factura C.
El Régimen de Transparencia Fiscal al Consumidor no transformó la Factura C en un comprobante que discrimine IVA. La [RG 5614/2024](https://www.argentina.gob.ar/normativa/nacional/norma-407183/texto) mantuvo el tratamiento propio de esta clase.
## Datos obligatorios de una Factura C
La [RG 1415 y su Anexo II](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion) establecen los datos mínimos, con adecuaciones según la actividad y la modalidad de emisión.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio comercial, CUIT, Ingresos Brutos o condición de no contribuyente, condición tributaria e inicio de actividades cuando corresponda |
| Comprobante | Letra C, código de tipo, punto de venta, numeración correlativa y fecha de emisión |
| Receptor | Nombre o razón social, domicilio, identificación y condición fiscal cuando corresponda |
| Operación | Descripción identificable, cantidades, precios unitarios, descuentos y cualquier concepto que incida en el total |
| Importe | Subtotales y total, sin IVA discriminado |
| Moneda | Moneda utilizada y tipo de cambio cuando la operación se expresa en moneda extranjera |
| Condiciones | Condiciones de venta o de pago y remitos u otros comprobantes vinculados, cuando existan |
| Autorización | CAE, CAEA o CAI y su vencimiento, según la modalidad |
En factura electrónica, la representación también debe incluir el [código QR exigido por ARCA](https://www.arca.gob.ar/fe/qr/conceptos-generales.asp).
## Identificación del consumidor final
La clase continúa siendo C aunque el importe obligue a identificar al consumidor final.
Desde el 1 de julio de 2026, la [RG 5866/2026](https://www.argentina.gob.ar/normativa/nacional/norma-427092/texto) exige:
- en toda operación con un consumidor final, incluir la leyenda **“A CONSUMIDOR FINAL”**;
- si la operación es igual o superior a **$10.000.000**, informar DNI, CUIL o CDI;
- si el comprador alcanzado por ese umbral es extranjero, informar documento o cédula del país de origen o pasaporte;
- si el comprador pide identificar la operación para computar una deducción en Ganancias, informar su CUIT sin importar el monto.
El umbral sólo modifica los datos del receptor: no cambia la letra del comprobante.
## Factura C en moneda extranjera
La moneda tampoco determina la clase. Una operación interna emitida por un sujeto alcanzado continúa documentándose con Factura C aunque se exprese en moneda extranjera.
Cuando el precio está fijado y la operación se cancela en esa misma moneda extranjera, la [RG 5616/2024](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5616%7Co%3A9%7Ca%3A2024%7Cf%3A17%2F12%2F2024) dispone utilizar el tipo de cambio vendedor divisa del Banco Nación correspondiente al día hábil cambiario anterior.
## Códigos de los comprobantes C
| Comprobante | Código |
| --- | ---: |
| Factura C | `011` |
| Nota de débito C | `012` |
| Nota de crédito C | `013` |
| Recibo C | `015` |
| Factura de Crédito Electrónica MiPyME C | `211` |
| Nota de débito FCE MiPyME C | `212` |
| Nota de crédito FCE MiPyME C | `213` |
La Factura de Crédito Electrónica MiPyME es una modalidad específica y tiene reglas propias de emisión, aceptación y ajuste.
## Cómo emitir una Factura C electrónica
Para una Factura C común se usa el código `011`, equivalente a `CbteTipo: 11` en WSFE.
Antes de emitir, verificá:
1. la condición tributaria del emisor;
2. si la operación es interna o una exportación;
3. el punto de venta habilitado para factura electrónica;
4. los datos exigidos para identificar al receptor;
5. la moneda, los importes y el total sin IVA discriminado;
6. la autorización y el vencimiento que deben figurar en la representación.
Podés consultar el [ejemplo técnico de Factura C](/docs/api-reference/web-services/wsfe/FECAESolicitar/factura-c) y ver una [plantilla PDF de Factura C](/docs/pdfs/invoice-c).
## Preguntas frecuentes
### ¿Un monotributista emite Factura C a un responsable inscripto?
Sí. La clase se define por la condición del emisor. El receptor responsable inscripto no puede computar crédito fiscal de IVA porque el comprobante no lo discrimina.
### ¿Un responsable inscripto puede emitir Factura C?
No en el régimen general. Utiliza Factura A o B para operaciones internas y Factura E para exportaciones, según corresponda.
### ¿La Factura C incluye IVA?
No discrimina una alícuota ni un importe de IVA. El total se informa sin separar ese impuesto.
### ¿Una exportación de un monotributista se documenta con Factura C?
No. Las exportaciones se documentan con Factura E, incluso cuando el emisor es monotributista o exento.
### ¿El monto de la operación puede convertirla en Factura A o B?
No. El monto puede exigir más datos de identificación del consumidor final, pero no modifica la clase.
## Fuentes oficiales
- [ARCA: clases de comprobantes del régimen general](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp)
- [RG 1415: requisitos y datos de los comprobantes](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion)
- [RG 5614/2024: Transparencia Fiscal al Consumidor](https://www.argentina.gob.ar/normativa/nacional/norma-407183/texto)
- [RG 5616/2024: operaciones concertadas en moneda extranjera](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5616%7Co%3A9%7Ca%3A2024%7Cf%3A17%2F12%2F2024)
- [RG 5866/2026: identificación del consumidor final](https://www.argentina.gob.ar/normativa/nacional/norma-427092/texto)
- [ARCA: web service de factura electrónica](https://www.arca.gob.ar/ws/documentacion/ws-factura-electronica.asp)
## También te puede interesar
---
--- title: Factura de Crédito Electrónica MiPyME: cómo funciona description: Conocé cuándo corresponde una FCE, sus clases A, B y C, cómo se acepta y qué datos requiere. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/factura-de-credito-electronica-mipyme.webp ---
# Factura de Crédito Electrónica MiPyME: cómo funciona
La **Factura de Crédito Electrónica MiPyME —FCE—** es un comprobante que, además de documentar una operación comercial, puede convertirse en un título negociable para facilitar el financiamiento de una MiPyME.
No es una clase fiscal independiente: existen FCE A, B y C según la condición tributaria de las partes. Cada una tiene códigos propios y reglas de aceptación, rechazo, cancelación y negociación.
> Esta guía resume el régimen vigente al 28 de julio de 2026. El monto mínimo y el plazo de aceptación se actualizan por normas específicas, por lo que conviene verificarlos antes de implementar reglas permanentes.
## Cuándo corresponde una FCE
La emisión es obligatoria cuando:
- el emisor es una MiPyME alcanzada por el régimen;
- el receptor figura como empresa grande en el registro aplicable;
- la operación no está excluida;
- el importe total es igual o superior al monto mínimo vigente.
Desde el **14 de abril de 2026**, el monto mínimo es de **$5.549.862**, según la [Resolución 1/2026](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1-2026-424460/texto).
También puede utilizarse voluntariamente en operaciones entre MiPyMEs cuando se cumplen las condiciones de adhesión previstas por el régimen.
La FCE no corresponde únicamente porque el emisor tenga certificado MiPyME. También deben evaluarse el receptor, el importe, la actividad, las exclusiones y la modalidad de la operación.
## Qué clase corresponde
La letra depende de las condiciones fiscales del emisor y del receptor, igual que en la facturación general:
| Clase | Relación fiscal habitual |
| --- | --- |
| FCE A | Responsable inscripto a responsable inscripto o monotributista |
| FCE B | Responsable inscripto a un receptor empresarial habilitado al que fiscalmente corresponda clase B, por ejemplo exento o no alcanzado |
| FCE C | Monotributista o exento por una operación interna |
No existe una FCE E para exportaciones ni una FCE T. Tampoco se utiliza una FCE M: desde diciembre de 2025 la clase M dejó de otorgarse para nuevas autorizaciones, y la Factura A con leyenda **“OPERACIÓN SUJETA A RETENCIÓN”** está excluida del régimen FCE.
## Códigos de Factura, Nota de Débito y Nota de Crédito
La familia de comprobantes FCE utiliza estos códigos:
| Clase | Factura | Nota de débito | Nota de crédito |
| --- | ---: | ---: | ---: |
| FCE A | 201 | 202 | 203 |
| FCE B | 206 | 207 | 208 |
| FCE C | 211 | 212 | 213 |
No uses los códigos comunes de Factura A, B o C para una operación alcanzada por FCE. La modalidad elegida determina tanto el tipo de comprobante como su circuito posterior.
## Cómo funciona la aceptación
El circuito general tiene estas etapas:
1. la MiPyME emite la FCE y obtiene el CAE;
2. el comprobante se pone a disposición del receptor en su Domicilio Fiscal Electrónico;
3. el receptor puede aceptarlo, rechazarlo o cancelar su importe por los mecanismos admitidos;
4. si transcurre el plazo sin una acción válida, la FCE queda aceptada tácitamente;
5. una vez aceptada, puede circular como título negociable bajo las reglas del régimen.
Al 28 de julio de 2026, el plazo es de **21 días corridos desde la recepción en el Domicilio Fiscal Electrónico**. Esta extensión rige hasta el **31 de octubre de 2026**, de acuerdo con la [Resolución 219/2025](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARES%7Cn%3A219%7Co%3A144%7Ca%3A2025%7Cf%3A24%2F10%2F2025).
La aceptación expresa o tácita es irrevocable. Por eso el receptor debe revisar dentro del plazo los datos, la entrega, el importe y cualquier causal de rechazo.
### El CAE no equivale a aceptación
El **CAE** confirma que ARCA autorizó fiscalmente el comprobante. La **aceptación** pertenece al circuito posterior de la FCE y define su carácter negociable.
Una FCE puede tener CAE y todavía estar pendiente de aceptación. No conviene interpretar el resultado exitoso de `FECAESolicitar` como confirmación de que el receptor ya la aceptó.
## Datos y condiciones necesarias
Además de los requisitos generales del comprobante, la FCE incorpora información y condiciones propias del régimen.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Identificación fiscal y condición MiPyME alcanzada |
| Receptor | CUIT, razón social, condición fiscal y pertenencia al universo correspondiente |
| Comprobante | Clase FCE, código específico, punto de venta, número, fecha y CAE |
| Operación | Bienes o servicios, cantidades, precios, descuentos, neto, IVA y total según la clase |
| Pago | Fecha de vencimiento y condiciones comerciales |
| Cuenta | CBU informada en el registro para recibir la cancelación |
| Referencias | Orden de compra, contrato, remitos u otros documentos comerciales cuando correspondan |
| Notificaciones | Domicilio Fiscal Electrónico constituido y actualizado |
Tanto el emisor como el receptor deben contar con Domicilio Fiscal Electrónico. El emisor, además, debe registrar la CBU exigida para operar. Emitir la factura no reemplaza estos requisitos.
## Notas de débito y crédito FCE
Las notas FCE tienen reglas más estrictas que las notas del régimen general:
- cada nota se asocia con una única FCE;
- antes de la aceptación expresa o tácita, ajusta el importe negociable;
- después de la aceptación, no modifica el valor del título ya constituido;
- una FCE aceptada no puede anularse completamente mediante una nota de crédito;
- debe conservar la misma moneda, salvo los ajustes específicos admitidos por diferencias de cambio.
La Nota de Débito FCE aumenta el importe de la operación. La Nota de Crédito FCE lo disminuye. El momento de emisión frente a la aceptación determina si ese ajuste modifica o no el monto negociable.
Antes de ajustar una FCE, consultá el estado del comprobante en el registro y no apliques automáticamente el circuito de una factura común.
## Cómo emitirla y gestionarla
La emisión puede realizarse mediante los sistemas admitidos por ARCA, incluidos **Comprobantes en Línea**, **WSFE**, **WSMTXCA** o **WSBFE**, según el caso. La consulta y gestión del circuito de aceptación se realiza mediante el Registro de Facturas de Crédito Electrónicas MiPyME o **WSFECRED**.
Para implementarla:
1. verificá que el emisor posea certificado MiPyME vigente;
2. consultá si el receptor pertenece al universo del régimen;
3. compará el total con el monto mínimo vigente;
4. determiná la clase A, B o C y su código FCE;
5. informá la fecha de vencimiento y las referencias comerciales;
6. solicitá el CAE;
7. monitoreá recepción, aceptación, rechazo o cancelación mediante el registro;
8. antes de emitir una nota, consultá el estado actual de la FCE.
Afip SDK incluye ejemplos de emisión para:
- [Factura de Crédito Electrónica A](/docs/api-reference/web-services/wsfe/FECAESolicitar/factura-de-credito-electronica-a)
- [Factura de Crédito Electrónica B](/docs/api-reference/web-services/wsfe/FECAESolicitar/factura-de-credito-electronica-b)
- [Factura de Crédito Electrónica C](/docs/api-reference/web-services/wsfe/FECAESolicitar/factura-de-credito-electronica-c)
También podés consultar las plantillas PDF de [FCE A](/docs/pdfs/invoice-fce-a), [FCE B](/docs/pdfs/invoice-fce-b) y [FCE C](/docs/pdfs/invoice-fce-c), y la [referencia de WSFECRED](/docs/api-reference/web-services/wsfecred) para gestionar el circuito posterior.
## Preguntas frecuentes
### ¿Toda factura de una MiPyME debe ser FCE?
No. Depende del receptor, el importe mínimo, la actividad, las exclusiones y las condiciones del régimen.
### ¿Cuál es el monto mínimo vigente?
Desde el 14 de abril de 2026 es de $5.549.862. El monto puede actualizarse, por lo que no conviene fijarlo sin fecha en un sistema.
### ¿Cuánto tiempo tiene el receptor para responder?
Al 28 de julio de 2026, 21 días corridos desde la recepción en el Domicilio Fiscal Electrónico. Ese plazo excepcional rige hasta el 31 de octubre de 2026.
### ¿Obtener CAE significa que la FCE fue aceptada?
No. El CAE es la autorización fiscal de emisión. La aceptación expresa o tácita ocurre después.
### ¿Puedo anular una FCE aceptada con una nota de crédito?
No de forma total. Una vez aceptada, la nota no modifica el título negociable y el régimen impide anular toda la operación por esa vía.
### ¿La FCE siempre es clase A?
No. Puede ser A, B o C según las condiciones fiscales de la operación.
## Fuentes oficiales
- [Ley 27.440: régimen de Factura de Crédito Electrónica MiPyME](https://www.argentina.gob.ar/normativa/nacional/ley-27440-310084/texto)
- [RG 4367: implementación del régimen FCE](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4367-2018-317926/actualizacion)
- [ARCA: características de la Factura de Crédito Electrónica](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/caracteristicas.asp)
- [ARCA: sujetos alcanzados](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/sujetos.asp)
- [ARCA: tipos y códigos de comprobantes FCE](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/comprobantes.asp)
- [ARCA: Registro de Facturas de Crédito Electrónicas MiPyME](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/registro-facturas.asp)
- [Resolución 1/2026: monto mínimo vigente](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1-2026-424460/texto)
- [Resolución 219/2025: plazo de aceptación](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARES%7Cn%3A219%7Co%3A144%7Ca%3A2025%7Cf%3A24%2F10%2F2025)
## También te puede interesar
---
--- title: Factura E: exportaciones y datos obligatorios description: Conocé cuándo corresponde una Factura E, quién puede emitirla y qué datos exige ARCA para exportar bienes o servicios. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/factura-e-exportaciones-datos-obligatorios.webp ---
# Factura E: exportaciones y datos obligatorios
La **Factura E** documenta una exportación de bienes, servicios u otras prestaciones destinadas al exterior. La clase se define por la naturaleza y el destino de la operación, no por la condición frente al IVA del emisor.
Por eso pueden emitirla responsables inscriptos, monotributistas y sujetos exentos. Para autorizarla electrónicamente se utiliza el web service **WSFEX**, no el servicio WSFE de facturación interna.
> Esta guía resume el régimen general vigente al 28 de julio de 2026. La operación concreta también puede estar alcanzada por requisitos aduaneros, cambiarios o sectoriales.
## Cuándo corresponde una Factura E
En términos generales, corresponde cuando se documenta:
- una exportación definitiva de bienes;
- una prestación o locación de servicios cuya utilización o explotación efectiva se realiza en el exterior;
- otra operación de exportación comprendida por el régimen.
La condición fiscal del emisor no cambia la letra:
| Emisor | Operación de exportación |
| --- | --- |
| Responsable inscripto en IVA | Factura E |
| Monotributista | Factura E |
| Sujeto exento | Factura E |
Una operación interna no pasa a ser exportación por expresarse o cobrarse en moneda extranjera. Debe cumplir las condiciones propias de una operación destinada al exterior.
## Quién recibe una Factura E
El receptor es una persona o entidad del exterior. El comprobante debe identificarla con los datos disponibles y exigidos para la operación, entre ellos:
- nombre o razón social;
- domicilio en el exterior;
- país;
- identificación tributaria extranjera;
- condición y tipo de receptor que correspondan en el sistema.
Estos datos reemplazan la identificación fiscal local que se utiliza en una factura interna.
## Cómo se trata el IVA
La exportación no genera débito fiscal de IVA al cliente del exterior. La Factura E debe incluir la leyenda **“IVA EXENTO OPERACION DE EXPORTACION”** y no sumar IVA al importe facturado.
Esto no significa que todo el tratamiento del IVA quede resuelto por el comprobante. El eventual cómputo o recupero de créditos fiscales vinculados con la exportación se analiza mediante el régimen correspondiente y por separado.
## Tipos de exportación
En WSFEX, la operación se identifica según su naturaleza:
| Código | Tipo |
| ---: | --- |
| `1` | Exportación de bienes |
| `2` | Exportación de servicios |
| `4` | Otras exportaciones |
La clasificación influye en los datos que debe recibir el web service. Una exportación de bienes puede requerir información aduanera e Incoterms, mientras que los servicios y otras exportaciones tienen campos propios.
## Datos obligatorios de una Factura E
La [RG 1415 y su Anexo II](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion), el régimen de factura electrónica de exportación y el manual de WSFEX determinan los datos aplicables.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio, CUIT, condición tributaria e información registral exigida |
| Comprobante | Letra E, código `019`, punto de venta exclusivo para exportación, numeración y fecha |
| Receptor | Nombre o razón social, domicilio, país e identificación tributaria extranjera |
| Operación | Tipo de exportación, descripción, cantidades, unidades, precios unitarios y total |
| Moneda | Moneda y tipo de cambio utilizado cuando corresponde |
| Bienes | Incoterm y datos aduaneros aplicables a la operación |
| Servicios u otras exportaciones | Fecha de pago y demás datos específicos cuando correspondan |
| Condiciones | Forma y condiciones de pago, permisos y referencias vinculadas cuando sean exigibles |
| Autorización | CAE y vencimiento; la representación electrónica también debe incluir el QR aplicable |
Los requisitos varían según se exporten bienes, servicios u otros conceptos. No conviene completar una solicitud de WSFEX copiando sin más los campos de una factura interna.
## Moneda y tipo de cambio
La Factura E puede emitirse en pesos o en moneda extranjera.
Para una exportación de servicios expresada en moneda extranjera, WSFEX utiliza el tipo de cambio vendedor divisa del Banco Nación correspondiente al día hábil cambiario anterior a la emisión, según la [RG 5616/2024](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5616%7Co%3A9%7Ca%3A2024%7Cf%3A17%2F12%2F2024).
Si posteriormente se emite una nota de crédito o débito E por esa operación, debe utilizarse el tipo de cambio del comprobante asociado.
## Códigos de los comprobantes E
| Comprobante | Código |
| --- | ---: |
| Factura E | `019` |
| Nota de débito E | `020` |
| Nota de crédito E | `021` |
Cada nota de crédito o débito E debe asociarse con **un único comprobante de exportación**. Esta regla es más estricta que la asociación admitida en algunos comprobantes del régimen general.
## Cómo emitir una Factura E electrónica
La autorización se solicita mediante **WSFEX v1**, usando el método `FEXAuthorize`. No se emite como una Factura A, B o C dentro de WSFE.
Antes de solicitar el CAE, verificá:
1. que la operación reúna las condiciones de una exportación;
2. que el punto de venta esté habilitado para comprobantes de exportación;
3. el tipo de exportación;
4. los datos completos del receptor del exterior;
5. la moneda y el tipo de cambio aplicable;
6. los datos aduaneros o de servicios exigidos;
7. la descripción, cantidades, importes y condiciones de pago.
La fecha informada en la solicitud puede encontrarse dentro de los cinco días anteriores o posteriores al pedido de autorización, conforme al régimen técnico de WSFEX.
Podés consultar la [referencia de `FEXAuthorize`](/docs/api-reference/web-services/wsfex/FEXAuthorize) y ver una [plantilla PDF de Factura E](/docs/pdfs/invoice-e).
## Diferencias entre Factura E y una factura interna
| Tema | Factura E | Factura A, B o C |
| --- | --- | --- |
| Destino | Operación de exportación | Operación interna |
| Receptor | Persona o entidad del exterior | Receptor local |
| IVA al cliente | No genera débito fiscal | Depende de la clase y la operación |
| Punto de venta | Exclusivo para exportación | Habilitado para la modalidad interna |
| Web service habitual | WSFEX | WSFE |
| Datos adicionales | País, identificación extranjera y datos de exportación | Condición fiscal e identificación local |
## Preguntas frecuentes
### ¿Un monotributista puede emitir Factura E?
Sí. Si realiza una exportación comprendida por el régimen, emite Factura E y no Factura C.
### ¿Una exportación de servicios lleva Factura E?
Sí, cuando la utilización o explotación efectiva del servicio se realiza en el exterior y se cumplen las demás condiciones de la operación.
### ¿La Factura E suma IVA al total?
No. No genera débito fiscal de IVA al cliente del exterior y debe contener la leyenda prevista para la operación de exportación.
### ¿Se puede emitir una Factura E con WSFE?
No en el flujo habitual. La autorización de comprobantes E se gestiona mediante WSFEX y su método `FEXAuthorize`.
### ¿Una nota de crédito E puede asociarse con varias facturas?
No. Cada nota E debe relacionarse con un único comprobante de exportación.
## Fuentes oficiales
- [RG 1415: requisitos y datos de los comprobantes](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion)
- [RG 2758: factura electrónica de exportación](https://www.argentina.gob.ar/normativa/nacional/norma-163382/actualizacion)
- [RG 3689: exportación de servicios](https://www.argentina.gob.ar/normativa/nacional/norma-236818/texto)
- [RG 5616/2024: operaciones concertadas en moneda extranjera](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5616%7Co%3A9%7Ca%3A2024%7Cf%3A17%2F12%2F2024)
- [ARCA: comprobantes para exportaciones de servicios](https://www.arca.gob.ar/derechos-de-exportacion-de-servicios/comprobantes-y-facturacion/comprobantes.asp)
- [ARCA: web services de factura electrónica](https://www.arca.gob.ar/ws/documentacion/ws-factura-electronica.asp)
- [ARCA: manual para el desarrollador de WSFEX](https://www.arca.gob.ar/ws/documentacion/manuales/WSFEX-Manualparaeldesarrollador_V3.1.1_ARCA.pdf)
## También te puede interesar
---
--- title: Factura T: qué es y cuándo corresponde description: Conocé cuándo se emite una Factura T por alojamiento de turistas extranjeros, quién puede emitirla y qué datos exige ARCA. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/factura-t-turistas-extranjeros.webp ---
# Factura T: qué es y cuándo corresponde
La **Factura T** es un comprobante especial para servicios de alojamiento prestados en Argentina a turistas extranjeros que cumplen las condiciones del régimen de reintegro de IVA.
Su alcance es estricto: no corresponde por cualquier venta a una persona extranjera ni por todos los servicios consumidos durante un viaje. Deben cumplirse en conjunto los requisitos del turista, del establecimiento, del servicio y del medio de pago.
> Esta guía resume el régimen vigente al 28 de julio de 2026. Antes de emitir, verificá la situación migratoria del huésped, la habilitación del emisor y el origen del medio de pago.
## Cuándo corresponde una Factura T
El régimen alcanza al servicio de alojamiento —incluido el desayuno cuando forma parte del precio— si se cumplen estas condiciones:
- el huésped es un turista extranjero que no reside en Argentina;
- el alojamiento se presta dentro del país;
- el emisor es un responsable inscripto que realiza la actividad de alojamiento, o una agencia de viajes y turismo habilitada y responsable inscripta que interviene en la operación;
- el pago se efectúa con una tarjeta de crédito o débito internacional emitida en el exterior o mediante una transferencia proveniente del exterior;
- se acredita la identidad y la condición de turista extranjero según las reglas del régimen.
Si falta una de estas condiciones, no corresponde elegir la clase T sólo por la nacionalidad del cliente. Debe emitirse el comprobante general que resulte aplicable.
La [RG 3971](https://www.argentina.gob.ar/normativa/nacional/norma-270043/actualizacion) regula la emisión y el reintegro, mientras que el [Decreto 1043/2016](https://www.argentina.gob.ar/normativa/nacional/decreto-1043-2016-265879/texto) establece el beneficio para los servicios alcanzados.
## Quién puede emitirla
No cualquier comercio puede emitir una Factura T. Los emisores alcanzados son:
- establecimientos que prestan servicios de alojamiento y están inscriptos como responsables en IVA;
- agencias de viajes y turismo habilitadas y responsables inscriptas, cuando facturan el alojamiento comprendido por el régimen.
El emisor debe utilizar el servicio electrónico específico y un punto de venta habilitado para estos comprobantes.
Un monotributista o un sujeto exento no utiliza Factura T. Tampoco corresponde para una exportación de servicios: la clase E responde a reglas distintas.
## Qué incluye y qué se factura por separado
La Factura T documenta el alojamiento y el desayuno incluido en su precio. Los demás bienes o servicios deben separarse.
| Concepto | Tratamiento general |
| --- | --- |
| Alojamiento | Puede incluirse en la Factura T si se cumplen todos los requisitos |
| Desayuno incluido en el precio | Forma parte del servicio alcanzado |
| Minibar, restaurante, excursiones, traslados u otros adicionales | Se facturan por separado |
| Venta de bienes no incluida en el alojamiento | Se documenta por separado |
Los conceptos complementarios se respaldan con una Factura A o B, según la relación fiscal que corresponda. No deben incorporarse artificialmente a la Factura T para extenderles el reintegro.
## Cómo se trata el IVA
El alojamiento alcanzado está gravado al **21%**. La Factura T discrimina ese IVA y permite instrumentar su reintegro al turista extranjero.
No se trata de una operación exenta ni gravada a tasa cero. El impuesto existe, se informa en el comprobante y se reintegra mediante el procedimiento previsto por el régimen.
El importe del reintegro debe ser igual al IVA del alojamiento elegible. No alcanza al IVA de los servicios adicionales que se facturan por separado.
## Datos obligatorios
Además de los requisitos generales de facturación, la Factura T debe contener la información necesaria para acreditar al turista, el alojamiento y el pago del exterior.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio, CUIT, condición frente al IVA y datos del establecimiento o agencia |
| Comprobante | Clase T, código, punto de venta, número correlativo y fecha |
| Turista | Nombre y apellido, nacionalidad, país de residencia y documento de viaje o identificación admitida |
| Alojamiento | Establecimiento, servicio prestado, período de estadía y descripción del alojamiento |
| Importes | Neto gravado, comisión si corresponde, IVA 21%, importe del reintegro y total |
| Pago | Medio de pago elegible y datos que permitan acreditar que fue emitido o provino del exterior |
| Autorización | CAE y vencimiento, según la autorización obtenida mediante el servicio específico |
| Relaciones | Uno o más comprobantes T asociados cuando se emite una nota de crédito o débito |
Los datos concretos exigidos por la interfaz se detallan en el [manual vigente del WSCT de ARCA](https://arca.gob.ar/ws/documentacion/manuales/Manual_Desarrollador_WSCT_v1.6.4.pdf).
## Códigos de los comprobantes T
La familia T tiene códigos propios:
| Comprobante | Código |
| --- | ---: |
| Factura T | 195 |
| Nota de débito T | 196 |
| Nota de crédito T | 197 |
Estos códigos no deben reemplazarse por los de Factura B aunque el huésped sea consumidor final. Si la operación cumple el régimen, se utiliza el comprobante T; si no lo cumple, se aplica la clase general correspondiente.
## Notas de crédito y débito T
Una Nota de Crédito T disminuye o revierte un importe de la Factura T. Una Nota de Débito T documenta un ajuste que lo aumenta.
En ambos casos:
- la nota la emite quien generó la Factura T;
- se dirige al mismo receptor;
- debe asociarse con uno o más comprobantes T originales;
- conserva el tratamiento del IVA y los datos específicos del régimen;
- sólo ajusta conceptos que estaban comprendidos en la operación de alojamiento.
No corresponde utilizar una nota A, B o C para ajustar una Factura T.
## Cómo emitirla electrónicamente
Por API, la Factura T se autoriza mediante el **Web Service de Comprobantes T —WSCT—**, no mediante WSFE. ARCA también admite la emisión a través de **Comprobantes en Línea**.
Antes de solicitar el CAE, verificá:
1. que el emisor esté alcanzado y habilitado;
2. que el huésped reúna la condición de turista extranjero no residente;
3. la documentación de identidad y migratoria requerida;
4. que el medio de pago sea elegible y provenga del exterior;
5. que sólo se incluyan alojamiento y desayuno comprendidos;
6. que el IVA del 21% esté correctamente calculado;
7. que los servicios adicionales se facturen por separado.
Podés consultar el método [`autorizarComprobante` del WSCT](/docs/api-reference/web-services/wsct/autorizarComprobante) y ver una representación en la [plantilla PDF de Factura T](/docs/pdfs/invoice-t).
## Preguntas frecuentes
### ¿Toda venta a un extranjero lleva Factura T?
No. La Factura T se reserva para alojamiento elegible de turistas extranjeros no residentes, con emisor habilitado y pago del exterior. Las demás operaciones usan el comprobante general que corresponda.
### ¿El alojamiento está exento de IVA?
No. Está gravado al 21%; el impuesto se discrimina y se reintegra mediante el régimen especial.
### ¿Puedo incluir consumos de restaurante o excursiones?
No como parte del beneficio. Los servicios complementarios deben facturarse por separado con la clase A o B que corresponda.
### ¿Se emite mediante WSFE?
No. Por API, los comprobantes T se autorizan mediante WSCT. También pueden emitirse a través de Comprobantes en Línea.
### ¿Cómo corrijo una Factura T?
Con una Nota de Crédito T si el ajuste disminuye el importe o una Nota de Débito T si lo aumenta. La nota debe asociarse con uno o más comprobantes T originales.
## Fuentes oficiales
- [Decreto 1043/2016: reintegro del IVA a turistas extranjeros](https://www.argentina.gob.ar/normativa/nacional/decreto-1043-2016-265879/texto)
- [RG 3971: régimen de comprobantes T](https://www.argentina.gob.ar/normativa/nacional/norma-270043/actualizacion)
- [RG 4106: implementación de los comprobantes T](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4106-2017-278360/texto)
- [ARCA: clases de comprobantes según emisor y receptor](https://www.arca.gob.ar/facturacion/regimen-general/comprobantes.asp)
- [ARCA: manual para desarrolladores del WSCT](https://arca.gob.ar/ws/documentacion/manuales/Manual_Desarrollador_WSCT_v1.6.4.pdf)
## También te puede interesar
---
--- title: Nota de crédito: qué es y cuándo emitirla description: Conocé cuándo usar una nota de crédito, quién debe emitirla, cómo asociarla con la factura original y qué datos exige ARCA. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/nota-de-credito-que-es-cuando-emitirla.webp ---
# Nota de crédito: qué es y cuándo emitirla
Una **nota de crédito** es el comprobante fiscal que disminuye o revierte total o parcialmente una operación facturada con anterioridad. Se usa, por ejemplo, ante una devolución, un descuento posterior, una rescisión o una factura emitida por error.
Una factura electrónica con CAE no se edita ni se borra. Se corrige mediante una nota de crédito o débito, según el efecto del ajuste; si corresponde reemplazarla, después se emite una nueva factura.
> Esta guía resume el régimen general vigente al 28 de julio de 2026. La Factura de Crédito Electrónica MiPyME, las exportaciones y otras actividades especiales tienen reglas adicionales.
## Para qué sirve una nota de crédito
La nota de crédito documenta una reducción del importe de una operación ya registrada. Los casos habituales son:
- devolución total o parcial de bienes;
- descuentos o bonificaciones acordados después de facturar;
- quitas;
- rescisión total o parcial de la operación;
- diferencias de precio o cantidad a favor del cliente;
- anulación de una factura duplicada;
- anulación de una factura emitida con datos equivocados, seguida de la factura correcta.
Si un descuento o una bonificación ya estaban acordados y podían determinarse al emitir la factura, deben incluirse en el comprobante original. No corresponde diferirlos artificialmente a una nota de crédito.
### No es lo mismo que devolver dinero
La nota de crédito documenta el ajuste fiscal y comercial. La devolución, compensación o aplicación del saldo es el movimiento financiero entre las partes y puede ocurrir por separado.
Emitir una nota de crédito no prueba, por sí solo, que el dinero ya fue reintegrado.
## Quién debe emitirla
La [RG 4540/2019](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A4540%7Co%3A3%7Ca%3A2019%7Cf%3A31%2F07%2F2019) establece tres reglas centrales:
1. sólo puede emitir la nota quien emitió el comprobante original;
2. debe emitirse al mismo receptor;
3. debe relacionarse con una o más facturas o documentos equivalentes emitidos previamente.
El comprador no puede generar su propia nota fiscal para reducir una factura del proveedor.
Si una factura se emitió a una CUIT equivocada, la nota de crédito debe dirigirse a **esa misma CUIT** y vincularse con la factura errónea. Después se emite la factura correcta al receptor correcto.
## Cuándo debe emitirse
La nota de crédito debe emitirse dentro de los **15 días corridos desde que surge el hecho o la situación que requiere el ajuste**.
El plazo no comienza necesariamente en la fecha de la factura. Si el motivo es una devolución posterior, por ejemplo, se cuenta desde ese hecho. En un [criterio administrativo publicado en 2020](https://arca.gob.ar/EspaciosdeDialogoInstitucional/documentos/Acta-EDI-Particular-Notas-Debito-y-Credito-7-07.pdf), ARCA indicó que el cómputo comienza cuando el emisor toma conocimiento del hecho que requiere el ajuste.
Esta regla no debe confundirse con las ventanas técnicas para solicitar el CAE de un comprobante electrónico. Las [consideraciones de emisión de ARCA](https://www.arca.gob.ar/fe/emision-autorizacion/consideraciones.asp) regulan esos plazos operativos por separado.
## Cómo se vincula con la factura original
La RG 4540 exige indicar los números de las facturas o documentos asociados —o el período que se ajusta— y las referencias comerciales relevantes.
En WSFE, la relación se informa de dos maneras:
- `CbtesAsoc` para comprobantes individuales, identificados principalmente por tipo, punto de venta y número;
- `PeriodoAsoc` cuando el ajuste corresponde a un período y el régimen lo admite.
El régimen general admite asociar una o más facturas o, en ciertos ajustes, un período. Si la diferencia corresponde a precio o cantidad, debe individualizarse cada factura afectada.
## Tipos de nota de crédito
La clase depende de la condición fiscal de las partes y del comprobante que se ajusta. No se elige según conveniencia.
- **A (003):** operación de responsable inscripto con responsable inscripto o monotributista.
- **A con “PAGO EN CBU INFORMADA” (003):** la misma relación, según la habilitación del emisor.
- **A con “OPERACIÓN SUJETA A RETENCIÓN” (053):** emitida por responsables habilitados para esa modalidad en operaciones clase A.
- **B (008):** operación de responsable inscripto con consumidor final, exento, no alcanzado, no categorizado o turista cuando no corresponde T.
- **C (013):** operación interna facturada por monotributista o exento.
- **E (021):** exportación.
Desde el 1 de diciembre de 2025 no se conceden nuevas autorizaciones electrónicas o de impresión para Nota de Crédito M. El código 053 identifica ahora la **Nota de Crédito A con leyenda “OPERACIÓN SUJETA A RETENCIÓN”**, según la transición establecida por las [RG 5762/2025](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5762%7Co%3A9%7Ca%3A2025%7Cf%3A24%2F09%2F2025) y [RG 5764/2025](https://www.boletinoficial.gob.ar/detalleAviso/primera/331949/20250925). Los formularios M impresos y autorizados antes del cambio pueden utilizarse hasta el vencimiento de su CAI.
## Datos obligatorios
La nota conserva los requisitos y formalidades del comprobante original y suma la información del ajuste.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio, CUIT, condición fiscal, Ingresos Brutos e inicio de actividades cuando corresponda |
| Comprobante | Denominación, clase, código, punto de venta, numeración correlativa y fecha |
| Receptor | Mismo receptor de la factura, con su identificación, domicilio y condición fiscal |
| Asociación | Factura o documento relacionado, o período cuando el régimen lo admite |
| Ajuste | Motivo, bienes o servicios alcanzados, cantidades, precios y diferencias documentadas |
| Impuestos | Neto, alícuotas, IVA, otros tributos y percepciones según la clase |
| Moneda | Moneda y tipo de cambio aplicable |
| Autorización | CAE, CAEA o CAI y su vencimiento |
La [RG 1415 y su Anexo II](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion) contienen los requisitos generales. En comprobantes electrónicos también debe incluirse el [código QR](https://www.arca.gob.ar/fe/qr/conceptos-generales.asp).
En una Nota de Crédito B a consumidor final siempre debe figurar la leyenda **“A CONSUMIDOR FINAL”**. Desde el 1 de julio de 2026 se exige identificación cuando el importe es igual o superior a $10.000.000; también debe informarse la CUIT, cualquiera sea el monto, si el receptor la solicita para deducir el gasto en Ganancias. El nombre y el domicilio pueden completarse con `NR` o ceros cuando el sistema lo requiera.
## Cómo afecta al importe y al IVA
La nota de crédito reduce los conceptos que ajusta:
- en una Nota de Crédito A, disminuye el neto y el IVA de cada alícuota involucrada;
- en una Nota de Crédito B, disminuye el importe con IVA incluido y debe reflejar el “IVA Contenido” correspondiente;
- en una Nota de Crédito C, el monotributista o exento no discrimina IVA;
- en todos los casos, los importes deben corresponder al comprobante asociado y al motivo real del ajuste.
Si el cambio **aumenta** el importe de la operación, corresponde una nota de débito, no una nota de crédito.
## Cómo anular una factura electrónica
Para revertir por completo una factura común:
1. emití una nota de crédito de la clase correspondiente;
2. usá el mismo receptor de la factura;
3. asociá el comprobante original;
4. aplicá la moneda, la cotización y el tratamiento fiscal exigidos por el régimen correspondiente;
5. informá el monto total que se revierte;
6. solicitá el CAE;
7. si la operación continúa, emití la factura correcta por separado.
Para una corrección parcial, incluí únicamente los conceptos e importes que cambian.
Si el error afecta al receptor, la clase u otro dato estructural, revertí totalmente el comprobante erróneo y emití uno nuevo. La corrección parcial sirve para conceptos o importes que efectivamente se ajustan.
ARCA explica que un comprobante electrónico autorizado sólo puede modificarse mediante otro documento fiscal. La [guía de anulación de comprobantes](https://servicioscf.afip.gob.ar/publico/abc/consultas_detalle.aspx?id=6490326) resume este procedimiento.
## Nota de crédito y nota de débito
| Situación | Comprobante |
| --- | --- |
| Disminuye o revierte el importe | Nota de crédito |
| Aumenta el importe | Nota de débito |
| Corrige una factura completa y luego se refactura | Nota de crédito total + nueva factura |
| El descuento ya era conocido al facturar | Debe incluirse en la factura original |
## Regímenes con reglas especiales
### Factura de Crédito Electrónica MiPyME
Utiliza comprobantes específicos —por ejemplo, códigos 203, 208 y 213 para notas de crédito FCE A, B y C— y reglas propias:
- cada nota se asocia con una única FCE;
- antes de la aceptación expresa o tácita, ajusta el monto negociable;
- después de la aceptación, no modifica el título;
- una FCE aceptada no puede anularse completamente mediante una nota de crédito;
- debe emitirse en la misma moneda, salvo el régimen específico para diferencias de cambio.
Al 28 de julio de 2026, el plazo de aceptación es de 21 días y esa extensión está vigente hasta el 31 de octubre de 2026. No conviene aplicar automáticamente las reglas operativas de una factura común.
Consultá los [comprobantes de Factura de Crédito Electrónica de ARCA](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/comprobantes.asp) antes de ajustar una FCE.
### Exportaciones
Una Nota de Crédito E se asocia con un único comprobante de exportación. En exportación de servicios se aplica el tipo de cambio del comprobante asociado, según las [reglas de comprobantes de exportación](https://arca.gob.ar/derechos-de-exportacion-de-servicios/comprobantes-y-facturacion/comprobantes.asp).
## Cómo emitirla electrónicamente
Antes de solicitar el CAE, verificá:
1. que el emisor y el receptor coincidan con la factura;
2. la clase y el código correctos;
3. los datos completos del comprobante asociado;
4. el motivo y el alcance total o parcial;
5. la distribución del neto, IVA y demás tributos;
6. la moneda y el tipo de cambio;
7. las reglas especiales si se trata de FCE o exportación.
Afip SDK incluye ejemplos de [Nota de Crédito A](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/nota-de-credito-a), [Nota de Crédito B](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/nota-de-credito-b) y [Nota de Crédito C](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/nota-de-credito-c).
## Preguntas frecuentes
### ¿Puedo borrar una factura electrónica?
No. Una factura autorizada se corrige mediante una nota de crédito o débito, según el efecto del ajuste.
### ¿El cliente puede emitir la nota de crédito?
No. La emite quien generó la factura original y al mismo receptor.
### ¿Siempre se asocia a una sola factura?
No en el régimen general: puede vincular una o más facturas o un período, según el tipo de ajuste. Las diferencias de precio o cantidad deben individualizar cada factura. Exportaciones y FCE tienen reglas más estrictas.
### ¿La nota de crédito significa que ya se devolvió el dinero?
No. Documenta el ajuste fiscal. La devolución o compensación financiera es un paso separado.
### ¿El plazo se cuenta desde la factura?
No necesariamente. Son 15 días corridos desde el hecho que requiere documentar el ajuste.
## Fuentes oficiales
- [RG 4540/2019: condiciones para notas de crédito y débito](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A4540%7Co%3A3%7Ca%3A2019%7Cf%3A31%2F07%2F2019)
- [ARCA: tipos de comprobantes y notas de ajuste](https://www.arca.gob.ar/facturacion/comprobantes/tipos.asp)
- [RG 1415: requisitos generales de los comprobantes](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion)
- [RG 5762/2025: reemplazo de la clase M](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5762%7Co%3A9%7Ca%3A2025%7Cf%3A24%2F09%2F2025)
- [RG 4892/2020: código QR en comprobantes electrónicos](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4892-2020-345661/texto)
## También te puede interesar
---
--- title: Nota de débito: qué es y cuándo emitirla description: Conocé para qué sirve una nota de débito, quién la emite, cómo se vincula con la factura original y qué clases existen. category: [AFIP] pubDate: jul 28, 2026 cover: /images/blog/nota-de-debito-que-es-cuando-emitirla.webp ---
# Nota de débito: qué es y cuándo emitirla
Una **nota de débito** es el comprobante fiscal que aumenta o agrega importes a una operación documentada con anterioridad. Se utiliza, por ejemplo, para facturar intereses posteriores, corregir una diferencia de precio o cantidad a favor del vendedor, o completar un importe facturado de menos.
No reemplaza libremente a una factura ni sirve para reducir una operación. Si el ajuste disminuye o revierte el importe, corresponde emitir una nota de crédito.
> Esta guía resume el régimen general vigente al 28 de julio de 2026. Las exportaciones, la Factura T y la Factura de Crédito Electrónica MiPyME tienen reglas adicionales.
## Para qué sirve una nota de débito
La nota de débito documenta un ajuste que **incrementa** el saldo de una operación ya facturada. Los casos habituales incluyen:
- intereses o recargos generados después de la factura;
- diferencias de precio a favor del emisor;
- diferencias de cantidad facturadas de menos;
- gastos adicionales vinculados con la operación original;
- otros conceptos que aumentan el importe previamente documentado.
El motivo debe corresponder a una operación real y guardar relación con el comprobante asociado. Si se trata de una venta o prestación nueva e independiente, corresponde emitir una factura por esa nueva operación.
### No acredita que el cliente ya pagó
La nota de débito registra el ajuste fiscal y comercial. El cobro es el movimiento financiero entre las partes y puede ocurrir después.
Emitir la nota aumenta el importe documentado, pero no demuestra por sí solo que ese importe ya fue abonado.
## Quién debe emitirla
La [RG 4540/2019](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4540-2019-326036/texto) establece tres reglas centrales:
1. la emite quien generó la factura o documento equivalente original;
2. se dirige al mismo receptor;
3. se relaciona con una o más facturas o documentos emitidos previamente, o con un período cuando el régimen lo permite.
El comprador no puede emitir su propia nota fiscal para aumentar el importe facturado por el proveedor.
La clase tampoco se elige por conveniencia: debe respetar la condición fiscal de las partes, la habilitación del emisor y el régimen del comprobante que se ajusta.
## Cuándo debe emitirse
La nota de débito debe emitirse dentro de los **15 días corridos desde que surge el hecho o la situación que requiere el ajuste**.
El plazo no se cuenta automáticamente desde la fecha de la factura. Si el ajuste nace después —por ejemplo, por intereses o por una diferencia detectada posteriormente—, se cuenta desde ese hecho. En un [criterio administrativo publicado por ARCA](https://arca.gob.ar/EspaciosdeDialogoInstitucional/documentos/Acta-EDI-Particular-Notas-Debito-y-Credito-7-07.pdf), el organismo indicó que el cómputo comienza cuando el emisor toma conocimiento del hecho que origina el ajuste.
Esta regla sustantiva es distinta de las ventanas técnicas para solicitar un CAE. Las [consideraciones de emisión de ARCA](https://www.arca.gob.ar/fe/emision-autorizacion/consideraciones.asp) regulan esos plazos operativos por separado.
## Cómo se vincula con el comprobante original
La nota debe identificar las facturas o documentos equivalentes relacionados y las referencias comerciales relevantes, como artículos, órdenes de compra o pedidos.
El régimen general permite asociar:
- uno o más comprobantes individuales; o
- un período, cuando el tipo de ajuste y el régimen aplicable lo admiten.
Si la nota corresponde a una diferencia de precio o cantidad, debe individualizar cada factura afectada. No alcanza con informar únicamente un período genérico.
### Asociación en WSFE
En una solicitud electrónica mediante WSFE se utiliza una de estas estructuras:
- `CbtesAsoc`, para informar los comprobantes individuales relacionados;
- `PeriodoAsoc`, para indicar el período al que corresponde el ajuste cuando está permitido.
No deben enviarse ambas alternativas en la misma solicitud. En `CbtesAsoc` se informa, entre otros datos, el tipo, punto de venta y número del comprobante relacionado.
## Tipos y códigos vigentes
La clase de la nota sigue la relación fiscal y el régimen de la operación original.
| Tipo | Código | Uso general |
| --- | ---: | --- |
| Nota de Débito A | 002 | Responsable inscripto a responsable inscripto o monotributista |
| Nota de Débito A con “PAGO EN CBU INFORMADA” | 002 | Misma relación, según la habilitación del emisor |
| Nota de Débito A con “OPERACIÓN SUJETA A RETENCIÓN” | 052 | Operaciones clase A alcanzadas por esa modalidad |
| Nota de Débito B | 007 | Responsable inscripto a consumidor final, exento, no alcanzado, no categorizado o turista extranjero cuando no corresponde T |
| Nota de Débito C | 012 | Operación interna facturada por monotributista o exento |
| Nota de Débito E | 020 | Exportación |
| Nota de Débito T | 196 | Alojamiento elegible de turistas extranjeros |
| Nota de Débito FCE A | 202 | Ajuste de una Factura de Crédito Electrónica A |
| Nota de Débito FCE B | 207 | Ajuste de una Factura de Crédito Electrónica B |
| Nota de Débito FCE C | 212 | Ajuste de una Factura de Crédito Electrónica C |
Desde el 1 de diciembre de 2025 no se otorgan nuevas autorizaciones electrónicas o de impresión para comprobantes M. El antiguo código 052 identifica ahora la **Nota de Débito A con leyenda “OPERACIÓN SUJETA A RETENCIÓN”**, de acuerdo con la transición dispuesta por las [RG 5762/2025](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5762%7Co%3A9%7Ca%3A2025%7Cf%3A24%2F09%2F2025) y [RG 5764/2025](https://www.boletinoficial.gob.ar/detalleAviso/primera/331949/20250925).
La clase M puede seguir apareciendo en comprobantes históricos o material técnico de compatibilidad, pero no es una alternativa vigente para una nueva autorización. Los formularios M impresos y autorizados antes del cambio pueden utilizarse hasta el vencimiento de su CAI.
## Datos obligatorios
La nota conserva los requisitos y formalidades de la operación original y agrega la información que explica el ajuste.
| Grupo | Datos principales |
| --- | --- |
| Emisor | Nombre o razón social, domicilio comercial, CUIT, condición fiscal, Ingresos Brutos e inicio de actividades cuando corresponda |
| Comprobante | Denominación, clase, código, punto de venta, numeración correlativa y fecha |
| Receptor | Mismo receptor del comprobante original, con identificación, domicilio y condición fiscal |
| Asociación | Comprobantes relacionados o período, cuando el régimen lo admite |
| Ajuste | Motivo, bienes o servicios alcanzados, cantidades, precios y diferencias documentadas |
| Impuestos | Neto, alícuotas, IVA, otros tributos y percepciones según la clase |
| Moneda | Moneda y tipo de cambio aplicable |
| Autorización | CAE, CAEA o CAI y su vencimiento, según la modalidad |
La [RG 1415 y su Anexo II](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion) contienen los requisitos generales. En comprobantes electrónicos también debe incluirse el [código QR exigido por ARCA](https://www.arca.gob.ar/fe/qr/conceptos-generales.asp).
## Cómo afecta al importe y al IVA
La nota de débito aumenta los conceptos que ajusta:
- en una Nota de Débito A, suma neto e IVA para cada alícuota involucrada;
- en una Nota de Débito B, aumenta el precio final con IVA incluido y debe reflejar el “IVA Contenido” correspondiente;
- en una Nota de Débito C, el monotributista o exento no discrimina IVA;
- en una Nota de Débito E, se aplican las reglas de la exportación asociada;
- en todos los casos, el importe debe responder al motivo real y al comprobante vinculado.
Si el ajuste **reduce** el neto, el IVA o el total, utilizá una nota de crédito.
## Nota de débito y nota de crédito
| Situación | Comprobante |
| --- | --- |
| Aumenta o agrega un importe | Nota de débito |
| Disminuye o revierte un importe | Nota de crédito |
| Se factura una operación nueva e independiente | Nueva factura |
| Se detecta una diferencia de precio o cantidad a favor del emisor | Nota de débito asociada a la factura |
| Se detecta una diferencia a favor del cliente | Nota de crédito asociada a la factura |
## Reglas especiales
### Exportaciones
La Nota de Débito E:
- utiliza el código 020;
- se emite mediante WSFEX;
- debe asociarse con un único comprobante de exportación;
- en exportaciones de servicios utiliza el tipo de cambio del comprobante asociado.
Podés consultar la [plantilla PDF de Nota de Débito E](/docs/pdfs/debit-note-e) y el método [FEXAuthorize de WSFEX](/docs/api-reference/web-services/wsfex/FEXAuthorize).
### Alojamiento de turistas extranjeros
La Nota de Débito T sólo corresponde dentro del régimen especial de alojamiento elegible para turistas extranjeros. Utiliza el código 196, se gestiona mediante WSCT y debe asociarse con uno o más comprobantes T originales.
Los bienes o servicios complementarios que no integran el alojamiento alcanzado se documentan por separado con la clase general que corresponda.
Consultá la [plantilla PDF de Nota de Débito T](/docs/pdfs/debit-note-t) y el método [autorizarComprobante de WSCT](/docs/api-reference/web-services/wsct/autorizarComprobante).
### Factura de Crédito Electrónica MiPyME
Las notas de débito FCE A, B y C tienen códigos propios —202, 207 y 212— y reglas particulares:
- cada nota se asocia con una única Factura de Crédito Electrónica;
- antes de la aceptación expresa o tácita, aumenta el monto negociable;
- después de la aceptación, no modifica el título aceptado;
- se emite en la misma moneda, salvo los ajustes específicos por diferencia de cambio.
La modalidad A con **“OPERACIÓN SUJETA A RETENCIÓN”** no integra el régimen FCE.
La emisión se realiza con los servicios de facturación habilitados y la gestión posterior se consulta en el Registro de Facturas de Crédito Electrónicas MiPyME o mediante WSFECRED. ARCA detalla estas reglas en su [guía de comprobantes FCE](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/comprobantes.asp).
## Cómo emitirla electrónicamente
Antes de solicitar la autorización:
1. verificá que el emisor y el receptor sean los mismos que en el comprobante original;
2. seleccioná la clase y el código correctos;
3. informá los comprobantes asociados o el período admitido;
4. describí el motivo y los conceptos que aumentan;
5. calculá neto, IVA, otros tributos y total según la clase;
6. aplicá la moneda y el tipo de cambio exigidos;
7. revisá las reglas especiales si se trata de una operación E, T o FCE.
Afip SDK incluye ejemplos de solicitud para [Nota de Débito A](/docs/api-reference/web-services/wsfe/FECAESolicitar/nota-de-debito-a), [Nota de Débito B](/docs/api-reference/web-services/wsfe/FECAESolicitar/nota-de-debito-b) y [Nota de Débito C](/docs/api-reference/web-services/wsfe/FECAESolicitar/nota-de-debito-c).
También podés usar las plantillas PDF de [Nota de Débito A](/docs/pdfs/debit-note-a), [Nota de Débito A sujeta a retención](/docs/pdfs/debit-note-a-operation-subject-to-withholding), [Nota de Débito B](/docs/pdfs/debit-note-b) y [Nota de Débito C](/docs/pdfs/debit-note-c).
Para FCE están disponibles los ejemplos de [Nota de Débito Electrónica A](/docs/api-reference/web-services/wsfe/FECAESolicitar/nota-de-debito-electronica-a), [B](/docs/api-reference/web-services/wsfe/FECAESolicitar/nota-de-debito-electronica-b) y [C](/docs/api-reference/web-services/wsfe/FECAESolicitar/nota-de-debito-electronica-c), junto con sus plantillas PDF [FCE A](/docs/pdfs/debit-note-fce-a), [FCE B](/docs/pdfs/debit-note-fce-b) y [FCE C](/docs/pdfs/debit-note-fce-c).
## Preguntas frecuentes
### ¿Una nota de débito reemplaza a la factura?
No. Ajusta hacia arriba una operación documentada previamente. Una operación nueva e independiente requiere su propia factura.
### ¿El cliente puede emitir la nota de débito?
No. La emite quien generó el comprobante original y debe dirigirla al mismo receptor.
### ¿Siempre debe asociarse a una sola factura?
No en el régimen general. Puede relacionarse con uno o más comprobantes o, cuando está permitido, con un período. Las diferencias de precio o cantidad deben individualizar cada factura. Las operaciones E, T y FCE tienen reglas de asociación propias; E y FCE exigen una asociación única.
### ¿El plazo se cuenta desde la fecha de la factura?
No necesariamente. Son 15 días corridos desde el hecho que requiere documentar el ajuste; ARCA también ha indicado que se considera cuándo el emisor toma conocimiento.
### ¿Puedo usar una nota de débito para anular una factura?
No. La nota de débito aumenta el importe. Para disminuir o revertir una factura corresponde una nota de crédito.
### ¿Todavía existe la Nota de Débito M?
No como alternativa para nuevas autorizaciones. Desde diciembre de 2025 fue reemplazada por la Nota de Débito A con leyenda “OPERACIÓN SUJETA A RETENCIÓN”.
## Fuentes oficiales
- [RG 4540/2019: condiciones para notas de crédito y débito](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-4540-2019-326036/texto)
- [ARCA: comprobantes y notas de ajuste](https://www.arca.gob.ar/facturacion/comprobantes/)
- [ARCA: asociación de notas de crédito y débito](https://servicioscf.afip.gob.ar/publico/abc/consultas_detalle.aspx?id=24548274)
- [RG 1415: requisitos generales de los comprobantes](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion)
- [RG 5762/2025: reemplazo de la clase M](https://biblioteca.arca.gob.ar/search/query/norma.aspx?p=t%3ARAG%7Cn%3A5762%7Co%3A9%7Ca%3A2025%7Cf%3A24%2F09%2F2025)
- [ARCA: comprobantes de Factura de Crédito Electrónica MiPyME](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/conceptos/comprobantes.asp)
## También te puede interesar
---
--- title: Facturar ventas de Mercado Libre con ARCA en n8n description: Tutorial para conectar órdenes de Mercado Libre con Afip SDK en n8n y emitir facturas electrónicas de ARCA con control de datos fiscales e idempotencia. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-mercadolibre-con-arca-en-n8n-cover.png ---
# Facturar ventas de Mercado Libre con ARCA en n8n
Descargá el workflow [mercadolibre-arca-invoice.json](/assets/blog/n8n/commerce/mercadolibre-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de Mercado Libre.
---
Mercado Libre requiere más cuidado que una tienda propia: las notificaciones sirven para enterarte de cambios, pero la factura debe salir después de consultar la orden, el pago, el envío y los datos de facturación disponibles.
La integración recomendada usa notificaciones de Mercado Libre, API de órdenes/pagos y Afip SDK en n8n.
Documentación útil:
- Developers Mercado Libre: https://developers.mercadolibre.com.ar/
- Órdenes y ventas: https://developers.mercadolibre.com.ar/es_ar/gestiona-ventas
- Notificaciones: https://developers.mercadolibre.com.ar/es_ar/notificaciones
- Facturación en Mercado Libre: https://developers.mercadolibre.com.ar/es_ar/facturacion
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. Mercado Libre notifica una novedad de orden.
2. n8n recibe la notificación en un nodo **Webhook**.
3. n8n consulta la orden por API usando el `resource` recibido.
4. n8n consulta pagos y envío si la orden lo requiere.
5. n8n valida si la venta está pagada y lista para facturar.
6. n8n arma el payload fiscal.
7. Afip SDK emite la factura electrónica.
8. n8n guarda el resultado en un backoffice, ERP o sistema de control.
## Paso 1: recibir notificaciones
En Mercado Libre, configurá la aplicación para recibir notificaciones del recurso de órdenes. El payload suele traer un `resource` que después tenés que consultar con API.
En n8n:
- Nodo **Webhook** con método `POST`.
- Nodo **IF** para descartar eventos que no sean de órdenes.
- Nodo **HTTP Request** para consultar el `resource`.
No emitas factura con el payload de la notificación. Usalo sólo para saber qué recurso cambió.
## Paso 2: consultar la orden
Con el access token del vendedor:
```http
GET https://api.mercadolibre.com{{ $json.resource }}
Authorization: Bearer {{ $env.MELI_ACCESS_TOKEN }}
```
Revisá:
- `status`.
- `paid_amount`.
- `payments`.
- `order_items`.
- `buyer`.
- `shipping`.
- Si pertenece a un pack.
Para packs, el recurso puede agrupar varias órdenes o envíos. Tu workflow debe decidir si factura por orden, por pack o desde el ERP que consolida la venta.
## Paso 3: validar si corresponde facturar
Agregá un nodo **IF** antes de Afip SDK:
- La orden debe estar paga.
- No debe tener factura emitida previamente en tu registro.
- No debe estar cancelada.
- Debe tener datos fiscales suficientes o una regla de consumidor final.
Mercado Libre puede no entregar todos los datos fiscales que necesitás en el mismo recurso. Si tu operación necesita CUIT y razón social, pedilos por mensajería, formulario externo o integrá tu ERP como fuente de datos fiscales.
## Paso 4: mapear items
Desde `order_items`, armá líneas fiscales:
```js
const order = $json;
const items = order.order_items.map((line) => ({
description: line.item.title,
quantity: line.quantity,
unitPrice: line.unit_price,
sku: line.item.seller_sku,
}));
return [{
json: {
externalId: `meli:${order.id}`,
buyerId: order.buyer.id,
paymentIds: order.payments?.map((payment) => payment.id) || [],
totalAmount: order.paid_amount,
items,
},
}];
```
No sumes comisiones de Mercado Libre ni costos internos de marketplace como parte de la venta al comprador.
## Paso 5: datos fiscales
Definí una política:
- Si el comprador informó CUIT y razón social, emití factura A o B según corresponda.
- Si no hay CUIT y aplica consumidor final, usá factura B con los datos permitidos por tu operación.
- Si faltan datos obligatorios, pausá el flujo y notificá.
Guardá siempre:
- Order id.
- Pack id, si existe.
- Buyer id.
- Payment ids.
- Número de comprobante ARCA.
- CAE y vencimiento.
## Paso 6: emitir con Afip SDK
El tramo Afip SDK es:
1. Autorización para `wsfe`.
2. `FECompUltimoAutorizado`.
3. `FECAESolicitar`.
4. Generar el PDF con el template de Afip SDK.
Usá como clave de idempotencia `meli:{order.id}` o `meli-pack:{pack_id}` según tu definición operativa.
## Paso 7: guardar o subir la factura
Mercado Libre tiene flujos propios de facturación y carga/descarga de documentos según país, cuenta y tipo de operación. Si no vas a subirla a Mercado Libre desde API, al menos guardá el comprobante en tu ERP o panel interno y enviá el PDF al cliente por el canal permitido.
## Errores comunes
- Facturar apenas llega una notificación sin consultar estado actual.
- Duplicar facturas por notificaciones repetidas.
- Facturar un pack dos veces.
- No diferenciar total cobrado, envío, descuentos y cargos internos.
- Asumir que Mercado Libre siempre trae CUIT y condición fiscal completa.
## Cierre
En Mercado Libre, n8n debe ser conservador: recibir notificaciones, consultar estado actual, validar datos y recién después llamar a Afip SDK. La trazabilidad entre orden, pago, pack y comprobante es lo más importante.
---
--- title: Facturar ventas de Mercado Pago con ARCA en n8n description: Aprende a conectar pagos aprobados de Mercado Pago con Afip SDK en n8n para emitir factura electrónica de ARCA, generar PDF y guardar el resultado junto a la operación. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-mercadopago-con-arca-en-n8n-cover.png ---
# Facturar ventas de Mercado Pago con ARCA en n8n
Descargá el workflow [mercadopago-arca-invoice.json](/assets/blog/n8n/commerce/mercadopago-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de Mercado Pago.
---
Mercado Pago no es un ecommerce completo: es el confirmador del cobro. Por eso el workflow correcto no debe facturar "un pago" aislado, sino una orden de tu sistema marcada como cobrada por Mercado Pago.
La integración se arma con Webhooks de Mercado Pago, la Payments API y los nodos oficiales de Afip SDK para n8n.
Documentación útil:
- Webhooks de Mercado Pago: https://www.mercadopago.com.ar/developers/en/docs/your-integrations/notifications/webhooks
- Payments API: https://www.mercadopago.com.ar/developers/en/reference/payments/_payments_id/get
- Búsqueda de pagos: https://www.mercadopago.com.ar/developers/en/reference/payments/_payments_search/get
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. Tu checkout crea una preferencia o un pago en Mercado Pago.
2. En `external_reference` o `metadata` guardás el id de orden interno.
3. Mercado Pago envía un Webhook cuando el pago cambia de estado.
4. n8n recibe el Webhook y consulta el pago por API.
5. Si el pago está `approved`, n8n busca la orden original en tu ecommerce, ERP o base operativa.
6. n8n normaliza los datos fiscales de la orden.
7. Afip SDK autoriza la factura electrónica en ARCA.
8. n8n guarda CAE, número de comprobante y PDF en tu sistema.
## Paso 1: configurar el Webhook de Mercado Pago
En Mercado Pago, configurá una URL pública de n8n como endpoint de Webhooks. El evento que te interesa es el de pagos.
En n8n:
- Agregá un nodo **Webhook**.
- Usá método `POST`.
- Copiá la production URL que genera n8n.
- Configurala en Mercado Pago como URL de notificaciones.
El Webhook no debería emitir factura directamente. Usalo como disparador y después consultá la Payments API. Así evitás confiar en un payload parcial o en notificaciones duplicadas.
## Paso 2: consultar el pago
Después del Webhook agregá un nodo **HTTP Request** hacia Mercado Pago:
```http
GET https://api.mercadopago.com/v1/payments/{{ $json.data.id }}
Authorization: Bearer {{ $env.MERCADO_PAGO_ACCESS_TOKEN }}
```
Validá:
- `status` debe ser `approved`.
- `external_reference` debe existir y apuntar a una orden interna.
- `transaction_amount` debe coincidir con el total cobrado.
- `metadata` puede traer datos auxiliares, pero no conviene usarla como única fuente fiscal.
## Paso 3: buscar la orden real
Mercado Pago confirma el cobro, pero normalmente no tiene todos los items fiscales de la venta. Con el `external_reference`, consultá tu fuente de verdad:
- Shopify, WooCommerce, Tiendanube u otra tienda.
- Tu ERP.
- Tu propio backend.
- Una hoja o tabla operativa si el negocio todavía es chico.
La orden debe aportar:
- CUIT, DNI o regla de consumidor final.
- Razón social o nombre.
- Condición frente al IVA.
- Items con precio, cantidad, descuentos e IVA.
- Envío, si corresponde facturarlo.
## Paso 4: normalizar para ARCA
Agregá un nodo **Code** en n8n y construí un objeto fiscal. Ejemplo:
```js
const payment = $('Get Mercado Pago payment').first().json;
const order = $('Get order').first().json;
return [{
json: {
externalId: `mp:${payment.id}`,
sourceOrderId: payment.external_reference,
pointOfSale: 1,
voucherType: order.customer.tax_id ? 1 : 6,
documentType: order.customer.tax_id ? 80 : 99,
documentNumber: order.customer.tax_id || 0,
customerName: order.customer.name,
netAmount: order.totals.net,
vatAmount: order.totals.vat,
totalAmount: order.totals.total,
items: order.items.map((item) => ({
description: item.name,
quantity: item.quantity,
unitPrice: item.unit_price,
vatRate: item.vat_rate,
})),
},
}];
```
No incluyas comisiones de Mercado Pago en la factura al comprador. La factura debe representar la venta, no el costo financiero del medio de pago.
## Paso 5: emitir con Afip SDK
Con los nodos de Afip SDK:
1. Obtené autorización para `wsfe`.
2. Ejecutá `FECompUltimoAutorizado`.
3. Calculá `CbteDesde` y `CbteHasta` como último comprobante + 1.
4. Ejecutá `FECAESolicitar`.
5. Generá el PDF con el template de Afip SDK.
Para producción, usá una clave de idempotencia como `mp:{payment.id}` o `order:{external_reference}` y guardá el resultado antes de responder OK al Webhook.
## Paso 6: guardar el resultado
Mercado Pago no es el mejor lugar para guardar el comprobante fiscal. Guardalo en la orden real:
- Campo `invoice_number`.
- Campo `cae`.
- Fecha de vencimiento del CAE.
- URL o archivo del PDF.
- Estado `facturada`.
Si no tenés backend propio, podés usar Google Sheets, Airtable o una base operativa como registro de facturas emitidas.
## Errores comunes
- Facturar apenas llega el Webhook sin consultar el pago.
- No usar `external_reference` y después no poder unir pago con orden.
- Facturar con el total cobrado sin reconstruir neto e IVA.
- Reintentar un Webhook y emitir dos comprobantes.
- Tratar una devolución de Mercado Pago como si fuera una nota de crédito automática.
## Cierre
Mercado Pago debe disparar el flujo, pero la orden comercial debe definir qué se factura. n8n queda en el medio como orquestador, y Afip SDK concentra la parte fiscal: autorización, CAE y PDF.
---
--- title: Facturar ventas de Producteca con ARCA en n8n description: Tutorial para facturar órdenes centralizadas en Producteca con ARCA usando n8n, Afip SDK y un flujo de normalización para marketplaces y tiendas. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-producteca-con-arca-en-n8n-cover.png ---
# Facturar ventas de Producteca con ARCA en n8n
Descargá el workflow [producteca-arca-invoice.json](/assets/blog/n8n/commerce/producteca-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de Producteca.
---
Producteca no debe tratarse como una tienda más. Es una plataforma omnicanal que centraliza ventas de marketplaces, tiendas, ERPs y logística. Además, su API pública no funciona como una API abierta self-service para cualquier cliente; Producteca documenta que la integración directa se resuelve mediante su servicio External-API y credenciales/webhooks habilitados para la cuenta.
Por eso el tutorial se enfoca en el caso real: Producteca como hub de órdenes, n8n como orquestador fiscal y Afip SDK como emisor de comprobantes.
Documentación útil:
- Producteca: https://www.producteca.com/
- Integraciones Producteca: https://www.producteca.com/en/integrations
- Nota sobre API abierta y External-API: https://producteca.zendesk.com/hc/es-419/articles/360049420551--La-API-de-Producteca-es-abierta
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. Producteca recibe ventas de Mercado Libre, Shopify, Tiendanube, VTEX, WooCommerce u otros canales.
2. Producteca normaliza la orden y su canal de origen.
3. n8n recibe la orden desde External-API, Webhook o consulta programada habilitada por Producteca.
4. n8n identifica canal, seller, datos fiscales y estado de pago.
5. n8n emite con Afip SDK.
6. n8n devuelve CAE, número de comprobante y PDF al sistema definido: Producteca, ERP o backoffice.
## Paso 1: definir el modo de integración con Producteca
Antes de escribir el workflow, confirmá con Producteca cuál de estos modelos tenés habilitado:
- External-API para consultar órdenes desde tu sistema.
- Webhooks configurados desde la sección de API/credenciales.
- Sincronización contra un ERP intermedio.
Si la cuenta no tiene API/External-API habilitada, n8n no debería intentar scrapear ni acceder por caminos no soportados. El camino correcto es pedir a Producteca la integración.
## Paso 2: recibir o consultar órdenes
Si tenés Webhook:
- Nodo **Webhook** en n8n.
- Producteca envía evento de orden o cambio de estado.
- n8n usa el id de orden para consultar detalle si el payload no viene completo.
Si tenés consulta programada:
- Nodo **Schedule Trigger**.
- Nodo **HTTP Request** contra el endpoint acordado con Producteca.
- Filtro por órdenes pagadas y no facturadas.
## Paso 3: identificar canal de origen
La ventaja de Producteca es centralizar ventas, pero el canal sigue importando. No todas las órdenes traen la misma calidad de datos fiscales.
En n8n, armá un switch por canal:
- Mercado Libre: validar buyer/order/payment ids y posibles packs.
- Shopify: buscar CUIT en atributos o metafields sincronizados.
- Tiendanube: revisar campos extra del checkout.
- VTEX: verificar seller y marketplace.
- WooCommerce: usar order meta de facturación.
## Paso 4: armar un payload fiscal unificado
Ejemplo de nodo **Code**:
```js
const order = $json;
return [{
json: {
externalId: `producteca:${order.id}`,
channel: order.channel || order.source,
originalOrderId: order.external_id || order.marketplace_order_id,
customer: {
taxId: order.billing?.tax_id,
name: order.billing?.company || order.billing?.name,
ivaCondition: order.billing?.iva_condition,
},
items: (order.items || []).map((item) => ({
sku: item.sku,
description: item.title || item.name,
quantity: item.quantity,
unitPrice: item.price,
})),
totals: order.totals,
},
}];
```
Los nombres exactos de campos dependen del contrato External-API habilitado. Lo importante es no perder:
- Canal.
- Id original de la orden.
- Id Producteca.
- Datos fiscales.
- Items.
- Descuentos y envío.
## Paso 5: validar antes de facturar
Antes de Afip SDK:
- La orden debe estar pagada.
- No debe tener comprobante previo.
- Debe tener canal y seller definidos.
- Debe tener datos fiscales suficientes.
- Debe indicar si factura Producteca, el ERP o el vendedor.
Si Producteca ya está conectado a un ERP que factura, no dupliques. En ese caso n8n puede emitir desde el ERP y usar Producteca sólo como origen de eventos.
## Paso 6: emitir con Afip SDK
El tramo de Afip SDK:
1. Obtener autorización `wsfe`.
2. Consultar último comprobante.
3. Crear factura con `FECAESolicitar`.
4. Generar el PDF con el template de Afip SDK.
Clave de idempotencia recomendada:
```plaintext
producteca:{order.id}:{channel}:{originalOrderId}
```
## Paso 7: devolver el resultado
Según el contrato:
- Actualizá Producteca con CAE, comprobante y PDF.
- O actualizá el ERP y dejá Producteca como canal operativo.
- O guardá el comprobante en un backoffice propio.
No dejes sólo el PDF. Guardá datos estructurados: tipo, punto de venta, número, CAE y vencimiento.
## Errores comunes
- Asumir que Producteca tiene una API pública abierta para cualquier cuenta.
- Perder el canal de origen y facturar todo con la misma regla.
- No distinguir órdenes de marketplace vs tienda propia.
- Facturar dos veces una orden reimportada.
- Confiar en datos fiscales incompletos del canal original.
## Cierre
Producteca sirve para centralizar la operación. Para facturación, n8n debe respetar el contrato de integración habilitado, conservar el canal original y usar Afip SDK sólo cuando la orden esté lista y validada fiscalmente.
---
--- title: Facturar ventas de SAP con ARCA en n8n description: Tutorial para conectar SAP con n8n y Afip SDK, autorizar comprobantes electrónicos de ARCA y devolver el resultado fiscal al documento comercial. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-sap-con-arca-en-n8n-cover.png ---
# Facturar ventas de SAP con ARCA en n8n
Descargá el workflow [sap-arca-invoice.json](/assets/blog/n8n/commerce/sap-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de SAP.
---
SAP no es una integración única: puede ser SAP Business One, SAP S/4HANA, SAP Business ByDesign o un landscape con middleware. Para n8n, el enfoque correcto es no reemplazar SAP, sino tomar el documento comercial aprobado, emitir en ARCA con Afip SDK y devolver los datos fiscales.
Documentación útil:
- SAP Business One Service Layer API Reference: https://help.sap.com/doc/056f69366b5345a386bb8149f1700c19/10.0/en-US/Service%20Layer%20API%20Reference.html
- SAP Business One Service Layer guide: https://help.sap.com/doc/fc2f5477516c404c8bf9ad1315a17238/10.0/en-US/Working_with_SAP_Business_One_Service_Layer.pdf
- SAP S/4HANA Sales Order API: https://help.sap.com/docs/SAP_S4HANA_CLOUD/03c04db2a7434731b7fe21dca77440da/10ec8998a151440795e797cb098321bb.html
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. SAP crea o aprueba un documento comercial.
2. n8n detecta documentos pendientes de autorización fiscal.
3. n8n lee cliente, sociedad, items, impuestos y totales desde SAP.
4. n8n valida punto de venta, CUIT emisor y tipo de comprobante.
5. Afip SDK autoriza la factura en ARCA.
6. n8n actualiza SAP con CAE, vencimiento, número y PDF.
## Paso 1: elegir el punto de integración
Opciones comunes:
- SAP Business One Service Layer.
- SAP S/4HANA OData APIs.
- Middleware corporativo que ya expone documentos listos para facturar.
- Tabla/interfaz de salida aprobada por el equipo SAP.
No conviene que n8n lea datos a medio completar. El documento debe estar aprobado por SAP o por el middleware.
## Paso 2: disparar n8n
Hay dos modelos:
- **Push:** SAP o middleware llama un Webhook de n8n con el id del documento.
- **Pull:** n8n corre por cron y busca documentos con estado `pending_arca`.
Para SAP suele ser más seguro el modelo pull contra una vista o endpoint de documentos pendientes, porque permite reintentos controlados y auditoría.
## Paso 3: leer el documento desde SAP Business One
Ejemplo conceptual con Service Layer:
```http
GET https://sap.example.com:50000/b1s/v2/Invoices(123)
Cookie: B1SESSION={{ $env.SAP_B1_SESSION }}
```
También puede ser Sales Order, Delivery o Draft según el circuito de la empresa. Lo importante es que SAP defina cuál documento se convierte en comprobante fiscal.
Leé:
- Business Partner.
- Federal Tax ID.
- Document lines.
- Tax codes.
- Totals.
- Currency.
- Branch o sociedad.
- Documento interno.
## Paso 4: leer desde S/4HANA
En S/4HANA normalmente se usan APIs OData para Sales Orders o Billing Documents. n8n debe consumir el endpoint acordado con Basis/integraciones y no inventar el flujo.
Campos mínimos:
- Sales organization o company code.
- Sold-to party.
- Tax number.
- Billing document o sales order.
- Items.
- Taxes.
- Currency.
## Paso 5: no recalcular contabilidad
SAP suele ser la fuente contable. n8n no debería cambiar importes, sino transformar al formato de ARCA.
Ejemplo de objeto intermedio:
```js
const sap = $json;
return [{
json: {
externalId: `sap:${sap.DocEntry || sap.BillingDocument}`,
companyCode: sap.CompanyCode,
customerTaxId: sap.FederalTaxID || sap.TaxNumber,
customerName: sap.CardName || sap.CustomerName,
currency: sap.DocCurrency || sap.TransactionCurrency,
totalAmount: Number(sap.DocTotal || sap.TotalGrossAmount),
items: (sap.DocumentLines || sap.Items || []).map((line) => ({
code: line.ItemCode || line.Material,
description: line.ItemDescription || line.Description,
quantity: Number(line.Quantity),
unitPrice: Number(line.UnitPrice || line.NetPriceAmount),
taxCode: line.TaxCode,
})),
},
}];
```
## Paso 6: emitir con Afip SDK
El flujo fiscal:
1. Autorización para `wsfe`.
2. `FECompUltimoAutorizado`.
3. `FECAESolicitar`.
4. Generar el PDF con el template de Afip SDK.
Clave de idempotencia:
```plaintext
sap:{companyCode}:{documentId}
```
Si hay sucursales o sociedades, mapeá cada una a CUIT y punto de venta.
## Paso 7: actualizar SAP
Después de ARCA:
- Guardá CAE.
- Guardá vencimiento de CAE.
- Guardá tipo, punto de venta y número.
- Adjuntá PDF o URL del PDF.
- Cambiá estado fiscal a autorizado.
Si SAP no permite escribir esos campos directamente, hacelo mediante el middleware o una tabla de integración.
## Errores comunes
- Facturar desde Sales Order cuando el circuito real factura desde Billing Document.
- Recalcular impuestos fuera de SAP.
- No mapear company code a CUIT y punto de venta.
- No manejar moneda extranjera.
- No coordinar reversas: cancelaciones y credit memos deben tener su flujo fiscal separado.
## Cierre
SAP debe seguir siendo la fuente contable. n8n toma documentos aprobados, Afip SDK autoriza ante ARCA y el resultado vuelve a SAP o al middleware con trazabilidad completa.
---
--- title: Facturar ventas de Shopify con ARCA en n8n description: Guía para emitir facturas electrónicas de ARCA desde órdenes pagadas de Shopify usando n8n, Afip SDK y un flujo de actualización de metacampos o tags. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-shopify-con-arca-en-n8n-cover.png ---
# Facturar ventas de Shopify con ARCA en n8n
Descargá el workflow [shopify-arca-invoice.json](/assets/blog/n8n/commerce/shopify-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de Shopify.
---
Shopify sí tiene una API y Webhooks suficientemente claros para automatizar la facturación. El flujo recomendado es escuchar `orders/paid`, consultar la orden completa con Admin API, emitir con Afip SDK y escribir el resultado en tags, order metafields o notas internas.
Documentación útil:
- Webhooks de Shopify: https://shopify.dev/docs/apps/build/webhooks
- Topics de Webhooks: https://shopify.dev/docs/api/webhooks
- Admin API: https://shopify.dev/docs/api/admin-rest
- Order resource: https://shopify.dev/docs/api/admin-rest/latest/resources/order
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. Shopify dispara un Webhook `orders/paid`.
2. n8n recibe el payload en un nodo **Webhook**.
3. n8n verifica que la orden no tenga factura emitida.
4. n8n consulta la orden completa con Admin API.
5. n8n toma CUIT/DNI desde metafields, cart attributes, note attributes o customer metafields.
6. Afip SDK autoriza el comprobante en ARCA.
7. n8n guarda CAE, número de factura y PDF en Shopify.
## Paso 1: crear el Webhook `orders/paid`
Desde una app privada/custom app o desde la configuración de Webhooks, creá una suscripción para `orders/paid`.
En n8n:
- Nodo **Webhook**.
- Método `POST`.
- Path, por ejemplo: `/shopify/orders-paid`.
- Respondé 200 rápido y procesá la factura después si el volumen es alto.
Shopify puede reenviar Webhooks, así que el workflow debe ser idempotente.
## Paso 2: consultar la orden completa
Aunque el Webhook trae datos de la orden, conviene consultar la Admin API para trabajar con el estado actual:
```http
GET https://{shop}.myshopify.com/admin/api/2026-01/orders/{{ $json.id }}.json
X-Shopify-Access-Token: {{ $env.SHOPIFY_ACCESS_TOKEN }}
```
Pedí o persistí estos campos:
- `id` y `order_number`.
- `financial_status`.
- `line_items`.
- `shipping_lines`.
- `discount_codes`.
- `total_tax`, `total_price`, `subtotal_price`.
- `billing_address`.
- `note_attributes`.
## Paso 3: dónde guardar CUIT y condición fiscal
Shopify no trae CUIT argentino como campo nativo de checkout para todos los casos. Tenés que definir un lugar estable:
- `note_attributes` del checkout.
- Order metafields.
- Customer metafields.
- Una app de checkout que capture `tax_id`, razón social y condición fiscal.
En n8n, agregá un nodo **Code** que busque el CUIT en esos lugares en orden de prioridad:
```js
const order = $json.order;
const noteAttributes = Object.fromEntries(
(order.note_attributes || []).map((attr) => [attr.name, attr.value])
);
const taxId = noteAttributes.cuit || noteAttributes.tax_id || order.customer?.tax_exemptions?.[0];
return [{
json: {
shopifyOrderId: order.id,
orderNumber: order.order_number,
taxId,
customerName: order.billing_address?.company || `${order.billing_address?.first_name || ''} ${order.billing_address?.last_name || ''}`.trim(),
email: order.email,
},
}];
```
Si `taxId` falta, no emitas la factura todavía. Etiquetá la orden como `facturacion-pendiente-datos` o notificá al equipo.
## Paso 4: mapear items, descuentos y envío
Shopify separa:
- Productos en `line_items`.
- Envíos en `shipping_lines`.
- Descuentos en `discount_codes` o allocations.
- Impuestos en campos de tax.
Antes de llamar a ARCA, consolidá esos importes. Si tu tienda carga precios con IVA incluido, el nodo Code debe separar neto e IVA según la alícuota del producto.
Ejemplo de estructura intermedia:
```js
return [{
json: {
externalId: `shopify:${order.id}`,
pointOfSale: 1,
voucherType: taxId ? 1 : 6,
documentType: taxId ? 80 : 99,
documentNumber: taxId || 0,
netAmount,
vatAmount,
totalAmount: Number(order.total_price),
items,
},
}];
```
## Paso 5: emitir con Afip SDK
Usá los nodos de Afip SDK:
1. **Get authorization token** para `wsfe`.
2. **Execute web service request** con `FECompUltimoAutorizado`.
3. **Execute web service request** con `FECAESolicitar`.
4. Nodo para generar el PDF con el template de Afip SDK.
El idempotency key debe ser `shopify:{order.id}`. Antes de emitir, buscá si ya existe un metafield `arca.invoice_number`.
## Paso 6: escribir el resultado en Shopify
Tenés tres opciones prácticas:
- Agregar tag: `facturada-arca`.
- Crear order metafields: `arca.cae`, `arca.invoice_number`, `arca.pdf_url`.
- Agregar una nota interna con el comprobante.
Para un flujo limpio, usá metafields para datos estructurados y tags para operación diaria.
## Errores comunes
- Facturar `orders/create` en vez de `orders/paid`.
- No capturar CUIT en checkout.
- Usar el email como dato fiscal.
- No contemplar refunds: una devolución en Shopify no es automáticamente una nota de crédito en ARCA.
- Duplicar facturas por reintentos de Webhook.
## Cierre
Shopify funciona muy bien con n8n porque el evento `orders/paid` es claro y la Admin API permite completar la información. La clave es sumar campos fiscales argentinos y guardar el resultado de ARCA en la orden.
---
--- title: Facturar ventas de Tiendanube con ARCA en n8n description: Cómo automatizar facturas electrónicas de ARCA para órdenes de Tiendanube usando webhooks, n8n y los nodos oficiales de Afip SDK. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-tiendanube-con-arca-en-n8n-cover.png ---
# Facturar ventas de Tiendanube con ARCA en n8n
Descargá el workflow [tiendanube-arca-invoice.json](/assets/blog/n8n/commerce/tiendanube-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de Tiendanube.
---
Tiendanube expone una API de órdenes y Webhooks. Para facturación electrónica, el flujo más confiable es recibir un Webhook de orden, consultar la orden completa por API y emitir sólo cuando el pago esté confirmado.
Documentación útil:
- API de Tiendanube/Nuvemshop: https://dev.nuvemshop.com.br/en/docs/developer-tools/nuvemshop-api
- Order resource: https://tiendanube.github.io/api-documentation/resources/order
- Webhooks: https://tiendanube.github.io/api-documentation/resources/webhook
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. Tiendanube dispara un Webhook cuando se crea o actualiza una orden.
2. n8n recibe el evento.
3. n8n consulta la orden por API.
4. n8n valida que la orden esté pagada o lista para facturar.
5. n8n toma datos fiscales desde campos del checkout o un formulario propio.
6. Afip SDK autoriza la factura.
7. n8n guarda CAE, PDF y estado en tu sistema de gestión.
## Paso 1: crear Webhooks de órdenes
En Tiendanube, registrá Webhooks para eventos de órdenes. El Webhook envía una notificación cuando hay una interacción con el recurso, pero para facturar necesitás consultar la orden completa.
En n8n:
- Nodo **Webhook** `POST`.
- Nodo **HTTP Request** para consultar la orden.
- Nodo **IF** para filtrar estados no facturables.
## Paso 2: consultar la orden
La API de Tiendanube usa `access_token` y store id.
```http
GET https://api.tiendanube.com/v1/{{ $env.TIENDANUBE_STORE_ID }}/orders/{{ $json.id }}
Authentication: bearer {{ $env.TIENDANUBE_ACCESS_TOKEN }}
User-Agent: AfipSDK n8n integration
```
Revisá en la respuesta:
- `id`.
- Estado de pago.
- Cliente.
- Productos.
- Envío.
- Descuentos.
- Total.
## Paso 3: capturar datos fiscales argentinos
La orden de Tiendanube puede no tener CUIT, razón social o condición fiscal de forma nativa según cómo esté configurado el checkout. Tenés que definir una fuente:
- Campos adicionales del checkout.
- Formulario post-compra.
- CRM conectado.
- ERP que ya tenga el cliente fiscalizado.
El workflow debe cortar si faltan datos obligatorios. No conviene inventar condición fiscal en n8n.
## Paso 4: armar el payload fiscal
Ejemplo de nodo **Code**:
```js
const order = $json;
const products = order.products || [];
const items = products.map((product) => ({
description: product.name?.es || product.name,
quantity: Number(product.quantity),
unitPrice: Number(product.price),
sku: product.sku,
}));
return [{
json: {
externalId: `tiendanube:${order.id}`,
orderNumber: order.number,
customerEmail: order.contact_email,
items,
totalAmount: Number(order.total),
shippingAmount: Number(order.shipping_cost_customer || 0),
},
}];
```
Después agregá neto, IVA y tipo de comprobante según las reglas fiscales del negocio.
## Paso 5: emitir con Afip SDK
Usá estos nodos:
1. Obtener autorización `wsfe`.
2. Consultar último comprobante.
3. Autorizar comprobante con `FECAESolicitar`.
4. Crear y descargar el PDF con el template de Afip SDK.
Clave de idempotencia recomendada: `tiendanube:{order.id}`.
## Paso 6: guardar resultado
Tiendanube puede quedar como canal comercial y tu ERP como registro fiscal. Guardá:
- CAE.
- Vencimiento de CAE.
- Tipo y número de comprobante.
- URL del PDF.
- Estado `facturada`.
Si tu flujo usa un ERP conectado a Tiendanube, escribí el comprobante ahí y sólo sincronizá un estado simple a la tienda.
## Errores comunes
- Usar Webhook de creación de orden sin esperar confirmación de pago.
- No pedir CUIT en checkout.
- Facturar descuentos y envío de forma distinta a como aparece en la orden.
- No separar órdenes canceladas o reembolsadas.
- Reprocesar la misma orden por updates sucesivos.
## Cierre
Tiendanube se integra bien con n8n si el Webhook sólo dispara el flujo y la API de órdenes es la fuente de datos. Para Argentina, la parte clave es sumar captura fiscal y bloquear duplicados antes de llamar a Afip SDK.
---
--- title: Facturar ventas de VTEX con ARCA en n8n description: Guía para integrar órdenes de VTEX con Afip SDK en n8n y emitir factura electrónica de ARCA con control de OMS, items e impuestos. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-vtex-con-arca-en-n8n-cover.png ---
# Facturar ventas de VTEX con ARCA en n8n
Descargá el workflow [vtex-arca-invoice.json](/assets/blog/n8n/commerce/vtex-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de VTEX.
---
VTEX tiene un OMS robusto. Para integrarlo con ARCA no conviene hacer polling ciego de órdenes: VTEX ofrece Feed y Hook para cambios de estado, y la Orders API para consultar el detalle real del pedido.
Documentación útil:
- Orders API: https://developers.vtex.com/docs/api-reference/orders-api
- Feed v3: https://developers.vtex.com/docs/guides/orders-feed
- Integración de órdenes con ERP: https://developers.vtex.com/docs/guides/erp-integration-set-up-order-integration
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. VTEX publica un cambio de orden por Feed v3 o Hook.
2. n8n recibe el evento o lee el feed.
3. n8n consulta el pedido completo en OMS.
4. n8n espera un estado facturable, por ejemplo `payment-approved` o el estado operativo definido por tu negocio.
5. n8n mapea items, shipping, discounts y taxes.
6. Afip SDK autoriza la factura.
7. n8n confirma el ítem del feed o actualiza el sistema fiscal/ERP.
## Feed o Hook
VTEX documenta dos opciones para seguir cambios de órdenes:
- **Feed:** n8n consulta un endpoint de cambios pendientes, procesa cada item y luego lo confirma.
- **Hook:** VTEX llama a un endpoint tuyo cuando una orden cambia.
Para n8n, Feed suele ser más controlable en alto volumen porque podés manejar concurrencia y reintentos. Hook es más inmediato, pero exige que tu endpoint responda bien y sea idempotente.
## Paso 1: tomar eventos de VTEX
Si usás Hook:
- Nodo **Webhook** en n8n.
- VTEX envía order id y estado.
- Respondé 200 sólo cuando aceptaste el evento.
Si usás Feed:
- Nodo **Schedule Trigger** cada pocos minutos.
- Nodo **HTTP Request** para leer feed items.
- Procesás cada item.
- Confirmás el item del feed cuando termina bien.
## Paso 2: consultar OMS
Con el order id:
```http
GET https://{account}.vtexcommercestable.com.br/api/oms/pvt/orders/{{ $json.orderId }}
X-VTEX-API-AppKey: {{ $env.VTEX_APP_KEY }}
X-VTEX-API-AppToken: {{ $env.VTEX_APP_TOKEN }}
```
Revisá:
- `orderId`.
- `status`.
- `clientProfileData`.
- `items`.
- `totals`.
- `shippingData`.
- `marketplace`.
- `sellers`.
## Paso 3: elegir el estado facturable
No todas las empresas facturan en el mismo momento. Opciones comunes:
- `payment-approved`: factura cuando el pago fue aprobado.
- `ready-for-handling`: factura cuando la orden entra a preparación.
- Estado custom del ERP: factura cuando logística confirma disponibilidad.
Definí una sola regla y documentala. Si facturás demasiado temprano, aumentan notas de crédito por cancelaciones.
## Paso 4: mapear totales de VTEX
VTEX separa totales por tipos. En n8n consolidá:
- Items.
- Discounts.
- Shipping.
- Tax.
- Change data, si hubo modificaciones.
Ejemplo de estructura:
```js
const order = $json;
const totalById = Object.fromEntries(
(order.totals || []).map((total) => [total.id, total.value / 100])
);
return [{
json: {
externalId: `vtex:${order.orderId}`,
status: order.status,
customerDocument: order.clientProfileData?.document,
customerName: `${order.clientProfileData?.firstName || ''} ${order.clientProfileData?.lastName || ''}`.trim(),
itemsAmount: totalById.Items || 0,
discountsAmount: Math.abs(totalById.Discounts || 0),
shippingAmount: totalById.Shipping || 0,
taxAmount: totalById.Tax || 0,
totalAmount: order.value / 100,
},
}];
```
## Paso 5: sellers, marketplace y CUIT emisor
VTEX puede operar con múltiples sellers. Antes de llamar a ARCA, decidí:
- Qué seller emite la factura.
- Qué CUIT corresponde.
- Qué punto de venta usar.
- Si el marketplace factura o si factura el seller.
No uses un único CUIT para todo si la cuenta opera marketplace o multi-seller.
## Paso 6: emitir con Afip SDK
El tramo fiscal:
1. Obtener autorización `wsfe`.
2. `FECompUltimoAutorizado`.
3. `FECAESolicitar`.
4. Generar el PDF con el template de Afip SDK.
Clave de idempotencia: `vtex:{orderId}:{sellerId}` si hay sellers, o `vtex:{orderId}` si emite una sola razón social.
## Paso 7: cerrar el circuito
Después de autorizar:
- Guardá CAE, número y PDF en el ERP o middleware.
- Marcá la orden como facturada en tu sistema.
- Si usás Feed, confirmá el item procesado para que VTEX no lo entregue de nuevo.
## Errores comunes
- No confirmar items del Feed y reprocesar órdenes.
- Facturar todos los sellers con el mismo CUIT.
- Ignorar descuentos negativos en `totals`.
- No contemplar cambios de orden antes del estado final.
- Procesar un Hook duplicado como si fuera una orden nueva.
## Cierre
VTEX necesita un flujo más transaccional que una tienda simple. El diseño correcto en n8n es: evento o feed, consulta OMS, validación de estado, mapeo por seller y recién después Afip SDK.
---
--- title: Facturar ventas de WooCommerce con ARCA en n8n description: Guía práctica para emitir facturas electrónicas de ARCA desde pedidos de WooCommerce usando webhooks, n8n y Afip SDK. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-woocommerce-con-arca-en-n8n-cover.png ---
# Facturar ventas de WooCommerce con ARCA en n8n
Descargá el workflow [woocommerce-arca-invoice.json](/assets/blog/n8n/commerce/woocommerce-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de WooCommerce.
---
WooCommerce es uno de los casos más directos para n8n: tiene REST API, Webhooks y `meta_data` para guardar campos fiscales o el resultado de ARCA. El punto delicado es elegir el estado correcto del pedido y no duplicar facturas cuando WooCommerce dispara varios updates.
Documentación útil:
- WooCommerce REST API: https://developer.woocommerce.com/docs/apis/rest-api/
- Webhooks de WooCommerce: https://woocommerce.com/document/webhooks/
- Webhooks desde API: https://woocommerce.github.io/woocommerce-rest-api-docs/v3.html#webhooks
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. WooCommerce dispara un Webhook de pedido.
2. n8n recibe el evento.
3. n8n consulta el pedido por REST API.
4. n8n procesa sólo estados `processing` o `completed`.
5. n8n lee CUIT y condición fiscal desde checkout fields o `meta_data`.
6. Afip SDK autoriza la factura.
7. n8n guarda CAE, número y PDF como `meta_data` o nota privada.
## Paso 1: generar credenciales REST API
En WordPress:
1. WooCommerce > Settings > Advanced.
2. REST API.
3. Add key.
4. Permisos `Read/Write`.
Guardá consumer key y consumer secret en credenciales de n8n.
## Paso 2: crear Webhook de pedido
En WooCommerce:
- Topic: `Order updated` o `Order created`.
- Delivery URL: URL del nodo Webhook de n8n.
- Status: Active.
Si usás `Order updated`, el evento se dispara muchas veces. Por eso el primer filtro en n8n debe mirar estado e idempotencia.
## Paso 3: consultar el pedido completo
Con el id recibido:
```http
GET https://tutienda.com/wp-json/wc/v3/orders/{{ $json.id }}
Authorization: Basic consumer_key:consumer_secret
```
Revisá:
- `status`.
- `billing`.
- `line_items`.
- `shipping_lines`.
- `fee_lines`.
- `coupon_lines`.
- `tax_lines`.
- `meta_data`.
## Paso 4: campos fiscales en checkout
WooCommerce no trae CUIT argentino estándar. Agregalo con un plugin de checkout fields o código propio y guardalo en `meta_data`.
Campos recomendados:
- `_billing_cuit`.
- `_billing_razon_social`.
- `_billing_condicion_iva`.
- `_arca_invoice_number`.
- `_arca_cae`.
- `_arca_pdf_url`.
Ejemplo de lectura en n8n:
```js
const order = $json;
const meta = Object.fromEntries((order.meta_data || []).map((entry) => [entry.key, entry.value]));
return [{
json: {
externalId: `woocommerce:${order.id}`,
status: order.status,
taxId: meta._billing_cuit,
businessName: meta._billing_razon_social || order.billing.company,
ivaCondition: meta._billing_condicion_iva,
alreadyInvoiced: Boolean(meta._arca_invoice_number),
},
}];
```
Si `alreadyInvoiced` es true, terminá el workflow sin llamar a Afip SDK.
## Paso 5: mapear importes
WooCommerce puede manejar precios con IVA incluido o excluido. Revisá cómo está configurada la tienda antes de calcular.
Mapeá:
- `line_items`: productos.
- `shipping_lines`: envío.
- `fee_lines`: recargos.
- `coupon_lines`: descuentos.
- `tax_lines`: impuestos.
No recalcules a ciegas si WooCommerce ya calculó impuestos. Validá contra el total del pedido.
## Paso 6: emitir con Afip SDK
Tramo fiscal:
1. Obtener autorización `wsfe`.
2. Consultar último comprobante.
3. Autorizar con `FECAESolicitar`.
4. Generar el PDF con el template de Afip SDK.
Clave de idempotencia:
```plaintext
woocommerce:{order.id}
```
## Paso 7: actualizar el pedido
Usá REST API para escribir `meta_data`:
```http
PUT https://tutienda.com/wp-json/wc/v3/orders/{{ order.id }}
```
Payload:
```json
{
"meta_data": [
{ "key": "_arca_invoice_number", "value": "0001-00001234" },
{ "key": "_arca_cae", "value": "12345678901234" },
{ "key": "_arca_pdf_url", "value": "https://..." }
]
}
```
También podés crear una order note privada para soporte.
## Errores comunes
- Facturar `pending` o `on-hold`.
- No bloquear duplicados en `Order updated`.
- No tener campos CUIT/IVA en checkout.
- Duplicar IVA porque la tienda ya guarda precios con impuestos.
- No diferenciar refund de nota de crédito.
## Cierre
WooCommerce es ideal para este flujo si usás `meta_data` de forma disciplinada. El Webhook dispara, la REST API confirma el estado y Afip SDK emite sólo una vez.
---
--- title: Facturar ventas de Zoho con ARCA en n8n description: Cómo conectar ventas de Zoho con Afip SDK en n8n para autorizar facturas electrónicas de ARCA y devolver CAE, PDF y estado fiscal al CRM o ERP. category: [n8n] pubDate: jun 15, 2026 cover: /images/blog/facturar-ventas-de-zoho-con-arca-en-n8n-cover.png ---
# Facturar ventas de Zoho con ARCA en n8n
Descargá el workflow [zoho-arca-invoice.json](/assets/blog/n8n/commerce/zoho-arca-invoice.json) para importarlo en n8n y adaptarlo a tu cuenta de Zoho.
---
Zoho puede significar varias cosas: Zoho CRM, Zoho Inventory, Zoho Books o Zoho Commerce. Para facturación electrónica, conviene elegir un módulo como fuente de verdad y no dejar que varios módulos disparen la misma factura.
En este tutorial usamos Zoho Inventory o Books como caso principal, porque ya trabajan con contactos, sales orders, items e invoices. n8n consulta Zoho por API, emite con Afip SDK y escribe el resultado fiscal de vuelta.
Documentación útil:
- Zoho Inventory API: https://www.zoho.com/inventory/api/v1/introduction/
- Zoho Books API: https://www.zoho.com/books/api/v3/introduction/
- Zoho OAuth: https://www.zoho.com/accounts/protocol/oauth.html
- Nodo Afip SDK para n8n: https://n8n.io/integrations/afip-sdk/
## Cómo funciona la integración
1. Una venta queda aprobada en Zoho.
2. n8n se dispara por Webhook, workflow de Zoho o cron.
3. n8n consulta Sales Order, Invoice o Contact por API.
4. n8n valida campos fiscales argentinos.
5. Afip SDK emite la factura en ARCA.
6. n8n actualiza Zoho con CAE, número de comprobante y PDF.
## Paso 1: elegir el módulo fuente
Definí una sola fuente para facturar:
- **Zoho Inventory Sales Orders:** útil si el negocio maneja stock y fulfillment.
- **Zoho Books Invoices:** útil si el documento comercial ya nace como factura interna.
- **Zoho CRM Deals:** útil sólo si CRM dispara el proceso, pero la factura debería salir desde Books/Inventory o un ERP.
No hagas que CRM, Books e Inventory disparen Afip SDK al mismo tiempo.
## Paso 2: autenticar Zoho en n8n
Zoho usa OAuth 2.0. En n8n podés:
- Usar un nodo Zoho si cubre el módulo que necesitás.
- Usar **HTTP Request** con OAuth configurado.
- Guardar `organization_id` como variable de entorno.
Para Zoho Inventory:
```http
GET https://www.zohoapis.com/inventory/v1/salesorders/{{ $json.salesorder_id }}?organization_id={{ $env.ZOHO_ORGANIZATION_ID }}
Authorization: Zoho-oauthtoken {{ $env.ZOHO_ACCESS_TOKEN }}
```
La región puede cambiar: `.com`, `.eu`, `.in`, etc. Usá el dominio de tu cuenta.
## Paso 3: disparar el workflow
Opciones:
- Webhook desde una custom function de Zoho.
- Schedule Trigger que busca órdenes con estado aprobado y campo `arca_status` vacío.
- Trigger manual para pruebas.
En producción, conviene agregar campos propios en Zoho:
- `arca_status`.
- `arca_cae`.
- `arca_invoice_number`.
- `arca_pdf_url`.
## Paso 4: mapear contacto y datos fiscales
El contacto debe tener campos argentinos:
- CUIT o DNI.
- Razón social.
- Condición frente al IVA.
- Domicilio fiscal.
Si esos campos no existen, crealos como custom fields en Zoho. No dependas de notas o texto libre.
Ejemplo de normalización:
```js
const sale = $json.salesorder || $json.invoice;
const customer = sale.customer || {};
return [{
json: {
externalId: `zoho:${sale.salesorder_id || sale.invoice_id}`,
customerName: customer.company_name || customer.customer_name,
taxId: customer.custom_field_hash?.cf_cuit,
ivaCondition: customer.custom_field_hash?.cf_condicion_iva,
totalAmount: Number(sale.total),
items: (sale.line_items || []).map((item) => ({
sku: item.sku,
description: item.name,
quantity: Number(item.quantity),
unitPrice: Number(item.rate),
taxName: item.tax_name,
taxPercentage: item.tax_percentage,
})),
},
}];
```
## Paso 5: emitir con Afip SDK
Usá los nodos:
1. Obtener autorización `wsfe`.
2. `FECompUltimoAutorizado`.
3. `FECAESolicitar`.
4. Generar el PDF con el template de Afip SDK.
Clave de idempotencia:
```plaintext
zoho:{module}:{id}
```
Por ejemplo `zoho:salesorder:123456789`.
## Paso 6: actualizar Zoho
Después de emitir:
- Actualizá custom fields del documento.
- Adjuntá o enlazá el PDF.
- Cambiá `arca_status` a `authorized`.
- Guardá errores con `arca_error` si ARCA rechaza.
Si Zoho Books ya genera una invoice comercial, no intentes reemplazarla. Relacionala con la factura fiscal de ARCA.
## Errores comunes
- Disparar desde CRM y desde Books al mismo tiempo.
- No crear custom fields fiscales.
- Usar customer name como razón social sin validación.
- No contemplar dominios regionales de Zoho.
- No guardar el CAE estructurado en Zoho.
## Cierre
Zoho funciona bien cuando se define un único módulo fuente. n8n debe tomar ese documento, convertirlo a payload fiscal argentino, emitir con Afip SDK y devolver el estado a Zoho.
---
--- title: Consultar constancia de Inscripción de ARCA en Anything description: Obtené datos de inscripción con Afip SDK API category: [Anything] pubDate: may 30, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-anything-cover.png ---
# Consultar constancia de Inscripción de ARCA en Anything
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Anything** que genere una app para consultar la constancia de inscripción de ARCA usando el web service `ws_sr_constancia_inscripcion` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a Anything
- El CUIT de la persona o empresa cuya constancia querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Anything
La instrucción principal para Anything es que no deje el token en la pantalla. Todo lo que se conecta con Afip SDK API debe quedar en backend.
Creá un nuevo proyecto.
## Prompt listo para pegar en Anything
Pegá este prompt:
```md
Quiero crear una app para consultar constancias de inscripción de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App full-stack
- Frontend para cargar datos
- Backend privado para llamar a Afip SDK API
- Pantalla de resultado y errores
Objetivo:
- Consultar datos de inscripción de un contribuyente.
- Usar el web service `ws_sr_constancia_inscripcion`.
- Ejecutar el método `getPersona_v2`.
- Mostrar la constancia en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- El frontend no debe llamar directamente a Afip SDK API.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar constancia de inscripción de ARCA".
- Campo CUIT, default 33693450239.
- Botón "Consultar constancia".
- Estado de carga.
- Resultado con datos generales, domicilio fiscal, impuestos y actividades si están disponibles.
- Mensaje de error claro si ARCA no devuelve información.
Backend:
Crear un endpoint privado `/api/constancias/consultar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
Guardar de la respuesta:
- token
- sign
2. Consultar la constancia:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitConsultado
}
}
3. Devolver al frontend:
{
"success": true,
"taxId": cuitConsultado,
"certificate": respuestaDeGetPersonaV2
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `personaNoRegistrada`, mostrar "No se encontró una constancia para ese CUIT".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Configurá `AFIP_SDK_ACCESS_TOKEN` como secret o variable privada del proyecto.
No lo pongas en la pantalla ni en código que se ejecute en el navegador. El backend debe leerlo desde el entorno.
## Probar la consulta
Con el CUIT inicial, Anything debería consultar la constancia y mostrar los datos disponibles del contribuyente.
Al finalizar, la pantalla debe mostrar:
- CUIT consultado
- Datos generales
- Domicilio fiscal, impuestos y actividades disponibles
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Consultar constancia de Inscripción de ARCA en Base44 description: Obtené datos de inscripción con Afip SDK API category: [Base44] pubDate: may 30, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-base44-cover.png ---
# Consultar constancia de Inscripción de ARCA en Base44
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Base44** que genere una app para consultar la constancia de inscripción de ARCA usando el web service `ws_sr_constancia_inscripcion` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Base44](https://base44.com/)
- El CUIT de la persona o empresa cuya constancia querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Base44
Base44 puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para conectarte con ARCA, pedile explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Base44, creá un nuevo proyecto.
## Prompt listo para pegar en Base44
Pegá este prompt:
```md
Quiero crear una app para consultar constancias de inscripción de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App web generada en Base44
- Función server-side, Edge Function o endpoint backend privado
- Frontend para cargar datos y ver resultados
Objetivo:
- Consultar datos de inscripción de un contribuyente.
- Usar el web service `ws_sr_constancia_inscripcion`.
- Ejecutar el método `getPersona_v2`.
- Mostrar la constancia en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar constancia de inscripción de ARCA".
- Campo CUIT, default 33693450239.
- Botón "Consultar constancia".
- Estado de carga.
- Resultado con datos generales, domicilio fiscal, impuestos y actividades si están disponibles.
- Mensaje de error claro si ARCA no devuelve información.
Backend:
Crear un endpoint privado `/api/constancias/consultar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
Guardar de la respuesta:
- token
- sign
2. Consultar la constancia:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitConsultado
}
}
3. Devolver al frontend:
{
"success": true,
"taxId": cuitConsultado,
"certificate": respuestaDeGetPersonaV2
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `personaNoRegistrada`, mostrar "No se encontró una constancia para ese CUIT".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Base44.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la consulta
Con el CUIT inicial, Base44 debería consultar la constancia y mostrar los datos disponibles del contribuyente.
Al finalizar, la pantalla debe mostrar:
- CUIT consultado
- Datos generales
- Domicilio fiscal, impuestos y actividades disponibles
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Consultar constancia de Inscripción de ARCA en Bolt.new description: Obtené datos de inscripción con Afip SDK API category: [Bolt] pubDate: may 30, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-bolt-new-cover.png ---
# Consultar constancia de Inscripción de ARCA en Bolt.new
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Bolt.new** que genere una app para consultar la constancia de inscripción de ARCA usando el web service `ws_sr_constancia_inscripcion` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [Bolt.new](https://bolt.new/)
- El CUIT de la persona o empresa cuya constancia querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Bolt.new
Bolt.new puede generar una app completa a partir de una descripción. Para este caso, conviene pedirle una app full-stack: pantalla para cargar datos y endpoint backend para llamar a Afip SDK.
Creá un nuevo proyecto en Bolt.new.
## Prompt listo para pegar en Bolt.new
Pegá este prompt:
```md
Quiero crear una app para consultar constancias de inscripción de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App full-stack generada por Bolt.new
- Frontend con formulario
- Endpoint backend privado
- Manejo de loading, success y error
Objetivo:
- Consultar datos de inscripción de un contribuyente.
- Usar el web service `ws_sr_constancia_inscripcion`.
- Ejecutar el método `getPersona_v2`.
- Mostrar la constancia en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- El access token de Afip SDK debe estar solo en backend.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar constancia de inscripción de ARCA".
- Campo CUIT, default 33693450239.
- Botón "Consultar constancia".
- Estado de carga.
- Resultado con datos generales, domicilio fiscal, impuestos y actividades si están disponibles.
- Mensaje de error claro si ARCA no devuelve información.
Backend:
Crear un endpoint privado `/api/constancias/consultar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
Guardar de la respuesta:
- token
- sign
2. Consultar la constancia:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitConsultado
}
}
3. Devolver al frontend:
{
"success": true,
"taxId": cuitConsultado,
"certificate": respuestaDeGetPersonaV2
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `personaNoRegistrada`, mostrar "No se encontró una constancia para ese CUIT".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Cuando Bolt.new genere el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada.
No lo guardes en el frontend ni en archivos públicos. El endpoint backend debe leerlo desde el entorno.
## Probar la consulta
Con el CUIT inicial, Bolt.new debería consultar la constancia y mostrar los datos disponibles del contribuyente.
Al finalizar, la pantalla debe mostrar:
- CUIT consultado
- Datos generales
- Domicilio fiscal, impuestos y actividades disponibles
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Consultar constancia de Inscripción de ARCA en Lovable description: Obtené datos de inscripción con Afip SDK API category: [Lovable] pubDate: may 30, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-lovable-cover.png ---
# Consultar constancia de Inscripción de ARCA en Lovable
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Lovable** que genere una app para consultar la constancia de inscripción de ARCA usando el web service `ws_sr_constancia_inscripcion` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Lovable](https://lovable.dev/)
- El CUIT de la persona o empresa cuya constancia querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Lovable
Lovable puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para conectarte con ARCA, pedile explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Lovable, creá un nuevo proyecto.
## Prompt listo para pegar en Lovable
Pegá este prompt:
```md
Quiero crear una app para consultar constancias de inscripción de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App web generada en Lovable
- Función server-side, Edge Function o endpoint backend privado
- Frontend para cargar datos y ver resultados
Objetivo:
- Consultar datos de inscripción de un contribuyente.
- Usar el web service `ws_sr_constancia_inscripcion`.
- Ejecutar el método `getPersona_v2`.
- Mostrar la constancia en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar constancia de inscripción de ARCA".
- Campo CUIT, default 33693450239.
- Botón "Consultar constancia".
- Estado de carga.
- Resultado con datos generales, domicilio fiscal, impuestos y actividades si están disponibles.
- Mensaje de error claro si ARCA no devuelve información.
Backend:
Crear un endpoint privado `/api/constancias/consultar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
Guardar de la respuesta:
- token
- sign
2. Consultar la constancia:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitConsultado
}
}
3. Devolver al frontend:
{
"success": true,
"taxId": cuitConsultado,
"certificate": respuestaDeGetPersonaV2
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `personaNoRegistrada`, mostrar "No se encontró una constancia para ese CUIT".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Lovable.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la consulta
Con el CUIT inicial, Lovable debería consultar la constancia y mostrar los datos disponibles del contribuyente.
Al finalizar, la pantalla debe mostrar:
- CUIT consultado
- Datos generales
- Domicilio fiscal, impuestos y actividades disponibles
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Consultar constancia de Inscripción de ARCA en Replit description: Obtené datos de inscripción con Afip SDK API category: [Replit] pubDate: may 30, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-replit-cover.png ---
# Consultar constancia de Inscripción de ARCA en Replit
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Replit** que genere una app para consultar la constancia de inscripción de ARCA usando el web service `ws_sr_constancia_inscripcion` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener una cuenta en [Replit](https://replit.com/) y crear un Repl de Node.js
- El CUIT de la persona o empresa cuya constancia querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Configurar el proyecto en Replit
Creá un nuevo Repl de Node.js.
Antes de pedirle a Replit Agent que genere la app, agregá estos secrets desde **Tools > Secrets**:
- `AFIP_SDK_ACCESS_TOKEN`: tu access_token de Afip SDK
- `AFIP_TAX_ID`: `20409378472`
- `AFIP_ENVIRONMENT`: `dev`
## Prompt listo para pegar en Replit
Abrí Replit Agent y pegá este prompt:
```md
Quiero crear una app para consultar constancias de inscripción de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- Node.js
- Express
- Frontend simple con HTML, CSS y JavaScript
- Backend Express para llamar a Afip SDK API
Crear estos archivos:
- `package.json`
- `server.js`
- `public/index.html`
- `public/styles.css`
- `public/app.js`
Objetivo:
- Consultar datos de inscripción de un contribuyente.
- Usar el web service `ws_sr_constancia_inscripcion`.
- Ejecutar el método `getPersona_v2`.
- Mostrar la constancia en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá `process.env.AFIP_SDK_ACCESS_TOKEN` solo en el backend Express.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar constancia de inscripción de ARCA".
- Campo CUIT, default 33693450239.
- Botón "Consultar constancia".
- Estado de carga.
- Resultado con datos generales, domicilio fiscal, impuestos y actividades si están disponibles.
- Mensaje de error claro si ARCA no devuelve información.
Backend:
Crear un endpoint privado `/api/constancias/consultar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
Guardar de la respuesta:
- token
- sign
2. Consultar la constancia:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitConsultado
}
}
3. Devolver al frontend:
{
"success": true,
"taxId": cuitConsultado,
"certificate": respuestaDeGetPersonaV2
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `personaNoRegistrada`, mostrar "No se encontró una constancia para ese CUIT".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Si Replit Agent no tomó los secrets al primer intento, abrí **Tools > Secrets** y confirmá que `AFIP_SDK_ACCESS_TOKEN` exista.
El token no debe aparecer en `public/index.html`, `public/app.js` ni en ningún archivo que se ejecute en el navegador.
## Probar la consulta
Con el CUIT inicial, Replit debería consultar la constancia y mostrar los datos disponibles del contribuyente.
Al finalizar, la pantalla debe mostrar:
- CUIT consultado
- Datos generales
- Domicilio fiscal, impuestos y actividades disponibles
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Consultar constancia de Inscripción de ARCA en v0 description: Obtené datos de inscripción con Afip SDK API category: [v0] pubDate: may 30, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-v0-cover.png ---
# Consultar constancia de Inscripción de ARCA en v0
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **v0** que genere una app para consultar la constancia de inscripción de ARCA usando el web service `ws_sr_constancia_inscripcion` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [v0](https://v0.dev/) y un proyecto Next.js
- El CUIT de la persona o empresa cuya constancia querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en v0
v0 suele trabajar muy bien con componentes React y proyectos Next.js. Para este caso, pedile que no haga la llamada desde el componente, sino desde un Route Handler privado.
Creá un proyecto nuevo o abrí tu proyecto Next.js.
## Prompt listo para pegar en v0
Pegá este prompt:
```md
Quiero crear una app para consultar constancias de inscripción de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- Next.js App Router
- React
- TypeScript
- Route Handler privado en `/app/api/.../route.ts`
Objetivo:
- Consultar datos de inscripción de un contribuyente.
- Usar el web service `ws_sr_constancia_inscripcion`.
- Ejecutar el método `getPersona_v2`.
- Mostrar la constancia en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usar `process.env.AFIP_SDK_ACCESS_TOKEN` solo en el Route Handler.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar constancia de inscripción de ARCA".
- Campo CUIT, default 33693450239.
- Botón "Consultar constancia".
- Estado de carga.
- Resultado con datos generales, domicilio fiscal, impuestos y actividades si están disponibles.
- Mensaje de error claro si ARCA no devuelve información.
Backend:
Crear un endpoint privado `/api/constancias/consultar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
Guardar de la respuesta:
- token
- sign
2. Consultar la constancia:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitConsultado
}
}
3. Devolver al frontend:
{
"success": true,
"taxId": cuitConsultado,
"certificate": respuestaDeGetPersonaV2
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `personaNoRegistrada`, mostrar "No se encontró una constancia para ese CUIT".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Cuando exportes el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada del entorno donde corra Next.js.
No uses variables públicas como `NEXT_PUBLIC_AFIP_SDK_ACCESS_TOKEN`. Todo lo que empieza con `NEXT_PUBLIC_` puede quedar visible en el navegador.
## Probar la consulta
Con el CUIT inicial, v0 debería consultar la constancia y mostrar los datos disponibles del contribuyente.
Al finalizar, la pantalla debe mostrar:
- CUIT consultado
- Datos generales
- Domicilio fiscal, impuestos y actividades disponibles
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en Anything description: Con prompt listo para pegar category: [Anything] pubDate: may 30, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-anything-cover.png ---
# Crear Factura Electrónica de ARCA en Anything
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a usar **Anything** para crear una app que emita una Factura B con el web service de factura electrónica (`wsfe`) usando Afip SDK API. Como Anything puede generar distintas arquitecturas, el prompt le pide una app full-stack con backend privado.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a Anything
- Configurar el token como secret o variable privada
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Anything
La instrucción principal para Anything es que no deje el token en la pantalla. Todo lo que se conecta con Afip SDK API debe quedar en backend.
Creá un nuevo proyecto.
## Prompt listo para pegar en Anything
Pegá este prompt:
```md
Quiero crear una app para emitir Factura Electrónica de ARCA usando Afip SDK API.
La app debe quedar lista para completar un formulario, presionar un botón y emitir la factura. Generá toda la lógica necesaria.
Objetivo:
- Emitir una Factura B en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener el CAE de ARCA.
- Mostrar número de comprobante, CAE y vencimiento del CAE.
Reglas:
- Crear una app full-stack con frontend y backend.
- El frontend no debe llamar directamente a Afip SDK API.
- El access token debe quedar como secret privado.
- La app debe limitarse a emitir el comprobante y mostrar el resultado.
Variables privadas:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev
Frontend:
- Crear una pantalla llamada "Emitir Factura Electrónica de ARCA".
- Agregar formulario con:
- Punto de venta: default 1.
- Tipo de comprobante: default 6.
- Concepto: default 1.
- Tipo de documento: default 99.
- Número de documento: default 0.
- Importe neto gravado: default 100.
- IVA: default 21.
- Condición IVA receptor: default 5.
- Agregar botón "Emitir factura".
- Mostrar loading mientras se emite.
- Mostrar resultado con número de comprobante, CAE y vencimiento.
- Mostrar errores con texto claro.
Backend:
Crear un endpoint privado `POST /api/facturas/emitir`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
Usar `token` y `sign` de la respuesta.
2. Consultar último comprobante autorizado:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
Calcular:
nextVoucherNumber = FECompUltimoAutorizadoResult.CbteNro + 1.
3. Solicitar CAE:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
4. Extraer de la respuesta:
- Número de comprobante: `CbteDesde`.
- CAE.
- Vencimiento del CAE: `CAEFchVto`.
5. Responder al frontend con esos datos.
Manejo de errores:
- Si falta el token, explicar que falta configurar `AFIP_SDK_ACCESS_TOKEN`.
- Si ARCA devuelve error, mostrar el mensaje recibido.
- Para error 10016, mostrar que debe reintentarse porque el comprobante debe usar el próximo número autorizado.
- Para error 10242, mostrar que falta la condición IVA receptor.
La app debe quedar lista para probar con los valores iniciales y emitir una factura de prueba de $121.
```
## Configurar el token
Configurá `AFIP_SDK_ACCESS_TOKEN` como secret o variable privada del proyecto.
No lo pongas en la pantalla ni en código que se ejecute en el navegador. El backend debe leerlo desde el entorno.
## Probar la emisión
Con los valores iniciales, Anything debería emitir una Factura B de prueba por $121 en ambiente `dev`.
Al finalizar, la pantalla debe mostrar:
- Número de comprobante
- CAE
- Vencimiento del CAE
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en Base44 description: Con prompt listo para pegar category: [Base44] pubDate: may 30, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-base44-cover.png ---
# Crear Factura Electrónica de ARCA en Base44
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a pedirle a **Base44** que cree una app para emitir una Factura B usando el web service de factura electrónica (`wsfe`) a través del API de Afip SDK. La idea es que puedas copiar un prompt, pegarlo en Base44 y dejar que la plataforma genere la pantalla, el endpoint privado y la conexión con ARCA.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Base44](https://base44.com/)
- Guardar el token como variable privada o secret, nunca en el frontend
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio, para avanzar más rápido.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Base44
Base44 puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para factura electrónica, lo importante es pedirle explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Base44, creá un nuevo proyecto.
## Prompt listo para pegar en Base44
Pegá este prompt:
```md
Quiero crear una app web en Base44 para emitir Factura Electrónica de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Objetivo:
- Crear una pantalla simple para cargar los datos de una Factura B.
- Emitir la factura contra el web service de factura electrónica de ARCA (`wsfe`) usando Afip SDK API.
- Mostrar el CAE, vencimiento del CAE y número de comprobante autorizado.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- La app debe limitarse a emitir el comprobante y mostrar el CAE.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
- Usá web service: `wsfe`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Emitir Factura Electrónica de ARCA".
- Formulario con estos campos:
- Punto de venta, valor inicial 1.
- Tipo de comprobante, valor inicial 6 para Factura B.
- Concepto, valor inicial 1 para Productos.
- Tipo de documento, valor inicial 99 para Consumidor Final.
- Número de documento, valor inicial 0.
- Importe neto gravado, valor inicial 100.
- IVA, valor inicial 21.
- Condición IVA receptor, valor inicial 5.
- Botón: "Emitir factura".
- Resultado visible:
- Número de comprobante.
- CAE.
- Vencimiento del CAE.
- Mensaje de error claro si ARCA rechaza la solicitud.
Backend:
Crear un endpoint privado, por ejemplo `/api/emitir-factura-arca`, que reciba los datos del formulario y haga estos pasos:
1. Obtener autorización de ARCA:
POST https://app.afipsdk.com/api/v1/afip/auth
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body JSON:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
La respuesta trae `token` y `sign`.
2. Obtener el último comprobante autorizado:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body JSON:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
Tomar `FECompUltimoAutorizadoResult.CbteNro` y calcular:
nextVoucherNumber = CbteNro + 1.
3. Crear la factura con `FECAESolicitar`:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body JSON:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualEnFormatoYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
4. Leer la respuesta de `FECAESolicitar`.
Extraer:
- `CAE`
- `CAEFchVto`
- `CbteDesde`
5. Devolver esos datos al frontend.
Manejo de errores:
- Si Afip SDK API devuelve un error, mostrarlo en pantalla con lenguaje claro.
- Si aparece el error 10016, indicar que el sistema debe volver a consultar el último comprobante y reintentar con el próximo número.
- Si aparece el error 10242, indicar que falta o es incorrecta la condición IVA receptor.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Base44.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la emisión
Con los valores iniciales del formulario, Base44 debería emitir una Factura B de prueba por $121 en ambiente de desarrollo.
Al finalizar, la pantalla debe mostrar:
- Número de comprobante
- CAE
- Vencimiento del CAE
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en Bolt.new description: Con prompt listo para pegar category: [Bolt] pubDate: may 30, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-bolt-new-cover.png ---
# Crear Factura Electrónica de ARCA en Bolt.new
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a pedirle a **Bolt.new** que genere una app web con frontend y backend para emitir una Factura B usando el web service de factura electrónica (`wsfe`) con Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [Bolt.new](https://bolt.new/)
- Configurar el token como variable de entorno privada
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Bolt.new
Bolt.new puede generar una app completa a partir de una descripción. Para este caso, conviene pedirle una app full-stack: pantalla para cargar la factura y endpoint backend para llamar a Afip SDK.
Creá un nuevo proyecto en Bolt.new.
## Prompt listo para pegar en Bolt.new
Pegá este prompt:
```md
Quiero crear una app full-stack en Bolt.new para emitir Factura Electrónica de ARCA usando Afip SDK API.
Necesito que generes todo: interfaz, endpoint backend, conexión con Afip SDK API, manejo de errores y resultado en pantalla.
Objetivo:
- Emitir una Factura B en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener CAE y vencimiento del CAE.
- Mostrar el resultado al usuario.
Reglas obligatorias:
- El access token de Afip SDK debe estar solo en backend.
- No hacer llamadas a Afip SDK API desde el navegador.
- La app debe limitarse a emitir la factura y mostrar el CAE.
Variables de entorno privadas:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev
Crear:
- Una pantalla principal con formulario.
- Un endpoint backend `POST /api/facturas/emitir`.
- Manejo de loading, success y error.
Formulario:
- Punto de venta, default 1.
- Tipo de comprobante, default 6 para Factura B.
- Concepto, default 1.
- Tipo de documento, default 99.
- Número de documento, default 0.
- Importe neto gravado, default 100.
- IVA, default 21.
- Condición IVA receptor, default 5.
Flujo del backend:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
Guardar de la respuesta:
- token
- sign
2. Consultar último comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
Calcular:
nextVoucherNumber = FECompUltimoAutorizadoResult.CbteNro + 1.
3. Solicitar CAE:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
4. Leer la respuesta y mostrar:
- Número de comprobante (`CbteDesde`).
- CAE.
- Vencimiento del CAE (`CAEFchVto`).
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Para error 10016, sugerir reintentar porque el próximo número debe recalcularse.
- Para error 10242, indicar que la condición IVA receptor debe estar completa.
Diseño:
- Interfaz clara, simple y lista para usar.
- Valores iniciales cargados para emitir una factura de prueba por $121.
- Mensajes visibles para saber si la factura se emitió correctamente.
```
## Configurar el token
Cuando Bolt.new genere el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada.
No lo guardes en el frontend ni en archivos públicos. El endpoint backend debe leerlo desde el entorno.
## Probar la emisión
Con los valores iniciales, la app debería emitir una Factura B de prueba por $121 en ambiente `dev`.
El resultado esperado es:
- Número de comprobante
- CAE
- Vencimiento del CAE
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en Lovable description: Con prompt listo para pegar category: [Lovable] pubDate: may 30, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-lovable-cover.png ---
# Crear Factura Electrónica de ARCA en Lovable
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a pedirle a **Lovable** que cree una app para emitir una Factura B usando el web service de factura electrónica (`wsfe`) a través del API de Afip SDK. La idea es que puedas copiar un prompt, pegarlo en Lovable y dejar que la plataforma genere la pantalla, el endpoint privado y la conexión con ARCA.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Lovable](https://lovable.dev/)
- Guardar el token como variable privada o secret, nunca en el frontend
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio, para avanzar más rápido.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Lovable
Lovable puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para factura electrónica, lo importante es pedirle explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Lovable, creá un nuevo proyecto.
## Prompt listo para pegar en Lovable
Pegá este prompt:
```md
Quiero crear una app web en Lovable para emitir Factura Electrónica de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Objetivo:
- Crear una pantalla simple para cargar los datos de una Factura B.
- Emitir la factura contra el web service de factura electrónica de ARCA (`wsfe`) usando Afip SDK API.
- Mostrar el CAE, vencimiento del CAE y número de comprobante autorizado.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- La app debe limitarse a emitir el comprobante y mostrar el CAE.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
- Usá web service: `wsfe`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Emitir Factura Electrónica de ARCA".
- Formulario con estos campos:
- Punto de venta, valor inicial 1.
- Tipo de comprobante, valor inicial 6 para Factura B.
- Concepto, valor inicial 1 para Productos.
- Tipo de documento, valor inicial 99 para Consumidor Final.
- Número de documento, valor inicial 0.
- Importe neto gravado, valor inicial 100.
- IVA, valor inicial 21.
- Condición IVA receptor, valor inicial 5.
- Botón: "Emitir factura".
- Resultado visible:
- Número de comprobante.
- CAE.
- Vencimiento del CAE.
- Mensaje de error claro si ARCA rechaza la solicitud.
Backend:
Crear un endpoint privado, por ejemplo `/api/emitir-factura-arca`, que reciba los datos del formulario y haga estos pasos:
1. Obtener autorización de ARCA:
POST https://app.afipsdk.com/api/v1/afip/auth
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body JSON:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
La respuesta trae `token` y `sign`.
2. Obtener el último comprobante autorizado:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body JSON:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
Tomar `FECompUltimoAutorizadoResult.CbteNro` y calcular:
nextVoucherNumber = CbteNro + 1.
3. Crear la factura con `FECAESolicitar`:
POST https://app.afipsdk.com/api/v1/afip/requests
Header:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Body JSON:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualEnFormatoYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
4. Leer la respuesta de `FECAESolicitar`.
Extraer:
- `CAE`
- `CAEFchVto`
- `CbteDesde`
5. Devolver esos datos al frontend.
Manejo de errores:
- Si Afip SDK API devuelve un error, mostrarlo en pantalla con lenguaje claro.
- Si aparece el error 10016, indicar que el sistema debe volver a consultar el último comprobante y reintentar con el próximo número.
- Si aparece el error 10242, indicar que falta o es incorrecta la condición IVA receptor.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Lovable.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la emisión
Con los valores iniciales del formulario, Lovable debería emitir una Factura B de prueba por $121 en ambiente de desarrollo.
Al finalizar, la pantalla debe mostrar:
- Número de comprobante
- CAE
- Vencimiento del CAE
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en Replit description: Con prompt listo para pegar category: [Replit] pubDate: may 30, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-replit-cover.png ---
# Crear Factura Electrónica de ARCA en Replit
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a usar **Replit** para crear una app con formulario y backend Express. El backend va a llamar al web service de factura electrónica (`wsfe`) usando Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener una cuenta en [Replit](https://replit.com/)
- Crear un Repl de Node.js
- Guardar el token en Secrets de Replit
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Replit
Creá un nuevo Repl de Node.js.
## Configurar el token
Antes de pedirle a Replit Agent que genere la app, agregá estos secrets desde **Tools > Secrets**:
- `AFIP_SDK_ACCESS_TOKEN`: tu access_token de Afip SDK
- `AFIP_TAX_ID`: `20409378472`
- `AFIP_ENVIRONMENT`: `dev`
## Prompt listo para pegar en Replit
Abrí Replit Agent y pegá este prompt:
```md
Quiero crear una app en Replit para emitir Factura Electrónica de ARCA usando Afip SDK API.
Necesito que generes toda la app lista para usar.
Stack:
- Node.js
- Express
- Frontend simple con HTML, CSS y JavaScript
- Backend Express para llamar a Afip SDK API
Objetivo:
- Emitir una Factura B en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener CAE y vencimiento del CAE.
- Mostrar el resultado en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde el frontend.
- No muestres el access token en HTML ni JavaScript del navegador.
- Usá `process.env.AFIP_SDK_ACCESS_TOKEN`.
- La app debe limitarse a emitir el comprobante y mostrar el CAE.
Secrets disponibles:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev
Crear estos archivos:
- `package.json`
- `server.js`
- `public/index.html`
- `public/styles.css`
- `public/app.js`
Pantalla:
- Título: "Emitir Factura Electrónica de ARCA".
- Formulario con:
- Punto de venta, default 1.
- Tipo de comprobante, default 6.
- Concepto, default 1.
- Tipo de documento, default 99.
- Número de documento, default 0.
- Importe neto, default 100.
- IVA, default 21.
- Condición IVA receptor, default 5.
- Botón "Emitir factura".
- Caja de resultado con número de comprobante, CAE y vencimiento.
- Caja de error con mensajes entendibles.
Backend:
Crear `POST /api/facturas/emitir`.
Ese endpoint debe:
1. Leer los datos del formulario.
2. Llamar a Afip SDK API para obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
3. Con el `token` y `sign` de la respuesta, obtener el último comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
4. Calcular `nextVoucherNumber` como `FECompUltimoAutorizadoResult.CbteNro + 1`.
5. Crear la factura:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
6. Extraer de la respuesta:
- CAE
- CAEFchVto
- CbteDesde
7. Devolver al frontend:
{
"success": true,
"voucherNumber": CbteDesde,
"cae": CAE,
"caeExpiration": CAEFchVto
}
Manejo de errores:
- Si Afip SDK API responde con error, devolver `success: false` y un mensaje claro.
- Si aparece error 10016, explicar que el número de comprobante no es el próximo autorizado.
- Si aparece error 10242, explicar que falta la condición IVA receptor.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá instrucciones en pantalla para que el usuario solo complete importes y presione "Emitir factura".
```
## Probar la emisión
Cuando Replit termine de generar la app, presioná **Run**.
Con los valores iniciales, la app debería emitir una Factura B de prueba por $121 en ambiente `dev`.
Al finalizar, la pantalla debe mostrar:
- Número de comprobante
- CAE
- Vencimiento del CAE
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en v0 description: Con prompt listo para pegar category: [v0] pubDate: may 30, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-v0-cover.png ---
# Crear Factura Electrónica de ARCA en v0
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a pedirle a **v0** que genere una app Next.js con una pantalla para cargar los datos de la factura y una API Route para llamar al web service de factura electrónica (`wsfe`) usando Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [v0](https://v0.dev/)
- Tener un proyecto Next.js o crear uno desde v0
- Configurar el token como variable de entorno privada
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en v0
v0 suele trabajar muy bien con componentes React y proyectos Next.js. Para factura electrónica, pedile que no haga la llamada desde el componente, sino desde un Route Handler privado.
Creá un proyecto nuevo o abrí tu proyecto Next.js.
## Prompt listo para pegar en v0
Pegá este prompt:
```md
Quiero crear una app Next.js para emitir Factura Electrónica de ARCA usando Afip SDK API.
Generá todo lo necesario: pantalla, formulario, API Route, manejo de errores y visualización del resultado.
Stack:
- Next.js App Router
- React
- TypeScript
- Route Handler en `/app/api/facturas/emitir/route.ts`
Objetivo:
- Crear una Factura B de ARCA en ambiente de desarrollo.
- Usar el web service `wsfe`.
- Obtener el CAE.
- Mostrar número de comprobante, CAE y vencimiento del CAE.
Reglas importantes:
- No llamar a Afip SDK API desde el componente React.
- No exponer `AFIP_SDK_ACCESS_TOKEN` al cliente.
- Usar `process.env.AFIP_SDK_ACCESS_TOKEN` solo en la API Route.
- La app debe limitarse a emitir la factura y mostrar el CAE.
Variables de entorno privadas:
- AFIP_SDK_ACCESS_TOKEN
- AFIP_TAX_ID=20409378472
- AFIP_ENVIRONMENT=dev
Crear una pantalla con:
- Título: "Emitir Factura Electrónica de ARCA".
- Explicación corta: "Completá los datos y el sistema solicitará el CAE a ARCA".
- Formulario con:
- Punto de venta, default 1.
- Tipo de comprobante, default 6.
- Concepto, default 1.
- Tipo de documento, default 99.
- Número de documento, default 0.
- Importe neto gravado, default 100.
- IVA, default 21.
- Condición IVA receptor, default 5.
- Botón "Emitir factura".
- Estado de carga.
- Resultado con:
- Número de comprobante.
- CAE.
- Vencimiento del CAE.
- Mensaje de error claro.
La API Route `/api/facturas/emitir` debe:
1. Recibir los datos del formulario.
2. Validar que existan `importeNeto` e `importeIVA`.
3. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
4. Obtener el último comprobante autorizado:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
}
}
5. Calcular `nextVoucherNumber = CbteNro + 1`.
6. Crear la factura con `FECAESolicitar`:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": concepto,
"DocTipo": docTipo,
"DocNro": docNro,
"CbteDesde": nextVoucherNumber,
"CbteHasta": nextVoucherNumber,
"CbteFch": fechaActualYYYYMMDD,
"ImpTotal": importeNeto + importeIVA,
"ImpTotConc": 0,
"ImpNeto": importeNeto,
"ImpOpEx": 0,
"ImpIVA": importeIVA,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": condicionIVAReceptorId,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": importeNeto,
"Importe": importeIVA
}
]
}
}
}
}
}
}
7. Extraer el detalle de la respuesta:
- `FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CAE`
- `FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CAEFchVto`
- `FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CbteDesde`
8. Devolver JSON al componente:
{
"success": true,
"voucherNumber": "...",
"cae": "...",
"caeExpiration": "..."
}
Manejo de errores:
- Si falta el access token, mostrar "Falta configurar AFIP_SDK_ACCESS_TOKEN".
- Si ARCA devuelve error, mostrar el mensaje de ARCA.
- Si aparece error 10016, mostrar "El número de comprobante no es el próximo a autorizar. Reintentá la emisión".
- Si aparece error 10242, mostrar "Falta completar la condición IVA receptor".
Dejá valores iniciales cargados para probar rápido en ambiente `dev`.
```
## Configurar variables de entorno
Cuando exportes el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada del entorno donde corra Next.js.
No uses variables públicas como `NEXT_PUBLIC_AFIP_SDK_ACCESS_TOKEN`. Todo lo que empieza con `NEXT_PUBLIC_` puede quedar visible en el navegador.
## Probar la emisión
Con los valores iniciales, la pantalla debería emitir una Factura B de prueba por $121 en ambiente `dev`.
Al finalizar, deberías ver:
- Número de comprobante
- CAE
- Vencimiento del CAE
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en Anything description: Usando el padrón alcance 13 de ARCA category: [Anything] pubDate: may 30, 2026 cover: /images/blog/obtener-informacion-de-un-dni-en-anything-cover.png ---
# Obtener información de un DNI en Anything
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Anything** que genere una app para consultar información asociada a un DNI usando el web service de padrón alcance 13 (`ws_sr_padron_a13`) a través de Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a Anything
- El DNI que querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Anything
La instrucción principal para Anything es que no deje el token en la pantalla. Todo lo que se conecta con Afip SDK API debe quedar en backend.
Creá un nuevo proyecto.
## Prompt listo para pegar en Anything
Pegá este prompt:
```md
Quiero crear una app para obtener información de un DNI usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App full-stack
- Frontend para cargar datos
- Backend privado para llamar a Afip SDK API
- Pantalla de resultado y errores
Objetivo:
- Consultar el CUIT asociado a un DNI.
- Usar el web service `ws_sr_padron_a13`.
- Consultar los datos de la persona con el CUIT obtenido.
- Mostrar la información en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- El frontend no debe llamar directamente a Afip SDK API.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar información de un DNI".
- Campo DNI, default 30111222.
- Botón "Consultar DNI".
- Estado de carga.
- Resultado con CUIT encontrado y datos principales de la persona.
- Mensaje de error claro si no se encuentra información.
Backend:
Crear un endpoint privado `/api/personas/dni`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
Guardar de la respuesta:
- token
- sign
2. Obtener el CUIT a partir del DNI:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"documento": dni
}
}
Tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
3. Obtener la información usando ese CUIT:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitEncontrado
}
}
4. Devolver al frontend:
{
"success": true,
"dni": dni,
"taxId": cuitEncontrado,
"person": respuestaDeGetPersona
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si no se encuentra CUIT para el DNI, mostrar "No se encontró una persona asociada a ese DNI".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Configurá `AFIP_SDK_ACCESS_TOKEN` como secret o variable privada del proyecto.
No lo pongas en la pantalla ni en código que se ejecute en el navegador. El backend debe leerlo desde el entorno.
## Probar la consulta
Con el DNI inicial, Anything debería consultar primero el CUIT asociado y después mostrar los datos disponibles en padrón alcance 13.
Al finalizar, la pantalla debe mostrar:
- DNI consultado
- CUIT encontrado
- Datos principales de la persona
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en Base44 description: Usando el padrón alcance 13 de ARCA category: [Base44] pubDate: may 30, 2026 cover: /images/blog/obtener-informacion-de-un-dni-en-base44-cover.png ---
# Obtener información de un DNI en Base44
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Base44** que genere una app para consultar información asociada a un DNI usando el web service de padrón alcance 13 (`ws_sr_padron_a13`) a través de Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Base44](https://base44.com/)
- El DNI que querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Base44
Base44 puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para conectarte con ARCA, pedile explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Base44, creá un nuevo proyecto.
## Prompt listo para pegar en Base44
Pegá este prompt:
```md
Quiero crear una app para obtener información de un DNI usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App web generada en Base44
- Función server-side, Edge Function o endpoint backend privado
- Frontend para cargar datos y ver resultados
Objetivo:
- Consultar el CUIT asociado a un DNI.
- Usar el web service `ws_sr_padron_a13`.
- Consultar los datos de la persona con el CUIT obtenido.
- Mostrar la información en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar información de un DNI".
- Campo DNI, default 30111222.
- Botón "Consultar DNI".
- Estado de carga.
- Resultado con CUIT encontrado y datos principales de la persona.
- Mensaje de error claro si no se encuentra información.
Backend:
Crear un endpoint privado `/api/personas/dni`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
Guardar de la respuesta:
- token
- sign
2. Obtener el CUIT a partir del DNI:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"documento": dni
}
}
Tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
3. Obtener la información usando ese CUIT:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitEncontrado
}
}
4. Devolver al frontend:
{
"success": true,
"dni": dni,
"taxId": cuitEncontrado,
"person": respuestaDeGetPersona
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si no se encuentra CUIT para el DNI, mostrar "No se encontró una persona asociada a ese DNI".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Base44.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la consulta
Con el DNI inicial, Base44 debería consultar primero el CUIT asociado y después mostrar los datos disponibles en padrón alcance 13.
Al finalizar, la pantalla debe mostrar:
- DNI consultado
- CUIT encontrado
- Datos principales de la persona
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en Bolt.new description: Usando el padrón alcance 13 de ARCA category: [Bolt] pubDate: may 30, 2026 cover: /images/blog/obtener-informacion-de-un-dni-en-bolt-new-cover.png ---
# Obtener información de un DNI en Bolt.new
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Bolt.new** que genere una app para consultar información asociada a un DNI usando el web service de padrón alcance 13 (`ws_sr_padron_a13`) a través de Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [Bolt.new](https://bolt.new/)
- El DNI que querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Bolt.new
Bolt.new puede generar una app completa a partir de una descripción. Para este caso, conviene pedirle una app full-stack: pantalla para cargar datos y endpoint backend para llamar a Afip SDK.
Creá un nuevo proyecto en Bolt.new.
## Prompt listo para pegar en Bolt.new
Pegá este prompt:
```md
Quiero crear una app para obtener información de un DNI usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App full-stack generada por Bolt.new
- Frontend con formulario
- Endpoint backend privado
- Manejo de loading, success y error
Objetivo:
- Consultar el CUIT asociado a un DNI.
- Usar el web service `ws_sr_padron_a13`.
- Consultar los datos de la persona con el CUIT obtenido.
- Mostrar la información en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- El access token de Afip SDK debe estar solo en backend.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar información de un DNI".
- Campo DNI, default 30111222.
- Botón "Consultar DNI".
- Estado de carga.
- Resultado con CUIT encontrado y datos principales de la persona.
- Mensaje de error claro si no se encuentra información.
Backend:
Crear un endpoint privado `/api/personas/dni`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
Guardar de la respuesta:
- token
- sign
2. Obtener el CUIT a partir del DNI:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"documento": dni
}
}
Tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
3. Obtener la información usando ese CUIT:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitEncontrado
}
}
4. Devolver al frontend:
{
"success": true,
"dni": dni,
"taxId": cuitEncontrado,
"person": respuestaDeGetPersona
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si no se encuentra CUIT para el DNI, mostrar "No se encontró una persona asociada a ese DNI".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Cuando Bolt.new genere el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada.
No lo guardes en el frontend ni en archivos públicos. El endpoint backend debe leerlo desde el entorno.
## Probar la consulta
Con el DNI inicial, Bolt.new debería consultar primero el CUIT asociado y después mostrar los datos disponibles en padrón alcance 13.
Al finalizar, la pantalla debe mostrar:
- DNI consultado
- CUIT encontrado
- Datos principales de la persona
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en Lovable description: Usando el padrón alcance 13 de ARCA category: [Lovable] pubDate: may 30, 2026 cover: /images/blog/obtener-informacion-de-un-dni-en-lovable-cover.png ---
# Obtener información de un DNI en Lovable
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Lovable** que genere una app para consultar información asociada a un DNI usando el web service de padrón alcance 13 (`ws_sr_padron_a13`) a través de Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Lovable](https://lovable.dev/)
- El DNI que querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Lovable
Lovable puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para conectarte con ARCA, pedile explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Lovable, creá un nuevo proyecto.
## Prompt listo para pegar en Lovable
Pegá este prompt:
```md
Quiero crear una app para obtener información de un DNI usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App web generada en Lovable
- Función server-side, Edge Function o endpoint backend privado
- Frontend para cargar datos y ver resultados
Objetivo:
- Consultar el CUIT asociado a un DNI.
- Usar el web service `ws_sr_padron_a13`.
- Consultar los datos de la persona con el CUIT obtenido.
- Mostrar la información en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar información de un DNI".
- Campo DNI, default 30111222.
- Botón "Consultar DNI".
- Estado de carga.
- Resultado con CUIT encontrado y datos principales de la persona.
- Mensaje de error claro si no se encuentra información.
Backend:
Crear un endpoint privado `/api/personas/dni`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
Guardar de la respuesta:
- token
- sign
2. Obtener el CUIT a partir del DNI:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"documento": dni
}
}
Tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
3. Obtener la información usando ese CUIT:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitEncontrado
}
}
4. Devolver al frontend:
{
"success": true,
"dni": dni,
"taxId": cuitEncontrado,
"person": respuestaDeGetPersona
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si no se encuentra CUIT para el DNI, mostrar "No se encontró una persona asociada a ese DNI".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Lovable.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la consulta
Con el DNI inicial, Lovable debería consultar primero el CUIT asociado y después mostrar los datos disponibles en padrón alcance 13.
Al finalizar, la pantalla debe mostrar:
- DNI consultado
- CUIT encontrado
- Datos principales de la persona
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en Replit description: Usando el padrón alcance 13 de ARCA category: [Replit] pubDate: may 30, 2026 cover: /images/blog/obtener-informacion-de-un-dni-en-replit-cover.png ---
# Obtener información de un DNI en Replit
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Replit** que genere una app para consultar información asociada a un DNI usando el web service de padrón alcance 13 (`ws_sr_padron_a13`) a través de Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener una cuenta en [Replit](https://replit.com/) y crear un Repl de Node.js
- El DNI que querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Configurar el proyecto en Replit
Creá un nuevo Repl de Node.js.
Antes de pedirle a Replit Agent que genere la app, agregá estos secrets desde **Tools > Secrets**:
- `AFIP_SDK_ACCESS_TOKEN`: tu access_token de Afip SDK
- `AFIP_TAX_ID`: `20409378472`
- `AFIP_ENVIRONMENT`: `dev`
## Prompt listo para pegar en Replit
Abrí Replit Agent y pegá este prompt:
```md
Quiero crear una app para obtener información de un DNI usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- Node.js
- Express
- Frontend simple con HTML, CSS y JavaScript
- Backend Express para llamar a Afip SDK API
Crear estos archivos:
- `package.json`
- `server.js`
- `public/index.html`
- `public/styles.css`
- `public/app.js`
Objetivo:
- Consultar el CUIT asociado a un DNI.
- Usar el web service `ws_sr_padron_a13`.
- Consultar los datos de la persona con el CUIT obtenido.
- Mostrar la información en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá `process.env.AFIP_SDK_ACCESS_TOKEN` solo en el backend Express.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar información de un DNI".
- Campo DNI, default 30111222.
- Botón "Consultar DNI".
- Estado de carga.
- Resultado con CUIT encontrado y datos principales de la persona.
- Mensaje de error claro si no se encuentra información.
Backend:
Crear un endpoint privado `/api/personas/dni`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
Guardar de la respuesta:
- token
- sign
2. Obtener el CUIT a partir del DNI:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"documento": dni
}
}
Tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
3. Obtener la información usando ese CUIT:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitEncontrado
}
}
4. Devolver al frontend:
{
"success": true,
"dni": dni,
"taxId": cuitEncontrado,
"person": respuestaDeGetPersona
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si no se encuentra CUIT para el DNI, mostrar "No se encontró una persona asociada a ese DNI".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Si Replit Agent no tomó los secrets al primer intento, abrí **Tools > Secrets** y confirmá que `AFIP_SDK_ACCESS_TOKEN` exista.
El token no debe aparecer en `public/index.html`, `public/app.js` ni en ningún archivo que se ejecute en el navegador.
## Probar la consulta
Con el DNI inicial, Replit debería consultar primero el CUIT asociado y después mostrar los datos disponibles en padrón alcance 13.
Al finalizar, la pantalla debe mostrar:
- DNI consultado
- CUIT encontrado
- Datos principales de la persona
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en v0 description: Usando el padrón alcance 13 de ARCA category: [v0] pubDate: may 30, 2026 cover: /images/blog/obtener-informacion-de-un-dni-en-v0-cover.png ---
# Obtener información de un DNI en v0
Si todavía no viste cómo funciona esta consulta mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **v0** que genere una app para consultar información asociada a un DNI usando el web service de padrón alcance 13 (`ws_sr_padron_a13`) a través de Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [v0](https://v0.dev/) y un proyecto Next.js
- El DNI que querés consultar
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en v0
v0 suele trabajar muy bien con componentes React y proyectos Next.js. Para este caso, pedile que no haga la llamada desde el componente, sino desde un Route Handler privado.
Creá un proyecto nuevo o abrí tu proyecto Next.js.
## Prompt listo para pegar en v0
Pegá este prompt:
```md
Quiero crear una app para obtener información de un DNI usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- Next.js App Router
- React
- TypeScript
- Route Handler privado en `/app/api/.../route.ts`
Objetivo:
- Consultar el CUIT asociado a un DNI.
- Usar el web service `ws_sr_padron_a13`.
- Consultar los datos de la persona con el CUIT obtenido.
- Mostrar la información en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usar `process.env.AFIP_SDK_ACCESS_TOKEN` solo en el Route Handler.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Consultar información de un DNI".
- Campo DNI, default 30111222.
- Botón "Consultar DNI".
- Estado de carga.
- Resultado con CUIT encontrado y datos principales de la persona.
- Mensaje de error claro si no se encuentra información.
Backend:
Crear un endpoint privado `/api/personas/dni`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
Guardar de la respuesta:
- token
- sign
2. Obtener el CUIT a partir del DNI:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"documento": dni
}
}
Tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
3. Obtener la información usando ese CUIT:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": token,
"sign": sign,
"cuitRepresentada": "20409378472",
"idPersona": cuitEncontrado
}
}
4. Devolver al frontend:
{
"success": true,
"dni": dni,
"taxId": cuitEncontrado,
"person": respuestaDeGetPersona
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si no se encuentra CUIT para el DNI, mostrar "No se encontró una persona asociada a ese DNI".
- Si ARCA devuelve "No existe persona con ese ID", mostrar ese mensaje de forma clara.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Cuando exportes el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada del entorno donde corra Next.js.
No uses variables públicas como `NEXT_PUBLIC_AFIP_SDK_ACCESS_TOKEN`. Todo lo que empieza con `NEXT_PUBLIC_` puede quedar visible en el navegador.
## Probar la consulta
Con el DNI inicial, v0 debería consultar primero el CUIT asociado y después mostrar los datos disponibles en padrón alcance 13.
Al finalizar, la pantalla debe mostrar:
- DNI consultado
- CUIT encontrado
- Datos principales de la persona
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Realizar constatación de comprobantes de ARCA en Anything description: Validá comprobantes usando Afip SDK API category: [Anything] pubDate: may 30, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-anything-cover.png ---
# Realizar constatación de comprobantes de ARCA en Anything
Si todavía no viste cómo funciona la constatación mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Anything** que genere una app para constatar comprobantes de ARCA usando el web service `wscdc` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a Anything
- Los datos del comprobante a constatar: CUIT emisor, punto de venta, tipo, número, fecha, importe y CAE/CAI
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Anything
La instrucción principal para Anything es que no deje el token en la pantalla. Todo lo que se conecta con Afip SDK API debe quedar en backend.
Creá un nuevo proyecto.
## Prompt listo para pegar en Anything
Pegá este prompt:
```md
Quiero crear una app para constatar comprobantes de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App full-stack
- Frontend para cargar datos
- Backend privado para llamar a Afip SDK API
- Pantalla de resultado y errores
Objetivo:
- Validar si un comprobante fue autorizado por ARCA.
- Usar el web service `wscdc`.
- Ejecutar el método `ComprobanteConstatar`.
- Mostrar el resultado de la constatación en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- El frontend no debe llamar directamente a Afip SDK API.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Constatar comprobante de ARCA".
- Formulario con:
- Modo de comprobante, default CAE.
- CUIT emisor, default 20409378472.
- Punto de venta, default 1.
- Tipo de comprobante, default 11.
- Número de comprobante, default 3850.
- Fecha de comprobante, default 20250225.
- Importe total, default 100.
- Código de autorización, default 75082223003046.
- Tipo de documento receptor, default 80.
- Número de documento receptor, default 33693450239.
- Botón "Constatar comprobante".
- Resultado con estado Aprobado/Rechazado, fecha de proceso y detalle devuelto por ARCA.
Backend:
Crear un endpoint privado `/api/comprobantes/constatar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
Guardar de la respuesta:
- token
- sign
2. Constatar el comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": cbteModo,
"CuitEmisor": cuitEmisor,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante,
"CbteNro": numeroDeComprobante,
"CbteFch": fechaDeComprobante,
"ImpTotal": importeTotal,
"CodAutorizacion": codigoDeAutorizacion,
"DocTipoReceptor": docTipoReceptor,
"DocNroReceptor": docNroReceptor
}
}
}
3. Leer `ComprobanteConstatarResult` y devolver al frontend:
{
"success": true,
"result": Resultado,
"processDate": FchProceso,
"voucher": CmpResp,
"raw": respuestaCompleta
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `Resultado: R`, mostrar que el comprobante fue rechazado y enseñar el detalle devuelto.
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Configurá `AFIP_SDK_ACCESS_TOKEN` como secret o variable privada del proyecto.
No lo pongas en la pantalla ni en código que se ejecute en el navegador. El backend debe leerlo desde el entorno.
## Probar la constatación
Con los valores iniciales, Anything debería enviar la solicitud a `wscdc` y mostrar el resultado de la constatación.
Al finalizar, la pantalla debe mostrar:
- Resultado de ARCA
- Fecha de proceso
- Datos del comprobante constatado
## Problemas comunes
Recordá que en ambiente de desarrollo solo podés constatar comprobantes emitidos en ese mismo entorno.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Realizar constatación de comprobantes de ARCA en Base44 description: Validá comprobantes usando Afip SDK API category: [Base44] pubDate: may 30, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-base44-cover.png ---
# Realizar constatación de comprobantes de ARCA en Base44
Si todavía no viste cómo funciona la constatación mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Base44** que genere una app para constatar comprobantes de ARCA usando el web service `wscdc` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Base44](https://base44.com/)
- Los datos del comprobante a constatar: CUIT emisor, punto de venta, tipo, número, fecha, importe y CAE/CAI
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Base44
Base44 puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para conectarte con ARCA, pedile explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Base44, creá un nuevo proyecto.
## Prompt listo para pegar en Base44
Pegá este prompt:
```md
Quiero crear una app para constatar comprobantes de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App web generada en Base44
- Función server-side, Edge Function o endpoint backend privado
- Frontend para cargar datos y ver resultados
Objetivo:
- Validar si un comprobante fue autorizado por ARCA.
- Usar el web service `wscdc`.
- Ejecutar el método `ComprobanteConstatar`.
- Mostrar el resultado de la constatación en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Constatar comprobante de ARCA".
- Formulario con:
- Modo de comprobante, default CAE.
- CUIT emisor, default 20409378472.
- Punto de venta, default 1.
- Tipo de comprobante, default 11.
- Número de comprobante, default 3850.
- Fecha de comprobante, default 20250225.
- Importe total, default 100.
- Código de autorización, default 75082223003046.
- Tipo de documento receptor, default 80.
- Número de documento receptor, default 33693450239.
- Botón "Constatar comprobante".
- Resultado con estado Aprobado/Rechazado, fecha de proceso y detalle devuelto por ARCA.
Backend:
Crear un endpoint privado `/api/comprobantes/constatar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
Guardar de la respuesta:
- token
- sign
2. Constatar el comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": cbteModo,
"CuitEmisor": cuitEmisor,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante,
"CbteNro": numeroDeComprobante,
"CbteFch": fechaDeComprobante,
"ImpTotal": importeTotal,
"CodAutorizacion": codigoDeAutorizacion,
"DocTipoReceptor": docTipoReceptor,
"DocNroReceptor": docNroReceptor
}
}
}
3. Leer `ComprobanteConstatarResult` y devolver al frontend:
{
"success": true,
"result": Resultado,
"processDate": FchProceso,
"voucher": CmpResp,
"raw": respuestaCompleta
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `Resultado: R`, mostrar que el comprobante fue rechazado y enseñar el detalle devuelto.
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Base44.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la constatación
Con los valores iniciales, Base44 debería enviar la solicitud a `wscdc` y mostrar el resultado de la constatación.
Al finalizar, la pantalla debe mostrar:
- Resultado de ARCA
- Fecha de proceso
- Datos del comprobante constatado
## Problemas comunes
Recordá que en ambiente de desarrollo solo podés constatar comprobantes emitidos en ese mismo entorno.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Realizar constatación de comprobantes de ARCA en Bolt.new description: Validá comprobantes usando Afip SDK API category: [Bolt] pubDate: may 30, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-bolt-new-cover.png ---
# Realizar constatación de comprobantes de ARCA en Bolt.new
Si todavía no viste cómo funciona la constatación mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Bolt.new** que genere una app para constatar comprobantes de ARCA usando el web service `wscdc` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [Bolt.new](https://bolt.new/)
- Los datos del comprobante a constatar: CUIT emisor, punto de venta, tipo, número, fecha, importe y CAE/CAI
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Bolt.new
Bolt.new puede generar una app completa a partir de una descripción. Para este caso, conviene pedirle una app full-stack: pantalla para cargar datos y endpoint backend para llamar a Afip SDK.
Creá un nuevo proyecto en Bolt.new.
## Prompt listo para pegar en Bolt.new
Pegá este prompt:
```md
Quiero crear una app para constatar comprobantes de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App full-stack generada por Bolt.new
- Frontend con formulario
- Endpoint backend privado
- Manejo de loading, success y error
Objetivo:
- Validar si un comprobante fue autorizado por ARCA.
- Usar el web service `wscdc`.
- Ejecutar el método `ComprobanteConstatar`.
- Mostrar el resultado de la constatación en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- El access token de Afip SDK debe estar solo en backend.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Constatar comprobante de ARCA".
- Formulario con:
- Modo de comprobante, default CAE.
- CUIT emisor, default 20409378472.
- Punto de venta, default 1.
- Tipo de comprobante, default 11.
- Número de comprobante, default 3850.
- Fecha de comprobante, default 20250225.
- Importe total, default 100.
- Código de autorización, default 75082223003046.
- Tipo de documento receptor, default 80.
- Número de documento receptor, default 33693450239.
- Botón "Constatar comprobante".
- Resultado con estado Aprobado/Rechazado, fecha de proceso y detalle devuelto por ARCA.
Backend:
Crear un endpoint privado `/api/comprobantes/constatar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
Guardar de la respuesta:
- token
- sign
2. Constatar el comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": cbteModo,
"CuitEmisor": cuitEmisor,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante,
"CbteNro": numeroDeComprobante,
"CbteFch": fechaDeComprobante,
"ImpTotal": importeTotal,
"CodAutorizacion": codigoDeAutorizacion,
"DocTipoReceptor": docTipoReceptor,
"DocNroReceptor": docNroReceptor
}
}
}
3. Leer `ComprobanteConstatarResult` y devolver al frontend:
{
"success": true,
"result": Resultado,
"processDate": FchProceso,
"voucher": CmpResp,
"raw": respuestaCompleta
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `Resultado: R`, mostrar que el comprobante fue rechazado y enseñar el detalle devuelto.
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Cuando Bolt.new genere el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada.
No lo guardes en el frontend ni en archivos públicos. El endpoint backend debe leerlo desde el entorno.
## Probar la constatación
Con los valores iniciales, Bolt.new debería enviar la solicitud a `wscdc` y mostrar el resultado de la constatación.
Al finalizar, la pantalla debe mostrar:
- Resultado de ARCA
- Fecha de proceso
- Datos del comprobante constatado
## Problemas comunes
Recordá que en ambiente de desarrollo solo podés constatar comprobantes emitidos en ese mismo entorno.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Realizar constatación de comprobantes de ARCA en Lovable description: Validá comprobantes usando Afip SDK API category: [Lovable] pubDate: may 30, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-lovable-cover.png ---
# Realizar constatación de comprobantes de ARCA en Lovable
Si todavía no viste cómo funciona la constatación mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Lovable** que genere una app para constatar comprobantes de ARCA usando el web service `wscdc` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener un proyecto en [Lovable](https://lovable.dev/)
- Los datos del comprobante a constatar: CUIT emisor, punto de venta, tipo, número, fecha, importe y CAE/CAI
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en Lovable
Lovable puede generar la interfaz visual y la lógica de backend a partir de un prompt. Para conectarte con ARCA, pedile explícitamente que el `access_token` quede en una función server-side o endpoint privado.
En Lovable, creá un nuevo proyecto.
## Prompt listo para pegar en Lovable
Pegá este prompt:
```md
Quiero crear una app para constatar comprobantes de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- App web generada en Lovable
- Función server-side, Edge Function o endpoint backend privado
- Frontend para cargar datos y ver resultados
Objetivo:
- Validar si un comprobante fue autorizado por ARCA.
- Usar el web service `wscdc`.
- Ejecutar el método `ComprobanteConstatar`.
- Mostrar el resultado de la constatación en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá una función server-side, Edge Function o endpoint backend privado.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Constatar comprobante de ARCA".
- Formulario con:
- Modo de comprobante, default CAE.
- CUIT emisor, default 20409378472.
- Punto de venta, default 1.
- Tipo de comprobante, default 11.
- Número de comprobante, default 3850.
- Fecha de comprobante, default 20250225.
- Importe total, default 100.
- Código de autorización, default 75082223003046.
- Tipo de documento receptor, default 80.
- Número de documento receptor, default 33693450239.
- Botón "Constatar comprobante".
- Resultado con estado Aprobado/Rechazado, fecha de proceso y detalle devuelto por ARCA.
Backend:
Crear un endpoint privado `/api/comprobantes/constatar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
Guardar de la respuesta:
- token
- sign
2. Constatar el comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": cbteModo,
"CuitEmisor": cuitEmisor,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante,
"CbteNro": numeroDeComprobante,
"CbteFch": fechaDeComprobante,
"ImpTotal": importeTotal,
"CodAutorizacion": codigoDeAutorizacion,
"DocTipoReceptor": docTipoReceptor,
"DocNroReceptor": docNroReceptor
}
}
}
3. Leer `ComprobanteConstatarResult` y devolver al frontend:
{
"success": true,
"result": Resultado,
"processDate": FchProceso,
"voucher": CmpResp,
"raw": respuestaCompleta
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `Resultado: R`, mostrar que el comprobante fue rechazado y enseñar el detalle devuelto.
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Después de generar la app, configurá `AFIP_SDK_ACCESS_TOKEN` en los secrets o variables privadas del proyecto de Lovable.
No pegues el token en un campo visible de la pantalla ni dentro de un componente React. El token solo debe vivir en el backend.
## Probar la constatación
Con los valores iniciales, Lovable debería enviar la solicitud a `wscdc` y mostrar el resultado de la constatación.
Al finalizar, la pantalla debe mostrar:
- Resultado de ARCA
- Fecha de proceso
- Datos del comprobante constatado
## Problemas comunes
Recordá que en ambiente de desarrollo solo podés constatar comprobantes emitidos en ese mismo entorno.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Realizar constatación de comprobantes de ARCA en Replit description: Validá comprobantes usando Afip SDK API category: [Replit] pubDate: may 30, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-replit-cover.png ---
# Realizar constatación de comprobantes de ARCA en Replit
Si todavía no viste cómo funciona la constatación mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **Replit** que genere una app para constatar comprobantes de ARCA usando el web service `wscdc` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener una cuenta en [Replit](https://replit.com/) y crear un Repl de Node.js
- Los datos del comprobante a constatar: CUIT emisor, punto de venta, tipo, número, fecha, importe y CAE/CAI
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Configurar el proyecto en Replit
Creá un nuevo Repl de Node.js.
Antes de pedirle a Replit Agent que genere la app, agregá estos secrets desde **Tools > Secrets**:
- `AFIP_SDK_ACCESS_TOKEN`: tu access_token de Afip SDK
- `AFIP_TAX_ID`: `20409378472`
- `AFIP_ENVIRONMENT`: `dev`
## Prompt listo para pegar en Replit
Abrí Replit Agent y pegá este prompt:
```md
Quiero crear una app para constatar comprobantes de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- Node.js
- Express
- Frontend simple con HTML, CSS y JavaScript
- Backend Express para llamar a Afip SDK API
Crear estos archivos:
- `package.json`
- `server.js`
- `public/index.html`
- `public/styles.css`
- `public/app.js`
Objetivo:
- Validar si un comprobante fue autorizado por ARCA.
- Usar el web service `wscdc`.
- Ejecutar el método `ComprobanteConstatar`.
- Mostrar el resultado de la constatación en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usá `process.env.AFIP_SDK_ACCESS_TOKEN` solo en el backend Express.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Constatar comprobante de ARCA".
- Formulario con:
- Modo de comprobante, default CAE.
- CUIT emisor, default 20409378472.
- Punto de venta, default 1.
- Tipo de comprobante, default 11.
- Número de comprobante, default 3850.
- Fecha de comprobante, default 20250225.
- Importe total, default 100.
- Código de autorización, default 75082223003046.
- Tipo de documento receptor, default 80.
- Número de documento receptor, default 33693450239.
- Botón "Constatar comprobante".
- Resultado con estado Aprobado/Rechazado, fecha de proceso y detalle devuelto por ARCA.
Backend:
Crear un endpoint privado `/api/comprobantes/constatar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
Guardar de la respuesta:
- token
- sign
2. Constatar el comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": cbteModo,
"CuitEmisor": cuitEmisor,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante,
"CbteNro": numeroDeComprobante,
"CbteFch": fechaDeComprobante,
"ImpTotal": importeTotal,
"CodAutorizacion": codigoDeAutorizacion,
"DocTipoReceptor": docTipoReceptor,
"DocNroReceptor": docNroReceptor
}
}
}
3. Leer `ComprobanteConstatarResult` y devolver al frontend:
{
"success": true,
"result": Resultado,
"processDate": FchProceso,
"voucher": CmpResp,
"raw": respuestaCompleta
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `Resultado: R`, mostrar que el comprobante fue rechazado y enseñar el detalle devuelto.
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Si Replit Agent no tomó los secrets al primer intento, abrí **Tools > Secrets** y confirmá que `AFIP_SDK_ACCESS_TOKEN` exista.
El token no debe aparecer en `public/index.html`, `public/app.js` ni en ningún archivo que se ejecute en el navegador.
## Probar la constatación
Con los valores iniciales, Replit debería enviar la solicitud a `wscdc` y mostrar el resultado de la constatación.
Al finalizar, la pantalla debe mostrar:
- Resultado de ARCA
- Fecha de proceso
- Datos del comprobante constatado
## Problemas comunes
Recordá que en ambiente de desarrollo solo podés constatar comprobantes emitidos en ese mismo entorno.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Realizar constatación de comprobantes de ARCA en v0 description: Validá comprobantes usando Afip SDK API category: [v0] pubDate: may 30, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-v0-cover.png ---
# Realizar constatación de comprobantes de ARCA en v0
Si todavía no viste cómo funciona la constatación mediante la API, te recomiendo leer el artículo introductorio:
En este tutorial vamos a pedirle a **v0** que genere una app para constatar comprobantes de ARCA usando el web service `wscdc` y Afip SDK API.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Tener acceso a [v0](https://v0.dev/) y un proyecto Next.js
- Los datos del comprobante a constatar: CUIT emisor, punto de venta, tipo, número, fecha, importe y CAE/CAI
- Configurar el token como variable privada o secret
Para usar los web services de ARCA se requiere un certificado digital. Con Afip SDK podés integrarte en modo desarrollo usando el CUIT `20409378472` sin obtener un certificado propio.
Cuando quieras usar tu CUIT, podés seguir la guía para [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Crear el proyecto en v0
v0 suele trabajar muy bien con componentes React y proyectos Next.js. Para este caso, pedile que no haga la llamada desde el componente, sino desde un Route Handler privado.
Creá un proyecto nuevo o abrí tu proyecto Next.js.
## Prompt listo para pegar en v0
Pegá este prompt:
```md
Quiero crear una app para constatar comprobantes de ARCA usando Afip SDK API.
Necesito que generes toda la implementación lista para usar.
Stack:
- Next.js App Router
- React
- TypeScript
- Route Handler privado en `/app/api/.../route.ts`
Objetivo:
- Validar si un comprobante fue autorizado por ARCA.
- Usar el web service `wscdc`.
- Ejecutar el método `ComprobanteConstatar`.
- Mostrar el resultado de la constatación en pantalla.
Reglas importantes:
- No llames a Afip SDK API desde componentes frontend.
- No expongas el access token en el navegador.
- Usar `process.env.AFIP_SDK_ACCESS_TOKEN` solo en el Route Handler.
- Usá ambiente de desarrollo: `dev`.
- Usá CUIT de desarrollo: `20409378472`.
Variables privadas que debo configurar:
- AFIP_SDK_ACCESS_TOKEN: mi access_token de Afip SDK.
- AFIP_TAX_ID: 20409378472.
- AFIP_ENVIRONMENT: dev.
Pantalla:
- Título: "Constatar comprobante de ARCA".
- Formulario con:
- Modo de comprobante, default CAE.
- CUIT emisor, default 20409378472.
- Punto de venta, default 1.
- Tipo de comprobante, default 11.
- Número de comprobante, default 3850.
- Fecha de comprobante, default 20250225.
- Importe total, default 100.
- Código de autorización, default 75082223003046.
- Tipo de documento receptor, default 80.
- Número de documento receptor, default 33693450239.
- Botón "Constatar comprobante".
- Resultado con estado Aprobado/Rechazado, fecha de proceso y detalle devuelto por ARCA.
Backend:
Crear un endpoint privado `/api/comprobantes/constatar`.
El endpoint debe hacer todo este flujo:
1. Obtener autorización:
POST https://app.afipsdk.com/api/v1/afip/auth
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
Guardar de la respuesta:
- token
- sign
2. Constatar el comprobante:
POST https://app.afipsdk.com/api/v1/afip/requests
Headers:
Authorization: Bearer ${process.env.AFIP_SDK_ACCESS_TOKEN}
Content-Type: application/json
Body:
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": token,
"Sign": sign,
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": cbteModo,
"CuitEmisor": cuitEmisor,
"PtoVta": puntoDeVenta,
"CbteTipo": tipoDeComprobante,
"CbteNro": numeroDeComprobante,
"CbteFch": fechaDeComprobante,
"ImpTotal": importeTotal,
"CodAutorizacion": codigoDeAutorizacion,
"DocTipoReceptor": docTipoReceptor,
"DocNroReceptor": docNroReceptor
}
}
}
3. Leer `ComprobanteConstatarResult` y devolver al frontend:
{
"success": true,
"result": Resultado,
"processDate": FchProceso,
"voucher": CmpResp,
"raw": respuestaCompleta
}
Manejo de errores:
- Si falta `AFIP_SDK_ACCESS_TOKEN`, mostrar "Falta configurar el access_token de Afip SDK".
- Si ARCA devuelve `Resultado: R`, mostrar que el comprobante fue rechazado y enseñar el detalle devuelto.
- Si ARCA devuelve un error, mostrar el mensaje recibido.
- Loguear detalles en consola del servidor, pero no mostrar secrets.
Agregá estados de carga, éxito y error. Dejá la app lista para probar con los valores iniciales en ambiente `dev`.
```
## Configurar el token
Cuando exportes el proyecto, configurá `AFIP_SDK_ACCESS_TOKEN` como variable privada del entorno donde corra Next.js.
No uses variables públicas como `NEXT_PUBLIC_AFIP_SDK_ACCESS_TOKEN`. Todo lo que empieza con `NEXT_PUBLIC_` puede quedar visible en el navegador.
## Probar la constatación
Con los valores iniciales, v0 debería enviar la solicitud a `wscdc` y mostrar el resultado de la constatación.
Al finalizar, la pantalla debe mostrar:
- Resultado de ARCA
- Fecha de proceso
- Datos del comprobante constatado
## Problemas comunes
Recordá que en ambiente de desarrollo solo podés constatar comprobantes emitidos en ese mismo entorno.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Consultar Constancia de Inscripción de ARCA en n8n description: Obtené la constancia de inscripción en segundos desde un workflow. category: [n8n] pubDate: abr 29, 2026 cover: /images/blog/consultar-constancia-de-inscripcion-de-arca-en-n8n-cover.png ---
# Consultar Constancia de Inscripción de ARCA en n8n
Si todavía no viste cómo funciona este proceso mediante la API, te recomiendo leer el artículo introductorio:
En esta guía vas a importar un workflow de n8n que autentica contra el servicio `ws_sr_constancia_inscripcion` de ARCA y obtiene la constancia de inscripción de un CUIT específico utilizando Afip SDK.
Descargá el archivo [afip-sdk-constancia-de-inscripcion.json](/assets/blog/n8n/afip-sdk-constancia-de-inscripcion.json) para importarlo en tu espacio de trabajo.
---
Para operar con este web service necesitás un certificado digital. En modo desarrollo podés usar el CUIT `20409378472` que ofrece Afip SDK para pruebas sin certificados propios.
Cuando quieras usar tus credenciales oficiales, seguí la guía de [integración con certificados en n8n](https://docs.afipsdk.com/integracion/n8n#usar-tu-propio-certificado-opcional).
---
## Requisitos previos
Asegurate de contar con:
- [Un access_token de Afip SDK](https://app.afipsdk.com/).
- El CUIT de la persona o empresa cuya constancia querés consultar.
Vamos a usar los [nodos oficiales de Afip SDK](https://n8n.io/integrations/afip-sdk/), por lo tanto, deberás configurar el `credential` en n8n y setear tu ACCESS_TOKEN en cualquier nodo de AfipSdk con la opción `Set up credential` completando el campo `Bearer Token`.
---
## Índice
1. [Introducción](#introducción)
2. [Estructura del Workflow en n8n](#estructura-del-workflow-en-n8n)
3. [Paso a Paso de la Implementación](#paso-a-paso-de-la-implementación)
- [1. Nodo: manual_trigger](#1-nodo-manual_trigger)
- [2. Nodo: auth](#2-nodo-auth)
- [3. Nodo: obtener_datos](#3-nodo-obtener_datos)
- [4. Nodo: Convert to File](#4-nodo-convert-to-file)
4. [Personalizar la consulta](#personalizar-la-consulta)
5. [Problemas comunes](#problemas-comunes)
6. [Conclusiones](#conclusiones)
---
## Introducción
La constancia de inscripción es uno de los documentos más consultados por áreas de compliance y equipos comerciales. Afip SDK expone este servicio a través de nuestra [API de integración](https://docs.afipsdk.com/integracion/api) usando el web service `ws_sr_constancia_inscripcion`. El workflow de n8n que acompaña esta nota resuelve toda la cadena: autentica, consulta los datos del contribuyente y entrega un archivo listo para descargar o enviar.
---
## Estructura del Workflow en n8n
El flujo se compone de cuatro nodos:
1. **manual_trigger:** Permite iniciar la consulta manualmente.
2. **auth:** Realiza la autenticación en `ws_sr_constancia_inscripcion` y obtiene `token` y `sign`.
3. **obtener_datos:** Ejecuta el método `getPersona_v2` para traer la constancia.
4. **Convert to File:** Convierte la respuesta JSON en un archivo descargable.
En la imagen debajo puedes ver cómo luce visualmente el workflow, lo cual ayuda a comprender la secuencia de nodos.

---
## Paso a Paso de la Implementación
### 1. Nodo: manual_trigger
- **Función:** Ejecución manual desde n8n para probar el flujo o integrarlo a un disparador posterior.
- **Configuración:** No requiere ajustes adicionales.
---
### 2. Nodo: auth
- **Nodo**: Get authorization token (TA) de Afip SDK
- **Objetivo:** Generar las credenciales temporales (`Token` y `Sign`).
- **Body:**
```json
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_constancia_inscripcion"
}
```
- **Resultado esperado:** Obtendrás `token`, `sign` y `expirationTime` válidos para realizar la consulta.
---
### 3. Nodo: obtener_datos
- **Nodo**: Execute web service request de Afip SDK
- **Objetivo:** Consultar la constancia usando el método `getPersona_v2`.
- **Body:**
```json
{
"environment": "dev",
"method": "getPersona_v2",
"wsid": "ws_sr_constancia_inscripcion",
"params": {
"token": "{{$json.token}}",
"sign": "{{$json.sign}}",
"cuitRepresentada": "20409378472",
"idPersona": 33693450239
}
}
```
- **Resultado esperado:** La respuesta incluye la constancia completa (`datosGenerales`, `actividadMonotributo`, `impuestos`, etc.).
---
### 4. Nodo: Convert to File
- **Función:** Generar un archivo JSON con la respuesta del servicio.
- **Configuración:**
- **Operation:** `toJson`
- **Binary Property:** `result.json`
- **File Name:** `result.json`
- **Resultado:** Descargá el archivo desde la ejecución para compartirlo con otras áreas o almacenarlo en tu sistema.
---
## Personalizar la consulta
Modificá el campos `idPersona` dentro del nodo **obtener_datos** para apuntar al CUIT correcto.
---
## Problemas comunes
- **CUIT inexistente:** Si el servicio devuelve `personaNoRegistrada`, verificá que el CUIT esté correctamente tipeado.
- **Token inválido:** Los tokens caducan rápido. Si obtenés un `401` en el nodo **obtener_datos**, ejecutá nuevamente el nodo **auth**.
- **Permisos insuficientes:** En producción asegurate de que el certificado tenga habilitado el servicio `ws_sr_constancia_inscripcion` en ARCA.
---
## Conclusiones
Con este workflow podés automatizar la obtención de constancias de inscripción desde n8n sin escribir código. Adaptalo para enviarlo por correo, guardarlo en un CRM o habilitarlo como servicio interno para otros equipos.
Para recibir ayuda adicional o compartir mejoras, sumate a la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en n8n description: Con workflow para importar directamente en tu proyecto. category: [n8n] pubDate: abr 29, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-n8n-cover.png ---
# Crear Factura Electrónica de ARCA en n8n
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
A continuación te presento una guía completa para integrar la API de Afip SDK con los [nodos oficiales](https://n8n.io/integrations/afip-sdk/) en n8n. Esta guía está pensada para que comprendas el funcionamiento de cada nodo, cómo se comunica la información entre ellos y de qué manera se automatiza el proceso completo de generar una factura electrónica, incluyendo la obtención del último número de comprobante, la generación del código QR, la construcción del HTML y la creación y descarga del PDF.

Les dejo el [create-bill-sample.json](/assets/blog/n8n/create-bill-sample.json) para que puedan importar rápidamente este workflow en su proyecto antes de comenzar.
---
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/n8n#usar-tu-propio-certificado-opcional).
---
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Recordá configurar el `credential` en n8n y setear tu ACCESS_TOKEN en cualquier nodo de AfipSdk con la opción `Set up credential` completando el campo `Bearer Token`.
---
## Índice
1. [Introducción](#introducción)
2. [Estructura del Workflow en n8n](#estructura-del-workflow-en-n8n)
3. [Paso a Paso de la Implementación](#paso-a-paso-de-la-implementación)
- [1. Nodo: Manual Trigger](#1-nodo-manual-trigger)
- [2. Nodo: get_authorization](#2-nodo-get_authorization)
- [3. Nodo: get_last_voucher_number](#3-nodo-get_last_voucher_number)
- [4. Nodo: create_voucher](#4-nodo-create_voucher)
- [5. Nodo: Code (Generación del QR)](#5-nodo-code-generación-del-qr)
- [6. Nodo: generate_html](#6-nodo-generate_html)
- [7. Nodo: create_pdf](#7-nodo-create_pdf)
- [8. Nodo: download_pdf](#8-nodo-download_pdf)
5. [Problemas comunes](#problemas-comunes)
6. [Conclusiones y Consideraciones Finales](#conclusiones-y-consideraciones-finales)
---
## Introducción
La integración de la API de Afip SDK en plataformas de automatización como n8n permite agilizar y automatizar procesos de facturación electrónica. Para esto contamos con los [nodos oficiales](https://n8n.io/integrations/afip-sdk/) de Afip SDK para facilitar la tarea (escribe Afip SDK en el buscador de n8n). En este ejemplo, se crea un workflow que, al activarse manualmente, realiza las siguientes acciones:
- Autentica al usuario y obtiene los tokens necesarios.
- Consulta el último número de comprobante autorizado para calcular el siguiente número a utilizar.
- Solicita la creación del comprobante mediante la API de Afip.
- Genera un código QR con la información necesaria, formateándolo en base64 y linkeándolo a la URL oficial de consulta.
- Construye el documento HTML de la factura, incorporando datos dinámicos (por ejemplo: número de comprobante, CAE, fecha de vencimiento, etc.) y la imagen del QR.
- Llama a la API para convertir dicho HTML a PDF.
- Descarga el PDF resultante.
---
## Estructura del Workflow en n8n
El workflow se compone de los siguientes nodos conectados en cadena:
1. **Manual Trigger:** Punto de inicio para ejecutar el flujo.
2. **get_authorization:** Realiza una petición POST para obtener el token de autorización.
3. **get_last_voucher_number:** Consulta el último comprobante autorizado.
4. **create_voucher:** Envía la solicitud de creación del comprobante (FECAESolicitar), utilizando el número del comprobante calculado (último + 1).
5. **Code:** Nodo que ejecuta código JavaScript para preparar el texto del código QR.
6. **generate_html:** Construye el HTML de la factura utilizando valores dinámicos extraídos de los pasos anteriores.
7. **create_pdf:** Envía el HTML generado a la API de Afip SDK para convertirlo en un PDF.
8. **download_pdf:** Descarga el archivo PDF resultante.
En la imagen debajo puedes ver cómo luce visualmente el workflow, lo cual ayuda a comprender la secuencia de nodos.

---
## Paso a Paso de la Implementación
### 1. Nodo: Manual Trigger
- **Función:** Activa manualmente la ejecución del workflow.
- **Uso:** Útil para pruebas iniciales o ejecución bajo demanda.
- **Configuración:** No requiere parámetros adicionales.
---
### 2. Nodo: get_authorization
- **Nodo**: Get authorization token (TA) de Afip SDK
- **Objetivo:** Autenticar al usuario ante la API de Afip SDK.
- **Parámetros del cuerpo:**
```json
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe"
}
```
- **Resultado:** Devuelve las credenciales necesarias (Token y Sign) que serán utilizados en posteriores peticiones.
*Este paso es fundamental para establecer la comunicación segura con la API.*
---
### 3. Nodo: get_last_voucher_number
- **Nodo**: Execute web service request de Afip SDK
- **Objetivo:** Obtener el último número de comprobante autorizado.
- **Parámetros del cuerpo:**
Se define utilizando el método `FECompUltimoAutorizado`, junto a los datos de autenticación obtenidos en el paso anterior y los parámetros específicos como "PtoVta" y "CbteTipo".
Ejemplo (fragmento):
```json
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": "{{ $json.token }}",
"Sign": "{{ $json.sign }}",
"Cuit": "20409378472"
},
"PtoVta": 1,
"CbteTipo": 11
}
}
```
- **Resultado:** Se obtiene el número de comprobante (por ejemplo, `CbteNro`) del último comprobante autorizado. Luego, en el siguiente nodo se utilizará ese número incrementado en uno para la creación del comprobante.
---
### 4. Nodo: create_voucher
- **Nodo**: Execute web service request de Afip SDK
- **Objetivo:** Solicitar a Afip la autorización para emitir un nuevo comprobante.
- **Parámetros del cuerpo:**
Se define utilizando el método `FECAESolicitar` y se incorporan los datos de autorización, junto a los detalles específicos del comprobante.
Ejemplo de fragmento del JSON:
```json
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": "{{ $('get_authorization').item.json.token }}",
"Sign": "{{ $('get_authorization').item.json.sign }}",
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": 1,
"CbteTipo": 11
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": 1,
"DocTipo": 80,
"DocNro": 33693450239,
"CbteDesde": {{ $json.FECompUltimoAutorizadoResult.CbteNro + 1 }},
"CbteHasta": {{ $json.FECompUltimoAutorizadoResult.CbteNro + 1 }},
"CbteFch": {{ new Date(Date.now() - ((new Date()).getTimezoneOffset() * 60000)).toISOString().split('T')[0].replace(/-/g, '') }},
"ImpTotal": 100,
"ImpTotConc": 0,
"ImpNeto": 100,
"ImpOpEx": 0,
"ImpIVA": 0,
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": 1
}
}
}
}
}
```
- **Notas:**
- Se utiliza una expresión para calcular el número del comprobante como último número + 1.
- La fecha de emisión se obtiene dinámicamente y se adapta a la zona horaria local.
- **Resultado:** Se recibe la respuesta con datos del nuevo comprobante, entre ellos el número asignado y el CAE (Código de Autorización Electrónica), que serán esenciales en el paso siguiente.
---
### 5. Nodo: Code (Generación del QR)
- **Objetivo:** Construir el texto que se usará para generar el código QR, conforme a las especificaciones de Afip.
- **Descripción:**
Se define un objeto `QRCodeData` que contiene:
- Versión del formato
- Fecha de emisión
- CUIT del emisor
- Punto de venta y tipo de comprobante
- Número de comprobante
- Importe, moneda y cotización
- Datos del receptor
- Tipo y código de autorización (utilizando el CAE obtenido)
Luego, el objeto se codifica a una cadena Base64 y se concatena en una URL oficial:
```js
const QRCodeData = {
'ver': 1,
'fecha': '2017-10-25', // Asegurarse de actualizar a la fecha real
'cuit': Number(12345678912),
'ptoVta': Number(1),
'tipoCmp': Number(6),
'nroCmp': Number(32),
'importe': Number(150),
'moneda': 'ARS',
'ctz': Number(1),
'tipoDocRec': Number(80),
'nroDocRec': Number(12345678912),
'tipoCodAut': 'E',
'codAut': Number($input.first().json.FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CAE)
};
const QRCodeText = 'https://www.afip.gob.ar/fe/qr/?p=' + Buffer.from(JSON.stringify(QRCodeData)).toString('base64');
return [{
qr_code_text: QRCodeText
}];
```
- **Resultado:** El nodo devuelve una propiedad `qr_code_text` que contiene el enlace completo para la generación del código QR, listo para incorporarse en el HTML de la factura.
---
### 6. Nodo: generate_html
- **Objetivo:** Construir el documento HTML que representa la factura electrónica.
- **Detalle de la Implementación:**
- Se utiliza un nodo HTML en n8n donde se define una plantilla HTML con estilos y estructura propia.
- Se incluyen expresiones dinámicas para insertar datos específicos, por ejemplo:
- Número de comprobante: `{{ $('create_voucher').item.json.FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CbteDesde }}`
- CAE: `{{ $('create_voucher').item.json.FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CAE }}`
- Fecha de vencimiento del CAE: `{{ $('create_voucher').item.json.FECAESolicitarResult.FeDetResp.FECAEDetResponse[0].CAEFchVto }}`
- Código QR: La imagen se genera mediante una URL de un servicio externo (por ejemplo, [qrserver.com](https://api.qrserver.com)) utilizando el `qr_code_text` generado en el nodo anterior:
```html
```
- **Resultado:** Se obtiene el HTML completo de la factura, que se utilizará para generar el PDF.
---
### 7. Nodo: create_pdf
- **Nodo**: Create PDF de Afip SDK
- **Objetivo:** Convertir el HTML generado en un archivo PDF.
- **Parámetros del cuerpo:**
El JSON enviado incluye:
- El HTML a procesar (serializado usando `JSON.stringify`).
- Nombre del archivo (por ejemplo, "Factura").
- Opciones de formato (configuración de márgenes, ancho, etc.).
Ejemplo de JSON:
```json
{
"html": "{{ JSON.stringify($json.html) }}",
"file_name": "Factura",
"options": {
"width": 8,
"marginLeft": 0.4,
"marginRight": 0.4,
"marginTop": 0.4,
"marginBottom": 0.4
}
}
```
- **Resultado:** La API devuelve una URL o identificador del PDF generado.
---
### 8. Nodo: download_pdf
- **Nodo**: HTTP Request
- **Objetivo:** Descargar el archivo PDF generado.
- **Parámetro clave:**
La URL del PDF se extrae de la respuesta del nodo anterior, utilizando expresiones como `={{ $json.file }}` para definir la URL en la solicitud.
- **Resultado:** Se descarga el PDF final, listo para su uso o almacenamiento.
---
## Problemas comunes
Si estas teniendo el error **(10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar** te recomiendo leer este artículo.
Si estas teniendo el error **(10242) El campo Condicion IVA receptor es obligatorio. Consular metodo FEParamGetCondicionIvaReceptor** te recomiendo leer este artículo.
---
## Conclusiones y Consideraciones Finales
**Aspectos a destacar:**
- **Integración Completa:** Cada nodo está diseñado para comunicarse y obtener datos necesarios en tiempo real. La autenticación, consulta y generación de comprobante se realizan de manera consecutiva.
- **Flexibilidad de n8n:** Permite incluir nodos de código personalizado (JavaScript) que facilitan el formateo y la transformación de datos, algo útil para la creación del código QR.
- **Uso de APIs Externas:** El nodo de creación de PDF se conecta a la API de Afip SDK para procesar el HTML, demostrando cómo n8n facilita la integración de servicios externos.
- **Automatización y Escalabilidad:** Este workflow puede programarse para ejecutarse automáticamente según las necesidades y adaptarse a flujos de trabajo más complejos.
Si necesitas ajustar alguno de los parámetros (por ejemplo, la fecha en el QR o los estilos del HTML) puedes hacerlo directamente en los nodos correspondientes, aprovechando la capacidad de n8n de trabajar con expresiones dinámicas y código personalizado.
Esta solución ofrece una excelente base para automatizar procesos de facturación electrónica usando Afip SDK en n8n y puede servir como punto de partida para ampliar funcionalidades, como integraciones con sistemas de gestión o notificaciones automáticas.
---
Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Descargar Mis Comprobantes de ARCA en n8n description: Automatizá la descarga de comprobantes emitidos o recibidos con Afip SDK. category: [n8n] pubDate: abr 29, 2026 cover: /images/blog/descargar-mis-comprobantes-de-arca-en-n8n-cover.png ---
# Descargar Mis Comprobantes de ARCA en n8n
Si todavía no conocés cómo funciona el servicio Mis Comprobantes en Afip SDK, te recomiendo revisar primero la guía para usar la API directamente.
A continuación vas a encontrar una guía paso a paso para importar y entender el workflow de n8n que descarga comprobantes de ARCA usando Afip SDK. Está pensado para que adaptes los filtros a tus necesidades y puedas reutilizarlo como parte de un flujo mayor.
Te dejo el archivo [afip-sdk-mis-comprobantes.json](/assets/blog/n8n/afip-sdk-mis-comprobantes.json) para que lo importes en tu instancia de n8n antes de continuar.
---
## Requisitos previos
Antes de seguir la guía asegurate de tener:
- [Un access_token de Afip SDK](https://app.afipsdk.com/).
- Un usuario y contraseña válidos para ingresar a ARCA.
Vamos a usar los [nodos oficiales de Afip SDK](https://n8n.io/integrations/afip-sdk/), por lo tanto, deberás configurar el `credential` en n8n y setear tu ACCESS_TOKEN en cualquier nodo de AfipSdk con la opción `Set up credential` completando el campo `Bearer Token`.
---
## Índice
1. [Introducción](#introducción)
2. [Estructura del Workflow en n8n](#estructura-del-workflow-en-n8n)
3. [Paso a Paso de la Implementación](#paso-a-paso-de-la-implementación)
- [1. Nodo: manual_trigger](#1nodo-manual_trigger)
- [2. Nodo: Run automation and wait](#2-nodo-create_automation)
- [3. Nodo: Convert to File](#3-nodo-convert-to-file)
4. [Personalizar filtros](#personalizar-filtros)
5. [Problemas comunes](#problemas-comunes)
6. [Conclusiones](#conclusiones)
---
## Introducción
El servicio **Mis Comprobantes** de ARCA permite consultar los comprobantes emitidos o recibidos. Con Afip SDK esta operación se expone como una automatización lista para usar desde [nuestra API de automations](https://afipsdk.com/docs/automations/integrations/api/). El workflow de n8n que acompaña esta nota crea la automatización, espera a que finalice y descarga los resultados como un archivo JSON listo para almacenar o compartir con otros sistemas.
---
## Estructura del Workflow en n8n
El flujo está compuesto por 3 nodos conectados de forma secuencial:
1. **manual_trigger:** Inicia la ejecución bajo demanda.
2. **Run automation and wait:** Crea la automatización `mis-comprobantes` en Afip SDK con los filtros deseados y espera su resultado.
3. **Convert to File:** Genera un archivo `result.json` con el contenido devuelto por Afip SDK.
En la imagen debajo puedes ver cómo luce visualmente el workflow, lo cual ayuda a comprender la secuencia de nodos.

---
## Paso a Paso de la Implementación
### 1. Nodo: manual_trigger
- **Función:** Ejecutar el workflow cuando lo necesites desde la interfaz de n8n.
- **Configuración:** No requiere parámetros adicionales.
---
### 2. Nodo: Run automation and wait
- **Objetivo:** Crear la automatización `mis-comprobantes` y esperar el resultado.
- **Body:**
```json
{
"automation": "mis-comprobantes",
"params": {
"cuit": "20111111112",
"username": "20111111112",
"password": "contraseña#segura?",
"filters": {
"t": "R",
"fechaEmision": "01/01/2024 - 31/01/2024"
}
}
}
```
- **Resultado esperado:** El nodo devuelve los datos solicitados de la automatización.
---
### 3. Nodo: Convert to File
- **Función:** Convertir la respuesta final en un archivo descargable.
- **Configuración:**
- **Operation:** `toJson`
- **Binary Property:** `result.json`
- **File Name:** `result.json`
- **Resultado:** Una vez que la automatización finaliza, podés descargar el archivo con todos los comprobantes desde el panel de ejecuciones de n8n.
---
## Personalizar filtros
El nodo **Run automation and wait** replica los filtros disponibles en la automatización [Mis Comprobantes](https://afipsdk.com/docs/automations/mis-comprobantes/api/). Para cambiar el alcance de la búsqueda editá el objeto `filters` con las claves admitidas:
- `t`: Define si buscás comprobantes emitidos (`E`) o recibidos (`R`).
- `fechaEmision`: Rango de fechas en formato `dd/mm/yyyy - dd/mm/yyyy`.
- `puntosVenta`, `tiposComprobantes`, `comprobanteDesde`, `comprobanteHasta`, `tipoDoc`, `nroDoc`, `codigoAutorizacion`: Campos opcionales para filtrar con mayor precisión.
Recordá mantener el formato de fechas y utilizar arrays para los campos que admiten múltiples valores.
---
## Problemas comunes
- **Credenciales inválidas:** Si el nodo **Run automation and wait** devuelve un error 401, verificá que el token esté vigente y que el usuario/contraseña de ARCA sean correctos.
- **Automatización sin resultados:** Es posible que la automatización finalice en `complete` pero con un array vacío. Revisá los filtros aplicados, especialmente el rango de fechas y los puntos de venta.
- **Demora en el procesamiento:** Para empresas con muchos comprobantes, deberás usar los nodos **Run automation** y **Get automation result** ampliando el tiempo de este último para evitar llegar al límite de peticiones concurrentes.
---
## Conclusiones
Con este workflow podés automatizar la descarga de comprobantes de ARCA en cuestión de minutos y dejar que n8n se encargue de la espera y la conversión de resultados. Aprovechá la estructura para integrarla con otras herramientas, por ejemplo subiendo el archivo a un almacenamiento en la nube o notificando por email cuando finalice la descarga.
Ante cualquier duda, sumate a la [Comunidad Afip SDK](https://community.afipsdk.com) y compartí tus experiencias automatizando tareas con n8n.
---
--- title: Realizar Constatación de Comprobantes de ARCA en n8n description: Validá comprobantes automáticamente con el workflow de Afip SDK. category: [n8n] pubDate: abr 29, 2026 cover: /images/blog/realizar-constatacion-de-comprobantes-de-arca-en-n8n-cover.png ---
# Realizar Constatación de Comprobantes de ARCA en n8n
Si todavía no probaste la constatación de comprobantes con la API, comenzá por esta guía base:
En este artículo vas a importar un workflow de n8n que autentica contra ARCA, envía la solicitud `ComprobanteConstatar` a través de Afip SDK y devuelve la respuesta en un archivo descargable. Es ideal para automatizar controles internos o validar comprobantes recibidos de forma recurrente.
Descargá el archivo [afip-sdk-constatacion-de-comprobantes.json](/assets/blog/n8n/afip-sdk-constatacion-de-comprobantes.json) y agregalo en tu proyecto de n8n.
---
Para operar con el servicio **Constatación de Comprobantes (WSCDC)** necesitás un certificado digital. En entorno de desarrollo podés usar el CUIT `20409378472` provisto por Afip SDK sin tramitar certificados propios.
Si deseás usar tu certificado más adelante, seguí los pasos de la [documentación para n8n](https://docs.afipsdk.com/integracion/n8n#usar-tu-propio-certificado-opcional).
---
## Requisitos previos
Antes de comenzar, asegurate de contar con:
- [Un access_token de Afip SDK](https://app.afipsdk.com/).
- Los datos del comprobante a verificar: CUIT emisor, tipo y punto de venta, número, fecha, importe y CAE/CAI.
Vamos a usar los [nodos oficiales de Afip SDK](https://n8n.io/integrations/afip-sdk/), por lo tanto, deberás configurar el `credential` en n8n y setear tu ACCESS_TOKEN en cualquier nodo de AfipSdk con la opción `Set up credential` completando el campo `Bearer Token`.
---
## Índice
1. [Introducción](#introducción)
2. [Estructura del Workflow en n8n](#estructura-del-workflow-en-n8n)
3. [Paso a Paso de la Implementación](#paso-a-paso-de-la-implementación)
- [1. Nodo: manual_trigger](#1-nodo-manual_trigger)
- [2. Nodo: auth](#2-nodo-auth)
- [3. Nodo: constatar](#3-nodo-constatar)
- [4. Nodo: Convert to File](#4-nodo-convert-to-file)
4. [Ajustar los datos del comprobante](#ajustar-los-datos-del-comprobante)
5. [Problemas comunes](#problemas-comunes)
6. [Conclusiones](#conclusiones)
---
## Introducción
El servicio de constatación permite validar si un comprobante electrónico fue autorizado por ARCA. Con Afip SDK simplificamos el acceso a este web service exponiendo un endpoint unificado en nuestra [API de integración](https://docs.afipsdk.com/integracion/api). El workflow de n8n que te proponemos ejecuta la autenticación en WSCDC y luego envía la petición `ComprobanteConstatar`, devolviendo el resultado en cuestión de segundos.
---
## Estructura del Workflow en n8n
El flujo está compuesto por cuatro nodos conectados en secuencia:
1. **manual_trigger:** Punto de partida manual para ejecutar el flujo.
2. **auth:** Request HTTP para obtener `Token` y `Sign` del servicio WSCDC.
3. **constatar:** Request HTTP que envía el método `ComprobanteConstatar` con los datos del comprobante.
4. **Convert to File:** Convierte la respuesta en un archivo JSON descargable.
En la imagen debajo puedes ver cómo luce visualmente el workflow, lo cual ayuda a comprender la secuencia de nodos.

---
## Paso a Paso de la Implementación
### 1. Nodo: manual_trigger
- **Función:** Permite disparar la constatación bajo demanda desde el canvas de n8n.
- **Configuración:** Sin parámetros adicionales.
---
### 2. Nodo: auth
- **Nodo**: Get authorization token (TA) de Afip SDK
- **Objetivo:** Autenticarte contra WSCDC y obtener `Token` y `Sign`.
- **Body:**
```json
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
```
- **Resultado esperado:** El nodo devuelve `token`, `sign` y `expirationTime`, que se encadenan automáticamente al siguiente paso.
---
### 3. Nodo: constatar
- **Nodo**: Execute web service request de Afip SDK
- **Objetivo:** Ejecutar el método `ComprobanteConstatar` del servicio WSCDC.
- **Body:**
```json
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": "{{$json.token}}",
"Sign": "{{$json.sign}}",
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": 20250225,
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
}
}
}
```
- **Resultado esperado:** Recibirás el resultado de la constatación, incluyendo el estado `Resultado` y los detalles del comprobante.
---
### 4. Nodo: Convert to File
- **Función:** Transformar la respuesta en un archivo binario.
- **Configuración:**
- **Operation:** `toJson`
- **Binary Property:** `result.json`
- **File Name:** `result.json`
- **Resultado:** Podés descargar el archivo desde la ejecución del workflow para compartirlo o almacenarlo como evidencia.
---
## Ajustar los datos del comprobante
Actualizá los campos dentro de `CmpReq` con el comprobante que querés validar. Los más importantes son:
- `CuitEmisor`, `DocTipoReceptor`, `DocNroReceptor`: Identifican emisor y receptor.
- `CbteTipo`, `PtoVta`, `CbteNro`: Identifican el comprobante.
- `CbteFch` (formato `yyyymmdd`) y `ImpTotal`.
- `CodAutorizacion`: El CAE o CAI informado en el comprobante.
Consultá la [documentación del web service WSCDC](https://docs.afipsdk.com/integracion/api#ws-cdc-constatacion-de-comprobantes) para ver la lista completa de campos y valores permitidos.
---
## Problemas comunes
- **Token expirado:** Si vuelve un error `403` en el nodo **constatar**, verificá que no haya pasado demasiado tiempo entre la autenticación y la consulta.
- **Datos inconsistentes:** El servicio puede devolver `Resultado = "A"` (aprobado) o `"O"/"R"` (observado/rechazado). Revisá cada campo cuando recibas un resultado diferente al esperado.
- **Errores de validación:** Mensajes como `CbteFch invalida` indican que el formato de fecha no es correcto (`yyyymmdd`).
---
## Conclusiones
Este workflow concentra toda la lógica necesaria para validar un comprobante en cuestión de segundos usando n8n. Podés integrarlo con otros nodos para registrar resultados en tu ERP, enviar notificaciones o frenar procesos de pago automáticamente.
Si tenés dudas o necesitás ayuda adicional, visitá la [Comunidad Afip SDK](https://community.afipsdk.com) y compartí tu experiencia con otros desarrolladores.
---
--- title: Obtener información de un DNI con PHP description: Usando el padrón alcance 13 de ARCA category: [PHP] pubDate: mar 05, 2026 cover: /images/blog/php-dni-cover.png ---
# Obtener información de un DNI con PHP
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.php](https://github.com/AfipSDK/afip.php)
**Composer**
```bash
composer require afipsdk/afip.php
```
**Manual**
1. Descargar la librería [Afip.php](https://github.com/AfipSDK/afip.php) y copiar la carpeta src en tu proyecto. [Link de descarga directo](https://github.com/AfipSDK/afip.php/archive/refs/heads/master.zip)
2. Incluir el archivo **src/Afip.php** en tu proyecto.
## Crear instancia de Afip
Para usar los web services de ARCA, se requiere un certificado digital. Con Afip SDK podés integrar en modo desarrollo usando el CUIT `20409378472` sin necesidad de configurar un certificado propio.
Si luego querés usar tu propio certificado en desarrollo, seguí esta guía: [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/php#usar-tu-propio-certificado-opcional).
```php
include 'ruta/a/src/Afip.php';
/**
* CUIT vinculado al certificado
**/
$CUIT = 20409378472;
$afip = new Afip(array(
'access_token' => 'TU_ACCESS_TOKEN',
'CUIT' => $CUIT
));
```
## Paso 1: Obtener el CUIT a partir del DNI
Primero obtenemos el CUIT con el método `GetTaxIDByDocument`.
```php
// DNI
$national_id = 30111222; // Reemplazar por el DNI a consultar
$tax_id = $afip->RegisterScopeThirteen->GetTaxIDByDocument($national_id);
if (!$tax_id) {
throw new Exception('No se encontró ningún CUIT asociado al DNI indicado.');
}
```
## Paso 2: Obtener la información usando ese CUIT
Con el CUIT obtenido, consultamos `GetTaxpayerDetails` para traer los datos completos.
```php
$taxpayer_details = $afip->RegisterScopeThirteen->GetTaxpayerDetails($tax_id);
if (!$taxpayer_details) {
throw new Exception('No se pudo obtener la información de la persona para el CUIT '.$tax_id);
}
var_dump($taxpayer_details);
```
Con esto ya obtenés la información de la persona partiendo del DNI.
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI con Python description: Usando el padrón alcance 13 de ARCA category: [Python] pubDate: mar 05, 2026 cover: /images/blog/python-dni-cover.png ---
# Obtener información de un DNI con Python
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.py](https://github.com/AfipSDK/afip.py)
**PyPI**
```bash
pip install afip.py
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/python#usar-tu-propio-certificado-opcional).
```python
from afip import Afip
# CUIT vinculado al certificado
CUIT = 20409378472
afip = Afip({ "access_token": "TU_ACCESS_TOKEN", "CUIT": CUIT })
```
## Paso 1: Obtener el CUIT a partir del DNI
Primero obtenemos el CUIT con el método `getTaxIDByDocument`.
```python
# DNI
national_id = 30111222 # Reemplazar por el DNI a consultar
tax_id = afip.RegisterScopeThirteen.getTaxIDByDocument(national_id)
if not tax_id:
raise Exception("No se encontró ningún CUIT asociado al DNI indicado.")
```
## Paso 2: Obtener la información usando ese CUIT
Con el CUIT obtenido, consultamos `getTaxpayerDetails` para traer los datos completos.
```python
taxpayer_details = afip.RegisterScopeThirteen.getTaxpayerDetails(tax_id)
if not taxpayer_details:
raise Exception(f"No se pudo obtener la información de la persona para el CUIT {tax_id}")
print(taxpayer_details)
```
Con esto ya obtenés la información de la persona partiendo del DNI.
## Problemas comunes
Si estás teniendo una respuesta nula o el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI con Ruby description: Usando el padrón alcance 13 de ARCA category: [Ruby] pubDate: mar 05, 2026 cover: /images/blog/ruby-dni-cover.png ---
# Obtener información de un DNI con Ruby
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.rb](https://github.com/AfipSDK/afip.rb)
**Gemfile**
```ruby
gem 'afip.rb', '~> 1.0', '>= 1.0.1'
```
**Gem**
```bash
gem install afip.rb
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/ruby#usar-tu-propio-certificado-opcional).
```ruby
require "afip"
# CUIT vinculado al certificado
CUIT = 20409378472
afip = Afip.new({ "access_token": "TU_ACCESS_TOKEN", "CUIT": CUIT })
```
## Paso 1: Obtener el CUIT a partir del DNI
Primero obtenemos el CUIT con el método `getTaxIDByDocument`.
```ruby
# DNI
national_id = 30111222 # Reemplazar por el DNI a consultar
tax_id = afip.RegisterScopeThirteen.getTaxIDByDocument(national_id)
raise "No se encontró ningún CUIT asociado al DNI indicado." if tax_id.nil?
```
## Paso 2: Obtener la información usando ese CUIT
Con el CUIT obtenido, consultamos `getTaxpayerDetails` para traer los datos completos.
```ruby
taxpayer_details = afip.RegisterScopeThirteen.getTaxpayerDetails(tax_id)
raise "No se pudo obtener la información de la persona para el CUIT #{tax_id}" if taxpayer_details.nil?
puts taxpayer_details
```
Con esto ya obtenés la información de la persona partiendo del DNI.
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI en NodeJS description: Usando el padrón alcance 13 de ARCA category: [Javascript] pubDate: mar 05, 2026 cover: /images/blog/javascript-dni-cover.png ---
# Obtener información de un DNI en NodeJS
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.js](https://github.com/AfipSDK/afip.js)
**npm**
```bash
npm install --save @afipsdk/afip.js
```
**Yarn**
```bash
yarn add @afipsdk/afip.js
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/node.js#usar-tu-propio-certificado-opcional).
```js
const Afip = require('@afipsdk/afip.js');
/**
* CUIT vinculado al certificado
**/
const CUIT = 20409378472;
const afip = new Afip({
access_token: 'TU_ACCESS_TOKEN',
CUIT,
});
```
## Paso 1: Obtener el CUIT a partir del DNI
Primero obtenemos el CUIT con el método `getTaxIDByDocument`.
```js
// DNI
const nationalId = 30111222; // Reemplazar por el DNI a consultar
const taxId = await afip.RegisterScopeThirteen.getTaxIDByDocument(nationalId);
if (!taxId) {
throw new Error('No se encontró ningún CUIT asociado al DNI indicado.');
}
```
## Paso 2: Obtener la información usando ese CUIT
Con el CUIT obtenido, consultamos `getTaxpayerDetails` para traer los datos completos.
```js
const taxpayerDetails = await afip.RegisterScopeThirteen.getTaxpayerDetails(taxId);
if (!taxpayerDetails) {
throw new Error(`No se pudo obtener la información de la persona para el CUIT ${taxId}`);
}
console.log(taxpayerDetails);
```
Con esto ya obtenés la información de la persona partiendo del DNI.
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Obtener información de un DNI via API description: Usando el padrón alcance 13 de ARCA category: [API] pubDate: mar 05, 2026 cover: /images/blog/api-dni-cover.png ---
# Obtener información de un DNI via API
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Obtener la autorización
Lo primero que tenemos hacer es obtener el “Token authorization”, que sería la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
Incluí el header con tu token:
```bash
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
```json
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "ws_sr_padron_a13"
}
```
Como respuesta nos devolverá
```json
{
"expiration": "2024-03-13T00:42:59.845Z",
"token": "PD94bWwgd...",
"sign": "kEaCwSs36hpe..."
}
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Paso 1: Obtener el CUIT a partir del DNI
Con `token` y `sign`, consultamos `getIdPersonaListByDocumento`.
```bash
POST https://app.afipsdk.com/api/v1/afip/requests
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
```json
{
"environment": "dev",
"method": "getIdPersonaListByDocumento",
"wsid": "ws_sr_padron_a13",
"params": {
"token": "{{token}}",
"sign": "{{sign}}",
"cuitRepresentada": "20409378472",
"documento": 30111222
}
}
```
De la respuesta debemos tomar el primer CUIT devuelto en `idPersonaListReturn.idPersona`.
## Paso 2: Obtener la información usando ese CUIT
Con ese CUIT, consultamos `getPersona`.
```bash
POST https://app.afipsdk.com/api/v1/afip/requests
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
```json
{
"environment": "dev",
"method": "getPersona",
"wsid": "ws_sr_padron_a13",
"params": {
"token": "{{token}}",
"sign": "{{sign}}",
"cuitRepresentada": "20409378472",
"idPersona": 20111111111
}
}
```
La respuesta devuelve los datos de la persona asociada al CUIT.
## Problemas comunes
Si recibís una respuesta vacía o el error **"No existe persona con ese ID"**, te recomiendo este artículo:
También podés revisar la guía oficial del servicio: [Padrón alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13).
Lo único que queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para consultar información real con tus propias credenciales.
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Crear Factura Electrónica de ARCA en Google Sheets description: Paso a paso con Apps Script category: [GoogleSheets] pubDate: mar 04, 2026 cover: /images/blog/crear-factura-electronica-de-arca-en-google-sheets-cover.png ---
# Crear Factura Electrónica de ARCA en Google Sheets
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE).
En este tutorial vamos a hacerlo desde **Google Sheets** usando **Apps Script** y el API de Afip SDK.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
- Una hoja de Google Sheets
## Plantilla de Google Sheets
Podés descargar esta plantilla base para empezar más rápido:
- [Descargar plantilla de facturación para Google Sheets](/files/plantilla-factura-arca-google-sheets.xlsx)
## Crear el script en Google Sheets
1. Abrí tu hoja de Google Sheets.
2. Andá a **Extensiones → Apps Script**.
3. Creá un archivo (por ejemplo `factura-arca.gs`).
## Configurar constantes
Pegá este bloque al inicio del archivo:
```js
const ACCESS_TOKEN = 'TU_ACCESS_TOKEN';
const TAX_ID = 20409378472; // CUIT de desarrollo
const BASE_URL = 'https://app.afipsdk.com/api/v1';
```
Para usar los web services de ARCA se requiere certificado digital. En desarrollo podés usar el CUIT `20409378472` para integrar rápido.
Si preferís usar tu propio certificado en desarrollo, seguí esta guía: [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
## Helpers para llamar a Afip SDK API
```js
function afipRequest(path, payload) {
const response = UrlFetchApp.fetch(`${BASE_URL}${path}`, {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: `Bearer ${ACCESS_TOKEN}`,
},
payload: JSON.stringify(payload),
muteHttpExceptions: true,
});
const data = JSON.parse(response.getContentText());
if (response.getResponseCode() >= 400) {
throw new Error(data?.error_message || data?.message || response.getContentText());
}
return data;
}
function getAfipAuth() {
return afipRequest('/afip/auth', {
environment: 'dev',
tax_id: String(TAX_ID),
wsid: 'wsfe',
});
}
```
## Obtener el número del último comprobante
Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto evita el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**.
```js
function getNextVoucherNumber(auth) {
const result = afipRequest('/afip/requests', {
environment: 'dev',
wsid: 'wsfe',
method: 'FECompUltimoAutorizado',
params: {
Auth: {
Token: auth.token,
Sign: auth.sign,
Cuit: TAX_ID,
},
PtoVta: 1,
CbteTipo: 6, // Factura B
},
});
const lastVoucher = Number(result?.FECompUltimoAutorizadoResult?.CbteNro || 0);
return lastVoucher + 1;
}
```
## Crear la factura desde Google Sheets
Vamos a crear una Factura B usando el número de comprobante obtenido en el paso anterior y tomando los importes desde la hoja.
En este ejemplo, tomamos los importes por fila (más natural para una planilla):
- **Fila 2** = comprobante a emitir
- **Columna C** = Importe neto gravado
- **Columna D** = Importe IVA
- **Columna F** = CAE (resultado)
- **Columna G** = Vencimiento del CAE (resultado)
- **Columna H** = Número de comprobante (resultado)
```js
function crearFacturaElectronicaARCA() {
const auth = getAfipAuth();
const nextVoucherNumber = getNextVoucherNumber(auth);
const today = new Date();
const cbteFch = Utilities.formatDate(today, 'GMT-3', 'yyyyMMdd');
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const row = 2; // fila del comprobante
const impNeto = Number(sheet.getRange(row, 3).getValue() || 0); // Columna C
const impIVA = Number(sheet.getRange(row, 4).getValue() || 0); // Columna D
const impTotal = impNeto + impIVA;
const result = afipRequest('/afip/requests', {
environment: 'dev',
wsid: 'wsfe',
method: 'FECAESolicitar',
params: {
Auth: {
Token: auth.token,
Sign: auth.sign,
Cuit: TAX_ID,
},
FeCAEReq: {
FeCabReq: {
CantReg: 1,
PtoVta: 1,
CbteTipo: 6,
},
FeDetReq: {
FECAEDetRequest: {
Concepto: 1,
DocTipo: 99,
DocNro: 0,
CbteDesde: nextVoucherNumber,
CbteHasta: nextVoucherNumber,
CbteFch: Number(cbteFch),
ImpTotal: impTotal,
ImpTotConc: 0,
ImpNeto: impNeto,
ImpOpEx: 0,
ImpIVA: impIVA,
ImpTrib: 0,
MonId: 'PES',
MonCotiz: 1,
CondicionIVAReceptorId: 5,
Iva: {
AlicIva: [
{
Id: 5,
BaseImp: impNeto,
Importe: impIVA,
},
],
},
},
},
},
},
});
const detalleRaw = result?.FECAESolicitarResult?.FeDetResp?.FECAEDetResponse;
const detalle = Array.isArray(detalleRaw) ? detalleRaw[0] : detalleRaw;
const cae = detalle?.CAE;
const caeVto = detalle?.CAEFchVto;
Logger.log(`CAE: ${cae}`);
Logger.log(`Vencimiento CAE: ${caeVto}`);
// Guardar resultado en la misma fila del comprobante
sheet.getRange(row, 6).setValue(cae || ''); // Columna F: CAE
sheet.getRange(row, 7).setValue(caeVto || ''); // Columna G: Vencimiento CAE
sheet.getRange(row, 8).setValue(nextVoucherNumber || ''); // Columna H: Número de comprobante
}
```
Ejecutá la función `crearFacturaElectronicaARCA` desde Apps Script y autorizá permisos cuando te lo pida.
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**, te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor**, te recomiendo leer este artículo.
Luego, lo único que queda es pasar a modo producción. Podés seguir la [guía para pasar a producción con Afip SDK](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta, podés resolverla rápidamente en la [Comunidad Afip SDK](https://community.afipsdk.com).
---
--- title: Descargar Mis Comprobantes de ARCA en NodeJS description: Con pocas líneas de código category: [Javascript] pubDate: oct 24, 2025 cover: /images/blog/nodejs-mis-comprobantes.png ---
# Descargar Mis Comprobantes de ARCA en NodeJS
Podemos usar Afip SDK para descargar los comprobantes emitidos o recibidos desde el servicio **Mis Comprobantes** de manera automática. Esto evita navegar manualmente por el sitio de ARCA y nos ayuda a reducir errores.
## Requisitos previos
Para poder usar las automatizaciones, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## 1. Instalación
Agregá la librería de [Afip SDK en Node.js](https://github.com/AfipSDK/afip.js).
**npm**
```bash
npm install --save @afipsdk/afip.js
```
**Yarn**
```bash
yarn add @afipsdk/afip.js
```
## 2. Crear una instancia de la clase Afip
```js
const afip = new Afip({ access_token: 'TU_ACCESS_TOKEN' });
```
## 3. Ejecutamos la automatización
Ahora vamos a ejecutar la automatización para [descargar los comprobantes](/docs/automations/mis-comprobantes/nodejs/).
```js
// CUIT del cual queremos obtener los comprobantes
const cuit = '20111111112';
// Usuario para ingresar a ARCA
// Para la mayoría es el mismo CUIT, pero si administrás
// una sociedad, el CUIT con el que se ingresa es el del administrador
const username = '20111111112';
// Contraseña para ingresar a ARCA
const password = 'contraseña#segura?';
// Filtros para acotar los comprobantes que queremos descargar
const filters = {
t: 'R', // R = Recibidos, E = Emitidos
fechaEmision: '01/01/2023 - 31/12/2023', // Rango de fechas dd/mm/yyyy - dd/mm/yyyy
// puntosVenta: [1, 6],
// tiposComprobantes: [11, 1],
// comprobanteDesde: 1,
// comprobanteHasta: 100,
// tipoDoc: 80,
// nroDoc: '20111111112',
// codigoAutorizacion: '74112153083444',
};
try {
const data = {
cuit,
username,
password,
filters,
};
const comprobantes = await afip.CreateAutomation('mis-comprobantes', data, true);
console.log(comprobantes);
} catch (error) {
console.error(error);
}
```
La automatización devuelve un arreglo con los comprobantes que cumplen los filtros indicados. Podés ajustar los campos comentados (`puntosVenta`, `tiposComprobantes`, `comprobanteDesde`, `comprobanteHasta`, `tipoDoc`, `nroDoc`, `codigoAutorizacion`) para afinar la búsqueda.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Descargar Mis Comprobantes de ARCA en PHP description: Con pocas líneas de código category: [PHP] pubDate: oct 24, 2025 cover: /images/blog/php-mis-comprobantes.png ---
# Descargar Mis Comprobantes de ARCA en PHP
Podemos usar Afip SDK para descargar los comprobantes emitidos o recibidos desde el servicio **Mis Comprobantes** de manera automática. Esto evita navegar manualmente por el sitio de ARCA y nos ayuda a reducir errores.
## Requisitos previos
Para poder usar las automatizaciones, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## 1. Instalación
Agregá la librería de [Afip SDK en PHP](https://github.com/AfipSDK/afip.php).
**Composer**
```bash
composer require afipsdk/afip.php
```
**Manual**
1. Descargar la librería [Afip.php](https://github.com/AfipSDK/afip.php) y copiar la carpeta src en nuestro proyecto. [Link de descarga directo](https://github.com/AfipSDK/afip.php/archive/refs/heads/master.zip)
2. Incluimos el archivo **src/Afip.php** en nuestro proyecto
```php
include 'ruta/a/src/Afip.php';
```
## 2. Crear una instancia de la clase Afip
```php
$afip = new Afip(['access_token' => 'TU_ACCESS_TOKEN']);
```
## 3. Ejecutamos la automatización
Ahora vamos a ejecutar la automatización para [descargar los comprobantes](/docs/automations/mis-comprobantes/php/).
```php
// CUIT del cual queremos obtener los comprobantes
$cuit = '20111111112';
// Usuario para ingresar a ARCA
// Para la mayoría es el mismo CUIT, pero si administrás
// una sociedad, el CUIT con el que se ingresa es el del administrador
$username = '20111111112';
// Contraseña para ingresar a ARCA
$password = 'contraseña#segura?';
// Filtros para acotar los comprobantes que queremos descargar
$filters = [
't' => 'R', // R = Recibidos, E = Emitidos
'fechaEmision' => '01/01/2023 - 31/12/2023', // Rango de fechas dd/mm/yyyy - dd/mm/yyyy
// 'puntosVenta' => [1, 6],
// 'tiposComprobantes' => [11, 1],
// 'comprobanteDesde' => 1,
// 'comprobanteHasta' => 100,
// 'tipoDoc' => 80,
// 'nroDoc' => '20111111112',
// 'codigoAutorizacion' => '74112153083444',
];
try {
$data = [
'cuit' => $cuit,
'username' => $username,
'password' => $password,
'filters' => $filters,
];
$comprobantes = $afip->CreateAutomation('mis-comprobantes', $data, TRUE);
var_dump($comprobantes);
} catch (\Throwable $error) {
var_dump($error);
}
```
La automatización devuelve un arreglo con los comprobantes que cumplen los filtros indicados. Podés ajustar los campos comentados (`puntosVenta`, `tiposComprobantes`, `comprobanteDesde`, `comprobanteHasta`, `tipoDoc`, `nroDoc`, `codigoAutorizacion`) para afinar la búsqueda.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Descargar Mis Comprobantes de ARCA en Python description: Con pocas líneas de código category: [Python] pubDate: oct 24, 2025 cover: /images/blog/python-mis-comprobantes.png ---
# Descargar Mis Comprobantes de ARCA en Python
Podemos usar Afip SDK para descargar los comprobantes emitidos o recibidos desde el servicio **Mis Comprobantes** de manera automática. Esto evita navegar manualmente por el sitio de ARCA y nos ayuda a reducir errores.
## Requisitos previos
Para poder usar las automatizaciones, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## 1. Instalación
Agregá la librería de [Afip SDK en Python](https://github.com/AfipSDK/afip.py).
**PyPI**
```bash
pip install afip.py
```
## 2. Crear una instancia de la clase Afip
```python
from afip import Afip
afip = Afip({ "access_token": "TU_ACCESS_TOKEN" })
```
## 3. Ejecutamos la automatización
Ahora vamos a ejecutar la automatización para [descargar los comprobantes](/docs/automations/mis-comprobantes/python/).
```python
# CUIT del cual queremos obtener los comprobantes
cuit = "20111111112"
# Usuario para ingresar a ARCA
# Para la mayoría es el mismo CUIT, pero si administrás
# una sociedad, el CUIT con el que se ingresa es el del administrador
username = "20111111112"
# Contraseña para ingresar a ARCA
password = "contraseña#segura?"
# Filtros para acotar los comprobantes que queremos descargar
filters = {
"t": "R", # R = Recibidos, E = Emitidos
"fechaEmision": "01/01/2023 - 31/12/2023", # Rango de fechas dd/mm/yyyy - dd/mm/yyyy
# "puntosVenta": [1, 6],
# "tiposComprobantes": [11, 1],
# "comprobanteDesde": 1,
# "comprobanteHasta": 100,
# "tipoDoc": 80,
# "nroDoc": "20111111112",
# "codigoAutorizacion": "74112153083444",
}
try:
data = {
"cuit": cuit,
"username": username,
"password": password,
"filters": filters
}
comprobantes = afip.createAutomation("mis-comprobantes", data, True)
print(comprobantes)
except Exception as error:
print(error)
```
La automatización devuelve un arreglo con los comprobantes que cumplen los filtros indicados. Podés ajustar los campos comentados (`puntosVenta`, `tiposComprobantes`, `comprobanteDesde`, `comprobanteHasta`, `tipoDoc`, `nroDoc`, `codigoAutorizacion`) para afinar la búsqueda.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Descargar Mis Comprobantes de ARCA en Ruby description: Con pocas líneas de código category: [Ruby] pubDate: oct 24, 2025 cover: /images/blog/ruby-mis-comprobantes.png ---
# Descargar Mis Comprobantes de ARCA en Ruby
Podemos usar Afip SDK para descargar los comprobantes emitidos o recibidos desde el servicio **Mis Comprobantes** de manera automática. Esto evita navegar manualmente por el sitio de ARCA y nos ayuda a reducir errores.
## Requisitos previos
Para poder usar las automatizaciones, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## 1. Instalación
Agregá la librería de [Afip SDK en Ruby](https://github.com/AfipSDK/afip.rb).
**Gemfile**
```ruby
gem 'afip.rb', '~> 1.0', '>= 1.0.1'
```
**Gem**
```bash
gem install afip.rb
```
## 2. Crear una instancia de la clase Afip
```ruby
require "afip"
afip = Afip.new({ "access_token": "TU_ACCESS_TOKEN" })
```
## 3. Ejecutamos la automatización
Ahora vamos a ejecutar la automatización para [descargar los comprobantes](/docs/automations/mis-comprobantes/ruby/).
```ruby
# CUIT del cual queremos obtener los comprobantes
cuit = "20111111112"
# Usuario para ingresar a ARCA
# Para la mayoría es el mismo CUIT, pero si administrás
# una sociedad, el CUIT con el que se ingresa es el del administrador
auth_username = "20111111112"
# Contraseña para ingresar a ARCA
auth_password = "contraseña#segura?"
# Filtros para acotar los comprobantes que queremos descargar
filters = {
"t": "R", # R = Recibidos, E = Emitidos
"fechaEmision": "01/01/2023 - 31/12/2023", # Rango de fechas dd/mm/yyyy - dd/mm/yyyy
# "puntosVenta": [1, 6],
# "tiposComprobantes": [11, 1],
# "comprobanteDesde": 1,
# "comprobanteHasta": 100,
# "tipoDoc": 80,
# "nroDoc": "20111111112",
# "codigoAutorizacion": "74112153083444",
}
begin
data = {
"cuit": cuit,
"username": auth_username,
"password": auth_password,
"filters": filters
}
comprobantes = afip.createAutomation("mis-comprobantes", data, true)
puts comprobantes
rescue => error
puts error
end
```
La automatización devuelve un arreglo con los comprobantes que cumplen los filtros indicados. Podés ajustar los campos comentados (`puntosVenta`, `tiposComprobantes`, `comprobanteDesde`, `comprobanteHasta`, `tipoDoc`, `nroDoc`, `codigoAutorizacion`) para afinar la búsqueda.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Descargar Mis Comprobantes de ARCA via API description: Con pocas líneas de código category: [API] pubDate: oct 24, 2025 cover: /images/blog/api-mis-comprobantes.png ---
# Descargar Mis Comprobantes de ARCA via API
Podemos usar Afip SDK para descargar los comprobantes emitidos o recibidos desde el servicio **Mis Comprobantes** de manera automática. Esto evita navegar manualmente por el sitio de ARCA y nos ayuda a reducir errores.
## Requisitos previos
Para poder usar las automatizaciones, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## 1. Crear la automatización
Vamos a ejecutar la automatización para [descargar los comprobantes](/docs/automations/mis-comprobantes/api/). Lo primero es enviar una solicitud **POST** al endpoint:
```bash
https://app.afipsdk.com/api/v1/automations
```
### Parámetros
| Nombre | Tipo | Descripción |
| ------ | ---- | ----------- |
| `cuit` | string | CUIT del que queremos descargar los comprobantes. |
| `username` | string | Usuario para ingresar a ARCA. Para la mayoría es el mismo CUIT, pero si administrás una sociedad es el CUIT del administrador. |
| `password` | string | Contraseña para ingresar a ARCA. |
| `filters` | object | Configuración para limitar los comprobantes obtenidos. |
Dentro de `filters` podés usar las siguientes claves:
| Campo | Tipo | Descripción |
| ----- | ---- | ----------- |
| `t` | string | Comprobantes a obtener (`E` = Emitidos, `R` = Recibidos). |
| `fechaEmision` | string | Rango de fechas en formato `dd/mm/yyyy - dd/mm/yyyy`. |
| `puntosVenta` | integer[] | Puntos de venta a incluir. *(opcional)* |
| `tiposComprobantes` | integer[] | Tipos de comprobante. *(opcional)* |
| `comprobanteDesde` | integer | Número inicial del comprobante. *(opcional, usar junto con `comprobanteHasta`)* |
| `comprobanteHasta` | integer | Número final del comprobante. *(opcional, usar junto con `comprobanteDesde`)* |
| `tipoDoc` | integer | Tipo de documento del receptor. *(opcional)* |
| `nroDoc` | string | Número de documento del receptor. *(opcional)* |
| `codigoAutorizacion` | string | Código de autorización (CAE/CAI). *(opcional)* |
Incluí el header con tu token:
```bash
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
**Ejemplo**
```json
{
"automation": "mis-comprobantes",
"params": {
"cuit": "20111111112",
"username": "20111111112",
"password": "contraseña#segura?",
"filters": {
"t": "R",
"fechaEmision": "01/01/2023 - 31/12/2023"
}
}
}
```
Al crear la automatización recibirás un `id` y su `status` inicial.
**Response**
```json
{
"status": "in_process",
"id": "0d1e71e0-8882-4b14-b7f8-c5d716261760"
}
```
## 2. Obtener el resultado
Una vez creada la automatización, esta va a comenzar a ejecutarse. Para obtener el resultado final debés realizar una llamada **GET** al endpoint:
```bash
https://app.afipsdk.com/api/v1/automations/:id
```
`id` es el identificador de la automatización previamente creada.
Incluí nuevamente el header con tu token:
```bash
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
La automatización va a devolver `{ "status": "in_process" }` hasta que se complete. Te recomendamos chequear el resultado cada 5 segundos hasta que deje de estar `in_process`.
`STATUS` `200`
```json
{
"status": "complete",
"data": [
{
"Fecha de Emisión": "2023-08-02",
"Tipo de Comprobante": "11",
"Punto de Venta": "1",
"Número Desde": "36",
"Número Hasta": "36",
"Cód. Autorización": "73312575323360",
"Tipo Doc. Receptor": "80",
"Nro. Doc. Receptor": "30632580082",
"Denominación Receptor": "EMPRESA SA",
"Tipo Cambio": "1,00",
"Moneda": "PES",
"Imp. Neto Gravado": "0,00",
"Imp. Neto No Gravado": "0,00",
"Imp. Op. Exentas": "0,00",
"Otros Tributos": "0,00",
"IVA": "0,00",
"Imp. Total": "4687,20"
}
]
}
```
`STATUS` `400`
```json
{
"status": "error",
"data": {
"message": "Número de CUIL/CUIT incorrecto"
}
}
```
La automatización devuelve un arreglo con los comprobantes que cumplen los filtros indicados. Ajustá los campos opcionales para afinar la búsqueda según tus necesidades.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Consultar constancia de inscripción de ARCA en Visual Basic 6 description: Con pocas líneas de código category: [VB6] pubDate: jul 16, 2025 cover: /images/blog/vb6-consult-registration.png ---
# Consultar constancia de inscripción de ARCA en Visual Basic 6
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Los datos de inscripción de un contribuyente pueden ser solicitados a través de nuestro sistema, consumiendo los servicios de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los servicios web de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Ademas, vamos a usar https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas para trabajar con JSON.
Para esto debemos descargar [descargar JsonConverter.bas](https://raw.githubusercontent.com/VBA-tools/VBA-JSON/refs/heads/master/JsonConverter.bas), y agregarlo a nuestro proyecto.
Elegimos "JsonConverter.bas"
Y agregar la referencia "Microsoft Scripting Runtime" y "Microsoft WinHTTP Services, version 5.1"
Elegimos "Microsoft Scripting Runtime"
y "Microsoft WinHTTP Services, version 5.1"
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vb6#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```vb
Private Sub GetAuthorization()
Const ACCESS_TOKEN As String = "TU_ACCESS_TOKEN"
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "ws_sr_constancia_inscripcion"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
End Sub
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Obtenemos los datos
Vamos a obtener los datos del contribuyente con el CUIT 33693450239 (cambiar esto por el CUIT que queramos consultar).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```vb
Private Sub GetRegistrationData()
Const ACCESS_TOKEN As String = "TU_ACCESS_TOKEN"
Dim objHttp As Object
Dim strResponse As String
Dim strUrl As String
Dim strData As String
Dim dictData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Set dictData = New Dictionary
dictData.Add "environment", "dev"
dictData.Add "method", "getPersona_v2"
dictData.Add "wsid", "ws_sr_constancia_inscripcion"
Dim dictParams As Dictionary
Set dictParams = New Dictionary
dictParams.Add "token", gstrToken
dictParams.Add "sign", gstrSign
dictParams.Add "cuitRepresentada", "20409378472"
dictParams.Add "idPersona", 33693450239
dictData.Add "params", dictParams
strData = JsonConverter.ConvertToJson(dictData)
With objHttp
.Open "POST", strUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
.Send strData
If .Status <> 200 Then
MsgBox "Error al obtener los datos: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Debug.Print "Response: " & strResponse
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Aquí puedes acceder a los datos de la constancia de inscripción
End Sub
```
En la respuesta, nos devolverá los datos de la constancia de inscripción del contribuyente.
```json
{
"apellido": ...,
"nombre": ...,
"domicilioFiscal": ...,
"actividad": ...
}
```
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
Con esto ya tenemos los datos del contribuyente. También podes usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en Visual Basic 6 description: Con pocas líneas de código category: [VB6] pubDate: jul 16, 2025 cover: /images/blog/vb6-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en Visual Basic 6
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Ademas, vamos a usar https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas para trabajar con JSON.
Para esto debemos descargar [descargar JsonConverter.bas](https://raw.githubusercontent.com/VBA-tools/VBA-JSON/refs/heads/master/JsonConverter.bas), y agregarlo a nuestro proyecto.
Elegimos "JsonConverter.bas"
Y agregar la referencia "Microsoft Scripting Runtime" y "Microsoft WinHTTP Services, version 5.1"
Elegimos "Microsoft Scripting Runtime"
y "Microsoft WinHTTP Services, version 5.1"
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vb6#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```vb
Private Sub GetAuthorization()
Const ACCESS_TOKEN As String = "TU_ACCESS_TOKEN"
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "wscdc"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
End Sub
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```vb
Private Sub VerifyVoucher()
Const ACCESS_TOKEN As String = "TU_ACCESS_TOKEN"
Dim objHttp As Object
Dim strResponse As String
Dim strUrl As String
Dim strData As String
Dim dictData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Set dictData = New Dictionary
dictData.Add "environment", "dev"
dictData.Add "method", "ComprobanteConstatar"
dictData.Add "wsid", "wscdc"
Dim dictParams As Dictionary
Set dictParams = New Dictionary
Dim dictAuth As Dictionary
Set dictAuth = New Dictionary
dictAuth.Add "Token", gstrToken
dictAuth.Add "Sign", gstrSign
dictAuth.Add "Cuit", "20409378472"
dictParams.Add "Auth", dictAuth
Dim dictCmpReq As Dictionary
Set dictCmpReq = New Dictionary
dictCmpReq.Add "CbteModo", "CAE"
dictCmpReq.Add "CuitEmisor", 20409378472
dictCmpReq.Add "PtoVta", 1
dictCmpReq.Add "CbteTipo", 11
dictCmpReq.Add "CbteNro", 3850
dictCmpReq.Add "CbteFch", 20250225
dictCmpReq.Add "ImpTotal", 100
dictCmpReq.Add "CodAutorizacion", "75082223003046"
dictCmpReq.Add "DocTipoReceptor", "80"
dictCmpReq.Add "DocNroReceptor", "33693450239"
dictParams.Add "CmpReq", dictCmpReq
dictData.Add "params", dictParams
strData = JsonConverter.ConvertToJson(dictData)
With objHttp
.Open "POST", strUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
.Send strData
If .Status <> 200 Then
MsgBox "Error al constatar el comprobante: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Debug.Print "Response: " & strResponse
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Aquí puedes acceder al resultado de la constatación
End Sub
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA a través de la API listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Usar web service factura MiPyME en Visual Basic 6 description: Con pocas líneas de código category: [VB6] pubDate: jul 16, 2025 cover: /images/blog/vb6-use-mipyme.png ---
# Usar web service factura MiPyME en Visual Basic 6
Consumir los web services de ARCA puede ser un poco complicado, por eso vamos a utilizar la API de Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Ademas, vamos a usar https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas para trabajar con JSON.
Para esto debemos descargar [descargar JsonConverter.bas](https://raw.githubusercontent.com/VBA-tools/VBA-JSON/refs/heads/master/JsonConverter.bas), y agregarlo a nuestro proyecto.
Elegimos "JsonConverter.bas"
Y agregar la referencia "Microsoft Scripting Runtime" y "Microsoft WinHTTP Services, version 5.1"
Elegimos "Microsoft Scripting Runtime"
y "Microsoft WinHTTP Services, version 5.1"
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vb6#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```vb
Private Sub GetAuthorization()
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "wsfecred"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
End Sub
```
Utilizamos el web service id wsfecred `"wsid": "wsfecred"`, el cual corresponde al web service factura MiPyME.
En la pestaña "API" [de la documentacion](https://docs.afipsdk.com/#integracion#id-3-crear-una-instancia-clase-afip) podes consultar todos los parametros del endpoint.
Aquí tenemos el token y sign que nos dio ARCA para usar el web service factura MiPyME. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Llamar al web service
En el [manual del web service](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/documentos/Manual-Desarrollador-WSFECRED.pdf) pueden encontrar los métodos disponibles
Para este ejemplo vamos a llamar al metodo `consultarMontoObligadoRecepcion`.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```vb
Private Sub ConsultarMontoObligadoRecepcion()
Dim objHttp As Object
Dim strResponse As String
Dim strUrl As String
Dim strData As String
Dim dictData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Set dictData = New Dictionary
dictData.Add "environment", "dev"
dictData.Add "method", "consultarMontoObligadoRecepcion"
dictData.Add "wsid", "wsfecred"
Dim dictParams As Dictionary
Set dictParams = New Dictionary
Dim dictAuthRequest As Dictionary
Set dictAuthRequest = New Dictionary
dictAuthRequest.Add "token", gstrToken
dictAuthRequest.Add "sign", gstrSign
dictAuthRequest.Add "cuitRepresentada", "20409378472"
dictParams.Add "authRequest", dictAuthRequest
dictParams.Add "cuitConsultada", "20054100605"
dictParams.Add "fechaEmision", "2024-03-03"
dictData.Add "params", dictParams
strData = JsonConverter.ConvertToJson(dictData)
With objHttp
.Open "POST", strUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strData
If .Status <> 200 Then
MsgBox "Error al consultar el monto: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Debug.Print "Response: " & strResponse
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Aquí puedes acceder al resultado de la consulta
End Sub
```
En la respuesta, nos devolverá la respuesta del web service.
```json
{
"consultarMontoObligadoRecepcionReturn": ...,
}
```
Con esto ya podemos conectarnos al web service factura MiPyME a través de la API.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Usar web services de ARCA en Visual Basic 6 description: Con pocas líneas de código category: [VB6] pubDate: jul 16, 2025 cover: /images/blog/vb6-use-webservices.png ---
# Usar web services de ARCA en Visual Basic 6
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Consumir los web services de ARCA puede ser un poco complicado, por eso vamos a utilizar la API de Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Ademas, vamos a usar https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas para trabajar con JSON.
Para esto debemos descargar [descargar JsonConverter.bas](https://raw.githubusercontent.com/VBA-tools/VBA-JSON/refs/heads/master/JsonConverter.bas), y agregarlo a nuestro proyecto.
Elegimos "JsonConverter.bas"
Y agregar la referencia "Microsoft Scripting Runtime" y "Microsoft WinHTTP Services, version 5.1"
Elegimos "Microsoft Scripting Runtime"
y "Microsoft WinHTTP Services, version 5.1"
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vb6#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```vb
Private Sub GetAuthorization()
Const ACCESS_TOKEN As String = "TU_ACCESS_TOKEN"
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "wsct"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
End Sub
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Llamar al web service
Para este ejemplo vamos a consultar el ultimo comprobante autorizado llamando al metodo `consultarUltimoComprobanteAutorizado`.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```vb
Private Sub ConsultarUltimoComprobanteAutorizado()
Const ACCESS_TOKEN As String = "TU_ACCESS_TOKEN"
Dim objHttp As Object
Dim strResponse As String
Dim strUrl As String
Dim strData As String
Dim dictData As Dictionary
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Set dictData = New Dictionary
dictData.Add "environment", "dev"
dictData.Add "method", "consultarUltimoComprobanteAutorizado"
dictData.Add "wsid", "wsct"
Dim dictParams As Dictionary
Set dictParams = New Dictionary
Dim dictAuthRequest As Dictionary
Set dictAuthRequest = New Dictionary
dictAuthRequest.Add "token", gstrToken
dictAuthRequest.Add "sign", gstrSign
dictAuthRequest.Add "cuitRepresentada", "20409378472"
dictParams.Add "authRequest", dictAuthRequest
dictParams.Add "codigoTipoComprobante", 195
dictParams.Add "numeroPuntoVenta", 1
dictData.Add "params", dictParams
strData = JsonConverter.ConvertToJson(dictData)
With objHttp
.Open "POST", strUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer " & ACCESS_TOKEN
.Send strData
If .Status <> 200 Then
MsgBox "Error al consultar el ultimo comprobante: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Debug.Print "Response: " & strResponse
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Aquí puedes acceder al resultado de la consulta
End Sub
```
En la respuesta, nos devolverá la respuesta del web service.
```json
{
"consultarUltimoComprobanteAutorizadoReturn": ...,
}
```
Con esto ya podemos conectarnos a cualquier web service de ARCA a través de la API.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error (10162) Si el comprobante es MiPyMEs (FCE) es obligatorio informar opcionales description: Pasos para resolver este error category: [AFIP] pubDate: jun 26, 2025 cover: /images/blog/afip-error.png ---
# Error (10162) Si el comprobante es MiPyMEs (FCE) es obligatorio informar opcionales
Al emitir una **Factura de Crédito Electrónica (FCE)** puede aparecer el mensaje de error:
```
Si el comprobante es MiPyMEs (FCE) es obligatorio informar opcionales. Ver metodo FEParamGetTiposOpcional()
```
Esto sucede cuando se intenta generar una FCE sin incluir en la solicitud los **opcionales** requeridos para este tipo de comprobantes.
## Solución
1. Utilizá el método [`FEParamGetTiposOpcional`](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica#obtener-tipos-de-opciones-disponibles-para-el-comprobante) para obtener la lista de opcionales disponibles. Allí encontrarás los identificadores (por ejemplo `2101`, `2102`, etc.) y su descripción.
2. En el arreglo `Opcionales` del comprobante agregá los campos que correspondan con su `Id` y `Valor`. Para la FCE normalmente se deben enviar los opcionales vinculados a los datos de la cuenta bancaria y demás información exigida por el régimen MiPyME.
Un ejemplo de estructura mínima en JSON sería:
```json
[
{
"Id": 2101,
"Valor": "1234567890123456789012"
},
{
"Id": 27,
"Valor": "ADC"
}
]
```
Si se trata de anular una FCE también se debe incluir el opcional **22**:
```json
[
{
"Id": 22,
"Valor": "S"
}
]
```
Reemplazá cada valor por la información real correspondiente. Si no contás con todos los datos es posible que el comprobante sea rechazado.
---
Este y otros problemas con los web services son detectados y resueltos rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Consultar constancia de inscripción de ARCA en Visual Fox Pro description: Con pocas líneas de código category: [VFP] pubDate: may 02, 2025 cover: /images/blog/vfp-consult-registration.png ---
# Consultar constancia de inscripción de ARCA en Visual Fox Pro
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Los datos de inscripción de un contribuyente pueden ser solicitados a través de nuestro sistema, consumiendo los servicios de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los servicios web de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Ademas, vamos a usar https://github.com/AfipSDK/vfp-json/blob/master/json.prg para trabajar con JSON.
```bash
SET PROCEDURE TO "path\al\archivo\json.prg" ADDITIVE
```
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vfp#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```csharp
* PASO 1 - Pedir autorizacion
LOCAL loHttp, loResponse, lcJson, lcAuthUrl, loAuthData, loAuthDataObject, loAuthResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
lcAccessToken = "TU_ACCESS_TOKEN"
loAuthDataObject = CREATEOBJECT("JSONObject")
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20409378472")
loAuthDataObject.set("wsid", "ws_sr_constancia_inscripcion")
loAuthData = json_encode(loAuthDataObject)
loHttp.Open("POST", lcAuthUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loAuthData)
IF loHttp.Status <> 200
? "Error en la autorizacion: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loAuthResponse = json_decode(loResponse)
lcToken = loAuthResponse._token
lcSign = loAuthResponse._sign
? "Token: " + lcToken
? "Sign: " + lcSign
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Obtenemos los datos
Vamos a obtener los datos del contribuyente con el CUIT 33693450239 (cambiar esto por el CUIT que queramos consultar).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```csharp
* PASO 2 - Obtener los datos
LOCAL loHttp, loResponse, lcRequestUrl, loRequestData, loRequestDataObject, loRequestResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcRequestUrl = "https://app.afipsdk.com/api/v1/afip/requests"
lcAccessToken = "TU_ACCESS_TOKEN"
loRequestDataObject = CREATEOBJECT("JSONObject")
loRequestDataObject.set("environment", "dev")
loRequestDataObject.set("method", "getPersona_v2")
loRequestDataObject.set("wsid", "ws_sr_constancia_inscripcion")
* Params
LOCAL params
params = CREATEOBJECT("JSONObject")
loRequestDataObject.set("params", params)
params.set("token", lcToken)
params.set("sign", lcSign)
params.set("cuitRepresentada", "20409378472")
params.set("idPersona", 33693450239)
loRequestData = json_encode(loRequestDataObject)
loHttp.Open("POST", lcRequestUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loRequestData)
IF loHttp.Status <> 200
? "Error al obtener los datos: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loRequestResponse = json_decode(loResponse)
? "Response: " + loResponse
```
En la respuesta, nos devolverá los datos de la constancia de inscripción del contribuyente.
```json
{
"apellido": ...,
"nombre": ...,
"domicilioFiscal": ...,
"actividad": ...
}
```
## Problemas comunes
Si estás teniendo el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
Con esto ya tenemos los datos del contribuyente. También podes usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en Visual Fox Pro description: Con pocas líneas de código category: [VFP] pubDate: may 02, 2025 cover: /images/blog/vfp-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en Visual Fox Pro
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Ademas, vamos a usar https://github.com/AfipSDK/vfp-json/blob/master/json.prg para trabajar con JSON.
```bash
SET PROCEDURE TO "path\al\archivo\json.prg" ADDITIVE
```
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vfp#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```csharp
* PASO 1 - Pedir autorizacion
LOCAL loHttp, loResponse, lcJson, lcAuthUrl, loAuthData, loAuthDataObject, loAuthResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
lcAccessToken = "TU_ACCESS_TOKEN"
loAuthDataObject = CREATEOBJECT("JSONObject")
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20409378472")
loAuthDataObject.set("wsid", "wscdc")
loAuthData = json_encode(loAuthDataObject)
loHttp.Open("POST", lcAuthUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loAuthData)
IF loHttp.Status <> 200
? "Error en la autorizacion: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loAuthResponse = json_decode(loResponse)
lcToken = loAuthResponse._token
lcSign = loAuthResponse._sign
? "Token: " + lcToken
? "Sign: " + lcSign
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```csharp
* PASO 2 - Realizar constatacion
LOCAL loHttp, loResponse, lcRequestUrl, loRequestData, loRequestDataObject, loRequestResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcRequestUrl = "https://app.afipsdk.com/api/v1/afip/requests"
lcAccessToken = "TU_ACCESS_TOKEN"
loRequestDataObject = CREATEOBJECT("JSONObject")
loRequestDataObject.set("environment", "dev")
loRequestDataObject.set("method", "ComprobanteConstatar")
loRequestDataObject.set("wsid", "wscdc")
* Params
LOCAL params
params = CREATEOBJECT("JSONObject")
loRequestDataObject.set("params", params)
* Auth
LOCAL auth
auth = CREATEOBJECT("JSONObject")
params.set("Auth", auth)
auth.set("Token", lcToken)
auth.set("Sign", lcSign)
auth.set("Cuit", "20409378472")
* CmpReq
LOCAL CmpReq
CmpReq = CREATEOBJECT("JSONObject")
params.set("CmpReq", CmpReq)
CmpReq.set("CbteModo", "CAE")
CmpReq.set("CuitEmisor", 20409378472)
CmpReq.set("PtoVta", 1)
CmpReq.set("CbteTipo", 11)
CmpReq.set("CbteNro", 3850)
CmpReq.set("CbteFch", 20250225)
CmpReq.set("ImpTotal", 100)
CmpReq.set("CodAutorizacion", "75082223003046")
CmpReq.set("DocTipoReceptor", "80")
CmpReq.set("DocNroReceptor", "33693450239")
loRequestData = json_encode(loRequestDataObject)
loHttp.Open("POST", lcRequestUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loRequestData)
IF loHttp.Status <> 200
? "Error al constatar el comprobante: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loRequestResponse = json_decode(loResponse)
? "Response: " + loResponse
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA a través de la API listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Usar web service factura MiPyME en Visual Fox Pro description: Con pocas líneas de código category: [VFP] pubDate: may 02, 2025 cover: /images/blog/vfp-use-mipyme.png ---
# Usar web service factura MiPyME en Visual Fox Pro
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Consumir los web services de ARCA puede ser un poco complicado, por eso vamos a utilizar la API de Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Ademas, vamos a usar https://github.com/AfipSDK/vfp-json/blob/master/json.prg para trabajar con JSON.
```bash
SET PROCEDURE TO "path\al\archivo\json.prg" ADDITIVE
```
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vfp#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```csharp
* PASO 1 - Pedir autorizacion
LOCAL loHttp, loResponse, lcJson, lcAuthUrl, loAuthData, loAuthDataObject, loAuthResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
lcAccessToken = "TU_ACCESS_TOKEN"
loAuthDataObject = CREATEOBJECT("JSONObject")
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20409378472")
loAuthDataObject.set("wsid", "wsfecred")
loAuthData = json_encode(loAuthDataObject)
loHttp.Open("POST", lcAuthUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loAuthData)
IF loHttp.Status <> 200
? "Error en la autorizacion: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loAuthResponse = json_decode(loResponse)
lcToken = loAuthResponse._token
lcSign = loAuthResponse._sign
? "Token: " + lcToken
? "Sign: " + lcSign
```
Utilizamos el web service id wsfecred `"wsid": "wsfecred"`, el cual corresponde al web service factura MiPyME.
En la pestaña "API" [de la documentacion](https://docs.afipsdk.com/#integracion#id-3-crear-una-instancia-clase-afip) podes consultar todos los parametros del endpoint.
Aquí tenemos el token y sign que nos dio ARCA para usar el web service factura MiPyME. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Llamar al web service
En el [manual del web service](https://servicioscf.afip.gob.ar/facturadecreditoelectronica/documentos/Manual-Desarrollador-WSFECRED.pdf) pueden encontrar los métodos disponibles
Para este ejemplo vamos a llamar al metodo `consultarMontoObligadoRecepcion`.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```csharp
* PASO 2 - Llamar al web service
LOCAL loHttp, loResponse, lcRequestUrl, loRequestData, loRequestDataObject, loRequestResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcRequestUrl = "https://app.afipsdk.com/api/v1/afip/requests"
lcAccessToken = "TU_ACCESS_TOKEN"
loRequestDataObject = CREATEOBJECT("JSONObject")
loRequestDataObject.set("environment", "dev")
loRequestDataObject.set("method", "consultarMontoObligadoRecepcion")
loRequestDataObject.set("wsid", "wsfecred")
* Params
LOCAL params
params = CREATEOBJECT("JSONObject")
loRequestDataObject.set("params", params)
* authRequest
LOCAL authRequest
authRequest = CREATEOBJECT("JSONObject")
params.set("authRequest", authRequest)
authRequest.set("token", lcToken)
authRequest.set("sign", lcSign)
authRequest.set("cuitRepresentada", "20409378472")
params.set("cuitConsultada", "20054100605")
params.set("fechaEmision", "2024-03-03")
loRequestData = json_encode(loRequestDataObject)
loHttp.Open("POST", lcRequestUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loRequestData)
IF loHttp.Status <> 200
? "Error al consultar el monto: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loRequestResponse = json_decode(loResponse)
? "Response: " + loResponse
```
En la pestaña "API" [de la documentacion](https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service) podes consultar todos los parametros del endpoint.
En la respuesta, nos devolverá la respuesta del web service.
```json
{
"consultarMontoObligadoRecepcionReturn": ...,
}
```
Con esto ya podemos conectarnos al web service factura MiPyME a través de la API.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Usar web services de ARCA en Visual Fox Pro description: Con pocas líneas de código category: [VFP] pubDate: may 02, 2025 cover: /images/blog/vfp-use-webservices.png ---
# Usar web services de ARCA en Visual Fox Pro
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Consumir los web services de ARCA puede ser un poco complicado, por eso vamos a utilizar la API de Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Ademas, vamos a usar https://github.com/AfipSDK/vfp-json/blob/master/json.prg para trabajar con JSON.
```bash
SET PROCEDURE TO "path\al\archivo\json.prg" ADDITIVE
```
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vfp#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```csharp
* PASO 1 - Pedir autorizacion
LOCAL loHttp, loResponse, lcJson, lcAuthUrl, loAuthData, loAuthDataObject, loAuthResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
lcAccessToken = "TU_ACCESS_TOKEN"
loAuthDataObject = CREATEOBJECT("JSONObject")
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20409378472")
loAuthDataObject.set("wsid", "wsct")
loAuthData = json_encode(loAuthDataObject)
loHttp.Open("POST", lcAuthUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loAuthData)
IF loHttp.Status <> 200
? "Error en la autorizacion: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loAuthResponse = json_decode(loResponse)
lcToken = loAuthResponse._token
lcSign = loAuthResponse._sign
? "Token: " + lcToken
? "Sign: " + lcSign
```
En este ejemplo utilizamos el web service id wsct `"wsid": "wsct"`, el cual corresponde al web service de comprobantes de turismo.
En la pestaña "API" [de la documentacion](https://docs.afipsdk.com/#integracion#id-3-crear-una-instancia-clase-afip) podes consultar todos los parametros del endpoint.
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Llamar al web service
Para este ejemplo vamos a consultar el ultimo comprobante autorizado llamando al metodo `consultarUltimoComprobanteAutorizado`.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```csharp
* PASO 2 - Llamar al web service
LOCAL loHttp, loResponse, lcRequestUrl, loRequestData, loRequestDataObject, loRequestResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcRequestUrl = "https://app.afipsdk.com/api/v1/afip/requests"
lcAccessToken = "TU_ACCESS_TOKEN"
loRequestDataObject = CREATEOBJECT("JSONObject")
loRequestDataObject.set("environment", "dev")
loRequestDataObject.set("method", "consultarUltimoComprobanteAutorizado")
loRequestDataObject.set("wsid", "wsct")
* Params
LOCAL params
params = CREATEOBJECT("JSONObject")
loRequestDataObject.set("params", params)
* authRequest
LOCAL authRequest
authRequest = CREATEOBJECT("JSONObject")
params.set("authRequest", authRequest)
authRequest.set("token", lcToken)
authRequest.set("sign", lcSign)
authRequest.set("cuitRepresentada", "20409378472")
params.set("codigoTipoComprobante", 195)
params.set("numeroPuntoVenta", 1)
loRequestData = json_encode(loRequestDataObject)
loHttp.Open("POST", lcRequestUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loRequestData)
IF loHttp.Status <> 200
? "Error al consultar el ultimo comprobante: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loRequestResponse = json_decode(loResponse)
? "Response: " + loResponse
```
En la pestaña "API" [de la documentacion](https://docs.afipsdk.com/siguientes-pasos/web-services/otro-web-service) podes consultar todos los parametros del endpoint.
En la respuesta, nos devolverá la respuesta del web service.
```json
{
"consultarUltimoComprobanteAutorizadoReturn": ...,
}
```
Con esto ya podemos conectarnos a cualquier web service de ARCA a través de la API.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Guía de migración a Afip SDK ≥ v1.0 description: Desde antiguas versiones de Afip SDK en PHP y Node category: [AFIP] pubDate: abr 16, 2025 cover: /images/blog/migrate-to-1-0.png ---
# Guía de migración a Afip SDK ≥ v1.0
## Introducción
Esta guía te muestra cómo migrar tus proyectos en PHP y Node.js desde versiones antiguas de Afip SDK a versiones **v1.0 o superiores**. Veremos los cambios principales en la forma de actualizar la librería, manejar certificados y configurar el entorno de producción con el nuevo sistema de token.
---
## Resumen
- Actualiza tu dependencia de Afip SDK a la última versión.
- Cambia la forma de pasar `cert` y `key`: ahora envías el contenido de los archivos.
- Configura tu proyecto para producción agregando el `access_token` (uso de pago).
- Elimina `afip_res` y no guardes TA localmente.
---
### 1. Actualizar la librería a la última versión
**PHP (Composer)**
```bash
composer require afipsdk/afip.php:^1.0
```
**Node.js (npm)**
```bash
npm install @afipsdk/afip.js@^1.0
```
---
### 2. Manejo de certificado y clave
En versiones anteriores pasabas el nombre de los archivos y los guardaba en afip_res, pero a partir de v1.0 debes leer el contenido y pasarlo directamente.
**Antes (v<1.0)**
#### PHP
```php
$afip = new Afip([
'cert' => 'nombre.crt',
'key' => 'nombre.key'
]);
```
#### Node
```js
const afip = new Afip({
cert: 'nombre.crt',
key: 'nombre.key'
});
```
**Ahora (v≥1.0)**
#### PHP
```php
// Certificado (Puede estar guardado en archivos, DB, etc)
$cert = file_get_contents('./certificado.crt');
// Key (Puede estar guardado en archivos, DB, etc)
$key = file_get_contents('./key.key');
$afip = new Afip([
'cert' => $cert,
'key' => $key
]);
```
#### Node
```js
const fs = require('fs');
// Certificado (Puede estar guardado en archivos, DB, etc)
const cert = fs.readFileSync('./certificado.crt', {encoding: 'utf8'});
// Key (Puede estar guardado en archivos, DB, etc)
const key = fs.readFileSync('./key.key', {encoding: 'utf8'});
const afip = new Afip({
cert: cert,
key: key
});
```
---
### 3. Configuración para ambiente de producción (uso de pago)
A partir de **v1.0**, usar Afip SDK en producción requiere un **access_token**. Sigue la guía oficial: https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion
---
### 4. Eliminación de `afip_res` y almacenamiento de TA
A partir de **v1.0**, ya no necesitas:
- Mantener la carpeta `afip_res`.
- Guardar localmente los tokens y firmas (TA).
El SDK gestiona la generación y almacenamiento temporal de estos datos.
---
## Conclusión
Con estos pasos habrás migrado satisfactoriamente tus proyectos a la versión **v1.0 o superior** de Afip SDK en PHP y Node.js.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Crear factura electrónica de ARCA en Visual Basic 6 description: Con pocas líneas de código category: [VB6] pubDate: mar 10, 2025 cover: /images/blog/vb6-create-invoice.png ---
# Crear factura electrónica de ARCA en Visual Basic 6
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA en Visual Basic 6 es obtener el Código de Autorización Electrónico o CAE.
Esto lo vamos a hacer utilizando Afip SDK que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Ademas, vamos a usar https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas para trabajar con JSON.
Para esto debemos descargar [descargar JsonConverter.bas](https://raw.githubusercontent.com/VBA-tools/VBA-JSON/refs/heads/master/JsonConverter.bas), y agregarlo a nuestro proyecto.
Elegimos "JsonConverter.bas"
Y agregar la referencia "Microsoft Scripting Runtime" y "Microsoft WinHTTP Services, version 5.1"
Elegimos "Microsoft Scripting Runtime"
y "Microsoft WinHTTP Services, version 5.1"
## Obtener la autorización
Lo primero que tenemos hacer es obtener el "Token authorization", que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vb6#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```vb
Private Sub GetAuthorization()
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
' Crear objeto XMLHTTP
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
' Preparamos la data para pedir el TA
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "wsfe"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
' Parsear respuesta JSON (requiere función auxiliar ParseJson)
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Guardar token y sign
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
End Sub
```
Ahora tenemos **token** y **sign** que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Obtener el número del último comprobante
Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto es fundamental para evitar el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**.
Para esto, vamos a usar el método `FECompUltimoAutorizado` haciendo una solicitud **POST** al endpoint:
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```vb
Private Sub GetLastVoucherNumber()
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
' Crear objeto XMLHTTP para autorización
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
' Preparamos la data para pedir el TA
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "wsfe"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
' Parsear respuesta JSON (requiere función auxiliar ParseJson)
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Guardar token y sign
Dim gstrToken As String, gstrSign As String
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
' --- Obtener el número del próximo comprobante ---
Dim objHttpComp As Object
Set objHttpComp = CreateObject("WinHttp.WinHttpRequest.5.1")
Dim strCompUrl As String
strCompUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Dim dictRequest As Dictionary
Set dictRequest = New Dictionary
dictRequest.Add "environment", "dev"
dictRequest.Add "method", "FECompUltimoAutorizado"
dictRequest.Add "wsid", "wsfe"
Dim dictParams As Dictionary
Set dictParams = New Dictionary
Dim dictAuth As Dictionary
Set dictAuth = New Dictionary
dictAuth.Add "Token", gstrToken
dictAuth.Add "Sign", gstrSign
dictAuth.Add "Cuit", "20409378472"
dictParams.Add "Auth", dictAuth
dictParams.Add "PtoVta", 1
dictParams.Add "CbteTipo", 6
dictRequest.Add "params", dictParams
Dim strData As String
strData = JsonConverter.ConvertToJson(dictRequest)
With objHttpComp
.Open "POST", strCompUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strData
If .Status <> 200 Then
MsgBox "Error al obtener el último comprobante: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Dim objJsonComp As Object
Set objJsonComp = JsonConverter.ParseJson(strResponse)
' El número siguiente es el último autorizado + 1
Dim nextVoucher As Long
nextVoucher = objJsonComp("FECompUltimoAutorizadoResult")("CbteNro") + 1
End Sub
```
Ahora sí, con el número correcto, podemos crear la factura:
## Crear la factura
Vamos a crear una Factura B por un importe de $121. En nuestro código, añadimos la siguiente función autocontenida:
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```vb
Private Sub CreateInvoice()
Dim objHttp As Object
Dim strResponse As String
Dim strAuthUrl As String
Dim strAuthData As String
Dim dictAuthData As Dictionary
' Crear objeto XMLHTTP para autorización
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
' Preparamos la data para pedir el TA
Set dictAuthData = New Dictionary
dictAuthData.Add "environment", "dev"
dictAuthData.Add "tax_id", "20409378472"
dictAuthData.Add "wsid", "wsfe"
strAuthData = JsonConverter.ConvertToJson(dictAuthData)
With objHttp
.Open "POST", strAuthUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strAuthData
If .Status <> 200 Then
MsgBox "Error en la autorización: " & .Status
MsgBox "Respuesta: " & .responseText
Exit Sub
End If
strResponse = .responseText
End With
' Parsear respuesta JSON (requiere función auxiliar ParseJson)
Dim objJson As Object
Set objJson = JsonConverter.ParseJson(strResponse)
' Guardar token y sign
Dim gstrToken As String, gstrSign As String
gstrToken = objJson("token")
gstrSign = objJson("sign")
Debug.Print "Token: " & gstrToken
Debug.Print "Sign: " & gstrSign
' --- Obtener el número del próximo comprobante ---
Dim objHttpComp As Object
Set objHttpComp = CreateObject("WinHttp.WinHttpRequest.5.1")
Dim strCompUrl As String
strCompUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Dim dictRequest As Dictionary
Set dictRequest = New Dictionary
dictRequest.Add "environment", "dev"
dictRequest.Add "method", "FECompUltimoAutorizado"
dictRequest.Add "wsid", "wsfe"
Dim dictParams As Dictionary
Set dictParams = New Dictionary
Dim dictAuth As Dictionary
Set dictAuth = New Dictionary
dictAuth.Add "Token", gstrToken
dictAuth.Add "Sign", gstrSign
dictAuth.Add "Cuit", "20409378472"
dictParams.Add "Auth", dictAuth
dictParams.Add "PtoVta", 1
dictParams.Add "CbteTipo", 6
dictRequest.Add "params", dictParams
Dim strData As String
strData = JsonConverter.ConvertToJson(dictRequest)
With objHttpComp
.Open "POST", strCompUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strData
If .Status <> 200 Then
MsgBox "Error al obtener el último comprobante: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Dim objJsonComp As Object
Set objJsonComp = JsonConverter.ParseJson(strResponse)
' El número siguiente es el último autorizado + 1
Dim nextVoucher As Long
nextVoucher = objJsonComp("FECompUltimoAutorizadoResult")("CbteNro") + 1
' --- Crear la factura ---
Dim strInvoiceUrl As String
Dim strInvoiceData As String
Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
strInvoiceUrl = "https://app.afipsdk.com/api/v1/afip/requests"
Dim dictInvoiceData As Dictionary
Set dictInvoiceData = New Dictionary
With dictInvoiceData
.Add "environment", "dev"
.Add "method", "FECAESolicitar"
.Add "wsid", "wsfe"
End With
Dim dictParamsInv As Dictionary
Set dictParamsInv = New Dictionary
' Auth
Dim dictAuthInv As Dictionary
Set dictAuthInv = New Dictionary
With dictAuthInv
.Add "Token", gstrToken
.Add "Sign", gstrSign
.Add "Cuit", "20409378472"
End With
dictParamsInv.Add "Auth", dictAuthInv
' FeCAEReq
Dim dictFeCAEReq As Dictionary
Set dictFeCAEReq = New Dictionary
' FeCabReq
Dim dictFeCabReq As Dictionary
Set dictFeCabReq = New Dictionary
With dictFeCabReq
.Add "CantReg", 1
.Add "PtoVta", 1
.Add "CbteTipo", 6
End With
dictFeCAEReq.Add "FeCabReq", dictFeCabReq
' FeDetReq
Dim dictFeDetReq As Dictionary
Set dictFeDetReq = New Dictionary
' FECAEDetRequest
Dim dictDetReq As Dictionary
Set dictDetReq = New Dictionary
With dictDetReq
.Add "Concepto", 1
.Add "DocTipo", 99
.Add "DocNro", 0
.Add "CbteDesde", nextVoucher
.Add "CbteHasta", nextVoucher
.Add "CbteFch", Format$(Date, "yyyymmdd")
.Add "ImpTotal", 121
.Add "ImpTotConc", 0
.Add "ImpNeto", 100
.Add "ImpOpEx", 0
.Add "ImpIVA", 21
.Add "ImpTrib", 0
.Add "MonId", "PES"
.Add "MonCotiz", 1
.Add "CondicionIVAReceptorId", 5
End With
' Iva
Dim dictIva As Dictionary
Set dictIva = New Dictionary
' Array Alic Iva
Dim colAlicIva As Collection
Set colAlicIva = New Collection
Dim dictIvaItem As Dictionary
Set dictIvaItem = New Dictionary
With dictIvaItem
.Add "Id", 5
.Add "BaseImp", 100
.Add "Importe", 21
End With
colAlicIva.Add dictIvaItem
dictIva.Add "AlicIva", colAlicIva
dictDetReq.Add "Iva", dictIva
dictFeDetReq.Add "FECAEDetRequest", dictDetReq
dictFeCAEReq.Add "FeDetReq", dictFeDetReq
dictParamsInv.Add "FeCAEReq", dictFeCAEReq
dictInvoiceData.Add "params", dictParamsInv
strInvoiceData = JsonConverter.ConvertToJson(dictInvoiceData, Whitespace:=2)
With objHttp
.Open "POST", strInvoiceUrl, False
.setRequestHeader "Content-Type", "application/json"
.setRequestHeader "Authorization", "Bearer TU_ACCESS_TOKEN"
.Send strInvoiceData
If .Status <> 200 Then
MsgBox "Error al crear la factura: " & .Status
Exit Sub
End If
strResponse = .responseText
End With
Debug.Print "Respuesta: " & strResponse
Set objJson = ParseJson(strResponse)
End Sub
```
En la respuesta tenemos el CAE y vencimiento correspondientes a la factura que acabamos de crear.
```json
{
...
"CAE": "12345678987654",
"CAEFchVto": "20240327"
...
}
```
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar** te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor** te recomiendo leer este artículo.
Con la autorización creada ya podemos proceder a crear el PDF para presentarle a nuestro cliente. Puedes usar como base esta [factura](https://gist.githubusercontent.com/AfipSDK/60604af781826b0d0438042ae807cc91/raw/87d7eff8ab2ad180319eecef9caa47fd0ae8ec1a/bill.html) o [ticket](https://gist.githubusercontent.com/AfipSDK/fb05e5bfd059e9bf7fc6045de426ae7f/raw/0bbda8e8e456de768e3a2fb464e4899258146ea2/ticket.html) de ejemplo.
Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en .NET description: Con pocas líneas de código category: [.NET] pubDate: feb 27, 2025 cover: /images/blog/csharp-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en .NET
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando la librería [Afip.Net](https://github.com/afipsdk/afip.net), que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.Net](https://github.com/afipsdk/afip.net)
**CLI**
```bash
dotnet add package Afip.Net
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/dotnet#usar-tu-propio-certificado-opcional).
```csharp
using AfipSDK.Afip.Net;
var afip = new Afip(new AfipOptions
{
CUIT = "20409378472", // CUIT vinculado al certificado
Production = false,
AccessToken = "TU_ACCESS_TOKEN",
});
```
## Creamos una instancia del web service
```csharp
var ws = afip.WebService("wscdc");
```
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
```csharp
// Obtenemos el TA
var ta = await ws.GetTokenAuthorizationAsync();
// Preparamos los datos
var data = new Dictionary
{
["Auth"] = new Dictionary
{
["Token"] = ta.Token,
["Sign"] = ta.Sign,
["Cuit"] = afip.Options.CUIT
},
["CmpReq"] = new Dictionary
{
["CbteModo"] = "CAE",
["CuitEmisor"] = 20409378472,
["PtoVta"] = 1,
["CbteTipo"] = 11,
["CbteNro"] = 3850,
["CbteFch"] = 20250225,
["ImpTotal"] = 100,
["CodAutorizacion"] = "75082223003046",
["DocTipoReceptor"] = "80",
["DocNroReceptor"] = "33693450239"
}
};
var res = await ws.ExecuteRequestAsync>("ComprobanteConstatar", data);
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(res));
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con .NET listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en Java description: Con pocas líneas de código category: [Java] pubDate: feb 27, 2025 cover: /images/blog/java-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en Java
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando la librería [afip.java](https://github.com/afipsdk/afip.java), que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [afip.java](https://github.com/afipsdk/afip.java)
**Maven**
```xml
com.afipsdk
afip-sdk-java
1.0.0
```
**Gradle**
```gradle
implementation 'com.afipsdk:afip-sdk-java:1.0.0'
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/java#usar-tu-propio-certificado-opcional).
```java
import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;
AfipOptions options = new AfipOptions();
options.setCuit("20409378472"); // CUIT vinculado al certificado
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN");
Afip afip = new Afip(options);
```
## Creamos una instancia del web service
```java
AfipWebService ws = afip.webService("wscdc");
```
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
```java
import com.afipsdk.AfipWebService;
import com.afipsdk.model.GetServiceTAResponse;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.LinkedHashMap;
import java.util.Map;
// Obtenemos el TA
GetServiceTAResponse ta = ws.getTokenAuthorization();
// Preparamos los datos
Map auth = new LinkedHashMap<>();
auth.put("Token", ta.getToken());
auth.put("Sign", ta.getSign());
auth.put("Cuit", afip.getOptions().getCuit());
Map cmpReq = new LinkedHashMap<>();
cmpReq.put("CbteModo", "CAE");
cmpReq.put("CuitEmisor", 20409378472L);
cmpReq.put("PtoVta", 1);
cmpReq.put("CbteTipo", 11);
cmpReq.put("CbteNro", 3850);
cmpReq.put("CbteFch", 20250225);
cmpReq.put("ImpTotal", 100);
cmpReq.put("CodAutorizacion", "75082223003046");
cmpReq.put("DocTipoReceptor", "80");
cmpReq.put("DocNroReceptor", "33693450239");
Map data = new LinkedHashMap<>();
data.put("Auth", auth);
data.put("CmpReq", cmpReq);
Map res = ws.executeRequest("ComprobanteConstatar", data);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println(gson.toJson(res));
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con Java listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en NodeJS description: Con pocas líneas de código category: [Javascript] pubDate: feb 27, 2025 cover: /images/blog/js-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en NodeJS
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.js](https://github.com/AfipSDK/afip.js)
**npm**
```bash
npm install --save @afipsdk/afip.js
```
**Yarn**
```bash
yarn add @afipsdk/afip.js
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/node.js#usar-tu-propio-certificado-opcional).
```javascript
const Afip = require('@afipsdk/afip.js');
// CUIT vinculado al certificado
const CUIT = 20409378472;
const afip = new Afip({
access_token: 'TU_ACCESS_TOKEN',
CUIT,
});
```
## Creamos una instancia del web service
```javascript
const ws = afip.webService('wscdc');
```
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
```javascript
// Obtenemos el TA
const ta = await ws.getTokenAuthorization();
// Preparamos los datos
const data = {
Auth: {
Token: ta.token,
Sign: ta.sign,
Cuit: CUIT
},
CmpReq: {
CbteModo: "CAE",
CuitEmisor: 20409378472,
PtoVta: 1,
CbteTipo: 11,
CbteNro: 3850,
CbteFch: 20250225,
ImpTotal: 100,
CodAutorizacion: "75082223003046",
DocTipoReceptor: "80",
DocNroReceptor: "33693450239"
}
};
const res = await ws.executeRequest('ComprobanteConstatar', data);
console.log(res);
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con NodeJS listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en PHP description: Con pocas líneas de código category: [PHP] pubDate: feb 27, 2025 cover: /images/blog/php-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en PHP
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.php](https://github.com/AfipSDK/afip.php)
**Composer**
```bash
composer require afipsdk/afip.php
```
**Manual**
1. Descargar la librería [Afip.php](https://github.com/AfipSDK/afip.php) y copiar la carpeta src en nuestro proyecto. [Link de descarga directo](https://github.com/AfipSDK/afip.php/archive/refs/heads/master.zip)
2. Incluimos el archivo **src/Afip.php** en nuestro proyecto
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/php#usar-tu-propio-certificado-opcional).
```php
include 'ruta/a/src/Afip.php';
/**
* CUIT vinculado al certificado
**/
$CUIT = 20409378472;
$afip = new Afip(array('access_token' => 'TU_ACCESS_TOKEN', 'CUIT' => $CUIT));
```
## Creamos una instancia del web service
```php
$ws = $afip->webService('wscdc');
```
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
```php
// Obtenemos el TA
$ta = $ws->getTokenAuthorization();
// Preparamos los datos
$data = array(
'Auth' => array(
'Token' => $ta->token,
'Sign' => $ta->sign,
'Cuit' => $CUIT
),
'CmpReq' => array(
'CbteModo' => 'CAE',
'CuitEmisor' => 20409378472,
'PtoVta' => 1,
'CbteTipo' => 11,
'CbteNro' => 3850,
'CbteFch' => 20250225,
'ImpTotal' => 100,
'CodAutorizacion' => '75082223003046',
'DocTipoReceptor' => '80',
'DocNroReceptor' => '33693450239'
)
);
$res = $ws->executeRequest('ComprobanteConstatar', $data);
var_dump($res);
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con PHP listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en Python description: Con pocas líneas de código category: [Python] pubDate: feb 27, 2025 cover: /images/blog/python-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en Python
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.py](https://github.com/AfipSDK/afip.py)
**PyPI**
```bash
pip install afip.py
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/python#usar-tu-propio-certificado-opcional).
```python
from afip import Afip
# CUIT vinculado al certificado
CUIT = 20409378472
afip = Afip({ "access_token": "TU_ACCESS_TOKEN", "CUIT": CUIT })
```
## Creamos una instancia del web service
```python
ws = afip.webService('wscdc')
```
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
```python
# Obtenemos el TA
ta = ws.getTokenAuthorization()
# Preparamos los datos
data = {
"Auth": {
"Token": ta["token"],
"Sign": ta["sign"],
"Cuit": CUIT
},
"CmpReq": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": 20250225,
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
}
}
res = ws.executeRequest("ComprobanteConstatar", data)
print(res)
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con Python listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA en Ruby description: Con pocas líneas de código category: [Ruby] pubDate: feb 27, 2025 cover: /images/blog/ruby-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA en Ruby
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.rb](https://github.com/AfipSDK/afip.rb)
**Gemfile**
```ruby
gem 'afip.rb', '~> 1.0', '>= 1.0.1'
```
**Gem**
```bash
gem install afip.rb
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/ruby#usar-tu-propio-certificado-opcional).
```ruby
require "afip"
# CUIT vinculado al certificado
CUIT = 20409378472
afip = Afip.new({ "access_token": "TU_ACCESS_TOKEN", "CUIT": CUIT })
```
## Creamos una instancia del web service
```ruby
ws = afip.webService('wscdc')
```
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
```ruby
# Obtenemos el TA
ta = ws.getTokenAuthorization
# Preparamos los datos
data = {
"Auth": {
"Token": ta["token"],
"Sign": ta["sign"],
"Cuit": CUIT
},
"CmpReq": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": 20250225,
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
}
}
res = ws.executeRequest('ComprobanteConstatar', data)
puts res
```
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA con Ruby listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Realizar constatación de comprobantes de ARCA via API description: Con pocas líneas de código category: [API] pubDate: feb 25, 2025 cover: /images/blog/api-voucher-verification.png ---
# Realizar constatación de comprobantes de ARCA via API
La constatación de los datos de un comprobante puede realizarse a través de nuestro propio sistema, consumiendo los web services de ARCA.
Esto lo vamos a hacer utilizando Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Obtener la autorización
Lo primero que tenemos hacer es obtener el “Token authorization”, que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/api#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
Incluí el header con tu token:
```bash
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
```json
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wscdc"
}
```
Como respuesta nos devolverá
```json
{
"expiration": "2024-03-13T00:42:59.845Z",
"token": "PD94bWwgd...",
"sign": "kEaCwSs36hpe..."
}
```
Aquí tenemos el token y sign que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Realizamos la constatación de un comprobante
Vamos a constatar el comprobante con el CAE 75082223003046. En este momento estamos ejecutando una solicitud en modo desarrollo, por lo que solo podemos constatar comprobantes emitidos en el entorno de desarrollo. Más adelante, al pasar a producción, podremos constatar comprobantes reales.
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
Incluí nuevamente el header con tu token:
```bash
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
```
```json
{
"environment": "dev",
"method": "ComprobanteConstatar",
"wsid": "wscdc",
"params": {
"Auth": {
"Token": "{{token}}",
"Sign": "{{sign}}",
"Cuit": "20409378472"
},
"CmpReq": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": 20250225,
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
}
}
}
```
Debemos reemplazar **\{\{token\}\}** y **\{\{sign\}\}** con los que obtuvimos anteriormente.
En la respuesta, nos devolverá el resultado de la constatación del comprobante.
```json
{
"ComprobanteConstatarResult": {
"CmpResp": {
"CbteModo": "CAE",
"CuitEmisor": 20409378472,
"PtoVta": 1,
"CbteTipo": 11,
"CbteNro": 3850,
"CbteFch": "20250225",
"ImpTotal": 100,
"CodAutorizacion": "75082223003046",
"DocTipoReceptor": "80",
"DocNroReceptor": "33693450239"
},
"Resultado": "A",
"FchProceso": "20250225091448",
"Events": {
"Evt": [
{
"Code": 0
}
]
}
}
}
```
En el resultado podemos ver que el comprobante fue constatado correctamente `"Resultado": "A"` (A = Aprobado, R = Rechazado).
Con esto ya tenemos la constatación de un comprobante de ARCA a través de la API listo.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para poder realizar constatación de comprobantes reales.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Crear factura electrónica de ARCA en Delphi description: Con pocas líneas de código category: [Delphi] pubDate: feb 24, 2025 cover: /images/blog/delphi-create-invoice.png ---
# Crear factura electrónica de ARCA en Delphi
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA en Delphi es obtener el Código de Autorización Electrónico o CAE.
Esto lo vamos a hacer utilizando Afip SDK que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Obtener la autorización
Lo primero que tenemos hacer es obtener el “Token authorization”, que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/delphi#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
A continuación, se muestra el código Delphi equivalente:
```pascal
uses
System.SysUtils, System.Classes, System.Net.HttpClient, System.Net.URLClient, System.JSON;
procedure ObtenerAutorizacion;
var
Client: THTTPClient;
AuthURL: string;
AuthData: TJSONObject;
Response: IHTTPResponse;
Token, Sign: string;
AuthResponse: TJSONObject;
begin
Client := THTTPClient.Create;
try
AuthURL := 'https://app.afipsdk.com/api/v1/afip/auth';
AuthData := TJSONObject.Create;
try
AuthData.AddPair('environment', 'dev');
AuthData.AddPair('tax_id', '20409378472'); // CUIT a utilizar
AuthData.AddPair('wsid', 'wsfe');
Response := Client.Post(AuthURL,
TStringStream.Create(AuthData.ToString, TEncoding.UTF8), nil,
[
TNetHeader.Create('Content-Type', 'application/json'),
TNetHeader.Create('Authorization', 'Bearer TU_ACCESS_TOKEN')
]);
if Response.StatusCode <> 200 then
begin
WriteLn(Format('Error en la autorización: %d', [Response.StatusCode]));
Exit;
end;
AuthResponse := TJSONObject.ParseJSONValue(Response.ContentAsString(TEncoding.UTF8)) as TJSONObject;
try
Token := AuthResponse.GetValue('token');
Sign := AuthResponse.GetValue('sign');
WriteLn('Token: ' + Token);
WriteLn('Sign: ' + Sign);
finally
AuthResponse.Free;
end;
finally
AuthData.Free;
end;
finally
Client.Free;
end;
end;
```
Ahora tenemos **token** y **sign** que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Obtener el número del último comprobante
Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto es fundamental para evitar el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**.
Para esto, vamos a usar el método `FECompUltimoAutorizado` haciendo una solicitud **POST** al endpoint:
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```pascal
uses
System.SysUtils, System.Classes, System.Net.HttpClient, System.Net.URLClient, System.JSON;
function ObtenerProximoNumeroComprobante(const Token, Sign: string): Integer;
var
Client: THTTPClient;
RequestURL: string;
RequestData, ParamsData, AuthData: TJSONObject;
Response: IHTTPResponse;
ResponseJson, ResultJson: TJSONObject;
CbteNro: Integer;
begin
Client := THTTPClient.Create;
try
RequestURL := 'https://app.afipsdk.com/api/v1/afip/requests';
RequestData := TJSONObject.Create;
try
RequestData.AddPair('environment', 'dev');
RequestData.AddPair('method', 'FECompUltimoAutorizado');
RequestData.AddPair('wsid', 'wsfe');
ParamsData := TJSONObject.Create;
try
AuthData := TJSONObject.Create;
AuthData.AddPair('Token', Token);
AuthData.AddPair('Sign', Sign);
AuthData.AddPair('Cuit', '20409378472');
ParamsData.AddPair('Auth', AuthData);
ParamsData.AddPair('PtoVta', TJSONNumber.Create(1));
ParamsData.AddPair('CbteTipo', TJSONNumber.Create(6));
RequestData.AddPair('params', ParamsData);
except
ParamsData.Free;
raise;
end;
Response := Client.Post(RequestURL,
TStringStream.Create(RequestData.ToString, TEncoding.UTF8), nil,
[
TNetHeader.Create('Content-Type', 'application/json'),
TNetHeader.Create('Authorization', 'Bearer TU_ACCESS_TOKEN')
]);
if Response.StatusCode <> 200 then
begin
WriteLn(Format('Error al obtener el último comprobante: %d', [Response.StatusCode]));
Exit(-1);
end;
ResponseJson := TJSONObject.ParseJSONValue(Response.ContentAsString(TEncoding.UTF8)) as TJSONObject;
try
// El número siguiente es el último autorizado + 1
ResultJson := ResponseJson.GetValue('FECompUltimoAutorizadoResult');
CbteNro := ResultJson.GetValue('CbteNro') + 1;
WriteLn('Próximo número de comprobante: ' + CbteNro.ToString);
Result := CbteNro;
finally
ResponseJson.Free;
end;
finally
RequestData.Free;
end;
finally
Client.Free;
end;
end;
```
Ahora, con el número correcto, podemos crear la factura en el siguiente paso.
## Crear la factura
Vamos a crear una [Factura B](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/factura-b) por un importe de $121. En nuestro código, añadimos la siguiente lógica:
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
A continuación, se muestra el código Delphi equivalente, usando el número de comprobante obtenido en el paso anterior:
```pascal
uses
System.SysUtils, System.Classes, System.Net.HttpClient, System.Net.URLClient, System.JSON;
procedure CrearFactura(const Token, Sign: string; NumeroComprobante: Integer);
var
Client: THTTPClient;
InvoiceURL: string;
InvoiceData, ParamsData, AuthData, FeCabReq, FeDetReq, FECAEDetRequest, FeCAEReq: TJSONObject;
IvaArray: TJSONArray;
IvaItem: TJSONObject;
Response: IHTTPResponse;
InvoiceResponse: TJSONObject;
begin
Client := THTTPClient.Create;
try
InvoiceURL := 'https://app.afipsdk.com/api/v1/afip/requests';
// Construir el objeto JSON para la factura
InvoiceData := TJSONObject.Create;
try
InvoiceData.AddPair('environment', 'dev');
InvoiceData.AddPair('method', 'FECAESolicitar');
InvoiceData.AddPair('wsid', 'wsfe');
// Construir el objeto Params
ParamsData := TJSONObject.Create;
try
// Objeto Auth
AuthData := TJSONObject.Create;
AuthData.AddPair('Token', Token);
AuthData.AddPair('Sign', Sign);
AuthData.AddPair('Cuit', '20409378472'); // CUIT utilizado
ParamsData.AddPair('Auth', AuthData);
// Objeto FeCAEReq
FeCAEReq := TJSONObject.Create;
try
// FeCabReq
FeCabReq := TJSONObject.Create;
FeCabReq.AddPair('CantReg', TJSONNumber.Create(1));
FeCabReq.AddPair('PtoVta', TJSONNumber.Create(1));
FeCabReq.AddPair('CbteTipo', TJSONNumber.Create(6));
FeCAEReq.AddPair('FeCabReq', FeCabReq);
// FeDetReq
FeDetReq := TJSONObject.Create;
try
FECAEDetRequest := TJSONObject.Create;
FECAEDetRequest.AddPair('Concepto', TJSONNumber.Create(1));
FECAEDetRequest.AddPair('DocTipo', TJSONNumber.Create(99)); // 99: Consumidor final
FECAEDetRequest.AddPair('DocNro', TJSONNumber.Create(0));
FECAEDetRequest.AddPair('CbteDesde', TJSONNumber.Create(NumeroComprobante));
FECAEDetRequest.AddPair('CbteHasta', TJSONNumber.Create(NumeroComprobante));
FECAEDetRequest.AddPair('CbteFch', FormatDateTime('yyyymmdd', Now));
FECAEDetRequest.AddPair('ImpTotal', TJSONNumber.Create(121));
FECAEDetRequest.AddPair('ImpTotConc', TJSONNumber.Create(0));
FECAEDetRequest.AddPair('ImpNeto', TJSONNumber.Create(100));
FECAEDetRequest.AddPair('ImpOpEx', TJSONNumber.Create(0));
FECAEDetRequest.AddPair('ImpIVA', TJSONNumber.Create(21));
FECAEDetRequest.AddPair('ImpTrib', TJSONNumber.Create(0));
FECAEDetRequest.AddPair('MonId', 'PES');
FECAEDetRequest.AddPair('MonCotiz', TJSONNumber.Create(1));
FECAEDetRequest.AddPair('CondicionIVAReceptorId', TJSONNumber.Create(5));
// Array de IVA: un elemento con Id = 5, BaseImp = 100 e Importe = 21
IvaArray := TJSONArray.Create;
IvaItem := TJSONObject.Create;
IvaItem.AddPair('Id', TJSONNumber.Create(5));
IvaItem.AddPair('BaseImp', TJSONNumber.Create(100));
IvaItem.AddPair('Importe', TJSONNumber.Create(21));
IvaArray.AddElement(IvaItem);
FECAEDetRequest.AddPair('Iva', IvaArray);
FeDetReq.AddPair('FECAEDetRequest', FECAEDetRequest);
FeCAEReq.AddPair('FeDetReq', FeDetReq);
except
FeDetReq.Free;
raise;
end;
ParamsData.AddPair('FeCAEReq', FeCAEReq);
InvoiceData.AddPair('params', ParamsData);
// Enviar la solicitud POST para crear la factura
Response := Client.Post(InvoiceURL,
TStringStream.Create(InvoiceData.ToString, TEncoding.UTF8), nil,
[
TNetHeader.Create('Content-Type', 'application/json'),
TNetHeader.Create('Authorization', 'Bearer TU_ACCESS_TOKEN')
]);
if Response.StatusCode <> 200 then
begin
WriteLn(Format('Error al crear la factura: %d', [Response.StatusCode]));
Exit;
end;
InvoiceResponse := TJSONObject.ParseJSONValue(Response.ContentAsString(TEncoding.UTF8)) as TJSONObject;
try
WriteLn('Invoice: ' + InvoiceResponse.ToString);
finally
InvoiceResponse.Free;
end;
except
ParamsData.Free;
raise;
end;
finally
InvoiceData.Free;
end;
finally
Client.Free;
end;
end;
end;
```
Por ejemplo, para crear la factura correctamente, el flujo sería:
```pascal
var
Token, Sign: string;
NumeroComprobante: Integer;
begin
ObtenerAutorizacion; // Debe asignar Token y Sign
NumeroComprobante := ObtenerProximoNumeroComprobante(Token, Sign);
if NumeroComprobante > 0 then
CrearFactura(Token, Sign, NumeroComprobante);
end;
```
En **invoice** tenemos el CAE y vencimiento correspondientes a la factura que acabamos de crear.
```json
{
...
"CAE": "12345678987654",
"CAEFchVto": "20240327"
...
}
```
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar** te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor** te recomiendo leer este artículo.
Con la autorización creada ya podemos proceder a crear el PDF para presentarle a nuestro cliente. Puedes usar como base esta [factura](https://gist.githubusercontent.com/AfipSDK/60604af781826b0d0438042ae807cc91/raw/87d7eff8ab2ad180319eecef9caa47fd0ae8ec1a/bill.html) o [ticket](https://gist.githubusercontent.com/AfipSDK/fb05e5bfd059e9bf7fc6045de426ae7f/raw/0bbda8e8e456de768e3a2fb464e4899258146ea2/ticket.html) de ejemplo.
Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Crear factura electrónica de ARCA en Visual Fox Pro description: Con pocas líneas de código category: [VFP] pubDate: feb 24, 2025 cover: /images/blog/vfp-create-invoice.png ---
# Crear factura electrónica de ARCA en Visual Fox Pro
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA en Visual Fox Pro es obtener el Código de Autorización Electrónico o CAE.
Esto lo vamos a hacer utilizando Afip SDK que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Ademas, vamos a usar https://github.com/AfipSDK/vfp-json/blob/master/json.prg para trabajar con JSON.
```bash
SET PROCEDURE TO "path\al\archivo\json.prg" ADDITIVE
```
## Obtener la autorización
Lo primero que tenemos hacer es obtener el “Token authorization”, que seria la autorización en ARCA.
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/vfp#usar-tu-propio-certificado-opcional).
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/auth
```
```csharp
* PASO 1 - Pedir autorizacion
LOCAL loHttp, loResponse, lcJson, lcAuthUrl, loAuthData, loAuthDataObject, loAuthResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcAuthUrl = "https://app.afipsdk.com/api/v1/afip/auth"
lcAccessToken = "TU_ACCESS_TOKEN"
loAuthDataObject = CREATEOBJECT("JSONObject")
loAuthDataObject.set("environment", "dev")
loAuthDataObject.set("tax_id", "20409378472")
loAuthDataObject.set("wsid", "wsfe")
loAuthData = json_encode(loAuthDataObject)
loHttp.Open("POST", lcAuthUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loAuthData)
IF loHttp.Status <> 200
? "Error en la autorizacion: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loAuthResponse = json_decode(loResponse)
lcToken = loAuthResponse._token
lcSign = loAuthResponse._sign
? "Token: " + lcToken
? "Sign: " + lcSign
```
Ahora tenemos **token** y **sign** que nos dio ARCA para usar el web service. No es necesario que lo guardemos, Afip SDK se encarga de esto por nosotros, debemos solicitarlo antes de cada llamada a los métodos del web service.
## Pedir el numero de la ultima factura
Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto es fundamental para evitar el error (10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar.
Para esto, vamos a usar el método FECompUltimoAutorizado haciendo una solicitud POST al endpoint:
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```csharp
* PASO 2 - Pedir el numero del ultimo comprobante
LOCAL loHttp, loResponse, lcRequestUrl, loRequestData, loRequestDataObject, loRequestResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcRequestUrl = "https://app.afipsdk.com/api/v1/afip/requests"
lcAccessToken = "TU_ACCESS_TOKEN"
loRequestDataObject = CREATEOBJECT("JSONObject")
loRequestDataObject.set("environment", "dev")
loRequestDataObject.set("method", "FECompUltimoAutorizado")
loRequestDataObject.set("wsid", "wsfe")
* Params
LOCAL params
params = CREATEOBJECT("JSONObject")
loRequestDataObject.set("params", params)
* Auth
LOCAL auth
auth = CREATEOBJECT("JSONObject")
params.set("Auth", auth)
auth.set("Token", lcToken)
auth.set("Sign", lcSign)
auth.set("Cuit", "20409378472")
params.set("PtoVta", 1)
params.set("CbteTipo", 6)
* Construct the JSON request body
loRequestData = json_encode(loRequestDataObject)
* Open the HTTP request
loHttp.Open("POST", lcRequestUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
* Send the request
loHttp.Send(loRequestData)
* Check response status
IF loHttp.Status <> 200
? "Error en la solicitud: " + STR(loHttp.Status)
RETURN
ENDIF
* Get response
loResponse = loHttp.responseText
loRequestResponse = json_decode(loResponse)
? "Respuesta de la API: " + loResponse
lcNextVoucherNumber = loRequestResponse._fecompultimoautorizadoresult._cbtenro + 1
```
## Crear la factura
Vamos a crear una [Factura B](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica/factura-b) por un importe de $121. En nuestro código, añadimos la siguiente lógica:
Debemos ejecutar una solicitud **POST** al endpoint
```bash
https://app.afipsdk.com/api/v1/afip/requests
```
```csharp
LOCAL loHttp, loResponse, lcInvoiceUrl, loInvoiceData, loInvoiceDataObject, loInvoiceResponse, lcAccessToken
loHttp = CREATEOBJECT("Msxml2.XMLHTTP")
lcInvoiceUrl = "https://app.afipsdk.com/api/v1/afip/requests"
lcAccessToken = "TU_ACCESS_TOKEN"
* Datos para la request
loInvoiceDataObject = CREATEOBJECT("JSONObject")
loInvoiceDataObject.set("environment", "dev")
loInvoiceDataObject.set("method", "FECAESolicitar")
loInvoiceDataObject.set("wsid", "wsfe")
* Params
LOCAL params
params = CREATEOBJECT("JSONObject")
loInvoiceDataObject.set("params", params)
* Auth
LOCAL auth
auth = CREATEOBJECT("JSONObject")
params.set("Auth", auth)
auth.set("Token", lcToken)
auth.set("Sign", lcSign)
auth.set("Cuit", "20409378472")
* FeCAEReq
LOCAL FeCAEReq
FeCAEReq = CREATEOBJECT("JSONObject")
params.set("FeCAEReq", FeCAEReq)
* FeCabReq
LOCAL FeCabReq
FeCabReq = CREATEOBJECT("JSONObject")
FeCAEReq.set("FeCabReq", FeCabReq)
FeCabReq.set("CantReg", 1)
FeCabReq.set("PtoVta", 1)
FeCabReq.set("CbteTipo", 6)
* FeDetReq
LOCAL FeDetReq
FeDetReq = CREATEOBJECT("JSONObject")
FeCAEReq.set("FeDetReq", FeDetReq)
* FECAEDetRequest
LOCAL FECAEDetRequest
FECAEDetRequest = CREATEOBJECT("JSONObject")
FeDetReq.set("FECAEDetRequest", FECAEDetRequest)
FECAEDetRequest.set("Concepto", 1)
FECAEDetRequest.set("DocTipo", 99)
FECAEDetRequest.set("DocNro", 0)
FECAEDetRequest.set("CbteDesde", STR(lcNextVoucherNumber))
FECAEDetRequest.set("CbteHasta", STR(lcNextVoucherNumber))
FECAEDetRequest.set("CbteFch", LEFT(TTOC(DATE(), 1), 8))
FECAEDetRequest.set("ImpTotal", 121)
FECAEDetRequest.set("ImpTotConc", 0)
FECAEDetRequest.set("ImpNeto", 100)
FECAEDetRequest.set("ImpOpEx", 0)
FECAEDetRequest.set("ImpIVA", 21)
FECAEDetRequest.set("ImpTrib", 0)
FECAEDetRequest.set("MonId", "PES")
FECAEDetRequest.set("MonCotiz", 1)
FECAEDetRequest.set("CondicionIVAReceptorId", 5)
* Iva
LOCAL Iva
Iva = CREATEOBJECT("JSONObject")
FECAEDetRequest.set("Iva", Iva)
* AlicIva
LOCAL AlicIva
AlicIva = CREATEOBJECT("JSONArray")
Iva.set("AlicIva", AlicIva)
* IvaItem
LOCAL IvaItem
IvaItem = CREATEOBJECT("JSONObject")
AlicIva.add(IvaItem)
IvaItem.set("Id", 5)
IvaItem.set("BaseImp", 100)
IvaItem.set("Importe", 21)
loInvoiceData = json_encode(loInvoiceDataObject)
loHttp.Open("POST", lcInvoiceUrl, .F.)
loHttp.setRequestHeader("Content-Type", "application/json")
loHttp.setRequestHeader("Authorization", "Bearer " + lcAccessToken)
loHttp.Send(loInvoiceData)
IF loHttp.Status <> 200
? "Error al crear la factura: " + STR(loHttp.Status)
RETURN
ENDIF
loResponse = loHttp.responseText
loInvoiceResponse = json_decode(loResponse)
? "Invoice: " + loResponse
lcCAE = loInvoiceResponse._fecaesolicitarresult._fedetresp._fecaedetresponse.array[1]._cae
lcCAEVencimiento = loInvoiceResponse._fecaesolicitarresult._fedetresp._fecaedetresponse.array[1]._caefchvto
? "CAE: " + lcCAE
? "Vencimiento CAE: " + lcCAEVencimiento
```
En **loResponse** tenemos el CAE y vencimiento correspondientes a la factura que acabamos de crear.
```json
{
...
"CAE": "12345678987654",
"CAEFchVto": "20240327"
...
}
```
## Problemas comunes
Si estás teniendo el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar** te recomiendo leer este artículo.
Si estás teniendo el error **(10242) El campo Condición IVA receptor es obligatorio. Consultar método FEParamGetCondicionIvaReceptor** te recomiendo leer este artículo.
Con la autorización creada ya podemos proceder a crear el PDF para presentarle a nuestro cliente. Puedes usar como base esta [factura](https://gist.githubusercontent.com/AfipSDK/60604af781826b0d0438042ae807cc91/raw/87d7eff8ab2ad180319eecef9caa47fd0ae8ec1a/bill.html) o [ticket](https://gist.githubusercontent.com/AfipSDK/fb05e5bfd059e9bf7fc6045de426ae7f/raw/0bbda8e8e456de768e3a2fb464e4899258146ea2/ticket.html) de ejemplo.
Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error: ns1:coe.alreadyAuthenticated El CEE ya posee un TA valido para el acceso al WSN solicitado description: Pasos para resolver este error category: [AFIP] pubDate: feb 21, 2025 cover: /images/blog/afip-error.png ---
# Error: ns1:coe.alreadyAuthenticated El CEE ya posee un TA valido para el acceso al WSN solicitado
## Problema
Este error aparece cuando intentamos obtener un nuevo antes de que haya pasado el tiempo necesario desde el último que solicitamos.
## Solución
Para evitar este problema, debes guardar el TA que obtuviste y reutilizarlo en lugar de solicitar uno nuevo cada vez que necesites hacer una operación.
Si estás utilizando [Afip SDK](/), no debes preocuparte por esto, ya que la plataforma se encarga de manejar el TA por ti. Cada vez que pidas un TA, te devolverá uno en caché y generará uno nuevo solo cuando sea necesario.
## Tiempo de espera
Si necesitas solicitar un TA nuevo, debes esperar 2 minutos en o 10 minutos en desde el último TA que solicitaste.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error: ns1:cms.cert.expired Certificado expirado description: Pasos para resolver este error category: [AFIP] pubDate: feb 21, 2025 cover: /images/blog/afip-error.png ---
# Error: ns1:cms.cert.expired Certificado expirado
## Problema
Este error aparece cuando el certificado que estás utilizando para conectarte a los web services de ARCA ha expirado.
Los certificados tienen una vida de 2 años, por lo que es importante estar atento a la fecha de vencimiento para evitar este tipo de problemas.
Además, a veces puedes seguir usando un certificado expirado, pero no es recomendable, ya que en cualquier momento puede dejar de funcionar.
## Solución
Para resolver este error, debes obtener un nuevo certificado. Si lo obtienes con el mismo alias que el que estás usando, no es necesario que vuelvas a autorizar los web services.
Te dejo una guía para que puedas obtener un nuevo certificado:
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error: ns1:coe.notAuthorized Computador no autorizado a acceder al servicio description: Pasos para resolver este error category: [AFIP] pubDate: feb 21, 2025 cover: /images/blog/afip-error.png ---
# Error: ns1:coe.notAuthorized Computador no autorizado a acceder al servicio
## Problema
Este error aparece cuando intentamos obtener un para un web service que aún no hemos autorizado a usar con el certificado que estamos utilizando.
Si tienes alguna duda sobre cómo funcionan las autorizaciones y delegaciones de cada CUIT a los web services, te recomiendo leer la siguiente guía, donde se explica en detalle todo el proceso con los certificados y sus autorizaciones:
## Solución
Para resolver este error, debes autorizar el web service que estás intentando utilizar con el certificado correspondiente. Puedes hacerlo siguiendo los pasos de la guía mencionada anteriormente.
Si ya lo autorizaste y sigues obteniendo este error, espera unos minutos, ya que a veces la autorización tarda en propagarse por los servidores de ARCA.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error: ns1:wsn.notFound Servicio informado inexistente description: Pasos para resolver este error category: [AFIP] pubDate: feb 21, 2025 cover: /images/blog/afip-error.png ---
# Error: ns1:wsn.notFound Servicio informado inexistente
## Problema
Este error aparece cuando intentamos obtener un para un web service que no existe.
## Solución
Para resolver este error, debes utilizar el ID correspondiente al web service que estás intentando utilizar. Puedes encontrar el ID de cada web service al comienzo de la documentación del mismo. Por ejemplo, para el [web service de facturación electrónica](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica).

Si estás intentando usar un web service que no está en la lista de web services de Afip SDK, puedes encontrar el ID en el manual del web service dentro del [catálogo de web services de ARCA](https://www.afip.gob.ar/ws/documentacion/catalogo.asp).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Obtener el certificado para conectar tu sistema con los web services de ARCA description: Guía paso a paso category: [AFIP] pubDate: feb 20, 2025 cover: /images/blog/arca-cert.png ---
# Obtener el certificado para conectar tu sistema con los web services de ARCA
## Cómo usar esta guía
Te recomiendo que leas esta guía de principio a fin antes de comenzar a realizar los pasos, para que tengas una idea general de lo que vamos a hacer y puedas anticipar cualquier problema que pueda surgir.
## Introducción
Para conectar tu sistema con los web services de ARCA necesitamos un "certificado" y su correspondiente "key". Este certificado no es ningún trámite especial que debamos realizar físicamente en ARCA, es simplemente un archivo que nos provee ARCA a través de su página. Lo único que necesitamos para obtenerlo es tener [clave fiscal nivel 3](https://www.afip.gob.ar/clavefiscal/ayuda/obtener-clave-fiscal.asp), y la key es un archivo que generamos nosotros. Podemos pensar en la key como la "contraseña" del certificado.
En algunas partes de la página de ARCA se requiere tener un "Computador Fiscal"; en esos casos, este certificado actúa como computador fiscal.
## ¿Por qué necesitamos un certificado?
Con este certificado serán firmadas digitalmente las solicitudes que realicemos a los web services de ARCA, confirmando que efectivamente somos nosotros quienes realizamos las solicitudes.
## Autorización de web services
Además de tener el certificado, necesitamos autorizarlo para que pueda acceder a los web services que necesitamos. Esto lo hacemos a través de la página de ARCA. Podemos pensar en esto como si estuviéramos autorizando a nuestro certificado a realizar ciertas operaciones en nombre de nuestro CUIT. Cada web service que queramos utilizar necesitará una autorización distinta y un mismo certificado puede tener autorizaciones para varios web services e incluso para varios CUITs.
## Obteniendo el certificado
Bien, primero tenemos que hacer una distinción importante: existen certificados para , o simplemente desarrollo, y certificados para , o simplemente producción, que es el que se utiliza cuando ya desarrollamos nuestro sistema y vamos a realizar operaciones que sean reales.
La forma en que vamos a obtener el certificado puede variar dependiendo si lo vamos a usar para un software utilizado por un solo CUIT o por múltiples CUITs.
### Obteniendo el certificado para un solo CUIT
Si vamos a utilizar el certificado para un solo CUIT, tenemos 2 opciones: hacerlo manualmente o hacerlo usando las [Automatizaciones de Afip SDK](/docs/automations/introduction).
#### Opción 1: Hacerlo automáticamente con Afip SDK
Primero, usa esta automatizacion para [obtener el certificado de producción](/docs/automations/create-cert-prod/nodejs) o esta otra para [obtener el certificado de desarrollo](/docs/automations/create-cert-dev/nodejs).
Luego de obtener el certificado, debes usar esta automatizacion para [autorizar un web service de desarrollo](/docs/automations/auth-web-service-dev/nodejs) o esta otra para [autorizar un web service de producción](/docs/automations/auth-web-service-prod/nodejs).
#### Opción 2: Hacerlo manualmente
Primero, sigue esta guía para [obtener el certificado de producción](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/obtener-certificado-de-produccion) o esta otra para [obtener el certificado de desarrollo](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/obtener-certificado-de-testing).
Luego de obtener el certificado, debemos seguir esta guía para [autorizar un web service de desarrollo](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-testing) o esta otra para [autorizar un web service de producción](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-produccion).
### Obteniendo el certificado para múltiples CUITs
Si estamos creando un software que va a ser utilizado por múltiples CUITs, podemos optar por seguir alguna de las opciones anteriores repetida para cada CUIT o tenemos una tercera opción.
> Nota: los certificados de desarrollo están pensados para ser utilizados solo por el CUIT que los creó, por lo que si necesitas un certificado de desarrollo para múltiples CUITs, deberás crear uno para cada CUIT.
#### Opción 3: Delegación de web service
En esta opción solo debes crear un certificado de producción para quien quieras que sea el "administrador" o más bien "delegado" de todos los CUITs que usen tu software, siguiendo alguna de las opciones anteriores. Normalmente usarías el CUIT de tu empresa para generar este certificado.
Luego, en la autorización del web service es donde cambiará. En lugar de autorizar el web service con el mismo CUIT que creó el certificado, debes hacerlo con cada CUIT que utilizará el software.
##### **Hacerlo automáticamente con Afip SDK**
Para esto, debes:
1. Usar la [automatizacion para delegar un web service](/docs/automations/delegate-web-service/nodejs) con la contraseña y CUIT del usuario que te va a delagar el servicio.
2. Luego, con tu contraseña y CUIT debes usar la [automatizacion para aceptar delegación de web service](/docs/automations/accept-web-service-delegation/nodejs).
3. Una vez aceptada la delegación, ya debes pasar a usar la [automatizacion para autorizar web service de producción](/docs/automations/auth-web-service-prod/nodejs), pero cambiando que en el paremetro de `cuit` usas el CUIT del usuario que te delego el web service y como `username` y `password` usas tu usuario (CUIT) y contraseña.
#### **Hacerlo manualmente**
Para esto, el CUIT primero debe seguir [la guía para delegarte el web service](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/delegar-web-service) y luego tú debes seguir esta [guía para aceptar la delegación del web service](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/aceptar-delegacion-de-web-service). Una vez aceptada la delegación, ya debes pasar a [autorizar un web service de producción](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-produccion), pero cambiando que en la parte de elegir el «Representado» debes elegir el CUIT que te delegó el web service.
### ¿Qué web service necesito autorizar?
Para saber qué web service debemos autorizar, podemos verlo al comienzo de la documentación del mismo. Por ejemplo, para el [web service de facturación electrónica](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica).

El identificador es el ID que usaremos cuando creamos el certificado o autorización en automáticamente usando Afip SDK. "Producción" es como se encuentra en el listado de web services de producción y "Desarrollo" es como se encuentra en el listado de web services de desarrollo.
## Conclusión
Un certificado puede tener autorización para usar múltiples CUITs y varios web services, por lo que si ya tienes un certificado y necesitas autorizar un nuevo web service o un nuevo CUIT, no necesitas crear un nuevo certificado, simplemente debes autorizar el web service o el CUIT en el certificado que ya tienes.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error (600) ValidaciónDeToken: Error al verificar hash: VerificaciónDeHash: No validó la firma digital description: Pasos para resolver este error category: [AFIP] pubDate: feb 20, 2025 cover: /images/blog/afip-error.png ---
# Error (600) ValidaciónDeToken: Error al verificar hash: VerificaciónDeHash: No validó la firma digital
Este error aparece cuando intentamos usar un de desarrollo en producción o viceversa.
## Solución
Si estás usando la [API de Afip SDK](/blog/usar-web-services-de-afip-via-api/), asegúrate de no estar pidiendo la autorización en desarrollo `"environment": "dev"` y ejecutando la request en producción `"environment": "prod"` o viceversa.
Si estás utilizando algunas de las librerías de Afip SDK, estas se encargan automáticamente de hacer el pedido del TA en el ambiente correspondiente.
---
Este y otros problemas con los web services son detectados y resueltos rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Conectar tu sistema con los web services de ARCA description: Guía paso a paso category: [AFIP] pubDate: feb 18, 2025 cover: /images/blog/arca.png ---
# Conectar tu sistema con los web services de ARCA
Conectar tu sistema con los servicios de ARCA puede parecer complicado, pero con
una guía clara se vuelve un proceso sencillo. A continuación verás los pasos que
debes seguir, sin importar la tecnología que uses.
## 1. Elegí el ambiente correcto
ARCA ofrece dos entornos:
* : sirve para hacer pruebas sin efectos reales.
* : en este ambiente las operaciones son definitivas.
Las facturas emitidas en desarrollo no tienen validez legal. Utilizá este entorno para probar tu sistema antes de pasar a producción.
## 2. Obtené tu certificado digital
El primer requisito para usar los web services es contar con un certificado digital válido. Este certificado asegura la identidad de tu sistema cuando se comunica con ARCA. Podés obtenerlo siguiendo esta guía:
## 3. Autorizá el web service
Con el certificado listo, debés autorizarlo para el web service que vas a utilizar. En la guía anterior también se explica este paso.
## 4. Obtené un Token de Autorización (TA)
Con el certificado autorizado podrás solicitar un "Token de Autorización" mediante el [web service de autenticación](https://www.afip.gob.ar/ws/documentacion/wsaa.asp). Este token es necesario para llamar a los demás servicios, como el de facturación electrónica.
Herramientas como [Afip SDK](https://afipsdk.com/) gestionan este token de forma automática y se encargan de renovarlo cuando vence.
## 5. Consumí el web service
Con el TA en mano ya podés enviar solicitudes al [web service](https://www.afip.gob.ar/ws/documentacion/catalogo.asp) que necesites.
La documentación oficial puede ser compleja. Para facilitarte el trabajo, existen librerías como [Afip SDK](https://docs.afipsdk.com/#integracion) que proveen guías simples y código listo para integrar.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Consultar constancia de Inscripción de ARCA en .NET description: Con pocas líneas de código category: [.NET] pubDate: feb 17, 2025 cover: /images/blog/csharp-use-register.png ---
# Consultar constancia de Inscripción de ARCA en .NET
Para obtener la constancia de inscripción de ARCA en .NET, debemos usar el web service de [Padrón de constancia de inscripción](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-de-constancia-de-inscripcion).
Esto lo vamos a hacer utilizando la librería [Afip.Net](https://github.com/afipsdk/afip.net), que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.Net](https://github.com/afipsdk/afip.net)
**CLI**
```bash
dotnet add package Afip.Net
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/dotnet#usar-tu-propio-certificado-opcional).
```csharp
using AfipSDK.Afip.Net;
var afip = new Afip(new AfipOptions
{
CUIT = "20409378472", // CUIT vinculado al certificado
Production = false,
AccessToken = "TU_ACCESS_TOKEN",
});
```
## Obtenemos los datos
```csharp
// CUIT del contribuyente
var taxId = 33693450239L;
var taxpayerDetails = await afip.RegisterInscriptionProof.GetTaxpayerDetailsAsync(taxId);
```
## Problemas comunes
Si estás teniendo una respuesta nula o el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
Con esto ya tenemos los datos del contribuyente. También podes usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Consultar constancia de Inscripción de ARCA en Java description: Con pocas líneas de código category: [Java] pubDate: feb 17, 2025 cover: /images/blog/java-use-register.png ---
# Consultar constancia de Inscripción de ARCA en Java
Para obtener la constancia de inscripción de ARCA en Java, debemos usar el web service de [Padrón de constancia de inscripción](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-de-constancia-de-inscripcion).
Esto lo vamos a hacer utilizando la librería [afip.java](https://github.com/afipsdk/afip.java), que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [afip.java](https://github.com/afipsdk/afip.java)
**Maven**
```xml
com.afipsdk
afip-sdk-java
1.0.0
```
**Gradle**
```gradle
implementation 'com.afipsdk:afip-sdk-java:1.0.0'
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/java#usar-tu-propio-certificado-opcional).
```java
import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;
AfipOptions options = new AfipOptions();
options.setCuit("20409378472"); // CUIT vinculado al certificado
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN");
Afip afip = new Afip(options);
```
## Obtenemos los datos
```java
import java.util.Map;
// CUIT del contribuyente
long taxId = 33693450239L;
Map taxpayerDetails = afip.registerInscriptionProof().getTaxpayerDetails(taxId);
```
## Problemas comunes
Si estás teniendo una respuesta nula o el error **"No existe persona con ese ID"**, se debe a que no todos los CUIT están disponibles en el ambiente de desarrollo. Te recomiendo leer este artículo:
Con esto ya tenemos los datos del contribuyente. También podes usar el [padrón de alcance 13](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-13) o el [padrón de alcance 10](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-alcance-10).
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/siguientes-pasos/ir-a-produccion) para obtener información real de los contribuyentes.
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Certificado no emitido por AC de confianza description: Pasos para resolver este error category: [AFIP] pubDate: feb 17, 2025 cover: /images/blog/afip-error.png ---
# Certificado no emitido por AC de confianza
Si estás teniendo este error al intentar conectarte con ARCA, es porque estás intentando usar certificados de producción en desarrollo o viceversa.
### Solución #1: En producción
Si el certificado es de producción, asegúrate de seguir los pasos descritos en [Ir a producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion), particularmente el tercer paso, que describe cómo cambiar los parámetros de la librería para usarlo en modo producción.
### Solución #2: En desarrollo
Si el certificado es de desarrollo, debes dejar la librería con `production: false`, o si estás usando la API, `environment: dev`.
---
Este y otros problemas con los web services son detectados y resueltos rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: (600) ValidacionDeToken: No aparecio CUIT en lista de relaciones description: Pasos para resolver este error category: [AFIP] pubDate: feb 17, 2025 cover: /images/blog/afip-error.png ---
# (600) ValidacionDeToken: No aparecio CUIT en lista de relaciones
Este error aparece cuando intentas conectarte con ARCA usando un CUIT no vinculado al certificado que estás utilizando.
Si tienes alguna duda sobre cómo funcionan las autorizaciones y delegaciones de cada CUIT a los web services, te recomiendo leer la siguiente guía, donde se explica en detalle todo el proceso con los certificados y sus autorizaciones:
## En producción
### Solución #1
Si estás teniendo este problema en producción y estás intentando usar un CUIT de un cliente que te [delegó el web service](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/delegar-web-service), aún debes [aceptar la delegación del web service](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/aceptar-delegacion-de-web-service) y luego seguir el tutorial [Autorizar web service de producción](https://docs.afipsdk.com/recursos/tutoriales-pagina-de-arca/autorizar-web-service-de-produccion), teniendo en cuenta que en la parte de elegir el «Representado» debes seleccionar el CUIT de tu cliente.
### Solución #2
Si esto no lo soluciona, quizá necesites [forzar la solicitud de un nuevo TA](https://docs.afipsdk.com/recursos/otros-metodos-utiles#forzar-la-solicitud-de-un-nuevo-ta).
## En desarrollo
En modo desarrollo, siempre debes generar los certificados con el mismo CUIT con el que te logueas en ARCA.
No debes intentar conectarte en desarrollo con un CUIT de un cliente, a menos que el certificado de desarrollo sea de ese cliente.
---
Este y otros problemas con los web services son detectados y resueltos rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Obtener condición frente al IVA de un CUIT vía web service description: Guía paso a paso. category: [AFIP] pubDate: feb 13, 2025 cover: /images/blog/afip-register.png ---
# Obtener condición frente al IVA de un CUIT vía web service
Para conocer la condición frente al IVA de un CUIT, necesitamos utilizar el web service [padrón de constancia de inscripción](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-de-constancia-de-inscripcion).
Este padrón no nos devuelve de forma directa cuál es la condición frente al IVA del CUIT, sino que nos devuelve todos los datos de la constancia de inscripción del CUIT. A nosotros nos interesan los impuestos, ya que son los que nos indican a qué condición frente al IVA corresponde.
Al [obtener los datos del contribuyente](https://docs.afipsdk.com/siguientes-pasos/web-services/padron-de-constancia-de-inscripcion#obtener-datos-del-contribuyente) obtendremos una respuesta similar a esta
```json
{
"datosGenerales": {
...
},
"datosRegimenGeneral": {
"actividad": [...],
"impuesto": [...],
...
},
// Si es monotributo:
"datosMonotributo": {
"actividad": [...],
"impuesto": [...],
...
}
}
```
Debemos buscar en los impuestos de `datosRegimenGeneral` o `datosMonotributo` para saber la condición frente al IVA.
Por ejemplo, si es **"IVA Responsable Inscripto"** encontraremos el siguiente impuesto:
```json
{
"datosRegimenGeneral": {
"impuesto": [
{ "descripcionImpuesto": "IVA", "idImpuesto": 30, ... },
],
},
}
```
Para **"Responsable Monotributo"**
```json
{
"datosMonotributo": {
"impuesto": [
{ "descripcionImpuesto": "MONOTRIBUTO", "idImpuesto": 20, ... },
],
},
}
```
Para **"IVA No Alcanzado"**
```json
{
"datosRegimenGeneral": {
"impuesto": [
{ "descripcionImpuesto": "IVA NO ALCANZADO", "idImpuesto": 34, ... },
],
},
}
```
De esta forma podemos saber a qué condición corresponde cada CUIT.
Podés descargar la lista de todos los posibles impuestos aquí:
[Impuestos en formato JSON](/assets/blog/files/ws_sr_padron_a100.SUPA.E_IMPUESTO.json)
[Impuestos en formato CSV](/assets/blog/files/ws_sr_padron_a100.SUPA.E_IMPUESTO.csv)
## Mapeo entre el ID de la condición frente al IVA y el ID de impuestos
| Id | Condición IVA | Impuesto(s) del padrón que la indican |
| -: | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | IVA Responsable Inscripto | **30 – IMPUESTO AL VALOR AGREGADO**. |
| 6 | Responsable Monotributo | **20 – MONOTRIBUTO** (puede venir acompañado por **22 – MONOTRIBUTO SEG.SOCIAL**, **23 – MONOTRIBUTO INTEG. DE SOCIEDAD**, **24 – MONOTRIBUTO OBRA SOCIAL**). |
| 13 | Monotributista Social | **20 – MONOTRIBUTO** (y eventualmente 22/23/24 como arriba). |
| 16 | Monotributo Trabajador Independiente Promovido | **20 – MONOTRIBUTO** (y eventualmente 22/23/24 como arriba). |
| 4 | IVA Sujeto Exento | **32 – IVA EXENTO**. |
| 5 | Consumidor Final | **No tiene** un impuesto específico en padrón (se infiere por **ausencia** de IVA/Monotributo/Exento/No Alcanzado). |
| 7 | Sujeto No Categorizado | **No tiene** un impuesto específico en padrón. |
| 8 | Proveedor del Exterior | **No aplica** (no es CUIT AR, padrón no devuelve impuestos locales). |
| 9 | Cliente del Exterior | **No aplica** (ídem). |
| 10 | IVA Liberado – Ley 19.640 | **Sin equivalente** explícito en la lista de impuestos del padrón (no aparece un “IVA LIBERADO”). |
| 15 | IVA No Alcanzado | **34 – IVA NO ALCANZADO**. |
Si estás teniendo problemas para obtener la información de un CUIT en modo desarrollo, te recomiendo que leas el siguiente artículo:
**Una aclaración:** Los ID devueltos por este web service no coinciden con el ID para el campo Condición IVA. Para más información, pueden ver la lista de posibles condiciones frente al IVA con sus correspondientes ID en el siguiente artículo:
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: No existe persona con ese Id description: Pasos para resolver este error category: [AFIP] pubDate: feb 12, 2025 cover: /images/blog/afip-error.png ---
# No existe persona con ese Id
Si estás teniendo este error, es por dos posibles razones.
### Solución #1: Modo desarrollo
Si estás en modo desarrollo, ARCA no provee datos de todos los CUITs, por lo que puede indicar que no existe, además de no ofrecer información real. Algunos de los CUITs que se pueden usar para obtener datos de prueba son:
```
33693450239
30558515305
30202020204
```
### Solución #2: Producción
Si estás teniendo este problema en producción, es porque el CUIT que estás consultando no existe en la base del padrón que estás usando.
Te recomiendo usar el [Padrón alcance 13](https://docs.afipsdk.com/paso-a-paso/web-services/padron-alcance-13) que es el que incluye más contribuyentes y además te permite [obtener datos de un DNI](https://docs.afipsdk.com/paso-a-paso/web-services/padron-alcance-13). Si necesitas la información de los impuestos del contribuyente, como su condición frente al IVA, puedes usar el [Padrón de constancia de inscripción](https://docs.afipsdk.com/paso-a-paso/web-services/padron-de-constancia-de-inscripcion).
---
Este y otros problemas con los web services son detectados y resueltos rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar description: Pasos para resolver este error category: [AFIP] pubDate: feb 11, 2025 cover: /images/blog/afip-error.png ---
# Error (10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar
Si estás teniendo este error, es porque el número de comprobante que estás enviando a ARCA no es el que corresponde al siguiente comprobante o la fecha del último comprobante es posterior a la que estás enviando actualmente.
Esto ocurre porque los comprobantes deben emitirse de forma correlativa tanto en el número como en la fecha. Es decir, si enviaste un comprobante con fecha de mañana, no puedes emitir uno con fecha de hoy. El siguiente (en el mismo punto de venta y mismo tipo de comprobante) debe ser de mañana o posterior, lo mismo aplica para el número de comprobante.
### Solución #1: Obtener el número del último comprobante
Vamos a utilizar el método para [Obtener número del último comprobante creado](https://docs.afipsdk.com/paso-a-paso/web-services/factura-electronica#obtener-numero-del-ultimo-comprobante-creado). Una vez que tengas el número, debes sumarle +1 y en los datos del comprobante cambiar `CbteDesde` y `CbteHasta` por ese número.
Si el problema persiste, debemos ir por la solución #2.
### Node
```js
// Numero de punto de venta
const puntoDeVenta = 1;
// Tipo de comprobante
const tipoDeComprobante = 6; // 6 = Factura B
const lastVoucher = await afip.ElectronicBilling.getLastVoucher(puntoDeVenta, tipoDeComprobante);
```
### PHP
```php
// Numero de punto de venta
$punto_de_venta = 1;
// Tipo de comprobante
$tipo_de_comprobante = 6; // 6 = Factura B
$last_voucher = $afip->ElectronicBilling->GetLastVoucher($punto_de_venta, $tipo_de_comprobante);
```
### Ruby
```ruby
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_comprobante)
```
### Python
```python
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
last_voucher = afip.ElectronicBilling.getLastVoucher(punto_de_venta, tipo_de_comprobante)
```
### API
```json
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth" : {
"Token": "{{token}}",
"Sign": "{{sign}}",
"Cuit": "20409378472"
},
"PtoVta" : 1,
"CbteTipo" : 6
}
}
```
### Solución #2: Obtener fecha del último comprobante
Con el número del último comprobante obtenido en la Solución #1, vamos a [Obtener información de un comprobante ya emitido](https://docs.afipsdk.com/paso-a-paso/web-services/factura-electronica#obtener-informacion-de-un-comprobante-ya-emitido).
En los detalles, encontrarás el campo `CbteFch` que hace referencia a la fecha de ese comprobante en formato "AAAAMMDD". A los datos de nuestro comprobante debemos asignarle esta fecha o alguna posterior en `CbteFch`.
### Node
```js
// Numero de comprobante
const numeroDeComprobante = 1;
// Numero de punto de venta
const puntoDeVenta = 1;
// Tipo de comprobante
const tipoDeComprobante = 6; // 6 = Factura B
const voucherInfo = await afip.ElectronicBilling.getVoucherInfo(numeroDeComprobante, puntoDeVenta, tipoDeComprobante);
if(voucherInfo === null){
console.log('El comprobante no existe');
}
else{
console.log('Esta es la información del comprobante:');
console.log(voucherInfo);
}
```
### PHP
```php
// Numero de comprobante
$numero_de_comprobante = 1;
// Numero de punto de venta
$punto_de_venta = 1;
// Tipo de comprobante
$tipo_de_comprobante = 6; // 6 = Factura B
$voucher_info = $afip->ElectronicBilling->GetVoucherInfo($numero_de_comprobante, $punto_de_venta, $tipo_de_comprobante);
if($voucher_info === NULL){
echo 'El comprobante no existe';
}
else{
echo 'Esta es la información del comprobante:';
echo '';
print_r($voucher_info);
echo '';
}
```
### Ruby
```ruby
# Numero de comprobante
numero_de_comprobante = 1
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
voucher_info = afip.ElectronicBilling.getVoucherInfo(numero_de_comprobante, punto_de_venta, tipo_de_comprobante)
puts "Esta es la información del comprobante:"
puts voucher_info
```
### Python
```python
# Numero de comprobante
numero_de_comprobante = 1
# Numero de punto de venta
punto_de_venta = 1
# Tipo de comprobante
tipo_de_comprobante = 6 # 6 = Factura B
voucher_info = afip.ElectronicBilling.getVoucherInfo(numero_de_comprobante, punto_de_venta, tipo_de_comprobante)
print("Esta es la información del comprobante:")
print(voucher_info)
```
### API
```json
{
"environment": "dev",
"method": "FECompConsultar",
"wsid": "wsfe",
"params": {
"Auth" : {
"Token": "{{token}}",
"Sign": "{{sign}}",
"Cuit": "20409378472"
},
"FeCompConsReq" : {
"CbteNro" : 10,
"PtoVta" : 1,
"CbteTipo" : 6
}
}
}
```
Este y otros problemas con los web services son detectados y resueltos rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio description: Pasos para resolver este error category: [AFIP] pubDate: feb 06, 2025 cover: /images/blog/factura-electronica-solucion-a-error-10242-cover.png ---
# Error (10242) El campo Condicion IVA receptor no es un valor valido/es obligatorio
import {
Alert,
AlertDescription,
AlertTitle,
} from "@/components/ui/alert"
El día 4 de febrero, los desarrolladores despertaron con la sorpresa de que ARCA, de repente, les devolvía el error **"(10242) El campo Condición IVA receptor no es un valor valido. Consultar método FEParamGetCondicionIvaReceptor"** (a veces también puede aparecer como **"(10242) El campo Condición IVA receptor es obligatorio."**). Esto sucedió porque ese día liberaron en *dev* una actualización.
¡Importante!
El dia 6 de abril de 2025, se actualizo la version del Web Service (WS) que permite enviar, de forma opcional, el campo Condicion Frente al IVA del receptor. Cabe destacar que la Resolucion General Nro 5616 indica que ese dato debe enviarse de manera obligatoria a partir del 15/04/2025. No obstante, se mantendra como un dato no excluyente hasta el 30/11/2026, inclusive. A partir del 01/12/2026 se rechazaran las solicitudes de emision de comprobantes sin este dato.
La solución es agregar el campo `CondicionIVAReceptorId` a la data del comprobante. Por ejemplo, para 'Responsable Monotributo':
```json
...
"CondicionIVAReceptorId": 6 // ID 6 = Responsable Monotributo
...
```
Les dejo el artículo para obtener la condición frente al IVA de un CUIT
La lista de posibles condiciones frente al IVA con sus correspondientes ID es la siguiente:
```json
[
{
"Id": 1,
"Desc": "IVA Responsable Inscripto",
"Cmp_Clase": "A/M/C"
},
{
"Id": 6,
"Desc": "Responsable Monotributo",
"Cmp_Clase": "A/M/C"
},
{
"Id": 13,
"Desc": "Monotributista Social",
"Cmp_Clase": "A/M/C"
},
{
"Id": 16,
"Desc": "Monotributo Trabajador Independiente Promovido",
"Cmp_Clase": "A/M/C"
},
{
"Id": 4,
"Desc": "IVA Sujeto Exento",
"Cmp_Clase": "B/C"
},
{
"Id": 5,
"Desc": "Consumidor Final",
"Cmp_Clase": "B/C"
},
{
"Id": 7,
"Desc": "Sujeto No Categorizado",
"Cmp_Clase": "B/C"
},
{
"Id": 8,
"Desc": "Proveedor del Exterior",
"Cmp_Clase": "B/C"
},
{
"Id": 9,
"Desc": "Cliente del Exterior",
"Cmp_Clase": "B/C"
},
{
"Id": 10,
"Desc": "IVA Liberado – Ley N° 19.640",
"Cmp_Clase": "B/C"
},
{
"Id": 15,
"Desc": "IVA No Alcanzado",
"Cmp_Clase": "B/C"
}
]
```
Para obtener la lista de condiciones usando el SDK, pueden hacerlo llamando al método FEParamGetCondicionIvaReceptor.
### Node
```js
const taxTypes = await afip.ElectronicBilling.executeRequest('FEParamGetCondicionIvaReceptor')
```
### PHP
```php
$tax_types = $afip->ElectronicBilling->ExecuteRequest('FEParamGetCondicionIvaReceptor');
```
### Ruby
```ruby
tax_types = afip.ElectronicBilling.executeRequest('FEParamGetCondicionIvaReceptor')
```
### Python
```python
tax_types = afip.ElectronicBilling.executeRequest('FEParamGetCondicionIvaReceptor')
```
### API
```json
{
"environment": "dev",
"method": "FEParamGetCondicionIvaReceptor",
"wsid": "wsfe",
"params": {
"Auth" : {
"Token": "{{token}}",
"Sign": "{{sign}}",
"Cuit": "{{cuit}}"
}
}
}
```
## Resolución General ARCA N° 5.616/2024:
**Condición ante el IVA del receptor:** En los comprobantes electrónicos a emitir a partir del 15 de abril, se deberá identificar, de manera obligatoria, la condición ante el impuesto al valor agregado del receptor.
**Operaciones que se cancelan en moneda extranjera:** En los casos de operaciones realizadas en moneda extranjera, cuando se cancelen en la misma moneda en la que se emite el comprobante, se deberá considerar el tipo de cambio vendedor divisa que informa el Banco de la Nación Argentina, correspondiente al día hábil cambiario anterior.
---
Este problema fue detectado y resuelto rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Usar web services de ARCA en .NET description: Con pocas líneas de código category: [.NET] pubDate: ene 13, 2025 cover: /images/blog/csharp-use-ws.png ---
# Usar web services de ARCA en .NET
Consumir los web services de ARCA en .NET puede ser un poco complicado, por eso vamos a utilizar la librería [Afip.Net](https://github.com/afipsdk/afip.net), que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.Net](https://github.com/afipsdk/afip.net)
**CLI**
```bash
dotnet add package Afip.Net
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/dotnet#usar-tu-propio-certificado-opcional).
```csharp
using AfipSDK.Afip.Net;
var afip = new Afip(new AfipOptions
{
CUIT = "20409378472", // CUIT vinculado al certificado
Production = false,
AccessToken = "TU_ACCESS_TOKEN",
});
```
## Creamos una instancia del web service
```csharp
/**
* Nombre del web service.
*
* El nombre por el cual se llama al web service en ARCA.
* Esto lo podes encontrar en el manual correspondiente.
* Por ej. el de factura electronica se llama 'wsfe', el de
* comprobantes T se llama 'wsct'
**/
var servicio = "wsct";
/**
* Creamos el web service
**/
var genericWebService = afip.WebService(servicio);
```
## Llamamos al web service
Este es un ejemplo de como utilizar el wsct para obtener el ultimo comprobante autorizado.
Aquí veras como obtener un Token Authorization para el web service que acabamos de crear y como ejecutar un request básico
```csharp
/**
* Obtenemos el Token Authorization
**/
var ta = await genericWebService.GetTokenAuthorizationAsync();
/**
* Preparamos los datos que nos pide el web service
*
* Este ejemplo es especifico para el wsct. En el manual
* del web service que quieras utilizar encontraras que
* datos requiere cada metodo
**/
var data = new Dictionary
{
["authRequest"] = new Dictionary
{
["token"] = ta.Token,
["sign"] = ta.Sign,
["cuitRepresentada"] = afip.Options.CUIT
},
["codigoTipoComprobante"] = 195, // Código del tipo de comprobante
["numeroPuntoVenta"] = 1 // Número del punto de venta
};
/**
* Ejecutamos la request al web service
*
* consultarUltimoComprobanteAutorizado es un metodo
* de wsct, esto debes cambiarlo por el metodo que
* quieras utilizar
**/
var result = await genericWebService.ExecuteRequestAsync>(
"consultarUltimoComprobanteAutorizado",
data
);
Console.WriteLine(result["consultarUltimoComprobanteAutorizadoReturn"]);
```
En la pestaña "API" [de la documentacion](https://docs.afipsdk.com/paso-a-paso/web-services/otro-web-service) podes consultar todos los parametros del endpoint.
En `result` nos devolverá la respuesta del web service.
```json
{
"consultarUltimoComprobanteAutorizadoReturn": ...
}
```
Con esto ya podemos conectarnos a cualquier web service de ARCA en .NET.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Usar web services de ARCA en Java description: Con pocas líneas de código category: [Java] pubDate: ene 10, 2025 cover: /images/blog/java-use-ws.png ---
# Usar web services de ARCA en Java
Consumir los web services de ARCA en Java puede ser un poco complicado, por eso vamos a utilizar la librería [afip.java](https://github.com/afipsdk/afip.java), que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [afip.java](https://github.com/afipsdk/afip.java)
**Maven**
```xml
com.afipsdk
afip-sdk-java
1.0.0
```
**Gradle**
```gradle
implementation 'com.afipsdk:afip-sdk-java:1.0.0'
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/java#usar-tu-propio-certificado-opcional).
```java
import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;
AfipOptions options = new AfipOptions();
options.setCuit("20409378472"); // CUIT vinculado al certificado
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN");
Afip afip = new Afip(options);
```
## Creamos una instancia del web service
```java
/**
* Nombre del web service.
*
* El nombre por el cual se llama al web service en ARCA.
* Esto lo podes encontrar en el manual correspondiente.
* Por ej. el de factura electronica se llama 'wsfe', el de
* comprobantes T se llama 'wsct'
**/
String servicio = "wsct";
/**
* Creamos el web service
**/
AfipWebService genericWebService = afip.webService(servicio);
```
## Llamamos al web service
Este es un ejemplo de como utilizar el wsct para obtener el ultimo comprobante autorizado.
Aquí veras como obtener un Token Authorization para el web service que acabamos de crear y como ejecutar un request básico
```java
import com.afipsdk.AfipWebService;
import com.afipsdk.model.GetServiceTAResponse;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Obtenemos el Token Authorization
**/
GetServiceTAResponse ta = genericWebService.getTokenAuthorization();
/**
* Preparamos los datos que nos pide el web service
*
* Este ejemplo es especifico para el wsct. En el manual
* del web service que quieras utilizar encontraras que
* datos requiere cada metodo
**/
Map authRequest = new LinkedHashMap<>();
authRequest.put("token", ta.getToken());
authRequest.put("sign", ta.getSign());
authRequest.put("cuitRepresentada", afip.getOptions().getCuit());
Map data = new LinkedHashMap<>();
data.put("authRequest", authRequest);
data.put("codigoTipoComprobante", 195); // Código del tipo de comprobante
data.put("numeroPuntoVenta", 1); // Número del punto de venta
/**
* Ejecutamos la request al web service
*
* consultarUltimoComprobanteAutorizado es un metodo
* de wsct, esto debes cambiarlo por el metodo que
* quieras utilizar
**/
Map result = genericWebService.executeRequest(
"consultarUltimoComprobanteAutorizado",
data
);
System.out.println(result.get("consultarUltimoComprobanteAutorizadoReturn"));
```
En `result` nos devolverá la respuesta del web service.
```json
{
"consultarUltimoComprobanteAutorizadoReturn": ...
}
```
Con esto ya podemos conectarnos a cualquier web service de ARCA con Java.
Lo único que nos queda es [pasar a modo producción](https://docs.afipsdk.com/paso-a-paso/ir-a-produccion).
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Crear QR de AFIP en Java description: Con pocas líneas de código category: [Java] pubDate: dic 17, 2024 cover: /images/blog/java-create-qr.png ---
# Crear QR de AFIP en Java
Luego de [obtener el CAE](/blog/crear-factura-electronica-de-afip-en-java/) vamos a generar el QR de AFIP para nuestro comprobante.
## Preparamos el QR
Para generar el QR vamos a utilizar [ZXing](https://github.com/zxing/zxing), una popular librería para trabajar con códigos QR en Java, y [Gson](https://github.com/google/gson/) para trabajar con JSON.
Primero, añadimos la dependencia de Maven:
```xml
com.google.code.gson
gson
2.11.0
com.google.zxing
core
3.5.1
com.google.zxing
javase
3.5.1
```
Y generamos el codigo QR
```java
package com.example;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.gson.Gson;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// Datos para el QR (Respetar los tipos string/numero)
Map qrCodeData = new HashMap<>();
qrCodeData.put("ver", 1); // Versión del formato de los datos (1 por defecto)
qrCodeData.put("fecha", "2017-10-25"); // Fecha de emisión del comprobante
qrCodeData.put("cuit", 12345678912L); // Cuit del Emisor del comprobante
qrCodeData.put("ptoVta", 1); // Punto de venta utilizado para emitir el comprobante
qrCodeData.put("tipoCmp", 6); // Tipo de comprobante
qrCodeData.put("nroCmp", 32); // Número del comprobante
qrCodeData.put("importe", 150); // Importe Total del comprobante (en la moneda en la que fue emitido)
qrCodeData.put("moneda", "ARS"); // Moneda del comprobante
qrCodeData.put("ctz", 1); // Cotización en pesos argentinos de la moneda utilizada
qrCodeData.put("tipoDocRec", 80); // Código del Tipo de documento del receptor
qrCodeData.put("nroDocRec", 12345678912L); // Número de documento del receptor
qrCodeData.put("tipoCodAut", "E"); // “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
qrCodeData.put("codAut", 12345678912345L); // CAE o CAEA, según corresponda
// Convertimos los datos a JSON y los codificamos en Base64
String json = new Gson().toJson(qrCodeData);
String qrCodeText = "https://www.afip.gob.ar/fe/qr/?p=" + Base64.getUrlEncoder().encodeToString(json.getBytes());
// Generamos el QR
QRCodeWriter qrCodeWriter = new QRCodeWriter();
int width = 200;
int height = 200;
try {
BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeText, BarcodeFormat.QR_CODE, width, height);
// Guardamos el QR como una imagen PNG
Path path = FileSystems.getDefault().getPath("./qr-afip.png");
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
System.out.println("QR generado correctamente: " + path.toAbsolutePath());
// O convertimos el QR a Base64 para usarlo en HTML
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", byteArrayOutputStream);
String base64Image = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());
System.out.println("Base64 para
: data:image/png;base64," + base64Image);
} catch (WriterException | IOException e) {
System.err.println("Error al generar el QR: " + e.getMessage());
}
}
}
```

Ya tenemos el QR listo para nuestro comprobante.
---
--- title: Crear QR de AFIP en C# description: Con pocas líneas de código category: [.NET] pubDate: dic 11, 2024 cover: /images/blog/csharp-create-qr.png ---
# Crear QR de AFIP en C#
Luego de [obtener el CAE](/blog/crear-factura-electronica-de-afip-en-csharp/) vamos a generar el QR de AFIP para nuestro comprobante.
## Preparamos el QR
Para generar el QR vamos a utilizar [SkiaSharp](https://www.nuget.org/packages/SkiaSharp/) y [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/)
```bash
dotnet add package SkiaSharp
dotnet add package ZXing.Net
dotnet add package ZXing.Net.Bindings.SkiaSharp
dotnet add package Newtonsoft.Json
```
Y generamos el codigo QR
```csharp
using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using SkiaSharp;
using ZXing.SkiaSharp;
class Program
{
static void Main()
{
// Datos para el QR (Respetar los tipos string/numero)
var qrCodeData = new Dictionary
{
{ "ver", 1 }, // Versión del formato de los datos (1 por defecto)
{ "fecha", "2017-10-25" }, // Fecha de emisión del comprobante
{ "cuit", 12345678912 }, // CUIT del Emisor del comprobante
{ "ptoVta", 1 }, // Punto de venta utilizado para emitir el comprobante
{ "tipoCmp", 6 }, // Tipo de comprobante
{ "nroCmp", 32 }, // Número de comprobante
{ "importe", 150 }, // Importe Total del comprobante (en la moneda en la que fue emitido)
{ "moneda", "ARS" }, // Moneda del comprobante
{ "ctz", 1 }, // Cotización en pesos argentinos de la moneda utilizada
{ "tipoDocRec", 80 }, // Código del Tipo de documento del receptor
{ "nroDocRec", 12345678912 }, // Número de documento del receptor
{ "tipoCodAut", "E" }, // “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
{ "codAut", 12345678912345 } // CAE o CAEA, según corresponda
};
// Convertimos los datos a JSON y luego a Base64
string jsonData = JsonConvert.SerializeObject(qrCodeData);
string base64Data = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));
// Preparamos el texto para el QR
string qrCodeText = $"https://www.afip.gob.ar/fe/qr/?p={base64Data}";
// Generamos el QR con SkiaSharp
var qrCode = GenerateQrCode(qrCodeText, 200);
// Guardamos el QR como archivo PNG
string outputFilePath = "./qr-afip.png";
using (var stream = System.IO.File.OpenWrite(outputFilePath))
{
qrCode.Encode(stream, SKEncodedImageFormat.Png, 100);
}
Console.WriteLine($"QR guardado en {outputFilePath}");
// O convertimos el QR a Base64 para usar en un tag
string base64Image = ConvertQrToBase64(qrCode);
Console.WriteLine($"data:image/png;base64,{base64Image}");
}
static SKBitmap GenerateQrCode(string text, int size)
{
// Generar el QR utilizando ZXing.Net
var writer = new ZXing.SkiaSharp.BarcodeWriter
{
Format = ZXing.BarcodeFormat.QR_CODE,
Options = new ZXing.Common.EncodingOptions
{
Height = size,
Width = size,
Margin = 1
}
};
return writer.Write(text);
}
static string ConvertQrToBase64(SKBitmap qrCode)
{
using (var image = SKImage.FromBitmap(qrCode))
using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
{
return Convert.ToBase64String(data.ToArray());
}
}
}
```

Ya tenemos el QR listo para nuestro comprobante.
---
--- title: Crear Factura Electrónica de ARCA en Make description: Con archivo para importar directamente en tu cuenta category: [Make] pubDate: nov 13, 2024 cover: /images/blog/make-create-invoice.png ---
# Crear Factura Electrónica de ARCA en Make
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA es obtener el Código de Autorización Electrónico (CAE). Esto lo haremos utilizando el API de Afip SDK, que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
Vamos a usar [Make](https://www.make.com) para generar automáticamente el CAE de un comprobante cuando se agrega una fila en una [Google Sheet](https://workspace.google.com/intl/es-419_ar/products/sheets/). Así es como luce la interfaz final:

Y así va a lucir nuestra Google Sheet:

Agregamos el trigger en Make para cuando se agrega una fila en nuestra Google Sheet (la primera vez te pedirá conectar tu cuenta de Google).

Ahora obtenemos un [Token de Autorización](https://docs.afipsdk.com/#integracion#id-3-crear-una-instancia-clase-afip) para poder enviar una solicitud a ARCA. Para esto, vamos a agregar una llamada HTTP con los siguientes datos:
> Si no sabes qué es el Token de Autorización, te recomiendo leer el post [Conectar tu sistema con la facturación electrónica de ARCA](/blog/conectar-tu-sistema-con-la-facturacion-electronica-de-afip/).
```md
URL: https://app.afipsdk.com/api/v1/afip/auth
Method: POST
Body type: Raw
Content type: JSON(application/json)
Headers:
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
Request content:
{
"environment": "dev",
"tax_id": "20409378472",
"wsid": "wsfe",
"force_create": false
}
Parse response: Yes
```
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/make#usar-tu-propio-certificado-opcional).

Luego realizamos otra llamada HTTP para consultar al web service cuál fue el [número del último comprobante creado](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica#obtener-numero-del-ultimo-comprobante-creado).
```md
URL: https://app.afipsdk.com/api/v1/afip/requests
Method: POST
Body type: Raw
Content type: JSON(application/json)
Headers:
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
Request content:
{
"environment": "dev",
"method": "FECompUltimoAutorizado",
"wsid": "wsfe",
"params": {
"Auth" : {
"Token": "{{1.data.token}}",
"Sign": "{{1.data.sign}}",
"Cuit": "20409378472"
},
"PtoVta" : 1,
"CbteTipo" : 6
}
}
Parse response: Yes
```
Si observan los datos de esta llamada, indicamos que en token y sign se utilicen los datos de la llamada HTTP anterior.

Y realizamos la última llamada HTTP para [obtener el CAE](https://docs.afipsdk.com/siguientes-pasos/web-services/factura-electronica#crear-y-asignar-cae-a-un-comprobante) usando el número de comprobante obtenido en el paso anterior.
```md
URL: https://app.afipsdk.com/api/v1/afip/requests
Method: POST
Body type: Raw
Content type: JSON(application/json)
Headers:
Authorization: Bearer TU_ACCESS_TOKEN_AQUI
Request content
{
"environment": "dev",
"method": "FECAESolicitar",
"wsid": "wsfe",
"params": {
"Auth": {
"Token": "{{1.data.token}}",
"Sign": "{{1.data.sign}}",
"Cuit": "20409378472"
},
"FeCAEReq": {
"FeCabReq": {
"CantReg": 1,
"PtoVta": 1,
"CbteTipo": 6
},
"FeDetReq": {
"FECAEDetRequest": {
"Concepto": 1,
"DocTipo": 99,
"DocNro": 0,
"CbteDesde": {{sum(4.data.FECompUltimoAutorizadoResult.CbteNro; 1)}},
"CbteHasta": {{sum(4.data.FECompUltimoAutorizadoResult.CbteNro; 1)}
},
"CbteFch": {{parseNumber(formatDate(2.`0`; "YYYYMMDD"))}},
"FchServDesde": null,
"FchServHasta": null,
"FchVtoPago": null,
"ImpTotal": {{sum(2.`1`; 2.`2`; 2.`3`)}},
"ImpTotConc": 0,
"ImpNeto": {{2.`1`}},
"ImpOpEx": {{2.`2`}},
"ImpIVA": {{2.`3`}},
"ImpTrib": 0,
"MonId": "PES",
"MonCotiz": 1,
"CondicionIVAReceptorId": 5,
"Iva": {
"AlicIva": [
{
"Id": 5,
"BaseImp": {{2.`1`}},
"Importe": {{2.`3`}}
}
]
}
}
}
}
}
}
Parse response: Yes
```
Si observan los datos de esta última llamada, verán que utiliza datos de las llamadas anteriores y de la Google Sheet.

Con los datos ya obtenidos, procedemos a actualizar la fila en Google Sheet, agregándole el número del comprobante generado y el CAE.
```md
CAE: {{3.data.FECAESolicitarResult.FeDetResp.FECAEDetResponse[].CAE}}
Vencimiento CAE: {{3.data.FECAESolicitarResult.FeDetResp.FECAEDetResponse[].CAEFchVto}}
```

Si vamos a la Google Sheet, veremos que se agregó el CAE y el Vencimiento del CAE a la nueva fila.
Les dejo el [create-cae-blueprint.json](/assets/blog/make/create-cae-blueprint.json) para que puedan importar rápidamente este workflow en su cuenta de Make.

## Problemas comunes
Si estas teniendo el error **(10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar** te recomiendo leer este artículo.
Si estas teniendo el error **(10242) El campo Condicion IVA receptor es obligatorio. Consular metodo FEParamGetCondicionIvaReceptor** te recomiendo leer este artículo.
Con la autorizacion creada ya podemos proceder a crear el PDF para presentarle a nuestro cliente. Podes usar como base esta [factura](https://gist.githubusercontent.com/AfipSDK/60604af781826b0d0438042ae807cc91/raw/87d7eff8ab2ad180319eecef9caa47fd0ae8ec1a/bill.html) o [ticket](https://gist.githubusercontent.com/AfipSDK/fb05e5bfd059e9bf7fc6045de426ae7f/raw/0bbda8e8e456de768e3a2fb464e4899258146ea2/ticket.html) de ejemplo.
Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Crear QR de AFIP en Ruby description: Con pocas líneas de código category: [Ruby] pubDate: nov 05, 2024 cover: /images/blog/ruby-create-qr.png ---
# Crear QR de AFIP en Ruby
Luego de [obtener el CAE](/blog/crear-factura-electronica-de-afip-en-ruby/) vamos a generar el QR de AFIP para nuestro comprobante.
## Preparamos el QR
Para generar el QR vamos a utilizar [rqrcode](https://github.com/whomwah/rqrcode)
```bash
gem install rqrcode
```
Y generamos el codigo QR
```ruby
require "rqrcode"
require "json"
require "base64"
# Datos para el QR
qr_code_data = {
"ver": 1, # Versión del formato de los datos (1 por defecto)
"fecha": "2017-10-25", # Fecha de emisión del comprobante
"cuit": 12345678912, # Cuit del Emisor del comprobante
"ptoVta": 1, # Punto de venta utilizado para emitir el comprobante
"tipoCmp": 6, # Tipo de comprobante
"nroCmp": 32, # Tipo de comprobante
"importe": 150, # Importe Total del comprobante (en la moneda en la que fue emitido)
"moneda": "ARS", # Moneda del comprobante
"ctz": 1, # Cotización en pesos argentinos de la moneda utilizada
"tipoDocRec": 80, # Código del Tipo de documento del receptor
"nroDocRec": 12345678912, # Número de documento del receptor
"tipoCodAut": "E", # “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
"codAut": 12345678912345 # CAE o CAEA, segun corresponda
}
# Preparamos el texto para el qr en base a https://www.afip.gob.ar/fe/qr/documentos/QRespecificaciones.pdf
qr_code_text = "https://www.afip.gob.ar/fe/qr/?p=#{Base64.urlsafe_encode64(JSON.dump(qr_code_data))}"
# Generamos el QR
qrcode = RQRCode::QRCode.new(qr_code_text)
# Lo transformamos a PNG
png = qrcode.as_png(
bit_depth: 1,
border_modules: 4,
color_mode: ChunkyPNG::COLOR_GRAYSCALE,
color: "black",
file: nil,
fill: "white",
module_px_size: 6,
resize_exactly_to: false,
resize_gte_to: false,
size: 200
)
puts "data:image/png;base64,#{Base64.encode64(png.to_s)}" # Podemos obtenerlo como URL para usar en
tag
IO.binwrite("./qr-afip.png", png.to_s) # o podemos guardarlo como un archivo
```

Ya tenemos el QR listo para nuestro comprobante. Ahora podemos [crear el PDF](/blog/crear-pdf-de-afip-en-ruby/)
---
--- title: Crear QR de AFIP en PHP description: Con pocas líneas de código category: [PHP] pubDate: oct 31, 2024 cover: /images/blog/php-create-qr.png ---
# Crear QR de AFIP en PHP
Luego de [obtener el CAE](/blog/crear-factura-electronica-de-afip-en-php/) vamos a generar el QR de AFIP para nuestro comprobante.
## Preparamos el QR
Para generar el QR vamos a utilizar [endroid/qr-code](https://github.com/endroid/qr-code)
```bash
composer require endroid/qr-code
```
Y generamos el codigo QR
```php
require('./vendor/autoload.php');
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Label\Label;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Writer\ValidationException;
// Datos para el QR (Respetar si es string o numero)
$QR_code_data = [
'ver' => 1, // Versión del formato de los datos (1 por defecto)
'fecha' => '2017-10-25', // Fecha de emisión del comprobante
'cuit' => 12345678912, // Cuit del Emisor del comprobante
'ptoVta' => 1, // Punto de venta utilizado para emitir el comprobante
'tipoCmp' => 6, // Tipo de comprobante
'nroCmp' => 32, // Tipo de comprobante
'importe' => 150, // Importe Total del comprobante (en la moneda en la que fue emitido)
'moneda' => 'ARS', // Moneda del comprobante
'ctz' => 1, // Cotización en pesos argentinos de la moneda utilizada
'tipoDocRec' => 80, // Código del Tipo de documento del receptor
'nroDocRec' => 12345678912, // Número de documento del receptor
'tipoCodAut' => 'E', // “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
'codAut' => 12345678912345 // CAE o CAEA, segun corresponda
];
// Preparamos el texto para el qr en base a https://www.afip.gob.ar/fe/qr/documentos/QRespecificaciones.pdf
$QR_code_text = 'https://www.afip.gob.ar/fe/qr/?p=' . base64_encode(json_encode($QR_code_data));
// Create QR code
$qrCode = new QrCode(
data: $QR_code_text,
encoding: new Encoding('UTF-8'),
errorCorrectionLevel: ErrorCorrectionLevel::Low,
size: 300,
margin: 10,
roundBlockSizeMode: RoundBlockSizeMode::Margin,
foregroundColor: new Color(0, 0, 0),
backgroundColor: new Color(255, 255, 255)
);
$result = (new PngWriter())->write($qrCode, $logo, $label);
echo $result->getDataUri(); // Podemos obtenerlo como URL para uswr en
tag
$result->saveToFile(__DIR__.'/qr_code.png'); // o podemos guardarlo como un archivo
```

Ya tenemos el QR listo para nuestro comprobante. Ahora podemos [crear el PDF](/blog/crear-pdf-de-afip-en-php/)
---
--- title: Crear QR de AFIP en NodeJS description: Con pocas líneas de código category: [Javascript] pubDate: oct 24, 2024 cover: /images/blog/nodejs-create-qr.png ---
# Crear QR de AFIP en NodeJS
Luego de [obtener el CAE](/blog/crear-factura-electronica-de-afip-en-nodejs/) vamos a generar el QR de AFIP para nuestro comprobante.
## Preparamos el QR
Para generar el QR vamos a utilizar [node-qrcode](https://github.com/soldair/node-qrcode)
```bash
npm install qrcode
```
Y generamos el codigo QR
```js
const QRCode = require('qrcode');
(async () => {
// Datos para el QR (Respetar si es string o numero)
const QRCodeData = {
'ver': 1, // Versión del formato de los datos (1 por defecto)
'fecha': '2017-10-25', // Fecha de emisión del comprobante
'cuit': 12345678912, // Cuit del Emisor del comprobante
'ptoVta': 1, // Punto de venta utilizado para emitir el comprobante
'tipoCmp': 6, // Tipo de comprobante
'nroCmp': 32, // Tipo de comprobante
'importe': 150, // Importe Total del comprobante (en la moneda en la que fue emitido)
'moneda': 'ARS', // Moneda del comprobante
'ctz': 1, // Cotización en pesos argentinos de la moneda utilizada
'tipoDocRec': 80, // Código del Tipo de documento del receptor
'nroDocRec': 12345678912, // Número de documento del receptor
'tipoCodAut': 'E', // “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
'codAut': 12345678912345 // CAE o CAEA, segun corresponda
};
// Preparamos el texto para el qr en base a https://www.afip.gob.ar/fe/qr/documentos/QRespecificaciones.pdf
const QRCodeText = 'https://www.afip.gob.ar/fe/qr/?p=' + btoa(JSON.stringify(QRCodeData));
console.log(await QRCode.toDataURL(QRCodeText)); // Podemos obtenerlo como URL
await QRCode.toFile('qr-afip.png', QRCodeText); // o podemos guardarlo como un archivo
})();
```

Ya tenemos el QR listo para nuestro comprobante. Ahora podemos [crear el PDF](/blog/crear-pdf-de-afip-en-nodejs/)
---
--- title: Crear Factura Electrónica de ARCA en .NET description: Con pocas líneas de código category: [.NET] pubDate: oct 15, 2024 cover: /images/blog/csharp-create-invoice.png ---
# Crear Factura Electrónica de ARCA en .NET
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA en .NET es obtener el Código de Autorización Electrónico o CAE.
Esto lo vamos a hacer utilizando Afip SDK que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [Afip.Net](https://github.com/afipsdk/afip.net)
**CLI**
```bash
dotnet add package Afip.Net
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/dotnet#usar-tu-propio-certificado-opcional).
```csharp
using AfipSDK.Afip.Net;
var afip = new Afip(new AfipOptions
{
CUIT = "20409378472", // CUIT vinculado al certificado
Production = false,
AccessToken = "TU_ACCESS_TOKEN",
});
```
## Obtener el número del último comprobante
Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto evita el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**.
```csharp
var puntoDeVenta = 1;
var tipoDeFactura = 6;
var lastVoucher = await afip.ElectronicBilling.GetLastVoucherAsync(puntoDeVenta, tipoDeFactura);
var numeroDeFactura = lastVoucher + 1;
Console.WriteLine($"Próximo número de comprobante: {numeroDeFactura}");
```
## Crear la factura
Vamos a crear una Factura B por un importe de $121 usando el número de comprobante obtenido en el paso anterior
```csharp
var data = new Dictionary
{
["CantReg"] = 1, // Cantidad de comprobantes a registrar
["PtoVta"] = puntoDeVenta, // Punto de venta
["CbteTipo"] = tipoDeFactura, // Tipo de comprobante (ver tipos disponibles)
["Concepto"] = 1, // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
["DocTipo"] = 99, // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
["DocNro"] = 0, // Número de documento del comprador (0 consumidor final)
["CbteDesde"] = numeroDeFactura, // Número de comprobante obtenido
["CbteHasta"] = numeroDeFactura, // Número de comprobante obtenido
["CbteFch"] = int.Parse(DateTime.UtcNow.ToString("yyyyMMdd")), // Fecha del comprobante (yyyyMMdd)
["ImpTotal"] = 121m, // Importe total del comprobante
["ImpTotConc"] = 0, // Importe neto no gravado
["ImpNeto"] = 100m, // Importe neto gravado
["ImpOpEx"] = 0, // Importe exento de IVA
["ImpIVA"] = 21m, // Importe total de IVA
["ImpTrib"] = 0, // Importe total de tributos
["MonId"] = "PES", // Tipo de moneda usada en el comprobante ('PES' para pesos argentinos)
["MonCotiz"] = 1, // Cotización de la moneda usada (1 para pesos argentinos)
["CondicionIVAReceptorId"] = 5, // Condición frente al IVA del receptor (ver tipos disponibles)
["Iva"] = new[] // (Opcional) Alícuotas asociadas al comprobante
{
new Dictionary
{
["Id"] = 5, // Id del tipo de IVA (5 para 21%)(ver tipos disponibles)
["BaseImp"] = 100m, // Base imponible
["Importe"] = 21m // Importe
}
}
};
var res = await afip.ElectronicBilling.CreateVoucherAsync(data);
```
Y por último mostramos el CAE y su vencimiento por pantalla.
```csharp
Console.WriteLine(res["CAE"]); //CAE asignado al comprobante
Console.WriteLine(res["CAEFchVto"]); //Fecha de vencimiento del CAE (yyyy-mm-dd)
```
## Problemas comunes
Si estas teniendo el error **(10016) El numero o fecha del comprobante no se corresponde con el proximo a autorizar** te recomiendo leer este artículo.
Si estas teniendo el error **(10242) El campo Condicion IVA receptor es obligatorio. Consular metodo FEParamGetCondicionIvaReceptor** te recomiendo leer este artículo.
Luego, lo único que nos queda es pasar a modo producción, para más información de cómo hacerlo pueden dirigirse a la documentación de la librería https://docs.afipsdk.com/
---
Ante cualquier duda o pregunta al respecto, pueden resolverla rápidamente dentro de la [Comunidad Afip SDK](https://community.afipsdk.com). Además, puedes unirte para estar al tanto de las novedades y problemas técnicos al usar los servicios de ARCA.
---
--- title: Crear factura electrónica de ARCA en Java description: Con pocas líneas de código category: [Java] pubDate: oct 07, 2024 cover: /images/blog/java-create-invoice.png ---
# Crear factura electrónica de ARCA en Java
Si es tu primera vez conectándote con la facturación electrónica de ARCA, te recomiendo leer esta guía básica sobre su funcionamiento general.
El primer paso para crear una factura electrónica de ARCA en Java es obtener el Código de Autorización Electrónico o CAE.
Esto lo vamos a hacer utilizando Afip SDK que nos permite conectarnos a los web services de ARCA sin complicarnos con el uso de SOAP y la autenticación.
## Requisitos previos
Para poder seguir esta guía, primero necesitarás:
- [Obtener un access_token de Afip SDK](https://app.afipsdk.com/)
## Instalación
Lo primero es instalar la librería [afip.java](https://github.com/afipsdk/afip.java)
**Maven**
```xml
com.afipsdk
afip-sdk-java
1.0.0
```
**Gradle**
```gradle
implementation 'com.afipsdk:afip-sdk-java:1.0.0'
```
## Creamos una instancia de la clase Afip
Para usar los web services de ARCA, se requiere un certificado digital, con Afip SDK puedes integrarte en modo desarrollo usando el CUIT `20409378472` sin necesidad de obtener un certificado, para poder integrarte lo más rápido posible.
Te dejo este enlace por si luego quieres [usar tu propio certificado para desarrollo](https://docs.afipsdk.com/integracion/java#usar-tu-propio-certificado-opcional).
```java
import com.afipsdk.Afip;
import com.afipsdk.model.AfipOptions;
AfipOptions options = new AfipOptions();
options.setCuit("20409378472"); // CUIT vinculado al certificado
options.setProduction(false);
options.setAccessToken("TU_ACCESS_TOKEN");
Afip afip = new Afip(options);
```
## Obtener el número del último comprobante
Antes de crear la factura, necesitamos saber cuál es el último número de comprobante autorizado. Esto evita el error **(10016) El número o fecha del comprobante no se corresponde con el próximo a autorizar**.
```java
int puntoDeVenta = 1;
int tipoDeFactura = 6;
int lastVoucher = afip.electronicBilling().getLastVoucher(puntoDeVenta, tipoDeFactura);
int numeroDeFactura = lastVoucher + 1;
System.out.println("Próximo número de comprobante: " + numeroDeFactura);
```
## Crear la factura
Vamos a crear una Factura B por un importe de $121 usando el número de comprobante obtenido en el paso anterior
```java
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
// Fecha del comprobante (yyyyMMdd)
int fechaActual = Integer.parseInt(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
Map data = new LinkedHashMap<>();
data.put("CantReg", 1); // Cantidad de comprobantes a registrar
data.put("PtoVta", puntoDeVenta); // Punto de venta
data.put("CbteTipo", tipoDeFactura); // Tipo de comprobante (ver tipos disponibles)
data.put("Concepto", 1); // Concepto del Comprobante: (1)Productos, (2)Servicios, (3)Productos y Servicios
data.put("DocTipo", 99); // Tipo de documento del comprador (99 consumidor final, ver tipos disponibles)
data.put("DocNro", 0); // Número de documento del comprador (0 consumidor final)
data.put("CbteDesde", numeroDeFactura); // Número de comprobante obtenido
data.put("CbteHasta", numeroDeFactura); // Número de comprobante obtenido
data.put("CbteFch", fechaActual); // Fecha del comprobante (yyyyMMdd)
data.put("ImpTotal", 121); // Importe total del comprobante
data.put("ImpTotConc", 0); // Importe neto no gravado
data.put("ImpNeto", 100); // Importe neto gravado
data.put("ImpOpEx", 0); // Importe exento de IVA
data.put("ImpIVA", 21); // Importe total de IVA
data.put("ImpTrib", 0); // Importe total de tributos
data.put("MonId", "PES"); // Tipo de moneda usada en el comprobante ('PES' para pesos argentinos)
data.put("MonCotiz", 1); // Cotización de la moneda usada (1 para pesos argentinos)
data.put("CondicionIVAReceptorId", 5); // Condición frente al IVA del receptor (ver tipos disponibles)
// (Opcional) Alícuotas asociadas al comprobante
List