Escrito por el equipo de Tramitito
Centro de ayuda
¿Te sirvió esta nota?
¿No era esto?
Documentación · API v1
Una clave, un pedido HTTP por venta, y la factura sale con CAE y QR de ARCA. Sin certificados, sin WSAA, sin SOAP: de eso nos ocupamos nosotros.
https://tramitito.app/api/v1JSON · UTF-8Bearer tk_live_…Dos maneras de conectarse — no necesitás las dos
tk_live_... (Zapier, Make, desarrollo propio): el resto de esta página.| Método | Ruta | Qué hace |
|---|---|---|
| POST | /api/v1/facturas | Emite la factura de una venta |
| GET | /api/v1/facturas/{id} | Estado de un comprobante |
| GET | /api/v1/facturas?idempotencia={pedido} | ¿Este pedido ya se facturó? |
| POST | /api/v1/facturas/{id}/nota-credito | Anula una factura (devolución) |
| GET | /api/v1/clientes/{doc} | Datos del cliente por DNI o CUIT |
| GET | /api/v1/yo | Verifica la clave y el estado de la cuenta |
Las claves se crean en tu panel de tienda, sección Claves de API — una por integración, revocable sin tocar las demás, hasta 10 activas. El secreto se muestra una sola vez: guardamos solo su hash. Si se pierde, se revoca y se crea otra.
Authorization: Bearer tk_live_9f2a...Con la clave mal puesta la API responde 401; si la cuenta apagó el modo tienda, 403; y si todavía le falta CUIT o punto de venta, 409. Los tres traen su código estable.
GET /api/v1/yo confirma que la clave anda y que la cuenta está lista.Para desarrollar, gratis
El plan Gratis emite 5 facturas por mes con la API incluida: alcanza para desarrollar y probar sin pagar nada.
Lo más fácil es el plugin oficial: sin webhooks, con el resultado anotado en cada pedido, el campo DNI/CUIT en el checkout y el botón «facturar ahora».
¿Sin plugin? Conexión WooCommerce en el panel (te da URL y secreto) y un webhook en WooCommerce → Ajustes → Avanzado → Webhooks: Activo, tema Pedido actualizado, API v3. Facturamos en Procesando o Completado; el resto se ignora.
Cuidado con «Enviar notificación de prueba»
Manda un pedido de EJEMPLO que, si viene como pagado, se factura de verdad en ARCA. Probá con un pedido real de monto chico y anulalo con su nota de crédito.
Pide tres datos: su aviso no trae el pedido, así que Tramitito lo lee de su API con el token de una aplicación de Tiendanube tuya, aunque sea privada.
https://www.tiendanube.com/apps/TU_CLIENT_ID/authorize, autorizá y copiá el parámetro code de la URL de retorno.curl -X POST https://www.tiendanube.com/apps/authorize/token \
-d 'client_id=TU_CLIENT_ID' \
-d 'client_secret=TU_CLIENT_SECRET' \
-d 'grant_type=authorization_code' \
-d 'code=EL_CODE_DEL_PASO_2'access_token y user_id: el ID de tu tienda (store_id).order/paid apuntando a esa URL:curl -X POST https://api.tiendanube.com/v1/TU_STORE_ID/webhooks \
-H 'Authentication: bearer TU_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"url": "LA_URL_QUE_TE_DIO_TRAMITITO", "event": "order/paid"}'¿Te suena a chino? Para un desarrollador son 15 minutos: pasale esta página. Si no tenés uno, escribinos por el chat de soporte.
Van por la API con clave: en el trigger «nueva venta pagada», un paso HTTP con POST a /api/v1/facturas, header Authorization: Bearer tu_clave y el body de Emitir una factura. No te olvides de idempotencia.
POST /api/v1/facturas
Un pedido por venta. La respuesta ya trae el CAE y el link al PDF.
curl -X POST https://tramitito.app/api/v1/facturas \
-H "Authorization: Bearer tk_live_9f2a..." \
-H "Content-Type: application/json" \
-d '{
"idempotencia": "pedido-1234",
"doc": "20111111112",
"nombre": "Juan Pérez",
"items": [
{ "descripcion": "Zapatillas running", "importe": 80000 },
{ "descripcion": "Envío", "importe": 5000 }
]
}'const r = await fetch('https://tramitito.app/api/v1/facturas', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TRAMITITO_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
idempotencia: pedido.id, // el id de TU sistema
doc: cliente.cuit, // sin doc: consumidor final
items: pedido.lineas.map((l) => ({
descripcion: l.nombre,
importe: l.total,
})),
}),
});
// 202 = ARCA no responde: la factura ya existe y sale sola. No reintentes.
const { factura } = await r.json();
guardar(pedido.id, factura.cae, factura.urlPdf);$ch = curl_init('https://tramitito.app/api/v1/facturas');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('TRAMITITO_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'idempotencia' => $pedido->id,
'doc' => $cliente->cuit,
'items' => [
['descripcion' => 'Plan mensual', 'importe' => 45000],
],
]),
]);
$factura = json_decode(curl_exec($ch), true)['factura'];
// $factura['cae'], $factura['numero'], $factura['urlPdf']import os, requests
r = requests.post(
"https://tramitito.app/api/v1/facturas",
headers={"Authorization": f"Bearer {os.environ['TRAMITITO_KEY']}"},
json={
"idempotencia": pedido.id,
"doc": cliente.cuit,
"items": [{"descripcion": "Plan mensual", "importe": 45000}],
},
timeout=30,
)
# 202 = ARCA caído: queda en cola y se emite sola
factura = r.json()["factura"]{
"ok": true,
"factura": {
"id": "clx8y2m4k0001",
"numero": 143,
"cae": "75123456789012",
"estado": "EMITIDA",
"concepto": "Venta online (2 productos)",
"urlPdf": "https://tramitito.app/facturas/clx8y2m4k0001/pdf"
},
"repetida": false,
"error": null
}Lo que se completa solo
Monto, concepto y tipo de comprobante salen de los items y de la condición fiscal de la cuenta. Con doc, el nombre y el domicilio del comprador se completan desde el padrón de ARCA: no hace falta consultarlo antes.
Todos opcionales, salvo que tenés que mandar al menos monto o items.
| Campo | Tipo | Para qué |
|---|---|---|
idempotencia | texto · hasta 120 | El número de pedido de tu sistema. Mandalo siempre (ver Idempotencia). |
items | lista · hasta 50 | Renglones del pedido (productos + envío): salen en el detalle del PDF. Ver Items, descuentos y tributos. |
monto | número | Total del comprobante. Si no lo mandás, se calcula sumando los items. Si mandás los dos y no cierran, devuelve 400 y no crea nada. |
doc | texto | DNI (7 u 8 dígitos) o CUIT/CUIL (11) del comprador, con o sin guiones. Sin doc, la venta sale a consumidor final (hasta el tope de ARCA). |
nombre | texto · hasta 120 | Sale en el PDF junto al documento. Solo tiene efecto si mandás doc. |
concepto | texto · hasta 200 | Descripción del comprobante. Si no lo mandás, se arma con los items o con el número de pedido. |
medioPago | texto | Se imprime como «Condición de venta» en el PDF. Valores: efectivo, tarjeta_credito, tarjeta_debito, transferencia, mercadopago, billetera, qr, cheque, contra_entrega, cuenta_corriente, tarjeta, otro. |
alicuotaIva | 21 · 10.5 · 27 · 5 · 2.5 · 0 | Alícuota de IVA del comprobante, para facturas A y B (responsable inscripto). En factura C se ignora. |
bonificacionPorc | número · 0 a 99,99 | Descuento en porcentaje sobre monto (precio de lista). Si mandás items, este se ignora: el descuento va en cada renglón. |
tributos | lista · hasta 6 | Percepciones y retenciones que se SUMAN al total (IIBB, municipales, internos). Ver Items, descuentos y tributos. |
conceptoArca | 1 · 2 · 3 | 1 productos, 2 servicios, 3 ambos. Por defecto 1, que es lo normal en un ecommerce. |
fechaComprobante | aaaa-mm-dd | Para emitir con otra fecha de venta (dentro de lo que permite ARCA). |
servicioDesde / servicioHasta | aaaa-mm-dd | El período facturado cuando el concepto es servicios (2 o 3). |
observaciones | texto · hasta 300 | Texto libre que se imprime en el PDF. |
Cada item es un renglón del PDF: descripcion (hasta 200), importe (lo que se cobra, ya con el descuento aplicado) y, opcional, bonificacionPorc — el descuento del renglón en porcentaje, que se imprime en la columna «% Bonif».
Los tributos son percepciones o retenciones que le cobrás al comprador además del IVA (IIBB, municipales, internos). Se suman al total: el comprobante sale por monto + tributos.
{
"idempotencia": "pedido-1235",
"items": [
{ "descripcion": "Monitor 27\"", "importe": 405000, "bonificacionPorc": 10 }
],
"tributos": [
{
"tipo": 2,
"descripcion": "Percepción IIBB Córdoba",
"baseImponible": 405000,
"alicuota": 3,
"importe": 12150
}
]
}| Campo del tributo | Qué es |
|---|---|
tipo | 1 nacional · 2 provincial · 3 municipal · 4 impuestos internos · 99 otros |
baseImponible y alicuota | La base y el % sobre el que se calcula. Con alicuota: 0 es un importe fijo. Si importe no coincide con base × alícuota, devuelve 400. |
importe | Lo que se suma al total del comprobante. |
Los webhooks de ecommerce reintentan: sin protección, una venta se factura tres veces. Mandá siempre idempotencia con el número de pedido:
"repetida": true, sin volver a llamar a ARCA.GET /api/v1/facturas?idempotencia=pedido-1234 lo responde sin emitir nada.No se elige desde la API: la deciden la condición fiscal de la cuenta y el documento del comprador.
| Si la cuenta es | Y mandás | Sale |
|---|---|---|
| Monotributo | cualquier cosa | Factura C |
| Responsable inscripto | sin doc, o un DNI | Factura B (el IVA va adentro del precio) |
| Responsable inscripto | el CUIT de otro responsable inscripto en doc | Factura A (con el IVA discriminado) |
El tope de consumidor final
Por encima de un monto que fija ARCA, el comprador sin doc devuelve 422: hay que identificarlo con DNI o CUIT. El tope vigente lo devuelve GET /api/v1/yo en topeConsumidorFinal — pedí el documento en el checkout, al menos en compras grandes.
| Estado | Qué significa |
|---|---|
| EMITIDA | Tiene CAE y QR. urlPdf apunta al comprobante listo para el cliente. |
| EN_COLA / PENDIENTE | ARCA no respondió. La factura existe y sale sola cuando el servicio vuelve (la emisión devolvió 202). Al consultarla aparece PENDIENTE hasta que tenga su CAE. No reintentes: ya está en cola. |
| RECHAZADA | ARCA la rechazó o un tope la frenó. El motivo viene en error: se corrige el dato y se emite de nuevo. |
| anulada: true | La factura tiene su nota de crédito. Las dos quedan: en ARCA nada se borra. |
POST /api/v1/facturas/{id}/nota-credito
ARCA no borra un comprobante con CAE: una devolución se anula con una nota de crédito.
curl -X POST https://tramitito.app/api/v1/facturas/clx8y2m4k0001/nota-credito \
-H "Authorization: Bearer tk_live_9f2a..."{
"ok": true,
"notaCredito": {
"id": "clx9a1b2c0002",
"letra": "NC-C",
"numero": 12,
"urlPdf": "https://tramitito.app/facturas/clx9a1b2c0002/pdf"
}
}No cuenta contra el tope del plan. Una factura no se anula dos veces, una nota de crédito no se anula, y una factura que todavía no salió (PENDIENTE) no se puede anular: cada caso devuelve 409 con su código.
# Por el id que devolvió la emisión
curl https://tramitito.app/api/v1/facturas/clx8y2m4k0001 \
-H "Authorization: Bearer tk_live_9f2a..."
# Por número de pedido: sirve para reconciliar
curl "https://tramitito.app/api/v1/facturas?idempotencia=pedido-1234" \
-H "Authorization: Bearer tk_live_9f2a..."{
"factura": {
"id": "clx8y2m4k0001",
"tipo": "Factura C",
"numero": 143,
"puntoVenta": 3,
"concepto": "Venta online (2 productos)",
"monto": 85000,
"estado": "EMITIDA",
"cae": "75123456789012",
"caeVencimiento": "2026-09-01T00:00:00.000Z",
"fecha": "2026-08-22T00:00:00.000Z",
"anulada": false,
"idempotencia": "pedido-1234",
"error": null,
"urlPdf": "https://tramitito.app/facturas/clx8y2m4k0001/pdf"
}
}urlPdf es null hasta que el comprobante esté EMITIDO. Si el pedido no se facturó, la búsqueda por idempotencia devuelve 404.
GET /api/v1/clientes/{doc}
Con el DNI (7 u 8 dígitos) o CUIT/CUIL (11) del comprador, el padrón de ARCA devuelve nombre, condición frente al IVA y domicilio fiscal. Sirve para autocompletar el checkout.
curl https://tramitito.app/api/v1/clientes/20111111112 \
-H "Authorization: Bearer tk_live_9f2a..."{
"ok": true,
"cliente": {
"doc": "20111111112",
"nombre": "PÉREZ JUAN",
"condicionIva": "MONOTRIBUTO",
"domicilio": "AV SIEMPRE VIVA 742, CÓRDOBA, CÓRDOBA, CP 5000"
}
}404 si no está en el padrón, 503 si el padrón de ARCA no responde. Límites: 30 por minuto y 600 por día (el padrón es lento; conviene cachear). Al emitir no hace falta llamarlo antes: nombre y domicilio se completan solos.
GET /api/v1/yo
Verifica la clave y el estado de la cuenta sin emitir nada: es el primer request que conviene hacer al configurar una integración.
{
"cuenta": {
"nombre": "Lucía Fernández",
"cuit": "27222222223",
"condicionFiscal": "MONOTRIBUTO",
"puntoVenta": 3,
"plan": "COMPLETO",
"facturasPorMes": null,
"listaParaFacturar": true
},
"topeConsumidorFinal": 10000000
}facturasPorMes en null significa sin tope mensual. El topeConsumidorFinal es el monto de ARCA desde el que una venta exige identificar al comprador (ver Qué letra sale).
Todos los errores traen error (mensaje en castellano, pensado para mostrarse) y codigo (estable: tu integración puede ramificar sobre él sin parsear texto).
| HTTP | codigo | Qué pasó |
|---|---|---|
| 400 | datos_invalidos | Falta un campo o tiene un formato inválido. El detalle viene campo por campo. |
| 400 | items_no_cierran | Mandaste monto e items juntos y no suman lo mismo. |
| 400 | documento_invalido | El documento de /clientes/{doc} no es un DNI ni un CUIT. |
| 400 | falta_idempotencia | Buscaste en /facturas sin el parámetro ?idempotencia=. |
| 401 | sin_credencial · formato_invalido · desconocida · revocada | Problemas con la clave: falta, está mal escrita, no existe o fue revocada desde el panel. |
| 403 | sin_modo_tienda | La cuenta apagó «Vendo online»: las claves no autentican hasta reactivarlo en el panel. |
| 404 | no_encontrada · no_encontrado | Ese comprobante, pedido o documento no existe (o no es de esta cuenta). |
| 409 | cuenta_incompleta | Falta cargar CUIT o punto de venta en el panel. |
| 409 | no_emitida · ya_anulada · es_nota_credito | La nota de crédito no corresponde: la factura no salió, ya está anulada, o es una NC. |
| 422 | rechazada | ARCA la rechazó, se acabó el tope del plan o falta el documento del comprador. El motivo, en error. |
| 429 | limite_padron | Pasaste un límite de pedidos (ver Límites). Esperá y reintentá. |
| 503 | padron_no_disponible | El padrón de ARCA no responde. La emisión sigue andando: solo se cae la consulta. |
El 202 no es un error
Si ARCA está caído, la emisión devuelve 202 con codigo: "en_cola": la factura existe y sale sola cuando el servicio vuelve. No reintentes — ver Estados del comprobante.
| Límite | Valor | Por qué |
|---|---|---|
| Pedidos por minuto | 120 / min por clave | Frena un bucle de webhooks mal configurado antes de que llegue a ARCA. |
| Consultas al padrón | 30 / min y 600 / día | Autocompletar un checkout no necesita más; descargar el padrón, sí. |
| Facturas del plan | según el plan | El mismo tope que en el bot y el panel: el Gratis emite 5 por mes y después responde 422. |
| Tamaños | 50 items · 6 tributos · 10 claves activas | Por comprobante y por cuenta. |
| Síntoma | Causa más común | Qué hacer |
|---|---|---|
| La plataforma marca el webhook como fallado | El secreto no coincide (firma inválida). | Copialo de nuevo, exacto — el panel te lo vuelve a mostrar. |
| No llega ninguna venta | URL mal pegada o evento equivocado. | La URL tiene que terminar con el código largo de tu conexión. El evento correcto: Pago de pedido (Shopify), order/paid (Tiendanube), Pedido actualizado (Woo). |
| La venta llegó pero no hay factura | Estado no cobrado, o faltó un dato. | Solo se facturan ventas pagadas (paid / Procesando / Completado). Si faltó un dato, el motivo te llegó por WhatsApp: corregilo y emitila desde el panel. |
| Un 401 de un día para el otro | La clave fue revocada, o se apagó el modo tienda. | GET /api/v1/yo te dice cuál de las dos. Se crea una clave nueva desde el panel. |
¿Otra cosa? Escribinos por el chat de soporte y lo vemos.
Activá el modo tienda, creá tu clave y probá con una venta chica.
Tramitito
Te respondemos por acá
Hola 👋
¿En qué te damos una mano?
Grabando… 0:00
Escrito por el equipo de Tramitito
Centro de ayuda
¿Te sirvió esta nota?
¿No era esto?