Saltar al contenido
AutomatizaciónFiscal

Documentación

Primera respuesta de ARCA en tres pasos.

Una API HTTP con claves de prueba y de producción separadas. Sin instalar nada, sin SDK obligatorio y sin que tengas que pensar en tickets de acceso, firmas ni SOAP.

El recorrido

  1. Creá una cuenta. Correo y contraseña; no hace falta ningún dato fiscal todavía.

  2. En Claves de API, creá una clave de prueba. Viene elegida por omisión. Se muestra una sola vez.

  3. Pegá el comando de acá abajo. La respuesta viene de ARCA, no de nosotros.

El primer llamado

GET/v1/arca/status

Le pregunta a ARCA si está en pie. Es la única operación que contesta con datos de ARCA sin certificado, sin delegación y sin ningún CUIT conectado, así que sirve para comprobar el camino entero antes de hacer ningún trámite. La atiende una clave de prueba.

curl https://automatizacionfiscal.com/v1/arca/status \
  -H "Authorization: Bearer aa_test_TU_CLAVE"
const r = await fetch("https://automatizacionfiscal.com/v1/arca/status", {
  headers: { Authorization: "Bearer " + process.env.AF_CLAVE },
});
const { data } = await r.json();
console.log(data.operativo ? "ARCA responde" : "ARCA no responde");
<?php
$ch = curl_init("https://automatizacionfiscal.com/v1/arca/status");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  "Authorization: Bearer " . getenv("AF_CLAVE"),
]);
$respuesta = json_decode(curl_exec($ch), true);
echo $respuesta["data"]["operativo"] ? "ARCA responde" : "ARCA no responde";
import os, urllib.request, json

pedido = urllib.request.Request(
    "https://automatizacionfiscal.com/v1/arca/status",
    headers={"Authorization": "Bearer " + os.environ["AF_CLAVE"]},
)
datos = json.load(urllib.request.urlopen(pedido))["data"]
print("ARCA responde" if datos["operativo"] else "ARCA no responde")
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("AF_CLAVE"));

var json = await http.GetStringAsync("https://automatizacionfiscal.com/v1/arca/status");
var datos = JsonDocument.Parse(json).RootElement.GetProperty("data");
Console.WriteLine(datos.GetProperty("operativo").GetBoolean()
    ? "ARCA responde" : "ARCA no responde");

Si preferís un cliente en vez de copiar el HTTP: el paquete se llama automatizacion-fiscal en npm y PyPI, automatizacion-fiscal/sdk en Composer y AutomatizacionFiscal en NuGet. Todavía no están publicados: se instalan desde el artefacto local del repo (sdks/).

Lo que devuelve

{
  "success": true,
  "data": {
    "entorno": "homologacion",
    "alcanzable": true,
    "operativo": true,
    "componentes": {
      "aplicacion": "OK",
      "base": "OK",
      "autenticacion": "OK"
    },
    "consultadoEn": "2026-08-19T22:41:07.412Z",
    "vigenciaSegundos": 30
  },
  "error": null,
  "requestId": "req_d52a945d8cef4c2f9d475639b9845ef5"
}

Los tres componentes vienen por separado porque fallan por separado: con la autenticación caída no se puede sacar un ticket aunque la aplicación conteste. Y que ARCA esté caído no es un error de la operación: contesta 200 con alcanzable: false, para que no tengas que distinguir «se rompió el servicio» de «el estado es malo» leyendo códigos.

Las claves

Hay dos, y el token dice cuál es de un vistazo. Es a propósito: quien abre un archivo de configuración tiene que poder ver en qué mundo está parado sin buscarlo en ningún tablero.

aa_test_
No llega a ARCA. Las lecturas de dominio (padrón, monotributo, DFE, puntos de venta, diagnóstico) contestan un ejemplo marcado sandbox: true. Puede administrar tu cuenta y puede consultar el estado de ARCA. No emite, no delega, no toca ninguna cuenta fiscal.
aa_live_
Consulta y opera de verdad los CUIT que tengas conectados.

Una clave de prueba no puede crear una clave real. Si pudiera, el corral se saldría en una llamada.

Cuando algo sale mal

Todos los errores tienen la misma forma, y todos traen remedy: qué hacer para destrabarlo, en castellano. Un error que sólo dice qué pasó obliga a adivinar.

{
  "success": false,
  "data": null,
  "error": {
    "code": "PORTAL_ACCION_NO_PERMITIDA",
    "message": "Estás usando una clave de prueba, y esta operación consulta ARCA.",
    "remedy": "Las claves aa_test_ nunca llegan a ARCA: sirven para escribir y probar tu integración sin tocar ninguna cuenta fiscal. Para operar de verdad, creá una clave aa_live_ desde el panel y conectá el CUIT con ARCA.",
    "details": { "credencial": "test", "cuit": "30712345671" },
    "retryable": false
  },
  "requestId": "req_9c1f0b2ea44d4a1b8f3e6c5d70b21a94"
}
requestId
Identificador de esa llamada. Viene en todas las respuestas —también en las que salen bien— y en la cabecera X-Request-Id. Es lo que hay que citar en un reclamo: con él encontramos el pedido en el registro.
error.code
Estable. Se puede ramificar sobre él.
error.remedy
Qué hacer. Pensado para mostrárselo a una persona.
error.retryable
Si reintentar puede cambiar el resultado. Reintentar un false sólo gasta cupo.
Idempotency-Key
Cabecera de las escrituras. Repetir un pedido con la misma clave devuelve el resultado del primero en vez de hacerlo dos veces — que en un comprobante fiscal es la diferencia entre un reintento y un duplicado.

Webhooks

Cada aviso se firma con HMAC-SHA256. El cuerpo viaja crudo: si lo parseás y lo volvés a serializar, la firma no va a coincidir. El aviso no trae el resultado: un comprobante es dato fiscal y no se deposita en un servidor que no controlamos. El aviso dice qué pasó; el resultado se lee con GET /v1/automations/{id}.

Si no contestás 2xx se reintenta con espera creciente. Deduplicá por X-Arca-Webhook-Id: el contrato es al menos una vez.

Límite de tasa

120 pedidos de integración por minuto, por organización, no por clave: emitir más claves no multiplica el cupo. Toda respuesta trae RateLimit-Limit, RateLimit-Remaining y RateLimit-Reset. El 429 agrega Retry-After.

Lo que todavía no está

Las rutas de dominio ya se pueden llamar: /v1/taxpayers/{cuit}/padron, monotributo, dfe, sales-points y diagnose. Hoy contestan REPRESENTANTE_NO_CONFIGURADO: falta que Automatización Fiscal quede constituida ante ARCA como representante, con su certificado de producción. Es un trámite, no una línea de código, y no es un problema de tu cuenta.

El sobre, los errores, el requestId y la idempotencia no van a cambiar cuando el cuerpo pase a traer datos. La emisión de comprobantes ya existe en POST /v1/vouchers y sigue exigiendo un certificado: el del cliente, o el nuestro el día que el representante esté.

La referencia completa

El documento OpenAPI describe cada operación, cada cuerpo y cada error, y se genera de los mismos esquemas que validan los pedidos: no puede quedar viejo.

openapi.json Contrato 1.9.0