API Reference

Todo lo que necesitas para integrar facturación electrónica ARCA/AFIP en tu aplicación.

Base URL

https://api-lgp2waq3ba-uc.a.run.app

Inicio rápido

Emití tu primera factura en 3 pasos.

1. Obtené tu API key

Registrate y genera una API key desde el dashboard. Las keys de test empiezan con lf_test_ y las de producción con lf_live_.

2. Configura tu certificado AFIP/ARCA

Genera un CSR, subilo a AFIP/ARCA, y luego subi el certificado firmado. Ver seccion Certificados.

3. Emiti una factura

curl -X POST https://api-lgp2waq3ba-uc.a.run.app/api/v1/invoices \
  -H "Authorization: Bearer lf_test_tu_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "cuit": "20359403616",
    "punto_venta": 1,
    "ambiente": "testing",
    "tipo_comprobante": 11,
    "concepto": 1,
    "cliente": {
      "tipo_documento": 96,
      "número_documento": "12345678",
      "razon_social": "Juan Perez"
    },
    "items": [{
      "descripción": "Servicio de desarrollo web",
      "cantidad": 1,
      "precio_unitario": 50000
    }]
  }'

Respuesta exitosa

{
  "success": true,
  "data": {
    "cae": "75044220307741",
    "cae_vencimiento": "20260405",
    "número_comprobante": 12,
    "tipo_comprobante": 11,
    "punto_venta": 1,
    "fecha": "2026-03-26",
    "total": 50000,
    "neto": 50000,
    "iva": 0,
    "qr_data": "https://www.afip.gob.ar/fe/qr/?p=...",
    "emisor": {
      "cuit": "20359403616",
      "razon_social": "Mi Empresa SRL",
      "punto_venta": 1
    },
    "cliente": {
      "tipo_documento": 96,
      "número_documento": "12345678",
      "razon_social": "Juan Perez"
    }
  }
}

Autenticacion

La API soporta dos métodos de autenticación. Los endpoints públicos (/health, /plans, /billing/webhook) no requieren auth.

Opcion 1: API Key (recomendada para integraciones)

# Via Authorization header
Authorization: Bearer lf_live_tu_api_key

# O via X-API-Key header
X-API-Key: lf_live_tu_api_key

Opcion 2: Firebase ID Token (usado por el dashboard)

Authorization: Bearer eyJhbGciOiJSUzI1NiIs...

Ambientes y keys

lf_test_*
Testing — Ambiente de homologación AFIP/ARCA. Solo permite ambiente: "testing". Las facturas no tienen validez fiscal.
lf_live_*
Produccion — Facturas reales ante AFIP/ARCA. Requiere certificado de producción validado y plan pago.
Importante: Una key lf_test_ forzara ambiente: "testing" en todos los requests, sin importar lo que envies. Usar una key de test con ambiente: "production" retorna error TEST_KEY_PRODUCTION.

Facturas

Emision y consulta de comprobantes electronicos AFIP/ARCA.

POST/api/v1/invoices

Emite una factura electrónica y obtiene el CAE de AFIP/ARCA.

Body (JSON)

ParametroTipoReq.Descripción
cuitstringSiCUIT del emisor (11 digitos). Debe estar configurado en tu cuenta.
punto_ventanumberSiPunto de venta (1-99999).
tipo_comprobantenumberNoTipo de comprobante AFIP/ARCA. Default: 11 (Factura C). Ver tabla abajo.
conceptonumberNo1: Productos, 2: Servicios, 3: Productos y Servicios. Default: 1.
ambientestringNo"testing" o "production". Default: segun la key usada.
monedastringNo"PES" (ARS), "DOL" (USD), "EUR". Default: "PES".
cotizacionnumberNoTipo de cambio si moneda != PES. Default: 1.
condicion_pagonumberNo1: Contado, 2: Tarjeta credito, etc. Default: 1.
observacionesstringNoNotas internas (no van a AFIP).
fecha_servicio_desdestringNoYYYY-MM-DD. Requerido si concepto es 2 o 3.
fecha_servicio_hastastringNoYYYY-MM-DD. Requerido si concepto es 2 o 3.
fecha_vencimiento_pagostringNoYYYY-MM-DD. Opcional para servicios.

Body > cliente (objeto, requerido)

ParametroTipoReq.Descripción
tipo_documentonumberSi80: CUIT, 86: CUIL, 96: DNI, 94: Pasaporte, 99: Consumidor Final.
número_documentostringSiNumero del documento del receptor.
razon_socialstringSiNombre o razon social del receptor.
domiciliostringNoDireccion del receptor.
emailstringNoEmail del receptor.
condicion_ivanumberNo1: Resp. Inscripto, 4: Exento, 5: Cons. Final, 6: Monotributista. Default: 5.

Body > items[] (array, requerido, min. 1)

ParametroTipoReq.Descripción
descripciónstringSiDescripción del item.
cantidadnumberNoCantidad. Default: 1.
precio_unitarionumberSiPrecio unitario en la moneda del comprobante.
alicuota_ivanumberNoPorcentaje IVA: 0, 2.5, 5, 10.5, 21, 27. Default: 0.
bonificacionnumberNoPorcentaje de descuento. Default: 0.
gravadobooleanNoSi el item esta gravado con IVA. Default: true.

Body > comprobante_asociado (objeto, solo NC/ND)

ParametroTipoReq.Descripción
tiponumberSiTipo del comprobante original.
punto_ventanumberSiPV del comprobante original.
númeronumberSiNumero del comprobante original.
cuitstringNoCUIT del emisor original.
fechastringNoFecha del comprobante original.

Body > tributos[] (array, opcional)

ParametroTipoReq.Descripción
idnumberSiID del tributo AFIP/ARCA.
descripciónstringNoDescripción del tributo.
base_imponiblenumberNoBase imponible.
alicuotanumberNoAlicuota del tributo.
importenumberNoImporte del tributo.

Tipos de comprobante comunes

CódigoDescripción
1Factura A
6Factura B
11Factura C
3Nota de Credito A
8Nota de Credito B
13Nota de Credito C
2Nota de Debito A
7Nota de Debito B
12Nota de Debito C

Respuesta exitosa (201)

{
  "success": true,
  "data": {
    "cae": "75044220307741",
    "cae_vencimiento": "20260405",
    "número_comprobante": 12,
    "tipo_comprobante": 11,
    "punto_venta": 1,
    "fecha": "2026-03-26",
    "total": 50000,
    "neto": 50000,
    "iva": 0,
    "tributos": 0,
    "qr_data": "https://www.afip.gob.ar/fe/qr/?p=...",
    "emisor": {
      "cuit": "20359403616",
      "razon_social": "Mi Empresa SRL",
      "punto_venta": 1
    },
    "cliente": {
      "tipo_documento": 96,
      "número_documento": "12345678",
      "razon_social": "Juan Perez"
    }
  }
}

Ejemplo con IVA (Factura A)

{
  "cuit": "20359403616",
  "punto_venta": 1,
  "tipo_comprobante": 1,
  "concepto": 1,
  "cliente": {
    "tipo_documento": 80,
    "número_documento": "30712345678",
    "razon_social": "Empresa SA",
    "condicion_iva": 1
  },
  "items": [
    {
      "descripción": "Licencia software mensual",
      "cantidad": 1,
      "precio_unitario": 100000,
      "alicuota_iva": 21
    },
    {
      "descripción": "Soporte tecnico",
      "cantidad": 10,
      "precio_unitario": 5000,
      "alicuota_iva": 21
    }
  ]
}

Ejemplo Nota de Credito

{
  "cuit": "20359403616",
  "punto_venta": 1,
  "tipo_comprobante": 13,
  "concepto": 1,
  "cliente": {
    "tipo_documento": 96,
    "número_documento": "12345678",
    "razon_social": "Juan Perez"
  },
  "comprobante_asociado": {
    "tipo": 11,
    "punto_venta": 1,
    "número": 12
  },
  "items": [{
    "descripción": "Anulacion factura 0001-00000012",
    "cantidad": 1,
    "precio_unitario": 50000
  }]
}
GET/api/v1/invoices

Lista las facturas emitidas. Paginado y con filtros opcionales.

Query parameters

ParametroTipoReq.Descripción
cuitstringNoFiltrar por CUIT emisor.
ambientestringNo"testing" o "production".
limitnumberNoResultados por pagina. Default: 50.
offsetnumberNoOffset para paginacion. Default: 0.

Ejemplo

curl "https://api-lgp2waq3ba-uc.a.run.app/api/v1/invoices?cuit=20359403616&limit=10" \
  -H "Authorization: Bearer lf_test_tu_api_key"

Respuesta (200)

{
  "success": true,
  "data": {
    "invoices": [
      {
        "id": "abc123",
        "cuit_emisor": "20359403616",
        "ambiente": "testing",
        "tipo_comprobante": 11,
        "punto_venta": 1,
        "número_comprobante": 12,
        "cae": "75044220307741",
        "cae_vencimiento": "20260405",
        "total": 50000,
        "neto": 50000,
        "iva": 0,
        "cliente": {
          "tipo_documento": 96,
          "número_documento": "12345678",
          "razon_social": "Juan Perez"
        },
        "items": [...],
        "fecha_emision": "2026-03-26",
        "created_at": "2026-03-26T15:30:00Z"
      }
    ],
    "count": 1
  }
}
GET/api/v1/invoices/last-authorized

Consulta el último número de comprobante autorizado en AFIP/ARCA para un punto de venta y tipo.

Query parameters

ParametroTipoReq.Descripción
cuitstringSiCUIT del emisor.
punto_ventanumberSiPunto de venta.
tipo_comprobantenumberSiTipo de comprobante.
ambientestringNo"testing" o "production".

Respuesta (200)

{
  "success": true,
  "data": {
    "CbteNro": 12,
    "PtoVta": 1,
    "CbteTipo": 11
  }
}
GET/api/v1/invoices/query

Consulta un comprobante específico en AFIP/ARCA por su número.

Query parameters

ParametroTipoReq.Descripción
cuitstringSiCUIT del emisor.
punto_ventanumberSiPunto de venta.
tipo_comprobantenumberSiTipo de comprobante.
númeronumberSiNumero del comprobante.
ambientestringNo"testing" o "production".

Respuesta (200)

{
  "success": true,
  "data": {
    "FeCabResp": {
      "Cuit": "20359403616",
      "PtoVta": 1,
      "CbteTipo": 11,
      "Resultado": "A"
    },
    "FeDetResp": {
      "FECAEDetResponse": {
        "Concepto": 1,
        "DocTipo": 96,
        "DocNro": 12345678,
        "CbteDesde": 12,
        "CbteHasta": 12,
        "CbteFch": "20260326",
        "ImpTotal": 50000,
        "ImpNeto": 50000,
        "ImpIVA": 0,
        "CAE": "75044220307741",
        "CAEFchVto": "20260405"
      }
    }
  }
}
GET/api/v1/invoices/types

Lista los tipos de comprobante habilitados para el CUIT en AFIP/ARCA.

Query parameters

ParametroTipoReq.Descripción
cuitstringSiCUIT del emisor.
ambientestringNo"testing" o "production".

Respuesta (200)

{
  "success": true,
  "data": [
    { "id": 1, "desc": "Factura A" },
    { "id": 6, "desc": "Factura B" },
    { "id": 11, "desc": "Factura C" },
    ...
  ]
}
POST/api/v1/invoices/:id/pdf

Genera el PDF de una factura con formato AFIP/ARCA y código QR.

Body (JSON)

ParametroTipoReq.Descripción
cuitstringSiCUIT del emisor.
punto_ventanumberSiPunto de venta.
tipo_comprobantenumberSiTipo de comprobante.
númeronumberSiNumero del comprobante.
ambientestringNo"testing" o "production".
emisorobjectNoDatos del emisor: cuit, razon_social, domicilio, condicionIVA, inicioActividades.
clienteobjectNoDatos del receptor: documento, razonSocial.
itemsarrayNoItems con descripción, cantidad, precioUnitario, total.
La respuesta es un archivo PDF binario con headers Content-Type: application/pdf y Content-Disposition: attachment.

Certificados

Gestión de certificados digitales AFIP/ARCA. Los certificados son necesarios para autenticarse contra los servicios de AFIP/ARCA y emitir facturas.

Flujo de certificados

  1. POST /certs/generate — Genera CSR + clave privada
  2. Descargas el CSR y lo subis a AFIP/ARCA manualmente
  3. AFIP te devuelve un archivo .crt firmado
  4. POST /certs/upload — Subis el .crt para validarlo
  5. El certificado de testing debe estar validado antes de generar el de producción
POST/api/v1/certs/generate

Genera un CSR (Certificate Signing Request) y clave privada RSA 2048 para tu CUIT.

Body (JSON)

ParametroTipoReq.Descripción
cuitstringSiCUIT (11 digitos).
razon_socialstringSiRazon social o nombre.
condicion_ivastringNoCondicion ante IVA.
domicilio_fiscalstringNoDomicilio fiscal.
ambientestringNo"testing" o "production". Default: "testing".

Respuesta (201)

{
  "success": true,
  "data": {
    "csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIIC...",
    "alias": "CUIT 20359403616 - testing",
    "cuit": "20359403616",
    "ambiente": "testing"
  }
}
POST/api/v1/certs/upload

Sube el certificado .crt firmado por AFIP/ARCA y lo valida contra la clave privada guardada.

Body (JSON)

ParametroTipoReq.Descripción
cuitstringSiCUIT (11 digitos).
certificatestringSiContenido del archivo .crt en formato PEM.
ambientestringNo"testing" o "production". Default: "testing".

Respuesta (200)

{
  "success": true,
  "data": {
    "cuit": "20359403616",
    "ambiente": "testing",
    "status": "certificado_activo",
    "validation": {
      "valid": true,
      "validFrom": "2026-03-01T00:00:00Z",
      "validTo": "2028-03-01T00:00:00Z",
      "subject": "CN=CUIT 20359403616"
    }
  }
}
POST/api/v1/certs/regenerate

Elimina todos los certificados de un CUIT+ambiente para poder generar uno nuevo.

Body (JSON)

ParametroTipoReq.Descripción
cuitstringSiCUIT (11 digitos).
ambientestringNo"testing" o "production". Default: "testing".

Respuesta (200)

{
  "success": true,
  "data": {
    "message": "Se eliminaron 1 certificado(s) para CUIT 20359403616 en testing. Ahora podes generar uno nuevo.",
    "cuit": "20359403616",
    "ambiente": "testing"
  }
}
GET/api/v1/certs/:cuit/status

Consulta el estado actual del certificado de un CUIT.

URL parameters

ParametroTipoReq.Descripción
:cuitstringSiCUIT (11 digitos) en la URL.

Respuesta (200)

{
  "success": true,
  "data": {
    "cuit": "20359403616",
    "status": "certificado_activo",
    "alias": "CUIT 20359403616 - testing",
    "validation": {
      "valid": true,
      "validFrom": "2026-03-01T00:00:00Z",
      "validTo": "2028-03-01T00:00:00Z"
    }
  }
}
Estados posibles: sin_certificado, csr_generado, certificado_activo, certificado_vencido.

API Keys

Crear, listar y revocar API keys. Las keys se muestran una sola vez al crearlas.

POST/api/v1/keys

Crea una nueva API key.

Body (JSON)

ParametroTipoReq.Descripción
namestringSiNombre descriptivo para la key.
environmentstringNo"test" o "production". Default: "test".

Respuesta (201)

{
  "success": true,
  "data": {
    "key": "lf_test_a1b2c3d4e5f6...",
    "id": "abc123",
    "name": "Mi integracion",
    "key_prefix": "lf_test_a1b2c3d...",
    "environment": "test",
    "created_at": "2026-03-26T15:30:00Z",
    "warning": "Guarda esta key de forma segura. No se puede recuperar."
  }
}
Importante: La key completa solo se muestra una vez. Guardala en un lugar seguro.
GET/api/v1/keys

Lista todas las API keys activas de tu cuenta.

Respuesta (200)

{
  "success": true,
  "data": {
    "keys": [
      {
        "id": "abc123",
        "name": "Mi integracion",
        "environment": "test",
        "key_prefix": "lf_test_a1b2c3d...",
        "created_at": "2026-03-26T15:30:00Z",
        "last_used": "2026-03-27T10:00:00Z"
      }
    ]
  }
}
DELETE/api/v1/keys/:keyId

Revoca una API key. La key dejara de funcionar inmediatamente.

URL parameters

ParametroTipoReq.Descripción
:keyIdstringSiID de la key a revocar.

Respuesta (200)

{
  "success": true,
  "data": {
    "revoked": true
  }
}

Suscripciónes

Gestión de planes y suscripciónes via MercadoPago.

POST/api/v1/billing/subscribe

Crea una suscripción en MercadoPago y devuelve la URL de pago.

Body (JSON)

ParametroTipoReq.Descripción
planstringSi"profesional" ($5.990/mes) o "empresa" ($12.990/mes).

Respuesta (200)

{
  "success": true,
  "data": {
    "init_point": "https://www.mercadopago.com.ar/subscriptions/checkout?preapproval_id=...",
    "subscription_id": "mp_sub_abc123"
  }
}
GET/api/v1/billing/status

Consulta el plan actual y estado de la suscripción.

Respuesta (200)

{
  "success": true,
  "data": {
    "plan": "profesional",
    "subscription": {
      "mp_id": "mp_sub_abc123",
      "status": "authorized",
      "plan_requested": "profesional",
      "created_at": "2026-03-01T00:00:00Z"
    }
  }
}
POST/api/v1/billing/cancel

Cancela la suscripción activa. El plan baja a Free inmediatamente.

Respuesta (200)

{
  "success": true,
  "data": {
    "message": "Suscripción cancelada. Tu plan ahora es Gratis."
  }
}
POST/api/v1/billing/webhookPublica

Webhook que recibe notificaciones de MercadoPago. No llamar manualmente.

Este endpoint es llamado automaticamente por MercadoPago cuando cambia el estado de una suscripción. Eventos procesados: subscription_preapproval. Siempre retorna 200 OK.

AFIP Genérica

Wrapper generico para llamar a cualquier servicio SOAP de AFIP/ARCA. Util para operaciones avanzadas.

GET/api/v1/afip/:service/describe

Describe los métodos disponibles de un servicio AFIP/ARCA.

URL parameters

ParametroTipoReq.Descripción
:servicestringSiNombre del servicio. Ej: "wsfev1", "wsaa".

Ejemplo

curl "https://api-lgp2waq3ba-uc.a.run.app/api/v1/afip/wsfev1/describe" \
  -H "Authorization: Bearer lf_test_tu_api_key"
POST/api/v1/afip/:service/:method

Ejecuta un metodo de un servicio AFIP con parametros custom.

URL parameters

ParametroTipoReq.Descripción
:servicestringSiNombre del servicio. Ej: "wsfev1".
:methodstringSiNombre del metodo. Ej: "FEDummy", "FEParamGetTiposCbte".

Body (JSON)

ParametroTipoReq.Descripción
cuitstringSiCUIT del emisor.
ambientestringNo"testing" o "production".
paramsobjectNoParametros del metodo SOAP. Default: {}.

Ejemplo: FEDummy (test de conectividad)

curl -X POST "https://api-lgp2waq3ba-uc.a.run.app/api/v1/afip/wsfev1/FEDummy" \
  -H "Authorization: Bearer lf_test_tu_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "cuit": "20359403616" }'

Respuesta (200)

{
  "success": true,
  "data": {
    "result": {
      "FeDummy": {
        "AppServer": "OK",
        "DbServer": "OK",
        "AuthServer": "OK"
      }
    }
  }
}

Perfil

GET/api/v1/me

Devuelve el perfil del usuario autenticado, su uso actual y CUITs configurados.

Respuesta (200)

{
  "success": true,
  "data": {
    "user": {
      "email": "usuario@ejemplo.com",
      "display_name": "Juan Perez",
      "company": "Mi Empresa SRL",
      "plan": "profesional"
    },
    "usage": {
      "month_requests": 150,
      "month_invoices": 45,
      "invoice_limit": 300,
      "cuits_configured": 1,
      "cuit_limit": 1
    },
    "environment": "testing",
    "cuits": ["20359403616"]
  }
}

Health & Planes

GET/api/v1/healthPublica

Health check. Verifica que la API este funcionando.

Respuesta (200)

{
  "success": true,
  "data": {
    "status": "ok",
    "version": "1.0.0",
    "timestamp": "2026-03-26T15:30:00Z"
  }
}
GET/api/v1/plansPublica

Lista los planes disponibles con precios y limites.

Respuesta (200)

{
  "success": true,
  "data": {
    "plans": [
      {
        "id": "free",
        "name": "Gratis",
        "price": 0,
        "invoicesPerMonth": 10,
        "maxCuits": 1,
        "features": ["testing_only", "basic_support"]
      },
      {
        "id": "emprendedor",
        "name": "Emprendedor",
        "price": 6990,
        "invoicesPerMonth": 50,
        "maxCuits": 1,
        "features": ["production", "email_support", "pdf_qr"]
      },
      {
        "id": "profesional",
        "name": "Profesional",
        "price": 14990,
        "invoicesPerMonth": 200,
        "maxCuits": 2,
        "features": ["production", "email_support", "pdf_qr", "api_access", "phone_support"]
      },
      {
        "id": "empresa",
        "name": "Empresa",
        "price": 29990,
        "invoicesPerMonth": 500,
        "maxCuits": 5,
        "features": ["production", "batch_invoicing", "pdf_custom", "webhooks", "priority_support"]
      },
      {
        "id": "corporativo",
        "name": "Corporativo",
        "price": 49990,
        "invoicesPerMonth": 1500,
        "maxCuits": 10,
        "features": ["production", "batch_invoicing", "pdf_custom", "webhooks", "dedicated_support", "api_unlimited"]
      }
    ]
  }
}

Errores

Todas las respuestas de error siguen el mismo formato estandar.

{
  "success": false,
  "error": {
    "code": "INVALID_CUIT",
    "message": "Digito verificador inválido",
    "details": { ... }
  }
}

Códigos de error

HTTPCódigoDescripción
400BAD_REQUESTDatos de entrada inválidos o faltantes
400INVALID_CUITCUIT no pasa validación módulo 11
400MISSING_CUITNo se envió el campo CUIT requerido
401MISSING_API_KEYNo se envió API key ni token
401INVALID_API_KEYAPI key inválida, expirada o revocada
401MISSING_TOKENNo se envió header Authorization
401TOKEN_EXPIREDFirebase token expirado
401INVALID_TOKENToken malformado o inválido
401USER_NOT_FOUNDUsuario no existe en el sistema
401USER_INACTIVECuenta de usuario desactivada
403CUIT_NOT_AUTHORIZEDCUIT no pertenece a tu cuenta
403TEST_KEY_PRODUCTIONKey de test usada para ambiente produccion
404NOT_FOUNDRecurso no encontrado
429RATE_LIMIT_EXCEEDEDLímite de requests por minuto excedido
429INVOICE_QUOTA_EXCEEDEDLímite mensual de facturas del plan alcanzado
500SERVER_ERRORError interno del servidor
502AFIP_ERRORError de comunicación con servidores AFIP/ARCA

Rate Limits

La API aplica límites en tres niveles: rate limit global por IP, rate limit por plan/key, y quota mensual de facturas.

Límite global

200 requests cada 15 minutos por IP. Aplica a todos los endpoints como protección base.

Límites por plan

PlanPrecioRate limitFacturas/mesCUITs
Gratis$010 req/min101
Emprendedor$6.99030 req/min501
Profesional$14.990100 req/min2002
Empresa$29.990200 req/min5005
Corporativo$49.990500 req/min1.50010

Protecciones activas

1.Rate limit por IP — 200 req/15min como protección global anti-abuso.
2.Rate limit por plan — Cada API key o sesión tiene un límite de req/min según el plan contratado.
3.Quota mensual de facturas — Al alcanzar el límite se devuelve INVOICE_QUOTA_EXCEEDED. Al 80% se envía header de warning.
4.Límite de CUITs — No se pueden agregar más CUITs que los permitidos por el plan. Devuelve CUIT_LIMIT_EXCEEDED.
5.Validación de ambiente — Keys lf_test_ no pueden operar en producción. Devuelve TEST_KEY_PRODUCTION.

Headers de respuesta

HeaderDescripción
RateLimit-LimitLímite maximo de requests en la ventana
RateLimit-RemainingRequests restantes en la ventana actual
X-RateLimit-LimitLímite de la API key por plan
X-RateLimit-RemainingRequests restantes de la API key
X-Invoice-Quota-WarningAparece al usar 80%+ de la cuota mensual de facturas