API Reference
Todo lo que necesitás para integrar facturación electrónica AFIP/ARCA en tu aplicación.
Base URL
https://api.lafactureadora.com.arVersión
v1 (estable)Inicio rápido
Emití tu primera factura en 3 pasos.
1. Obtené una API key
Generala desde el dashboard. Las de testing arrancan con
lf_test_y las de producción conlf_live_.2. Configurá tu certificado AFIP/ARCA
Generá un CSR y cargalo en ARCA (WSASS para testing — el certificado aparece como texto en el campo "Resultado"; Administración de Certificados Digitales para producción — se descarga un .crt). Después subí ese certificado con /certs/upload. Ver Certificados.
3. Emití tu primera factura
curl -X POST https://api.lafactureadora.com.ar/api/v1/invoices \ -H "Authorization: Bearer lf_test_tu_api_key" \ -H "Content-Type: application/json" \ -d '{ "cuit": "20359403616", "punto_venta": 1, "tipo_comprobante": 11, "cliente": { "tipo_documento": 96, "numero_documento": "12345678", "razon_social": "Juan Perez" }, "items": [{ "descripcion": "Servicio web", "cantidad": 1, "precio_unitario": 50000 }] }'
Autenticación
La API soporta dos métodos. Los endpoints públicos (/health, /health/deep, /plans, /billing/webhook, /whatsapp/webhook, /chat) no requieren auth.
Opción 1 — API Key (recomendada para integraciones)
# Authorization header
Authorization: Bearer lf_live_tu_api_key
# O X-API-Key
X-API-Key: lf_live_tu_api_keyOpción 2 — Firebase ID Token (dashboard web)
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...Ambientes y prefijos
Ambiente homologación. Se fuerza ambiente: "testing". Facturas sin validez fiscal.
Facturas reales. Requiere certificado de producción validado.
Emitir factura
/api/v1/invoicesEmite una factura electrónica y obtiene el CAE de AFIP/ARCA. Si el comprobante es rechazado por race condition (10016) la API reintenta automáticamente con backoff (hasta 5 intentos en total).
Body (raíz)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor (11 dígitos). Debe estar configurado y tener cert validado. |
| punto_venta | number | SÍ | Punto de venta tipo RECE (1-99999). |
| tipo_comprobante | number | No | Default: 11 (Factura C). Enviar como número JSON (no string). Ver tabla más abajo. FCE MiPyMEs (201-213) no soportados: devuelven 400 con details.code FCE_NOT_SUPPORTED. |
| concepto | number | No | 1: Productos, 2: Servicios, 3: Productos y Servicios. Default: 1. |
| ambiente | string | No | "testing" o "production". Con key lf_test_*: si pedís "production" recibís 403 TEST_KEY_PRODUCTION; si lo omitís se usa testing. |
| external_reference | string | No | Clave de idempotencia (1-64 chars, opaca, la generás vos — ej: "venta_abc123_f"). Reintentar con la MISMA clave nunca emite dos veces: si la emisión ya se hizo devuelve el comprobante original (200 + data.already_existed), si está en curso devuelve 409 EXTERNAL_REFERENCE_IN_PROGRESS. Única por usuario + ambiente. Ver la nota "Idempotencia". |
| moneda | string | No | "PES" (ARS), "DOL" (USD), "EUR". Default: "PES". |
| cotizacion | number | No | Tipo de cambio. OBLIGATORIA (> 0) si moneda != PES — sin ella recibís 400 MONEDA_REQUIRES_COTIZACION. Cotización oficial: POST /afip/wsfev1/FEParamGetCotizacion. |
| cancelacion_misma_moneda | string | No | Solo moneda != PES: 'S' si el comprobante se cancela en esa misma moneda, 'N' si no (RG 5259, campo CanMisMonExt). Default: 'N'. |
| condicion_pago | number | No | Se acepta por compatibilidad pero NO se envía a AFIP (wsfev1 no tiene campo de condición de venta). |
| observaciones | string | No | Texto libre: se persiste y se imprime en el PDF del comprobante (no se envía a AFIP). No confundir con data.observaciones de la respuesta (avisos de AFIP). |
| fecha_servicio_desde | string | No | YYYY-MM-DD. Requerido si concepto es 2 o 3. |
| fecha_servicio_hasta | string | No | YYYY-MM-DD. Requerido si concepto es 2 o 3. |
| fecha_vencimiento_pago | string | No | YYYY-MM-DD. Opcional para servicios. |
Body > cliente (objeto, requerido)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| tipo_documento | number | SÍ | 80: CUIT, 86: CUIL, 87: CDI, 96: DNI, 94: Pasaporte (5-20 alfanuméricos), 99: Consumidor Final sin identificar (numero_documento debe ser "0" o vacío). |
| numero_documento | string | SÍ | Número del documento (sin guiones). |
| razon_social | string | SÍ | Nombre o razón social del receptor. |
| domicilio | string | No | Dirección del receptor. |
| string | No | Email del receptor. | |
| condicion_iva | number | No | 1: RI, 4: Exento, 5: CF, 6: Monotributo, 11: RI Agente Percep., 13: Monot. Social, 16: Monot. Promovido. Default: 5. Clase A admite 1/6/11/13/16; monotributistas (6/13/16) NO pueden recibir clase B. |
Body > items[] (array, requerido, mín. 1)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| descripcion | string | SÍ | Descripción del item. |
| cantidad | number | No | Cantidad. Default: 1. |
| precio_unitario | number | SÍ | Precio unitario en la moneda del comprobante. |
| alicuota_iva | number | No | Porcentaje IVA: 0, 2.5, 5, 10.5, 21, 27. Default: 0. ATENCIÓN (facturas A/B): con 0 y sin gravado_cero el importe se informa a AFIP como EXENTO (ImpOpEx). En Factura C es irrelevante (sin desglose de IVA). |
| bonificacion | number | No | Porcentaje de descuento (0-100). Default: 0. |
| gravado | boolean | No | Si el item está gravado con IVA. false lo informa como No Gravado (ImpTotConc). Default: true. |
| gravado_cero | boolean | No | Solo facturas A/B con alicuota_iva 0: true informa el item como GRAVADO a tasa 0% real (AlicIva Id 3), en vez de Exento. Default: false. |
Body > comprobante_asociado (objeto, solo NC/ND)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| tipo | number | SÍ | Tipo del comprobante original. |
| punto_venta | number | SÍ | PV del comprobante original. |
| numero | number | SÍ | Número del comprobante original. |
| cuit | string | No | CUIT del emisor original. |
| fecha | string | No | Fecha del comprobante original (YYYY-MM-DD). |
Body > tributos[] (array, opcional — IIBB, percepciones)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| id | number | SÍ | ID del tributo según AFIP. |
| descripcion | string | No | Descripción del tributo. |
| base_imponible | number | No | Base imponible. |
| alicuota | number | No | Alícuota del tributo. |
| importe | number | No | Importe del tributo. |
curl -X POST https://api.lafactureadora.com.ar/api/v1/invoices \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"cuit": "20359403616",
"punto_venta": 1,
"tipo_comprobante": 11,
"concepto": 1,
"cliente": {
"tipo_documento": 96,
"numero_documento": "12345678",
"razon_social": "Juan Perez"
},
"items": [{
"descripcion": "Servicio de desarrollo web",
"cantidad": 1,
"precio_unitario": 50000
}]
}'{
"success": true,
"data": {
"id": "5f3a8b9c1e7d4a2b8c1e7d4a",
"cae": "75044220307741",
"cae_vencimiento": "20260405",
"numero_comprobante": 12,
"tipo_comprobante": 11,
"punto_venta": 1,
"fecha": "2026-03-26",
"total": 50000,
"neto": 50000,
"iva": 0,
"tributos": 0,
"qr_data": null,
"observaciones": null,
"emisor": {
"cuit": "20359403616",
"razon_social": "Mi Empresa SRL",
"punto_venta": 1
},
"cliente": {
"tipo_documento": 96,
"numero_documento": "12345678",
"razon_social": "Juan Perez"
}
}
}Listar facturas
/api/v1/invoicesLista las facturas emitidas por el usuario, ordenadas por fecha desc. Filtros opcionales. Paginación con cursor (no offset).
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | No | Filtrar por CUIT emisor. |
| ambiente | string | No | "testing" o "production". |
| external_reference | string | No | Lookup puntual por clave de idempotencia: devuelve 0 o 1 resultado dentro del scope usuario + ambiente (si no pasás ambiente se usa el de tu key). Ignora limit/cursor. El campo también viene incluido en los objetos de invoices[] cuando la factura se emitió con clave. |
| limit | number | No | Resultados por página. Default: 50. Max: 200. |
| cursor | string | No | Para paginar: pasar `next_cursor` de la respuesta anterior. Si no se pasa, devuelve la primera página. |
# Primera página
curl "https://api.lafactureadora.com.ar/api/v1/invoices?cuit=20359403616&limit=50" \
-H "Authorization: Bearer lf_test_tu_api_key"
# Páginas siguientes (usando next_cursor de la respuesta anterior)
curl "https://api.lafactureadora.com.ar/api/v1/invoices?cuit=20359403616&limit=50&cursor=abc123" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"invoices": [
{
"id": "abc123",
"user_id": "fWq8zK1x...",
"cuit_emisor": "20359403616",
"ambiente": "testing",
"tipo_comprobante": 11,
"punto_venta": 1,
"numero_comprobante": 12,
"cae": "75044220307741",
"cae_vencimiento": "20260405",
"total": 50000,
"neto": 50000,
"iva": 0,
"tributos": 0,
"items": [
{ "descripcion": "Servicio de desarrollo web", "cantidad": 1, "precio_unitario": 50000, "total": 50000 }
],
"cliente": {
"tipo_documento": 96,
"numero_documento": "12345678",
"razon_social": "Juan Perez"
},
"fecha_emision": "2026-03-26",
"created_at": "2026-03-26T15:30:00.000Z"
}
],
"count": 1,
"next_cursor": "abc123",
"has_more": true
}
}Resumen fiscal mensual
/api/v1/invoices/summaryTotales facturados del mes en curso, IVA, tributos y desglose por tipo de comprobante.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | No | Filtrar por CUIT emisor. |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/invoices/summary?cuit=20359403616" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"mes": "2026-05",
"total_comprobantes": 12,
"total_facturado": 685000,
"total_neto": 566115.7,
"total_iva": 118884.3,
"total_tributos": 0,
"por_tipo": [
{ "tipo_comprobante": 1, "nombre": "Factura A", "cantidad": 8, "total": 580000 },
{ "tipo_comprobante": 6, "nombre": "Factura B", "cantidad": 4, "total": 105000 }
],
"por_estado": { "aprobadas": 12, "rechazadas": 0 }
}
}Último comprobante autorizado
/api/v1/invoices/last-authorizedConsulta el último número de comprobante autorizado en AFIP/ARCA para un PV y tipo específicos.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor. |
| punto_venta | number | SÍ | Punto de venta. |
| tipo_comprobante | number | SÍ | Tipo de comprobante. |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/invoices/last-authorized?cuit=20359403616&punto_venta=1&tipo_comprobante=11" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"CbteNro": 12,
"PtoVta": 1,
"CbteTipo": 11
}
}Consultar comprobante en AFIP
/api/v1/invoices/queryConsulta un comprobante específico en AFIP/ARCA por su número.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor. |
| punto_venta | number | SÍ | Punto de venta. |
| tipo_comprobante | number | SÍ | Tipo de comprobante. |
| numero | number | SÍ | Número del comprobante. |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/invoices/query?cuit=20359403616&punto_venta=1&tipo_comprobante=11&numero=12" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"ResultGet": {
"Concepto": 1,
"DocTipo": 96,
"DocNro": 12345678,
"CbteDesde": 12,
"CbteHasta": 12,
"CbteFch": "20260326",
"ImpTotal": 50000,
"ImpNeto": 50000,
"ImpIVA": 0,
"MonId": "PES",
"MonCotiz": 1,
"CodAutorizacion": "75044220307741",
"EmisionTipo": "CAE",
"FchVto": "20260405",
"PtoVta": 1,
"CbteTipo": 11,
"Resultado": "A"
}
}
}Tipos de comprobante disponibles
/api/v1/invoices/typesLista los tipos de comprobante habilitados para el CUIT en AFIP/ARCA.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor. |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/invoices/types?cuit=20359403616" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": [
{ "Id": 1, "Desc": "Factura A", "FchDesde": "20100901", "FchHasta": "20990101" },
{ "Id": 6, "Desc": "Factura B", "FchDesde": "20100901", "FchHasta": "20990101" },
{ "Id": 11, "Desc": "Factura C", "FchDesde": "20100901", "FchHasta": "20990101" }
]
}Generar PDF de comprobante
/api/v1/invoices/:id/pdfGenera el PDF (formato AFIP con QR) de una factura ya emitida. Lookup por :id interno de Firestore (caso común) o por (cuit, punto_venta, tipo_comprobante, numero) en el body como fallback. Devuelve un binario application/pdf.
Path parameter
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| :id | string | No | ID interno de Firestore (el que viene en `data.id` del response de POST /invoices). Si no lo tenés, mandalo como cualquier string (ej. "factura") y la API hace fallback al lookup por body. |
Body (JSON) — fallback si :id no es ID interno válido
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | No | CUIT del emisor. Requerido si :id no es ID interno. |
| punto_venta | number | No | Punto de venta. Requerido si :id no es ID interno. |
| tipo_comprobante | number | No | Tipo de comprobante. Requerido si :id no es ID interno. |
| numero | number | No | Número del comprobante. Requerido si :id no es ID interno. |
# Caso normal: usar el id que viene en data.id del response de POST /invoices
curl -X POST https://api.lafactureadora.com.ar/api/v1/invoices/5f3a8b9c1e7d4a2b8c1e7d4a/pdf \
-H "Authorization: Bearer lf_test_tu_api_key" \
--output factura.pdf
# Fallback si no tenés el id interno: mandalo cualquier cosa en :id y pasá los identificadores en body
curl -X POST https://api.lafactureadora.com.ar/api/v1/invoices/x/pdf \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"cuit": "30718954149",
"punto_venta": 2,
"tipo_comprobante": 6,
"numero": 1
}' \
--output factura.pdf(application/pdf — binario)Generar CSR (Certificate Signing Request)
/api/v1/certs/generateGenera un CSR + clave privada RSA 2048 para un CUIT. El CSR se pega en ARCA (WSASS para testing, Administración de Certificados Digitales para producción).
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT (11 dígitos). |
| razon_social | string | SÍ | Razón social o nombre. |
| condicion_iva | number | No | Código AFIP de condición frente al IVA (los mismos que PUT /cuits/:cuit: 1, 4, 5, 6, 8, 9, 10, 11, 13). No se valida: se guarda tal cual. |
| domicilio_fiscal | string | No | Domicilio fiscal. |
| ambiente | string | No | "testing" o "production". Default: "testing". |
curl -X POST https://api.lafactureadora.com.ar/api/v1/certs/generate \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"cuit": "20359403616",
"razon_social": "Mi Empresa SRL",
"condicion_iva": 1,
"ambiente": "testing"
}'{
"success": true,
"data": {
"csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIIC...\n-----END CERTIFICATE REQUEST-----",
"alias": "lafactureadora_20359403616_1716598123456",
"cuit": "20359403616",
"ambiente": "testing"
}
}Subir certificado .crt firmado por ARCA
/api/v1/certs/uploadSube el certificado .crt firmado por ARCA y lo valida contra la clave privada guardada previamente.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT (11 dígitos). |
| certificate | string | SÍ | Contenido del .crt en formato PEM (con BEGIN/END CERTIFICATE). |
| ambiente | string | No | "testing" o "production". Default: "testing". |
curl -X POST https://api.lafactureadora.com.ar/api/v1/certs/upload \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"cuit": "20359403616",
"certificate": "-----BEGIN CERTIFICATE-----\nMIIE...\n-----END CERTIFICATE-----",
"ambiente": "testing"
}'{
"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=20359403616"
}
}
}Listar CSRs sin completar
/api/v1/certs/pendingLista los CSRs generados que aún no fueron completados con un .crt subido. Útil para retomar onboarding a medias.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| ambiente | string | No | Filtrar por "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/certs/pending?ambiente=testing" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"pending": [
{
"id": "abc123",
"cuit": "20359403616",
"ambiente": "testing",
"alias": "lafactureadora_20359403616_1716598123456",
"created_at": "2026-05-24T18:30:00.000Z"
}
]
}
}Limpiar CSR pendiente
/api/v1/certs/pendingBorra atómicamente: cert no validado + tokens AFIP cacheados. Si no queda cert validado en ningún ambiente, desvincula también el CUIT del perfil.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT a limpiar. |
| ambiente | string | SÍ | "testing" o "production". |
curl -X DELETE "https://api.lafactureadora.com.ar/api/v1/certs/pending?cuit=20359403616&ambiente=testing" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"cuit": "20359403616",
"ambiente": "testing",
"deleted_certs": 1,
"removed_from_profile": true,
"message": "Se limpió el CSR pendiente y se desvinculó el CUIT 20359403616 del perfil."
}
}Regenerar certificado
/api/v1/certs/regenerateBorra los certificados de un CUIT+ambiente de tu cuenta (incluso validados) para poder generar uno nuevo desde cero. También limpia los tokens AFIP cacheados de ese CUIT+ambiente.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT (11 dígitos). |
| ambiente | string | No | "testing" o "production". Default: "testing". |
curl -X POST https://api.lafactureadora.com.ar/api/v1/certs/regenerate \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{ "cuit": "20359403616", "ambiente": "testing" }'{
"success": true,
"data": {
"message": "Se eliminaron 1 certificado(s) para CUIT 20359403616 en testing. Ahora podés generar uno nuevo.",
"cuit": "20359403616",
"ambiente": "testing"
}
}Estado del certificado
/api/v1/certs/:cuit/statusConsulta el estado actual del certificado de un CUIT. El campo autoritativo es status: "CSR_GENERADO" (falta subir el .crt), "CERTIFICADO_VALIDADO" (listo para emitir) o "NO_ENCONTRADO" (nunca se generó nada para ese CUIT+ambiente).
URL parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| :cuit | string | SÍ | CUIT (11 dígitos) en la URL. |
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| ambiente | string | No | "testing" o "production". Default: "production". |
curl "https://api.lafactureadora.com.ar/api/v1/certs/20359403616/status?ambiente=testing" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"cuit": "20359403616",
"status": "CERTIFICADO_VALIDADO",
"ambiente": "production",
"alias": "lafactureadora_20359403616_1716598123456"
}
}Datos para delegar
/api/v1/delegacion/infoDevuelve a que CUIT hay que delegarle el web service y cual es el servicio. Si el deploy no tiene configurada la modalidad, responde { disponible: false } en vez de error.
curl https://api.lafactureadora.com.ar/api/v1/delegacion/info \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"disponible": true,
"cuit_delegatario": "30719503337",
"servicio": "wsfe",
"servicio_label": "Facturacion Electronica"
}
}Marcar un CUIT como delegado
/api/v1/delegacion/startVincula el CUIT a la cuenta y lo marca en modalidad delegada. Aplica los mismos guards de titularidad que POST /certs/generate.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT a facturar. Se acepta con o sin guiones: se normaliza a 11 digitos. |
| razon_social | string | No | Opcional: si no viene, se completa despues desde el padron. |
| condicion_iva | number | No | Condicion frente al IVA del emisor. |
curl -X POST https://api.lafactureadora.com.ar/api/v1/delegacion/start \
-H "Authorization: Bearer lf_live_tu_api_key" \
-H "Content-Type: application/json" \
-d '{"cuit":"20359403616"}'{
"success": true,
"data": {
"cuit": "20359403616",
"modo": "delegado",
"status": "esperando_delegacion",
"cuit_delegatario": "30719503337",
"servicio": "wsfe",
"aviso_cert_propio": null
}
}Avisar que ya se delego en ARCA
/api/v1/delegacion/confirmEl contribuyente declara que ya hizo la delegacion. Pasa el estado a pendiente_admin: quedan los pasos que hace La Factureadora (aceptar la designacion y asociarla al certificado), que son manuales.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT en modalidad delegada. |
curl -X POST https://api.lafactureadora.com.ar/api/v1/delegacion/confirm \
-H "Authorization: Bearer lf_live_tu_api_key" \
-H "Content-Type: application/json" \
-d '{"cuit":"20359403616"}'{
"success": true,
"data": { "cuit": "20359403616", "status": "pendiente_admin" }
}Consultar el estado de la delegacion
/api/v1/delegacion/statusDevuelve la modalidad del CUIT y, si es delegado, el estado de la cadena en ARCA. No consulta a ARCA: lee lo ultimo verificado.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT a consultar. |
curl "https://api.lafactureadora.com.ar/api/v1/delegacion/status?cuit=20359403616" \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"cuit": "20359403616",
"modo": "delegado",
"delegacion": {
"status": "activa",
"verificada_at": "2026-08-08T22:10:00.000Z",
"ultima_verificacion_error": null
},
"cuit_delegatario": "30719503337"
}
}Preguntarle a ARCA si la delegacion ya rige
/api/v1/delegacion/verifySonda en vivo: llama a FECompUltimoAutorizado con el CUIT del contribuyente. Si ARCA responde sin errores, la cadena esta completa y el estado pasa a activa.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT en modalidad delegada. |
| ambiente | string | No | Solo production tiene sentido (es el default). |
| punto_venta | number | No | Punto de venta a consultar. Default 1. |
curl -X POST https://api.lafactureadora.com.ar/api/v1/delegacion/verify \
-H "Authorization: Bearer lf_live_tu_api_key" \
-H "Content-Type: application/json" \
-d '{"cuit":"20359403616","punto_venta":1}'{
"success": true,
"data": {
"cuit": "20359403616",
"status": "activa",
"mensaje": "La delegacion esta activa: ya podes emitir con este CUIT."
}
}Salir de la modalidad delegada
/api/v1/delegacion/cancelDevuelve el CUIT a modalidad de certificado propio.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT en modalidad delegada. |
curl -X POST https://api.lafactureadora.com.ar/api/v1/delegacion/cancel \
-H "Authorization: Bearer lf_live_tu_api_key" \
-H "Content-Type: application/json" \
-d '{"cuit":"20359403616"}'{
"success": true,
"data": { "cuit": "20359403616", "modo": "cert_propio" }
}Listar CUITs configurados
/api/v1/cuitsLista todos los CUITs vinculados a la cuenta con info fiscal y puntos de venta configurados.
curl https://api.lafactureadora.com.ar/api/v1/cuits \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"cuits": [
{
"cuit": "20359403616",
"razon_social": "Mi Empresa SRL",
"condicion_iva": 1,
"condicion_iva_label": "IVA Responsable Inscripto",
"status": "active",
"domicilio_comercial": "Av. Corrientes 1234, CABA",
"ingresos_brutos": "901-123456-7",
"inicio_actividades": "2019-03-15",
"modo": "cert_propio",
"delegacion": null,
"puntos_venta": [
{ "numero": 1, "tipo": "electronico" }
]
}
]
}
}Actualizar datos fiscales de un CUIT
/api/v1/cuits/:cuitActualiza los datos fiscales del emisor: condición frente al IVA, razón social, domicilio comercial, ingresos brutos e inicio de actividades. Al menos un campo. Si el CUIT está vinculado pero nunca terminó la configuración (no existe su ficha), devuelve 404.
URL parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| :cuit | string | SÍ | CUIT (11 dígitos) en la URL. |
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| condicion_iva | number | No | 1: RI, 4: Exento, 5: CF, 6: Monotributo, 8: Prov.Exterior, 9: Cliente Exterior, 10: Ley 19640, 11: RI Agente Percep., 13: Monot. Social. |
| razon_social | string | No | Razón social o nombre. |
| domicilio_comercial | string | No | Domicilio comercial que se imprime en el comprobante. Máx 200 caracteres. Mandá "" para borrarlo. |
| ingresos_brutos | string | No | Número de Ingresos Brutos o "Convenio Multilateral". Máx 200 caracteres. |
| inicio_actividades | string | No | Fecha de inicio de actividades en formato yyyy-mm-dd. |
curl -X PUT https://api.lafactureadora.com.ar/api/v1/cuits/20359403616 \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"condicion_iva": 1,
"razon_social": "Mi Empresa SRL",
"domicilio_comercial": "Av. Corrientes 1234, CABA",
"ingresos_brutos": "901-123456-7",
"inicio_actividades": "2019-03-15"
}'{
"success": true,
"data": {
"cuit": "20359403616",
"condicion_iva": 1,
"condicion_iva_label": "IVA Responsable Inscripto",
"razon_social": "Mi Empresa SRL",
"domicilio_comercial": "Av. Corrientes 1234, CABA",
"ingresos_brutos": "901-123456-7",
"inicio_actividades": "2019-03-15"
}
}Consultar padrón AFIP (constancia de inscripción)
/api/v1/afip/padronObtiene datos de un contribuyente: razón social, condición frente al IVA real (desde la constancia de inscripción), domicilio fiscal, actividad principal y estado. Cache 24h por CUIT consultado + ambiente.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit_consulta | string | SÍ | CUIT que querés consultar (puede ser el propio o el de un cliente). |
| cuit_emisor | string | No | CUIT del emisor que firma. Si no se pasa, usa el primero del usuario. |
| ambiente | string | No | "testing" o "production". Default: "production". |
| force | string | No | Pasar "1" para saltear el cache de 24h y consultar ARCA en fresco. |
| debug | string | No | Pasar "1" para incluir la respuesta cruda de ARCA en _debug_raw (para diagnóstico). |
curl "https://api.lafactureadora.com.ar/api/v1/afip/padron?cuit_consulta=30712345678&ambiente=production" \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"ok": true,
"data": {
"cuit": "30712345678",
"razon_social": "Empresa SA",
"tipo_persona": "JURIDICA",
"estado": "ACTIVO",
"condicion_iva": 1,
"condicion_iva_label": "IVA Responsable Inscripto",
"condicion_iva_confirmada": true,
"condicion_iva_inferida": null,
"fuente": "constancia",
"monotributo_categoria": null,
"forma_juridica": null,
"domicilio_fiscal": {
"direccion": "Av. Corrientes 1234",
"localidad": "CABA",
"cod_postal": "1043",
"provincia": "CIUDAD AUTONOMA BUENOS AIRES"
},
"actividad_principal": "Servicios de consultoría informática"
}
}
}Ficha completa de un contribuyente
/api/v1/afip/contribuyenteCombina en una sola llamada el padrón (razón social, condición IVA, domicilio) con los catálogos de wsfev1: condiciones IVA de receptor por clase de comprobante (tabla RG 5616) y tipos de comprobante. Si no se pasa cuit_consulta, consulta el propio CUIT emisor.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT emisor que firma las consultas (debe estar configurado en tu cuenta, con cert validado). |
| cuit_consulta | string | No | CUIT a consultar (ej. un cliente). Default: el mismo cuit. |
| ambiente | string | No | "testing" o "production". Default: el ambiente de la key (API key) o "testing" (dashboard). |
curl "https://api.lafactureadora.com.ar/api/v1/afip/contribuyente?cuit=20359403616&cuit_consulta=30712345678" \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"cuit": "30712345678",
"padron": {
"razon_social": "Empresa SA",
"condicion_iva": 1,
"condicion_iva_label": "IVA Responsable Inscripto",
"condicion_iva_confirmada": true,
"...": "mismo formato que data.data de GET /afip/padron"
},
"padron_error": null,
"tipos_comprobante_habilitados": [
{ "id": 1, "descripcion": "Factura A", "fecha_desde": "20100917", "fecha_hasta": null },
{ "id": 6, "descripcion": "Factura B", "fecha_desde": "20100917", "fecha_hasta": null }
],
"condiciones_iva": [
{ "Id": 1, "Desc": "IVA Responsable Inscripto", "Cmp_Clase": "A" },
{ "Id": 5, "Desc": "Consumidor Final", "Cmp_Clase": "B" }
]
}
}Listar puntos de venta
/api/v1/afip/puntos-ventaLista los puntos de venta habilitados del CUIT en AFIP. Si AFIP no devuelve datos (común en testing), hace fallback a los PVs ya usados en facturas locales.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor. |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/afip/puntos-venta?cuit=20359403616&ambiente=production" \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"puntos_venta": [
{ "numero": 1, "emision_tipo": "CAE", "bloqueado": false, "fecha_baja": null, "origen": "afip" },
{ "numero": 2, "emision_tipo": "CAE", "bloqueado": false, "fecha_baja": null, "origen": "afip" }
],
"total": 2
}
}Último número autorizado
/api/v1/afip/ultimo-comprobanteConsulta el último número autorizado para un PV. Si no se pasa tipo_comprobante, consulta los 6 más comunes (1, 6, 11, 3, 8, 13).
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor. |
| punto_venta | number | SÍ | Número de PV. |
| tipo_comprobante | number | No | Tipo específico. Si se omite, consulta los más comunes. |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/afip/ultimo-comprobante?cuit=20359403616&punto_venta=1" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"punto_venta": 1,
"comprobantes": [
{ "tipo_comprobante": 1, "nombre": "Factura A", "ultimo_numero": 12 },
{ "tipo_comprobante": 11, "nombre": "Factura C", "ultimo_numero": 47 }
]
}
}Health check de AFIP/ARCA
/api/v1/afip/estadoHealth check de los servicios AFIP/ARCA (WSFEv1). Útil para verificar que AFIP está operativo antes de emitir.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor (para firmar el dummy). |
| ambiente | string | No | "testing" o "production". |
curl "https://api.lafactureadora.com.ar/api/v1/afip/estado?cuit=20359403616&ambiente=production" \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"servicios": {
"app_server": "OK",
"db_server": "OK",
"auth_server": "OK"
},
"online": true,
"ambiente": "production",
"timestamp": "2026-05-30T22:10:33.000Z"
}
}Describir un servicio SOAP
/api/v1/afip/:service/describeDevuelve la estructura WSDL de un servicio AFIP/ARCA (métodos con sus inputs/outputs) más la lista plana availableMethods. Útil para explorar qué se puede llamar vía el wrapper genérico.
URL parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| :service | string | SÍ | Nombre del servicio. Ej: "wsfev1". |
curl "https://api.lafactureadora.com.ar/api/v1/afip/wsfev1/describe" \
-H "Authorization: Bearer lf_test_tu_api_key"{
"success": true,
"data": {
"service": "wsfev1",
"environment": "testing",
"serviceUrl": "https://wswhomo.afip.gov.ar/wsfev1/service.asmx",
"description": { "Service": { "ServiceSoap": { "FEDummy": { "...": "WSDL completo" } } } },
"availableMethods": ["FEDummy", "FECompUltimoAutorizado", "FEParamGetTiposCbte", "..."]
}
}Wrapper SOAP genérico
/api/v1/afip/:service/:methodLlama cualquier método SOAP de AFIP de la whitelist. Útil para operaciones de consulta avanzadas no cubiertas por endpoints específicos.
URL parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| :service | string | SÍ | Nombre del servicio. Ej: "wsfev1". |
| :method | string | SÍ | Método SOAP. Debe estar en la whitelist. |
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| cuit | string | SÍ | CUIT del emisor. |
| ambiente | string | No | "testing" o "production". |
| params | object | No | Parámetros del método SOAP. Default: {}. |
curl -X POST "https://api.lafactureadora.com.ar/api/v1/afip/wsfev1/FEDummy" \
-H "Authorization: Bearer lf_test_tu_api_key" \
-H "Content-Type: application/json" \
-d '{ "cuit": "20359403616", "ambiente": "testing" }'{
"success": true,
"data": {
"success": true,
"service": "wsfev1",
"method": "FEDummy",
"result": {
"AppServer": "OK",
"DbServer": "OK",
"AuthServer": "OK"
}
}
}Crear una nueva API key
/api/v1/keysGenera una API key. La key completa se muestra UNA SOLA VEZ en la respuesta. Después se ve solo el prefijo.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| name | string | SÍ | Nombre descriptivo (ej: "Integración WooCommerce"). |
| environment | string | No | "test" (genera lf_test_*) o "production" (genera lf_live_*). Default: "test". |
curl -X POST https://api.lafactureadora.com.ar/api/v1/keys \
-H "Authorization: Bearer <firebase_id_token>" \
-H "Content-Type: application/json" \
-d '{ "name": "Mi integración", "environment": "production" }'{
"success": true,
"data": {
"key": "lf_live_a1b2c3d4e5f6...",
"id": "abc123",
"name": "Mi integración",
"key_prefix": "lf_live_a1b2c3...",
"environment": "production",
"created_at": "2026-03-26T15:30:00Z",
"warning": "Guardá esta key de forma segura. No se puede recuperar."
}
}Listar API keys
/api/v1/keysLista todas las keys del usuario. Solo se muestra el prefijo (no la key completa).
Este endpoint no requiere parámetros.
curl https://api.lafactureadora.com.ar/api/v1/keys \
-H "Authorization: Bearer <firebase_id_token>"{
"success": true,
"data": {
"keys": [
{
"id": "abc123",
"name": "Mi integración",
"environment": "production",
"key_prefix": "lf_live_a1b2c3...",
"active": true,
"created_at": "2026-03-26T15:30:00Z",
"last_used_at": "2026-05-30T22:10:00Z",
"usage": {
"total_requests": 12450,
"month_requests": 1850,
"month_invoices": 47,
"current_month": "2026-05"
}
}
]
}
}Revocar una API key
/api/v1/keys/:keyIdLa key deja de funcionar inmediatamente. No es reversible — hay que crear una nueva.
URL parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| :keyId | string | SÍ | ID de la key (no la key completa). |
curl -X DELETE https://api.lafactureadora.com.ar/api/v1/keys/abc123 \
-H "Authorization: Bearer <firebase_id_token>"{
"success": true,
"data": { "revoked": true }
}Crear suscripción en MercadoPago
/api/v1/billing/subscribeCrea una suscripción en MercadoPago y devuelve la URL de pago para redirigir al usuario. Si ya tenés una suscripción activa devuelve 400 (usá change-plan).
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| plan | string | SÍ | "emprendedor" ($6.990), "profesional" ($14.990), "empresa" ($29.990) o "corporativo" ($49.990). |
curl -X POST https://api.lafactureadora.com.ar/api/v1/billing/subscribe \
-H "Authorization: Bearer <firebase_id_token>" \
-H "Content-Type: application/json" \
-d '{ "plan": "profesional" }'{
"success": true,
"data": {
"init_point": "https://www.mercadopago.com.ar/subscriptions/checkout?preapproval_id=...",
"subscription_id": "mp_sub_abc123"
}
}Estado de la suscripción
/api/v1/billing/statusConsulta el plan actual y el estado de la suscripción del usuario.
Este endpoint no requiere parámetros.
curl https://api.lafactureadora.com.ar/api/v1/billing/status \
-H "Authorization: Bearer <firebase_id_token>"{
"success": true,
"data": {
"plan": "profesional",
"subscription": {
"mp_id": "mp_sub_abc123",
"status": "authorized",
"plan_requested": "profesional",
"created_at": "2026-03-01T00:00:00Z"
}
}
}Cambiar de plan
/api/v1/billing/change-planUpgrade o downgrade. Crea una suscripción nueva en MP en estado pending y devuelve su init_point. La suscripción vieja sigue activa (cobrando el plan actual) hasta que MP confirma el pago de la nueva: recién ahí el webhook "authorized" cancela la anterior, activa el plan nuevo y reconcilia los CUITs (suspende excedentes en downgrade / reactiva en upgrade). Si el usuario abandona el pago, no cambia nada.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| plan | string | SÍ | "emprendedor", "profesional", "empresa" o "corporativo". |
curl -X PUT https://api.lafactureadora.com.ar/api/v1/billing/change-plan \
-H "Authorization: Bearer <firebase_id_token>" \
-H "Content-Type: application/json" \
-d '{ "plan": "empresa" }'{
"success": true,
"data": {
"init_point": "https://www.mercadopago.com.ar/subscriptions/checkout?...",
"subscription_id": "mp_sub_xyz789",
"previous_plan": "profesional",
"new_plan": "empresa",
"is_downgrade": false
}
}Historial de pagos
/api/v1/billing/historyDevuelve el historial de pagos autorizados de la suscripción del usuario, consultado en vivo desde MercadoPago.
Este endpoint no requiere parámetros.
curl https://api.lafactureadora.com.ar/api/v1/billing/history \
-H "Authorization: Bearer <firebase_id_token>"{
"success": true,
"data": {
"payments": [
{
"id": "mp_pay_123",
"date": "2026-05-15T14:00:00.000Z",
"amount": 14990,
"status": "approved",
"status_detail": "accredited",
"payment_method": "visa"
}
],
"plan": "profesional",
"subscription_status": "authorized"
}
}Cancelar suscripción
/api/v1/billing/cancelCancela en MercadoPago todas las suscripciones vivas de la cuenta (la actual y, si quedó una de un cambio de plan a medio camino, también esa). El plan baja a Free y se suspenden CUITs excedentes. Si alguna baja falla en MercadoPago, el plan NO se cambia: preferimos dejarte el servicio antes que bajarte a Gratis mientras el cobro sigue activo.
Este endpoint no requiere parámetros.
curl -X POST https://api.lafactureadora.com.ar/api/v1/billing/cancel \
-H "Authorization: Bearer <firebase_id_token>"{
"success": true,
"data": {
"message": "Suscripción cancelada. Tu plan ahora es Gratis. 2 CUIT(s) fueron suspendidos por exceder el límite del plan.",
"suspended_cuits": 2
}
}Webhook de MercadoPago
/api/v1/billing/webhookPúblicaEndpoint llamado automáticamente por MercadoPago. No llamar manualmente. Procesa eventos subscription_preapproval con validación HMAC-SHA256 + idempotencia por evento (mp_id + status + x-request-id de MP), de modo que las renovaciones mensuales con el mismo estado se procesan igual.
# Configurado en el panel de MP. Recibe POST automático cuando cambia estado de suscripción.OKRegistrar un webhook
/api/v1/webhooksRegistra una URL HTTPS tuya para recibir eventos de tu cuenta (POST con payload JSON firmado). Máximo 5 webhooks activos por cuenta.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| url | string | SÍ | URL HTTPS pública (puerto 443). Se rechazan http://, IPs privadas/localhost/metadata (anti-SSRF) y URLs ya registradas. |
| events | string[] | SÍ | Eventos a suscribir: invoice.created, invoice.rejected (AFIP rechazó el comprobante), subscription.payment_succeeded, subscription.payment_failed, subscription.cancelled, cert.expiring_soon (certificado vence en ≤30 días; un aviso por certificado, chequeo diario). |
| description | string | No | Descripción libre para identificarlo. |
curl -X POST https://api.lafactureadora.com.ar/api/v1/webhooks \
-H "Authorization: Bearer lf_live_tu_api_key" \
-H "Content-Type: application/json" \
-d '{
"url": "https://miapp.com/hooks/lafactureadora",
"events": ["invoice.created"],
"description": "Sync de facturas con mi ERP"
}'{
"success": true,
"data": {
"id": "wh_abc123",
"url": "https://miapp.com/hooks/lafactureadora",
"events": ["invoice.created"],
"description": "Sync de facturas con mi ERP",
"secret": "whsec_1a2b3c4d5e6f...64 hex chars",
"active": true,
"warning": "Guardá este secret. Lo vas a usar para verificar la firma X-LF-Signature de cada webhook. No se puede recuperar despues."
}
}Listar webhooks
/api/v1/webhooksLista tus webhooks. El secret no se expone completo (solo un prefijo).
Este endpoint no requiere parámetros.
curl https://api.lafactureadora.com.ar/api/v1/webhooks \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"webhooks": [
{
"id": "wh_abc123",
"url": "https://miapp.com/hooks/lafactureadora",
"events": ["invoice.created"],
"description": "Sync de facturas con mi ERP",
"active": true,
"secret_prefix": "whsec_1a2b3c...",
"created_at": "2026-07-01T12:00:00.000Z"
}
],
"available_events": ["invoice.created", "invoice.rejected", "subscription.payment_succeeded", "subscription.payment_failed", "subscription.cancelled", "cert.expiring_soon"]
}
}Eliminar un webhook
/api/v1/webhooks/:idDesactiva el webhook (soft delete: se conserva el historial de entregas). Deja de recibir eventos inmediatamente.
Este endpoint no requiere parámetros.
curl -X DELETE https://api.lafactureadora.com.ar/api/v1/webhooks/wh_abc123 \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": { "id": "wh_abc123", "deactivated": true }
}Historial de entregas
/api/v1/webhooks/:id/deliveriesÚltimas entregas del webhook, para debug: estado, HTTP status del destino, intentos y error.
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| limit | number | No | Cantidad de entregas. Default: 20. Máximo: 100. |
curl "https://api.lafactureadora.com.ar/api/v1/webhooks/wh_abc123/deliveries?limit=20" \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"deliveries": [
{
"id": "dl_xyz",
"event": "invoice.created",
"status": "delivered",
"http_status": 200,
"attempts": 1,
"duration_ms": 412,
"error": null,
"created_at": "2026-07-01T12:34:56.000Z",
"delivered_at": "2026-07-01T12:34:56.500Z"
},
{
"id": "dl_abc",
"event": "invoice.created",
"status": "pending_retry",
"http_status": 500,
"attempts": 2,
"duration_ms": 9800,
"error": "HTTP 500",
"created_at": "2026-07-01T11:00:00.000Z",
"delivered_at": null
}
]
}
}Chat IA (Gemini)
/api/v1/chatPúblicaProxy a Gemini IA (gemini-2.5-flash-lite) con prompts especializados. Endpoint público con rate-limit estricto.
Body (JSON)
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| messages | array | SÍ | Historia de mensajes: [{ role, text }]. role = "user" | "model". |
| context | string | No | "soporte" (técnico, default) o "ventas" (no menciona precios). |
curl -X POST https://api.lafactureadora.com.ar/api/v1/chat \
-H "Content-Type: application/json" \
-d '{
"messages": [
{ "role": "user", "text": "¿Cómo configuro un punto de venta en AFIP?" }
],
"context": "soporte"
}'{
"success": true,
"data": {
"reply": "Para crear un punto de venta web services en AFIP/ARCA..."
}
}Perfil del usuario autenticado
/api/v1/meDevuelve el perfil, uso del mes, CUITs configurados y CUITs suspendidos por downgrades.
curl https://api.lafactureadora.com.ar/api/v1/me \
-H "Authorization: Bearer lf_live_tu_api_key"{
"success": true,
"data": {
"user": {
"email": "usuario@ejemplo.com",
"display_name": "Juan Perez",
"company": "Mi Empresa SRL",
"plan": "profesional"
},
"usage": {
"month_requests": 1850,
"month_invoices": 47,
"invoice_limit": 200,
"cuits_configured": 1,
"cuit_limit": 2
},
"environment": "production",
"cuits": ["20359403616"],
"suspended_cuits": []
}
}Health check
/api/v1/healthPúblicaVerifica que la API esté online. Endpoint público (sin auth).
Este endpoint no requiere parámetros.
curl https://api.lafactureadora.com.ar/api/v1/health{
"success": true,
"data": {
"status": "ok",
"version": "1.0.0",
"timestamp": "2026-05-30T22:10:33.000Z"
}
}Health check profundo
/api/v1/health/deepPúblicaVerifica la API y sus dependencias: Firestore siempre, AFIP wsfev1 solo si se pide con ?afip=1. Pensado para monitoreo externo (Better Stack, UptimeRobot, etc.): si Firestore falla responde 503. Endpoint público (sin auth).
Query parameters
| Parámetro | Tipo | Req. | Descripción |
|---|---|---|---|
| afip | string | No | Pasar "1" para incluir el ping a AFIP wsfev1 (FEDummy público, timeout 5s). Si se omite, ese check viene "skipped". |
curl "https://api.lafactureadora.com.ar/api/v1/health/deep?afip=1"{
"success": true,
"data": {
"status": "ok",
"version": "1.0.0",
"timestamp": "2026-05-30T22:10:33.000Z",
"checks": {
"api": { "status": "ok" },
"firestore": { "status": "ok", "latency_ms": 42 },
"afip_wsfev1": { "status": "ok", "latency_ms": 850 }
}
}
}Listar planes disponibles
/api/v1/plansPúblicaLista los 5 planes públicos con precios, límites y features reales. Endpoint público (sin auth).
curl https://api.lafactureadora.com.ar/api/v1/plans{
"success": true,
"data": {
"plans": [
{ "id": "free", "name": "Gratis", "price": 0, "invoicesPerMonth": 10, "maxCuits": 1, "features": ["production", "chat_support"] },
{ "id": "emprendedor", "name": "Emprendedor", "price": 6990, "invoicesPerMonth": 50, "maxCuits": 1, "features": ["production", "pdf_qr", "clients", "chat_support"] },
{ "id": "profesional", "name": "Profesional", "price": 14990, "invoicesPerMonth": 200, "maxCuits": 2, "features": ["production", "pdf_qr", "clients", "api_access", "chat_support"] },
{ "id": "empresa", "name": "Empresa", "price": 29990, "invoicesPerMonth": 500, "maxCuits": 5, "features": ["production", "pdf_qr", "clients", "api_access", "chat_support"] },
{ "id": "corporativo", "name": "Corporativo", "price": 49990, "invoicesPerMonth": 1500, "maxCuits": 10, "features": ["production", "pdf_qr", "clients", "api_access", "chat_support"] }
]
}
}Tipos de comprobante
Códigos AFIP/ARCA aceptados en el campo tipo_comprobante al emitir facturas. Los comprobantes FCE MiPyMEs (201-213) no están soportados por ahora: la API los rechaza con 400 y details.code: "FCE_NOT_SUPPORTED".
| Código | Tipo |
|---|---|
| 1 | Factura A |
| 6 | Factura B |
| 11 | Factura C |
| 3 | Nota de Crédito A |
| 8 | Nota de Crédito B |
| 13 | Nota de Crédito C |
| 2 | Nota de Débito A |
| 7 | Nota de Débito B |
| 12 | Nota de Débito C |
| 4 | Recibo A |
| 9 | Recibo B |
| 15 | Recibo C |
Códigos de error
Todas las respuestas de error siguen el mismo formato:
{
"success": false,
"error": {
"code": "INVALID_CUIT",
"message": "Dígito verificador inválido",
"details": { ... }
}
}| HTTP | Código | Descripción |
|---|---|---|
| 400 | BAD_REQUEST | Datos de entrada inválidos o faltantes. En los errores de validación de facturas, el código específico viene en error.details.code (filas "↳" de abajo). |
| 400 | ↳ details.code: FCE_NOT_SUPPORTED | FCE MiPyMEs (tipos 201-213) no soportados. Usá comprobantes estándar A/B/C. |
| 400 | ↳ details.code: CLASE_A_REQUIRES_CUIT | Comprobantes Clase A (1/2/3/4) requieren receptor con CUIT (tipo_documento 80). |
| 400 | ↳ details.code: CLASE_A_REQUIRES_RI | Receptor de Clase A debe ser RI o Monotributista (condicion_iva 1, 6, 11, 13 o 16 — tabla RG 5616). |
| 400 | ↳ details.code: MONO_REQUIRES_CLASE_A | Receptor monotributista (condicion_iva 6/13/16) no puede recibir Clase B: le corresponde Clase A (Ley 27618 / RG 5003). |
| 400 | ↳ details.code: INVALID_DOC_NUMBER | cliente.numero_documento no cumple el formato esperado para ese tipo_documento (CUIT/CUIL/CDI 11 dígitos, DNI 7-8, tipo 99 exige 0 o vacío). |
| 400 | ↳ details.code: INVALID_DOC_CHECKSUM | CUIT/CUIL/CDI del receptor no pasa validación módulo 11. |
| 400 | ↳ details.code: CONDICION_IVA_REQUIRED | Receptor identificado con CUIT (tipo_documento 80): cliente.condicion_iva es obligatoria (consultala en GET /afip/padron). |
| 400 | ↳ details.code: MONEDA_REQUIRES_COTIZACION | Con moneda distinta de PES, cotizacion explícita > 0 es obligatoria (cotización oficial vía FEParamGetCotizacion). |
| 400 | ↳ details.code: INVALID_CAN_MIS_MON_EXT | cancelacion_misma_moneda solo admite 'S' o 'N' (RG 5259, comprobantes en moneda extranjera). |
| 400 | ↳ details.code: INVALID_DATE_FORMAT | Las fechas de servicio no respetan el formato yyyy-mm-dd. |
| 400 | ↳ details.code: INVALID_DATE | Una fecha de servicio no es válida (ej. 2026-02-30). |
| 400 | ↳ details.code: DATE_RANGE_INVALID | fecha_servicio_desde > fecha_servicio_hasta, fecha_vencimiento_pago < fecha_servicio_desde, o fecha_vencimiento_pago anterior a hoy (AFIP 1411). |
| 400 | INVALID_CUIT | CUIT no pasa validación módulo 11. |
| 400 | MISSING_CUIT | Falta el campo cuit requerido. |
| 401 | UNAUTHORIZED | No se envió ninguna credencial reconocible (ni API key ni token). |
| 401 | MISSING_API_KEY | No se envió API key. |
| 401 | INVALID_API_KEY | API key inválida, revocada o de cuenta desactivada. |
| 401 | API_KEY_REVOKED | Solo POST /invoices: la key fue revocada entre la autenticación y la reserva de cupo. |
| 401 | MISSING_TOKEN | No se envió header Authorization. |
| 401 | TOKEN_EXPIRED | Firebase token expirado. |
| 401 | INVALID_TOKEN | Token malformado o inválido. |
| 401 | USER_NOT_FOUND | Usuario no existe en el sistema. |
| 403 | FORBIDDEN | Genérico de permisos: CUIT de otra cuenta (certs/cuits/afip/listados) o recurso ajeno (PDF, webhook). El límite de CUITs y el CUIT ya vinculado tienen ahora códigos propios. |
| 403 | ACCOUNT_DISABLED | Cuenta desactivada (con Firebase token). |
| 403 | CUIT_NOT_AUTHORIZED | CUIT no pertenece a tu cuenta (endpoints con requireCuitAccess, ej. POST /invoices, /certs/upload). |
| 403 | CUIT_LIMIT_EXCEEDED | Límite de CUITs del plan alcanzado. En POST /invoices con CUIT nuevo, y también en POST /certs/generate y POST /delegacion/start (antes devolvían FORBIDDEN). |
| 403 | TEST_KEY_PRODUCTION | Key lf_test_* pidiendo ambiente production. Se aplica en todos los endpoints que aceptan ambiente. |
| 403 | API_ACCESS_REQUIRED | POST /keys: tu plan no incluye acceso a la API (disponible desde Profesional). details.upgrade_url apunta al cambio de plan. |
| 403 | METHOD_NOT_ALLOWED_HERE | Método SOAP bloqueado en /afip/:service/:method (usa /invoices para emitir). Los métodos permitidos vienen en error.allowed_methods. |
| 403 | WEBHOOK_LIMIT_EXCEEDED | Máximo 5 webhooks activos por cuenta. |
| 400 | CUIT_ES_DELEGATARIO | POST /delegacion/start: intentaste delegar el CUIT de La Factureadora a sí mismo. |
| 400 | NO_DELEGADO | /delegacion/confirm y /delegacion/verify: el CUIT no está en modalidad delegada (llamá antes a /delegacion/start). |
| 400 | INVALID_PUNTO_VENTA | POST /delegacion/verify: punto_venta tiene que ser un entero mayor a 0. |
| 403 | CUIT_ALREADY_LINKED | El CUIT ya pertenece a otra cuenta. Aplica a POST /certs/generate y POST /delegacion/start. |
| 403 | CUIT_EN_MODO_DELEGADO | POST /certs/generate sobre un CUIT delegado. Salí de la modalidad con POST /delegacion/cancel antes de generar un certificado propio. |
| 503 | DELEGACION_NOT_AVAILABLE | La modalidad delegada no está habilitada en este deploy. Usá el certificado propio. |
| 404 | NOT_FOUND | Recurso no encontrado. |
| 409 | CERT_ALREADY_VALIDATED | No se puede limpiar pending si ya hay cert validado activo (usa /regenerate). |
| 409 | WEBHOOK_DUPLICATE_URL | Ya existe un webhook activo con esa URL. |
| 409 | EXTERNAL_REFERENCE_IN_PROGRESS | POST /invoices: ya hay una emisión en curso con ese external_reference. Esperá unos minutos y reintentá con la MISMA clave (si terminó, recibís el comprobante original). |
| 409 | EXTERNAL_REFERENCE_CONFLICT | POST /invoices: el external_reference ya se usó para un comprobante con OTRO total. Bug de integración — cada venta necesita su propia clave. Los datos del comprobante existente vienen en error.details. |
| 429 | RATE_LIMIT_EXCEEDED | Límite de requests por minuto excedido. |
| 429 | INVOICE_QUOTA_EXCEEDED | Límite mensual de facturas del plan alcanzado. |
| 429 | CHAT_RATE_LIMIT | /chat: 20 mensajes/min/IP alcanzado. |
| 429 | CHAT_RATE_LIMIT_HOUR | /chat: 200 mensajes/hora/IP alcanzado. |
| 500 | INTERNAL_ERROR | Error interno del servidor. |
| 502 | AFIP_ERROR | Error hablando con AFIP/ARCA. Incluye tanto caídas/timeouts (reintentable) como RECHAZOS definitivos del comprobante: si error.message empieza con "AFIP RECHAZO: [código]", NO reintentar — corregí los datos. |
Rate limits & cuotas
La API aplica tres niveles de límite: global por IP, por plan/key, y cuota mensual de facturas.
Global por IP
200 / 15min
Anti-abuso, aplica a todos.
/chat (público)
20/min · 200/hora
Por IP.
Dashboard
Sin rate
Firebase Token skip rate-limit por plan.
Por plan (API Keys)
| Plan | Precio | Rate limit | Facturas/mes | CUITs |
|---|---|---|---|---|
| Gratis | $0 | 10 req/min | 10 | 1 |
| Emprendedor | $6.990 | 30 req/min | 50 | 1 |
| Profesional | $14.990 | 100 req/min | 200 | 2 |
| Empresa | $29.990 | 200 req/min | 500 | 5 |
| Corporativo | $49.990 | 500 req/min | 1.500 | 10 |
Headers de respuesta
| Header | Descripción |
|---|---|
| RateLimit-Limit | Límite de la ventana (por plan cuando usás API key). |
| RateLimit-Remaining | Requests restantes en la ventana. |
| RateLimit-Reset | Segundos hasta que se reinicia la ventana. |
| X-Request-Id | ID único de la request (útil para soporte). |