Integrá tu sistema con FACTUskill para emitir comprobantes con CAE de ARCA (AFIP) automáticamente, sin carga manual. Disponible para empresas con plan Avanzado o Empresas.
Antes de integrar, confirmá con tu estudio contable que se cumplen estos tres requisitos:
Si alguno de estos tres no se cumple, todas las requests devuelven 403.
API Key. El administrador del estudio contable genera la key desde el panel de FACTUskill (edición de la empresa). Solo existe una key activa por empresa a la vez — generar una nueva revoca automáticamente la anterior. La key se muestra en texto plano una única vez, al generarla; después solo se ve su prefijo.
Cada request debe incluir:
Authorization: Bearer <api_key>
Content-Type: application/json
POST https://admin.factuskill.com.ar/api/v1/comprobantes/emitir
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
referencia_externa | string | Sí | Identificador único propio de esta operación (pedido, venta, etc.). Es la clave de idempotencia — ver más abajo. |
cbte_tipo | int | Sí | Tipo de comprobante AFIP (ver catálogo). |
concepto | int | No (default 2) | 1 = Productos, 2 = Servicios, 3 = Productos y Servicios. |
fecha_emision | string (AAAA-MM-DD) | No (default hoy) | |
doc_tipo | int | Sí | Tipo de documento del receptor (ver catálogo). |
doc_nro | string | Sí | Número de documento del receptor (solo dígitos). |
cliente_id | int | No | Id de Cliente ya cargado en FACTUskill, si se conoce. |
cliente_nombre | string | Sí | Razón social o nombre del receptor. |
cliente_domicilio | string | No | |
cliente_email | string | No | |
cliente_telefono | string | No | |
fecha_serv_desde, fecha_serv_hasta, fecha_vto_pago | string (AAAA-MM-DD) | Sí si concepto > 1 | Obligatorias para Servicios. |
items | array | Sí (mín. 1) | Ver tabla de abajo. |
Cada elemento de items:
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
descripcion | string | Sí | |
cantidad | float | No (default 1) | |
precio_unitario | float | Sí | Precio con IVA incluido. |
iva_id | int | No (default 5 = 21%) | Ver catálogo. |
unidad_medida | string | No (default 07 = unidades) |
Ejemplo de body:
{
"referencia_externa": "pedido-00458",
"cbte_tipo": 11,
"concepto": 1,
"doc_tipo": 99,
"doc_nro": "0",
"cliente_nombre": "Consumidor Final",
"items": [
{
"descripcion": "Servicio de consultoría",
"cantidad": 1,
"precio_unitario": 15000,
"iva_id": 5
}
]
}
201 — Emitido con éxito (primera vez):
{
"ok": true,
"comprobante_id": 4995,
"cae": "86383707667201",
"cae_vto": "2026-09-28",
"nro_formateado": "1001-00000089",
"url_publica": "https://admin.factuskill.com.ar/comprobante/ver?h=...",
"imp_total": 15000,
"cliente_email": null,
"cliente_tel": null
}
200 — Idempotente (ya se había procesado esa referencia_externa antes; no se volvió a tocar AFIP):
{ "ok": true, "idempotente": true, "comprobante_id": 4995, "cae": "86383707667201", "...": "..." }
200 con ok: false — AFIP rechazó el comprobante (no es un error HTTP, la request en sí era válida):
{
"ok": false,
"error": "AFIP rechazó el comprobante.",
"error_code": 10000,
"observaciones": "[10000] NO AUTORIZADO A EMITIR COMPROBANTES..."
}
Errores HTTP:
| Código | Causa |
|---|---|
400 | Falta referencia_externa, faltan datos obligatorios, body no es JSON válido, o la condición IVA del receptor no es compatible con el tipo de comprobante (normativa RG 5616). |
401 | Falta el header Authorization, o la API Key es inválida / fue revocada. |
403 | Empresa inactiva, sin plan asignado, plan sin la API habilitada, plan vencido, o límite mensual de comprobantes del plan alcanzado. |
429 | Se superó el límite de requests por minuto de esta API Key. |
500 | Error consultando AFIP (timeout, certificado, etc.) o error interno. Es seguro reintentar con la misma referencia_externa. |
Idempotencia. referencia_externa debe ser única por empresa (un pedido, una venta, un cobro — lo que identifique la operación en tu sistema). Si se repite una request con la misma referencia_externa, FACTUskill no vuelve a emitir en AFIP: devuelve la misma respuesta que generó la primera vez, marcada con "idempotente": true. Esto es lo que permite reintentar con seguridad ante un timeout o un corte de red sin arriesgarse a duplicar una factura real.
Rate limiting. Cada API Key tiene un límite de requests por minuto, configurable por el estudio contable al generarla (si no se configura, aplica el default del sistema). Al superarlo, la respuesta es 429 con el límite vigente en el mensaje. Se recomienda esperar antes de reintentar (backoff) en vez de reintentar inmediatamente.
Valores estándar del catálogo oficial de AFIP (confirmá con tu estudio contable cuáles aplican a tu empresa según su condición IVA):
cbte_tipo (tipos de comprobante más comunes):
| ID | Descripción |
|---|---|
| 1 | Factura A |
| 6 | Factura B |
| 11 | Factura C |
| 2 / 7 / 12 | Nota de Débito A / B / C |
| 3 / 8 / 13 | Nota de Crédito A / B / C |
doc_tipo (tipo de documento del receptor):
| ID | Descripción |
|---|---|
| 80 | CUIT |
| 86 | CUIL |
| 96 | DNI |
| 99 | Consumidor Final / Sin identificar |
iva_id (alícuota de IVA, para comprobantes que la discriminan):
| ID | Alícuota |
|---|---|
| 3 | 0% |
| 4 | 10.5% |
| 5 | 21% (default si no se envía) |
| 6 | 27% |
Nota: si cbte_tipo corresponde a Factura C (Monotributo, no discrimina IVA), FACTUskill ignora iva_id y calcula el comprobante sin discriminar automáticamente.
Condición IVA del receptor (RG 5616): si mandás cliente_id de un cliente ya cargado con su condición IVA, o doc_tipo: 99 (Consumidor Final), FACTUskill la resuelve automáticamente. Si mandás un CUIT (doc_tipo: 80) de un receptor nuevo, el sistema consulta el padrón de AFIP para completarla; si no puede resolverla, la emisión se rechaza con 400 en vez de emitir sin ese dato obligatorio.
cURL:
curl -X POST https://admin.factuskill.com.ar/api/v1/comprobantes/emitir \
-H "Authorization: Bearer TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"referencia_externa": "pedido-00458",
"cbte_tipo": 11,
"concepto": 1,
"doc_tipo": 99,
"doc_nro": "0",
"cliente_nombre": "Consumidor Final",
"items": [{ "descripcion": "Servicio", "cantidad": 1, "precio_unitario": 15000, "iva_id": 5 }]
}'
PowerShell:
$headers = @{ "Authorization" = "Bearer TU_API_KEY" }
$body = @{
referencia_externa = "pedido-00458"
cbte_tipo = 11
concepto = 1
doc_tipo = 99
doc_nro = "0"
cliente_nombre = "Consumidor Final"
items = @(@{ descripcion = "Servicio"; cantidad = 1; precio_unitario = 15000; iva_id = 5 })
} | ConvertTo-Json
Invoke-RestMethod -Uri "https://admin.factuskill.com.ar/api/v1/comprobantes/emitir" -Method Post -Headers $headers -ContentType "application/json" -Body $body
Manejo de errores recomendado:
referencia_externa de forma determinística a partir de tu propia operación (no un valor aleatorio en cada intento) — así un reintento automático después de un timeout es seguro.500 o timeout de red: reintentar con la misma referencia_externa es seguro gracias a la idempotencia.400, 401 o 403: no reintentar sin corregir la causa (son errores de la request, no van a resolverse solos).429: esperar y reintentar con backoff, respetando el límite indicado en el mensaje.200 con "ok": false significa que AFIP rechazó el comprobante en sí (dato incorrecto, receptor no habilitado, etc.) — revisá observaciones antes de reintentar.