ARBA A122
certificado retención digital (preliminar)
certificado retención digital (preliminar)
Este servicio (API) de ARBA permite emitir el certificado de retención digital (previa declaración jurada abierta) y descargar el PDF correspondiente
REM ejemplo para visual basic 6
REM ejecutar el código directamente
REM no es necesario agregar referencia
REM la interfaz se crea dinamicamente
Dim mio As Object
Dim bresultado As Boolean
bresultado = True
Dim curl As String
Rem URL del servidor (prueba o real)
curl = "https://app2.test.arba.gov.ar/a122rSrv/api/external/comprobante"
Dim crutaticket As String
Rem Ruta donde se guardó el token del paso anterior
crutaticket = "d:\ticket.txt"
Dim carchivoxmlenviado As String
Dim carchivoxmlrecibido As String
Rem Rutas para guardar el log de tráfico enviado/recibido
carchivoxmlenviado = "d:\arbapet.txt"
carchivoxmlrecibido = "d:\arbaret.txt"
Dim ctoken As String
Dim numeroArchivo As Integer
numeroArchivo = 1
Rem Lectura del archivo de ticket (Sintaxis VB6 clásica)
Open crutaticket For Input As #numeroArchivo
ctoken = Input(LOF(numeroArchivo), #numeroArchivo)
Close #numeroArchivo
Dim ccuit As String
Rem CUIT del agente ARBA
ccuit = "20111111112"
Dim crutalicencia As String
Rem Ruta de la licencia (Servicio ARBA A122)
crutalicencia = "D:\20111111112.lic"
Dim cidDDJJ As String
Rem ID de la DDJJ (obtenido previamente)
cidDDJJ = "1234"
Rem Creación del objeto COM (Sintaxis VB6)
Set mio = CreateObject("WSAFIPFE.misdatos")
If mio.iniciar(ccuit, "") Then
mio.tls = -1
mio.archivolicencia = crutalicencia
mio.ArchivoXMLEnviado = carchivoxmlenviado
mio.ArchivoXMLRecibido = carchivoxmlrecibido
bresultado = mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.ticket", ctoken, 0, 0)
Dim cticket As String
If bresultado Then
cticket = mio.apiLeerPropiedad("ARBA2025", "obtenerticket.ticketvigente", "", 0, 0)
If cticket = "SI" Then
If bresultado Then
bresultado = mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
Rem Configuración de parámetros JSON
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.URLMETODO", curl, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.TIPOMETODO", "POST", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.idDj", cidDDJJ, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.cuitContribuyente", "20111111112", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.cuitAgente", ccuit, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.sucursal", "3", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.alicuota", "2", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.baseImponible", "100.10", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.importeRetencion", "2.01", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.razonSocialContribuyente", "prueba", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.fechaOperacion", "2025-11-20T20:00:20.595Z", 0, 0)
Rem Dirección (Diccionario anidado)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.calle", "san martin", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.numero", "260", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.piso", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.departamento", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.codigoPostal", "0000", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.localidad", "Capital Federal", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.diccionario.direccion.provincia", "Capital Federa", 0, 0)
If bresultado Then
If mio.apiEjecutar("ARBA2025") Then
Dim ccadena As String
Dim cmessage As String
Dim cid As String
cmessage = mio.apiLeerPropiedad("ARBA2025", "diccionario.error", "", 0, 0)
If cmessage = "" Then
cid = mio.apiLeerPropiedad("ARBA2025", "diccionario.id", "", 0, 0)
MsgBox "id certificado " & cid
Else
MsgBox "error " & cmessage
End If
Else
MsgBox "error metodo " & mio.UltimoMensajeError
bresultado = False
End If
Else
bresultado = False
MsgBox "error cargar propiedad " & mio.UltimoMensajeError
End If
End If
Else
MsgBox "ticket vencido"
End If
Else
MsgBox mio.UltimoMensajeError
End If
End If
Esta API (replicada por la interfaz WSAFIFPE.misdatos) contiene método para abrir una declaración jurado (obteniendo su ID) mensual o quincenalmente (según la actividad) y luego otro método para emitir retenciónes (informando sus datos: fecha, monto, id DD.JJ, monto retenido, etc.) y descargar el PDF generado por el mismo servicio.
Para poder usar este servicio debe tener en cuenta los siguientes puntos o requisitos
El instalador 100.90 o superior.
Un usuario/contraseña (CUIT/CIT) del agente de retención válido para sesión en la web de ARBA (tanto para el modo prueba o real).
Un archivo de licencia (provisorio o definitivo) generado para ese CUIT que incluya el servicio ARBA A122 retención digital como figura en este tutorial.
Los PDF y manuales del servicio (al pie) donde figuran los datos y campos de cada método y las URL que cada una de las operaciones y sus validaciones.
Dim mio As Object
Dim bresultado As Boolean
bresultado = True
Dim curl As String
Rem URL del servidor (prueba o real) para obtener el token
curl = "https://idp.test.arba.gov.ar/realms/ARBA/protocol/openid-connect/token"
Dim crutaticket As String
Rem Ruta donde se guardará el token obtenido
crutaticket = "d:\ticket.txt"
Dim carchivoxmlenviado As String
Dim carchivoxmlrecibido As String
Rem Rutas para guardar el log de tráfico enviado/recibido
carchivoxmlenviado = "d:\arbapet.txt"
carchivoxmlrecibido = "d:\arbaret.txt"
Dim ccadena As String
Dim numeroArchivo As Integer
numeroArchivo = 1
Dim ccuit As String
Rem CUIT del agente ARBA
ccuit = "cuit Agente"
Dim cpassword As String
cpassword = "clave"
Dim crutalicencia As String
Rem Archivo de licencia que incluye el servicio ARBA A122
crutalicencia = "D:\cuitagente.lic"
Set mio = CreateObject("WSAFIPFE.misdatos")
If mio.iniciar(ccuit, "") Then
mio.tls = -1
mio.archivolicencia = crutalicencia
mio.ArchivoXMLEnviado = carchivoxmlenviado
mio.ArchivoXMLRecibido = carchivoxmlrecibido
' Carga de parámetros para el Token (OAuth/OpenID)
bresultado = bresultado And mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.URLMETODO", curl, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.TIPOMETODO", "POST", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOS.client_id", "A122RServicios", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOS.client_secret", "44cqahkhERKtkkDGmcqrPApCMtez3XxT", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOS.username", ccuit, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOS.password", cpassword, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOS.grant_type", "password", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOS.scope", "openid", 0, 0)
If bresultado Then
If mio.apiEjecutar("ARBA2025.OBTENERTICKET") Then
ccadena = mio.apiLeerPropiedad("ARBA2025", "obtenerticket", "", 0, 0)
MsgBox "TICKET " & ccadena
If mio.UltimoMensajeError = "" Then
' Guardamos el token en un archivo de texto
Open crutaticket For Output As #numeroArchivo
Print #numeroArchivo, ccadena
Close #numeroArchivo
Else
MsgBox "error " & mio.UltimoMensajeError
End If
Else
MsgBox "error obtener ticket " & mio.UltimoMensajeError
End If
Else
MsgBox "error cargar propiedad " & mio.UltimoMensajeError
End If
Else
MsgBox mio.UltimoMensajeError & " fallo iniciar"
End If
Dim mio As Object
Dim bresultado As Boolean
bresultado = True
Dim curl As String
Rem es la url o dirección del servidor (prueba o real)
curl = "https://app2.test.arba.gov.ar/a122rSrv/api/external/declaracionJurada"
Dim crutaticket As String
Rem es donde se guardó el token obtenido en paso anterior.
crutaticket = "d:\ticket.txt"
Dim carchivoxmlenviado As String
Dim carchivoxmlrecibido As String
carchivoxmlenviado = "d:\arbapet.txt"
carchivoxmlrecibido = "d:\arbaret.txt"
Dim ctoken As String
Dim numeroArchivo
numeroArchivo = 1
Rem leemos el ticket de acceso
Open crutaticket For Input As #numeroArchivo
ctoken = Input(LOF(numeroArchivo), #numeroArchivo)
Close #numeroArchivo
Dim ccuit As String
ccuit = "cuit agente ARBA"
Dim crutalicencia As String
crutalicencia = "D:\cuitagente.lic"
Set mio = CreateObject("WSAFIPFE.misdatos")
If mio.iniciar(ccuit, "") Then
mio.tls = -1
mio.archivolicencia = crutalicencia
mio.ArchivoXMLEnviado = carchivoxmlenviado
mio.ArchivoXMLRecibido = carchivoxmlrecibido
bresultado = mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.ticket", ctoken, 0, 0)
Dim cticket As String
If bresultado Then
cticket = mio.apiLeerPropiedad("ARBA2025", "obtenerticket.ticketvigente", "", 0, 0)
If cticket = "SI" Then
bresultado = mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.URLMETODO", curl, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.TIPOMETODO", "POST", 0, 0)
' Configuración JSON
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.cuitAgente", ccuit, 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.quincena", "0", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.actividadId", "10", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.anio", "2025", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.DATOSJSON.mes", "11", 0, 0)
If bresultado Then
If mio.apiEjecutar("ARBA2025") Then
Dim ccadena As String
ccadena = mio.apiLeerPropiedad("ARBA2025", "resultado", "", 0, 0)
If mio.UltimoMensajeError = "" Then
MsgBox (ccadena)
Dim cid As String
Dim cmessage As String
cmessage = mio.apiLeerPropiedad("ARBA2025", "diccionario.message", "", 0, 0)
If cmessage = "" Then
cid = mio.apiLeerPropiedad("ARBA2025", "diccionario.id", "", 0, 0)
MsgBox ("id DDJJ " + cid)
Else
MsgBox (cmessage)
End If
Else
MsgBox ("errorpropioed " + mio.UltimoMensajeError)
End If
Else
MsgBox ("eror metodo " + mio.UltimoMensajeError)
bresultado = False
End If
Else
bresultado = False
MsgBox ("error cargar propiedad " + mio.UltimoMensajeError)
End If
Else
MsgBox ("ticket vencido")
End If
Else
MsgBox ("error recuperar ticket" + mio.UltimoMensajeError)
End If
End If
Dim mio As Object
Dim bresultado As Boolean
bresultado = True
Dim curl As String
Rem URL del servidor (prueba o real) para descarga de PDF
curl = "https://app.test.arba.gov.ar/a122rSrv/api/external/comprobantePdf"
Dim crutaticket As String
Rem Ruta donde se guardó el token obtenido
crutaticket = "d:\ticket.txt"
Dim carchivoxmlenviado As String
Dim carchivoxmlrecibido As String
Rem Rutas para guardar el log de tráfico
carchivoxmlenviado = "d:\arbapet.txt"
carchivoxmlrecibido = "d:\arbaret.txt"
Dim ctoken As String
Dim numeroArchivo As Integer
numeroArchivo = 1
Rem Lectura del ticket de acceso
Open crutaticket For Input As #numeroArchivo
ctoken = Input(LOF(numeroArchivo), #numeroArchivo)
Close #numeroArchivo
Dim ccuit As String
Rem CUIT del agente
ccuit = "cuitagente"
Dim crutalicencia As String
Rem Ruta de la licencia del servicio
crutalicencia = "D:\cuitagente.lic"
Set mio = CreateObject("WSAFIPFE.misdatos")
If mio.iniciar(ccuit, "") Then
mio.tls = -1
mio.archivolicencia = crutalicencia
mio.ArchivoXMLEnviado = carchivoxmlenviado
mio.ArchivoXMLRecibido = carchivoxmlrecibido
' Cargamos parámetros iniciales
bresultado = mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.ticket", ctoken, 0, 0)
Dim cticket As String
If bresultado Then
' Verificamos si el ticket es válido
cticket = mio.apiLeerPropiedad("ARBA2025", "obtenerticket.ticketvigente", "", 0, 0)
If cticket = "SI" Then
bresultado = mio.apiCargarPropiedad("LIMPIAR", "", 0, 0)
' Configuración de la llamada GET para el PDF
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.URLMETODO", curl, 0, 0)
' CORREGIDO: El método es GET y el contenido es JSON
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.TIPOMETODO", "GET", 0, 0)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.TIPOCONTENIDO", "application/json", 0, 0)
' Parámetro de ejemplo (ID de comprobante)
bresultado = bresultado And mio.apiCargarPropiedad("ARBA2025.PARAMETROS.comprobante", "1", 0, 0)
If bresultado Then
If mio.apiEjecutar("ARBA2025") Then
Dim ccadena As String
' Leemos el resultado crudo
ccadena = mio.apiLeerPropiedad("ARBA2025", "resultado", "", 0, 0)
If mio.UltimoMensajeError = "" Then
Dim cmessage As String
cmessage = mio.apiLeerPropiedad("ARBA2025", "diccionario.error", "", 0, 0)
If cmessage = "" Then
' Si no hay error lógico, guardamos el PDF
' El tercer parámetro indica la ruta de destino del archivo binario
bresultado = mio.apiLeerPropiedad("ARBA2025", "diccionario.stack", "d:\archivo.pdf", 0, 0)
MsgBox "PDF descargado correctamente: " & mio.UltimoMensajeError
Else
MsgBox cmessage
End If
Else
MsgBox "Error propio: " & mio.UltimoMensajeError
End If
Else
MsgBox "Error metodo: " & mio.UltimoMensajeError
bresultado = False
End If
Else
bresultado = False
MsgBox "Error cargar propiedad: " & mio.UltimoMensajeError
End If
Else
MsgBox "Ticket vencido o inválido"
End If
Else
MsgBox "Error recuperar ticket: " & mio.UltimoMensajeError
End If
End If
Los datos de este servicio (tanto enviados como recibidos) son en formato json por lo que es recomendable tener claro como el método leerPropiedad ubica los datos de la respuesta (ver JSON) de igual forma el método cargarPropiedad.
La planilla de test que figura al pie implementa los métodos y campos de la API para ejecutarlos mediante macros. debe ser ejecutada desde un excel de 32 bits y con macros habilitadas.
Tomando como referencia los ejemplos en visual basic 6 (o las macro de planilla) puede generar código en otros lenguajes teniendo en cuenta que en los ejemplos solo se realizan 3 acciones básicas: cargar el valor de una propiedad, llamar a un método con o sin argumentos, leer el valor de una propiedad. Para generar código en otros lenguajes introducir este prompt en un chat de IA (ChatGPT, gemini u otros) preferentemente desde una cuenta paga:
Prompt equivalencia ARBA: https://docs.google.com/document/d/1CW9Qp6uleRzir8iSZa1OtFiUgChDi8QS5csePjI8L94/edit?usp=sharing
Esta confirmada la compatibilidad con estos lenguajes:
Visual Basic 6.
Visual FoxPro.
COBOL (rm, wow, acu, microfocus, power, fujitsu).
NET.
Delphi (5, 9, 2009).
Windows.
PowerBuilder.
Clarion.
Paradox.
Office (excel, access)
Al pie figuran los PDF de manuales de ARBA sobre este servicio. el PDF Interfaz Servicios contiene las URL para cada método (prueba y real) y los parámetros o datos a enviar también los campos de la respuesta y todas las validaciones que el servidor realiza. Tambien contiene el "Swagger UI " util para conocer el nombre y tipo de cada métodoy parámetro.
Desde la plataforma MisDatos puede adquirir soporte pago sin limites. Para ahorrar costos recomendamos antes leer esta guia y usar los prompt de IA sugeridos y solo usar el soporte pago para casos específicos o errores no documentados.