Trastienda Facturador Crear una clave

API del facturador

Emití facturas electrónicas de ARCA desde tu propio sistema: un ERP, una tienda o una app. Mandás los datos de la venta y Trastienda se ocupa del resto: letra, numeración, CAE, reintentos y PDF con QR.

JSON sobre HTTPSSin facturas duplicadasAmbiente de prueba sin validez fiscalPlanes Comercio y Multicanal

Dirección base https://facturador.mitrastienda.com.ar/v1

Para empezar

  1. 1En el facturador, entrá a Ajustes › Integraciones y creá una clave de prueba con permiso de facturar.
  2. 2Probá con el ejemplo de Crear una factura: sale en el ambiente de prueba de ARCA, sin validez fiscal.
  3. 3Cuando todo ande, conectá tu certificado de ARCA (guía), pasá el facturador a producción y creá una clave de producción.

Autenticación

Cada pedido lleva la clave en el encabezado Authorization.

Encabezado
Authorization: Bearer art_test_xxxxxxxxxxxxxxxxxxxxxxxx
  • Ambiente: las claves art_test_ funcionan solo con el facturador en modo de prueba, y las art_live_ solo en producción. Una prueba nunca sale como factura real.
  • Permiso: "Solo leer" consulta; "Facturar" además crea facturas y notas de crédito.
  • Guardá la clave en tu servidor, nunca en una página web ni en una app del celular. Si se filtra, revocala en Ajustes y creá otra.

Crear una factura

POST/v1/comprobantes

Con el encabezado Idempotency-Key: un identificador único de la venta en tu sistema, por ejemplo el número de pedido (8 a 120 caracteres). Si repetís el pedido con el mismo valor, devuelve la misma factura y no emite otra.

curl
curl https://facturador.mitrastienda.com.ar/v1/comprobantes \
  -H "Authorization: Bearer art_test_..." \
  -H "Idempotency-Key: pedido-10457" \
  -H "Content-Type: application/json" \
  -d '{
    "cliente": { "nombre": "Consumidor final" },
    "items": [
      { "descripcion": "Auriculares bluetooth", "cantidad": 1, "precioUnitario": 48900, "iva": 21 },
      { "descripcion": "Envío", "cantidad": 1, "precioUnitario": 6500, "iva": 21 }
    ]
  }'

Campos

items[]

De 1 a 50 líneas: descripcion, cantidad, precioUnitario (con IVA incluido) e iva (21, 10.5, 27 o 0; por defecto 21).

cliente.nombreopcional

Nombre o razón social. Si no viene, "Consumidor final".

cliente.docTipo · cliente.docNroopcional

80 CUIT, 86 CUIL, 96 DNI, 99 sin identificar (por defecto). El número, solo con dígitos.

cliente.condicionIvaopcional

Según ARCA: 1 Responsable Inscripto, 4 Exento, 5 Consumidor final (por defecto), 6 Monotributo.

cliente.email · cliente.domicilioopcional

Van impresos en la factura.

emitiropcional

true (por defecto) la manda a ARCA enseguida. false la deja como borrador para aprobar en el panel.

fechaopcional

Fecha de la factura anterior a hoy (AAAA-MM-DD): hasta 5 días antes, o 10 con servicios, y nunca anterior a la última factura del mismo tipo y punto de venta. Sin este campo, el día en que se emite.

servicioopcional

Para facturar servicios con su período: {"concepto": 2, "desde": "2026-10-01", "hasta": "2026-10-31", "vencimientoPago": "2026-10-20"}. Concepto 2 es servicios y 3 productos y servicios. Sin este campo, se factura como productos.

La letra (A, B o C) sale de tu condición frente al IVA y la del comprador. El punto de venta es el predeterminado del ambiente.

Respuesta

201 · JSON
{
  "id": "cm2x...",
  "tipo": "factura",
  "estado": "emitiendo",
  "ambiente": "prueba",
  "letra": "B",
  "puntoDeVenta": 3,
  "numero": null,
  "cae": null,
  "total": 55400,
  "referencia": "pedido-10457",
  "mensaje": null
  // ...
}

El CAE llega en segundos: consultá GET /v1/comprobantes/{id} hasta que el estado sea autorizada o rechazada, o recibilo con los avisos a tu sistema.

Estados

borradorArmada, sin mandar a ARCA: con emitir: false, o le falta un dato (mirá mensaje, por ejemplo el DNI en ventas grandes).
emitiendoEn la cola. Si ARCA no responde, se reintenta sola y nunca sale dos veces.
autorizadaTiene número y CAE. Ya se puede bajar el PDF.
rechazadaARCA no la aceptó: el motivo está en mensaje.
descartadaSe descartó desde el panel.

Todos los pedidos

POST/v1/comprobantes

Crear una factura (arriba).

GET/v1/comprobantes/{id}

Ver un comprobante.

GET/v1/comprobantes

Listar, de a 50. Filtros: desde y hasta (AAAA-MM-DD), estado, referencia (tu Idempotency-Key) y pagina.

GET/v1/comprobantes/{id}/pdf

El PDF con el QR de ARCA.

POST/v1/comprobantes/{id}/nota-de-credito

Nota de crédito por el total de una factura autorizada. Si ya existe, devuelve la misma.

GET/v1/contribuyentes/{cuit}

Datos del padrón de ARCA: razón social, domicilio y condición frente al IVA.

GET/v1/libro-iva?desde=…&hasta=…

Libro IVA Ventas del período en CSV (punto y coma, coma decimal): neto, IVA por alícuota y total de cada comprobante; las notas de crédito en negativo.

GET/v1/puntos-de-venta

Los puntos de venta del ambiente y el predeterminado.

Avisos a tu sistema

En Ajustes › Integraciones › Avisos a tu sistema cargás una dirección https://. Cuando un comprobante se autoriza o se rechaza, le mandamos un POST:

Cuerpo del aviso
{
  "evento": "comprobante.autorizado",
  "creado": "2026-10-12T15:04:05.000Z",
  "comprobante": { "id": "cm2x...", "estado": "autorizada", "numero": 128, "cae": "76412589031524", "referencia": "pedido-10457" /* ... */ }
}
  • Eventos: comprobante.autorizado y comprobante.rechazado. El botón Probar manda uno de tipo prueba.
  • Respondé con un 2xx en menos de 10 segundos. Si no, reintentamos con espera creciente, hasta 8 veces.
  • Puede llegar más de una vez: usá comprobante.id para no procesarlo dos veces.

Verificar la firma

Cada aviso trae Artic-Signature: t=<segundos>,v1=<firma>. La firma es un HMAC-SHA256 en hexadecimal de t + "." + cuerpo con el secreto que te mostramos al cargar la dirección.

Node.js
import { createHmac, timingSafeEqual } from "node:crypto";

function avisoValido(cuerpo, encabezado, secreto) {
  const { t, v1 } = Object.fromEntries(encabezado.split(",").map((p) => p.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // más de 5 minutos: se descarta
  const esperada = createHmac("sha256", secreto).update(`${t}.${cuerpo}`).digest("hex");
  return timingSafeEqual(Buffer.from(esperada), Buffer.from(v1));
}

Errores

Responden con un código HTTP y este formato:

JSON
{ "error": { "codigo": "idempotency_key", "mensaje": "Mandá el encabezado Idempotency-Key..." } }
400Datos inválidos, falta Idempotency-Key, o no se pudo armar (por ejemplo, faltan tus datos fiscales o la fecha está fuera de lo que acepta ARCA).
401Falta la clave, no es válida o fue revocada.
402La suscripción no está activa o el plan no incluye la API.
403La clave es de solo lectura.
404No existe el comprobante (o es del otro ambiente).
409La clave es de un ambiente y el facturador está en el otro.
429Más de 120 pedidos por minuto con la misma clave.

¿Dudas con la integración? Escribinos con lo que estás armando y te ayudamos.

admin@artic.systems