/pingEl endpoint /ping explicado en criollo: qué es, todas las opciones que podés pedir, y cómo leer la respuesta para decidir si conviene conectarte o no.
/ping te dice, antes de intentar facturar, si "hay línea" con los servidores que vas a necesitar. En vez de lanzar una operación contra ARCA y esperar a que falle porque no hay internet o porque ARCA está caído, primero preguntás "¿está todo accesible?" y con esa respuesta decidís si seguís o esperás.
Chequea dos cosas de cada servidor:
afiPAPI no hace el chequeo en el momento en que preguntás. Tiene un proceso interno que va midiendo la conectividad solo, cada 30 segundos, y guarda el último resultado. Cuando preguntás, te devuelve ese dato ya guardado, sin que esperes nada. Por eso podés consultarlo seguido sin penalización.
| Método | Cuándo | Cómo |
|---|---|---|
| GET | Solo querés chequear los servidores de ARCA | Sin cuerpo, todo por la URL |
| POST | Además querés chequear servidores tuyos (ej. tu MySQL) | Con un cuerpo JSON donde definís qué chequear |
Los dos devuelven exactamente el mismo formato de respuesta. El GET es el atajo cómodo; el POST es el que te da las opciones.
El JSON que mandás tiene 3 campos, todos con un valor por defecto sensato:
{
"produccion": false,
"incluirAfip": true,
"destinos": [ ... ]
}produccion — opcional, default falseElige contra qué ambiente de ARCA se mide. false = homologación (pruebas); true = producción (el real). Importa porque homo y prod son máquinas distintas: puede estar arriba una y caída la otra.
incluirAfip — opcional, default trueDice si en la respuesta querés que vengan los servidores de ARCA (WSAA + WSFE) o no. Ponelo en false cuando querés chequear únicamente algo tuyo, sin arrastrar el chequeo de ARCA.
destinos — opcional, una listaAcá va la consulta personalizada: uno o varios servidores tuyos a chequear. Cada destino es un objeto con estos campos:
| Campo | ¿Obligatorio? | Qué es |
|---|---|---|
| host | Sí | La dirección o IP del servidor (ej. "10.0.0.5" o "mibase.local") |
| puerto | Sí | El puerto TCP (ej. 3306 MySQL, 443 HTTPS, 1433 SQL Server…) |
| nombre | No | Una etiqueta para reconocerlo en la respuesta. Si no la ponés, usa "host:puerto" |
| tipo | No | "tcp" (default) o "mysql" — ver abajo |
tipo:"tcp" → solo prueba abrir la conexión al puerto. Sirve para cualquier servicio (una web, otra base, un servidor de correo, lo que sea)."mysql" → además de conectar, lee el saludo inicial que manda MySQL/MariaDB. Eso confirma que el motor está realmente vivo (no solo "el puerto abierto") y de yapa te devuelve su versión. Todo sin usuario ni contraseña.tipo y el puerto es 3306, asume "mysql" solo.GET /api/afip/ping?produccion=falseGET /api/afip/ping?produccion=true{
"destinos": [
{ "nombre": "MySQL caja", "host": "10.0.0.5", "puerto": 3306, "tipo": "mysql" }
]
}{
"incluirAfip": false,
"destinos": [
{ "nombre": "MySQL caja", "host": "10.0.0.5", "puerto": 3306 }
]
}Acá omití tipo: como el puerto es 3306, lo toma como mysql igual.
{
"incluirAfip": false,
"destinos": [
{ "nombre": "MySQL", "host": "10.0.0.5", "puerto": 3306, "tipo": "mysql" },
{ "nombre": "Mi web", "host": "miapp.com", "puerto": 443, "tipo": "tcp" },
{ "nombre": "Impresora fiscal", "host": "192.168.1.50", "puerto": 9100 }
]
}{
"ok": true,
"data": {
"fecha": "2026-07-23T10:15:03",
"produccion": false,
"afipAccesible": true,
"objetivos": [
{
"nombre": "WSAA", "grupo": "afip",
"host": "wsaahomo.afip.gov.ar", "puerto": 443, "tipo": "tcp",
"accesible": true, "latenciaMs": 84, "servidor": null, "error": null,
"fechaChequeo": "2026-07-23T10:14:51", "edadSegundos": 12
},
{
"nombre": "MySQL caja", "grupo": "custom",
"host": "10.0.0.5", "puerto": 3306, "tipo": "mysql",
"accesible": true, "latenciaMs": 3, "servidor": "MySQL 8.0.36", "error": null,
"fechaChequeo": "2026-07-23T10:14:51", "edadSegundos": 12
}
]
}
}| Campo | Qué te dice |
|---|---|
| ok | La regla de siempre: true = la consulta salió bien. Si es false, mirá data.error. |
| fecha | El momento en que se armó esta respuesta. |
| produccion | Te recuerda contra qué ambiente se midió. |
| afipAccesible | El resumen clave: true solo si WSAA y WSFE están accesibles. Es tu semáforo directo para "¿puedo facturar?". |
| objetivos | La lista con el detalle de cada servidor. |
| Campo | Qué te dice |
|---|---|
| nombre | La etiqueta (la que pusiste, o "WSAA"/"WSFE" para los de ARCA). |
| grupo | "afip" (servidor de ARCA, fijo) o "custom" (uno tuyo). |
| host / puerto | A qué apuntó exactamente. |
| tipo | "tcp" o "mysql". |
| accesible | true/false: lo más importante. ¿Se pudo conectar? |
| latenciaMs | Cuánto tardó, en milisegundos. Es null si no se pudo conectar. |
| servidor | Info extra del servidor (ej. la versión de MySQL). null si no aplica. |
| error | Si accesible es false, acá está el motivo (ej. "Connection refused", "Timeout tras 3000 ms"). null si anduvo. |
| fechaChequeo | Cuándo se midió realmente (no cuándo preguntaste). |
| edadSegundos | Qué tan viejo es el dato. Como viene de cache, te dice hace cuántos segundos se chequeó. Normalmente 0-30 s. |
fechaChequeo + edadSegundos existe justamente porque la respuesta sale de cache: te deja saber si el dato es fresco. Si vieras un edadSegundos muy alto (minutos), sería señal de que el chequeo de fondo se frenó.Si mandás un destino incompleto o inválido, la API te lo dice con ok:false y un status HTTP:
| Status | Motivo |
|---|---|
| 400 | Falta el host de un destino. |
| 400 | Puerto fuera de rango (no entre 1 y 65535). |
| 403 | Un host no permitido por la allowlist. Hoy está abierta en *, así que no salta; es un candado para el día que quieras restringir qué puede chequear la API. |
En tu programa, típicamente:
/ping.afipAccesible: si es true, seguís con login/emitir. Si es false, mostrás "sin conexión con ARCA" y reintentás.destinos y chequeás su accesible en la misma llamada — así, en un solo request, sabés si todo el circuito (ARCA + tu base) está listo./ping es el chequeo rápido y barato que hacés antes de operar, para no lanzar facturación a ciegas cuando no hay línea./ping ›
Todos los endpoints ›
Guía de integración ›