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.ar

Versión

v1 (estable)

Inicio rápido

Emití tu primera factura en 3 pasos.

  1. 1. Obtené una API key

    Generala desde el dashboard. Las de testing arrancan con lf_test_ y las de producción con lf_live_.

  2. 2. Configurá tu certificado AFIP/ARCA

    Generá un CSR, subilo a ARCA (WSASS para testing, Administración de Certificados Digitales para producción), descargá el .crt y subilo. Ver Certificados.

  3. 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, /plans, /billing/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_key

Opción 2 — Firebase ID Token (dashboard web)

Authorization: Bearer eyJhbGciOiJSUzI1NiIs...

Ambientes y prefijos

lf_test_*
Testing

Ambiente homologación. Se fuerza ambiente: "testing". Facturas sin validez fiscal.

lf_live_*
Producción

Facturas reales. Requiere certificado de producción validado.

Atención:Una key lf_test_ fuerza ambiente:"testing" siempre. Si mandás ambiente:"production" con una key de test, devuelve TEST_KEY_PRODUCTION.

Emitir factura

POST/api/v1/invoices

Emite 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 hasta 5 veces con backoff.

Atención:Comprobantes Clase A (1/2/3/4/201/202/203): AFIP exige receptor con CUIT (DocTipo 80) + condición IVA 1 o 11. Sino devuelve CLASE_A_REQUIRES_CUIT o CLASE_A_REQUIRES_RI antes de pegarle a AFIP.
Nota:Validación de documentos del receptor: CUIT/CUIL/CDI requieren 11 dígitos + módulo 11 válido. DNI requiere 7-8 dígitos. Errores devuelven INVALID_DOC_NUMBER o INVALID_DOC_CHECKSUM antes de pegarle a AFIP.
Nota:Para servicios (concepto 2/3): fecha_servicio_desde ≤ fecha_servicio_hasta, y fecha_vencimiento_pago ≥ fecha_servicio_desde. Formato yyyy-mm-dd. Errores: INVALID_DATE_FORMAT, DATE_RANGE_INVALID.
Atención:Si AFIP aprueba con observaciones (warnings), aparecen en data.observaciones: [{code, message}]. Importante: la factura es válida, pero el cliente debería ver el aviso.
Atención:Si la respuesta es 202 Accepted (no 201), el CAE en AFIP es válido pero falló el guardado en nuestra DB. Guardá el CAE de warning.cae para reconciliación.

Body (raíz)

ParámetroTipoReq.Descripción
cuitstringCUIT del emisor (11 dígitos). Debe estar configurado y tener cert validado.
punto_ventanumberPunto de venta tipo RECE (1-99999).
tipo_comprobantenumberNoDefault: 11 (Factura C). Ver tabla más abajo.
conceptonumberNo1: Productos, 2: Servicios, 3: Productos y Servicios. Default: 1.
ambientestringNo"testing" o "production". Si la key es lf_test_*, se fuerza testing.
monedastringNo"PES" (ARS), "DOL" (USD), "EUR". Default: "PES".
cotizacionnumberNoTipo de cambio si moneda != PES. Default: 1.
condicion_pagonumberNo1: Contado, 2: Tarjeta crédito, 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)

ParámetroTipoReq.Descripción
tipo_documentonumber80: CUIT, 86: CUIL, 96: DNI, 94: Pasaporte, 99: Consumidor Final.
numero_documentostringNúmero del documento (sin guiones).
razon_socialstringNombre o razón social del receptor.
domiciliostringNoDirección del receptor.
emailstringNoEmail del receptor.
condicion_ivanumberNo1: RI, 4: Exento, 5: CF, 6: Monotributo, 11: RI Agente Percep., 13: Monot. Social. Default: 5.

Body > items[] (array, requerido, mín. 1)

ParámetroTipoReq.Descripción
descripcionstringDescripción del item.
cantidadnumberNoCantidad. Default: 1.
precio_unitarionumberPrecio unitario en la moneda del comprobante.
alicuota_ivanumberNoPorcentaje IVA: 0, 2.5, 5, 10.5, 21, 27. Default: 0.
bonificacionnumberNoPorcentaje de descuento (0-100). Default: 0.
gravadobooleanNoSi el item está gravado con IVA. Default: true.

Body > comprobante_asociado (objeto, solo NC/ND)

ParámetroTipoReq.Descripción
tiponumberTipo del comprobante original.
punto_ventanumberPV del comprobante original.
numeronumberNúmero del comprobante original.
cuitstringNoCUIT del emisor original.
fechastringNoFecha del comprobante original (YYYY-MM-DD).

Body > tributos[] (array, opcional — IIBB, percepciones)

ParámetroTipoReq.Descripción
idnumberID del tributo según AFIP.
descripcionstringNoDescripción del tributo.
base_imponiblenumberNoBase imponible.
alicuotanumberNoAlícuota del tributo.
importenumberNoImporte del tributo.
Request — cURL
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
    }]
  }'
Respuesta
{
  "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

GET/api/v1/invoices

Lista las facturas emitidas por el usuario, ordenadas por fecha desc. Filtros opcionales. Paginación con cursor (no offset).

Nota:Paginación: la primera llamada no necesita cursor. La respuesta trae `next_cursor` y `has_more`. Para la siguiente página, pasá `?cursor=<next_cursor>`. Cuando `has_more=false` ya no hay más facturas.

Query parameters

ParámetroTipoReq.Descripción
cuitstringNoFiltrar por CUIT emisor.
ambientestringNo"testing" o "production".
limitnumberNoResultados por página. Default: 50. Max: 200.
cursorstringNoPara paginar: pasar `next_cursor` de la respuesta anterior. Si no se pasa, devuelve la primera página.
Request — cURL
# 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"
Respuesta
{
  "success": true,
  "data": {
    "invoices": [
      {
        "id": "abc123",
        "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,
        "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

GET/api/v1/invoices/summary

Totales facturados del mes en curso, IVA, tributos y desglose por tipo de comprobante.

Query parameters

ParámetroTipoReq.Descripción
cuitstringNoFiltrar por CUIT emisor.
ambientestringNo"testing" o "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/invoices/summary?cuit=20359403616" \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "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

GET/api/v1/invoices/last-authorized

Consulta el último número de comprobante autorizado en AFIP/ARCA para un PV y tipo específicos.

Query parameters

ParámetroTipoReq.Descripción
cuitstringCUIT del emisor.
punto_ventanumberPunto de venta.
tipo_comprobantenumberTipo de comprobante.
ambientestringNo"testing" o "production".
Request — cURL
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"
Respuesta
{
  "success": true,
  "data": {
    "CbteNro": 12,
    "PtoVta": 1,
    "CbteTipo": 11
  }
}

Consultar comprobante en AFIP

GET/api/v1/invoices/query

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

Query parameters

ParámetroTipoReq.Descripción
cuitstringCUIT del emisor.
punto_ventanumberPunto de venta.
tipo_comprobantenumberTipo de comprobante.
numeronumberNúmero del comprobante.
ambientestringNo"testing" o "production".
Request — cURL
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"
Respuesta
{
  "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"
      }
    }
  }
}

Tipos de comprobante disponibles

GET/api/v1/invoices/types

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

Query parameters

ParámetroTipoReq.Descripción
cuitstringCUIT del emisor.
ambientestringNo"testing" o "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/invoices/types?cuit=20359403616" \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "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

POST/api/v1/invoices/:id/pdf

Genera 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.

Nota:El PDF se genera desde la DB de La Factureadora (donde guardamos cae + items + cliente al emitir). NO re-consultamos AFIP — más rápido y robusto.
Atención:Si el comprobante no existe en la DB de La Factureadora (ej. fue emitido por otro sistema o se perdió en un DB_SAVE_FAILED), devuelve 404. Para esos casos, recomendado guardar el binario PDF en tu lado al recibir el 201 inicial.

Path parameter

ParámetroTipoReq.Descripción
:idstringNoID 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ámetroTipoReq.Descripción
cuitstringNoCUIT del emisor. Requerido si :id no es ID interno.
punto_ventanumberNoPunto de venta. Requerido si :id no es ID interno.
tipo_comprobantenumberNoTipo de comprobante. Requerido si :id no es ID interno.
numeronumberNoNúmero del comprobante. Requerido si :id no es ID interno.
Request — cURL
# 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
Respuesta
(application/pdf — binario)

Generar CSR (Certificate Signing Request)

POST/api/v1/certs/generate

Genera 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).

Atención:Para ambiente "production" se requiere tener primero un certificado validado en "testing" para el mismo CUIT.

Body (JSON)

ParámetroTipoReq.Descripción
cuitstringCUIT (11 dígitos).
razon_socialstringRazón social o nombre.
condicion_ivanumberNoCódigo AFIP (1, 4, 6, 11, 13).
domicilio_fiscalstringNoDomicilio fiscal.
ambientestringNo"testing" o "production". Default: "testing".
Request — cURL
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"
  }'
Respuesta
{
  "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

POST/api/v1/certs/upload

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

Body (JSON)

ParámetroTipoReq.Descripción
cuitstringCUIT (11 dígitos).
certificatestringContenido del .crt en formato PEM (con BEGIN/END CERTIFICATE).
ambientestringNo"testing" o "production". Default: "testing".
Request — cURL
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"
  }'
Respuesta
{
  "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

GET/api/v1/certs/pending

Lista los CSRs generados que aún no fueron completados con un .crt subido. Útil para retomar onboarding a medias.

Query parameters

ParámetroTipoReq.Descripción
ambientestringNoFiltrar por "testing" o "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/certs/pending?ambiente=testing" \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "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

DELETE/api/v1/certs/pending

Borra atómicamente: cert no validado + tokens AFIP cacheados. Si no queda cert validado en ningún ambiente, desvincula también el CUIT del perfil.

Atención:Si el CUIT ya tiene un cert validado y activo en el ambiente, retorna 409 CERT_ALREADY_VALIDATED. Usa /regenerate en su lugar.

Query parameters

ParámetroTipoReq.Descripción
cuitstringCUIT a limpiar.
ambientestring"testing" o "production".
Request — cURL
curl -X DELETE "https://api.lafactureadora.com.ar/api/v1/certs/pending?cuit=20359403616&ambiente=testing" \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "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

POST/api/v1/certs/regenerate

Borra todos los certificados de un CUIT+ambiente (incluso validados) para poder generar uno nuevo desde cero.

Cuidado:Acción destructiva: deja al CUIT sin poder facturar en ese ambiente hasta que generes y subas un certificado nuevo.

Body (JSON)

ParámetroTipoReq.Descripción
cuitstringCUIT (11 dígitos).
ambientestringNo"testing" o "production". Default: "testing".
Request — cURL
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" }'
Respuesta
{
  "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

GET/api/v1/certs/:cuit/status

Consulta el estado actual del certificado de un CUIT.

URL parameters

ParámetroTipoReq.Descripción
:cuitstringCUIT (11 dígitos) en la URL.
Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/certs/20359403616/status \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "success": true,
  "data": {
    "cuit": "20359403616",
    "status": "CERTIFICADO_VALIDADO",
    "ambiente": "production",
    "alias": "lafactureadora_20359403616_1716598123456"
  }
}

Listar CUITs configurados

GET/api/v1/cuits

Lista todos los CUITs vinculados a la cuenta con info fiscal y puntos de venta configurados.

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/cuits \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "success": true,
  "data": {
    "cuits": [
      {
        "cuit": "20359403616",
        "razon_social": "Mi Empresa SRL",
        "condicion_iva": 1,
        "condicion_iva_label": "IVA Responsable Inscripto",
        "status": "active",
        "puntos_venta": [
          { "numero": 1, "tipo": "electronico" }
        ]
      }
    ]
  }
}

Actualizar datos fiscales de un CUIT

PUT/api/v1/cuits/:cuit

Actualiza condición frente al IVA y/o razón social del CUIT. Al menos uno de los dos campos.

URL parameters

ParámetroTipoReq.Descripción
:cuitstringCUIT (11 dígitos) en la URL.

Body (JSON)

ParámetroTipoReq.Descripción
condicion_ivanumberNo1: RI, 4: Exento, 5: CF, 6: Monotributo, 8: Prov.Exterior, 9: Cliente Exterior, 10: Ley 19640, 11: RI Agente Percep., 13: Monot. Social.
razon_socialstringNoRazón social o nombre.
Request — cURL
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" }'
Respuesta
{
  "success": true,
  "data": {
    "cuit": "20359403616",
    "condicion_iva": 1,
    "condicion_iva_label": "IVA Responsable Inscripto",
    "razon_social": "Mi Empresa SRL"
  }
}

Consultar padrón AFIP (A13)

GET/api/v1/afip/padron

Obtiene datos completos de un contribuyente: razón social, condición frente al IVA, domicilio fiscal, actividad principal y estado. Cache 24h por CUIT consultado + ambiente.

Atención:El CUIT emisor debe tener autorizado el servicio ws_sr_padron_a13 en ARCA, asociado al alias del certificado. Es una autorización separada de wsfe (vía Administrador de Relaciones → Nueva Relación → WebServices).
Nota:Siempre retorna 200 OK con un wrapper { ok, data?, authorized?, error? } para no romper UX. Inspeccionar data.ok antes de usar data.data.

Query parameters

ParámetroTipoReq.Descripción
cuit_consultastringCUIT que querés consultar (puede ser el propio o el de un cliente).
cuit_emisorstringNoCUIT del emisor que firma. Si no se pasa, usa el primero del usuario.
ambientestringNo"testing" o "production". Default: "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/afip/padron?cuit_consulta=30712345678&ambiente=production" \
  -H "Authorization: Bearer lf_live_tu_api_key"
Respuesta
{
  "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",
      "monotributo_categoria": 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"
    }
  }
}

Listar puntos de venta

GET/api/v1/afip/puntos-venta

Lista 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ámetroTipoReq.Descripción
cuitstringCUIT del emisor.
ambientestringNo"testing" o "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/afip/puntos-venta?cuit=20359403616&ambiente=production" \
  -H "Authorization: Bearer lf_live_tu_api_key"
Respuesta
{
  "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

GET/api/v1/afip/ultimo-comprobante

Consulta 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ámetroTipoReq.Descripción
cuitstringCUIT del emisor.
punto_ventanumberNúmero de PV.
tipo_comprobantenumberNoTipo específico. Si se omite, consulta los más comunes.
ambientestringNo"testing" o "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/afip/ultimo-comprobante?cuit=20359403616&punto_venta=1" \
  -H "Authorization: Bearer lf_test_tu_api_key"
Respuesta
{
  "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

GET/api/v1/afip/estado

Health check de los servicios AFIP/ARCA (WSFEv1). Útil para verificar que AFIP está operativo antes de emitir.

Query parameters

ParámetroTipoReq.Descripción
cuitstringCUIT del emisor (para firmar el dummy).
ambientestringNo"testing" o "production".
Request — cURL
curl "https://api.lafactureadora.com.ar/api/v1/afip/estado?cuit=20359403616&ambiente=production" \
  -H "Authorization: Bearer lf_live_tu_api_key"
Respuesta
{
  "success": true,
  "data": {
    "servicios": {
      "app_server": "OK",
      "db_server": "OK",
      "auth_server": "OK"
    },
    "online": true,
    "ambiente": "production",
    "timestamp": "2026-05-30T22:10:33.000Z"
  }
}

Wrapper SOAP genérico

POST/api/v1/afip/:service/:method

Llama cualquier método SOAP de AFIP de la whitelist. Útil para operaciones de consulta avanzadas no cubiertas por endpoints específicos.

Atención:Whitelist: FEDummy, FECompUltimoAutorizado, FECompConsultar, FEParamGet* (todos los paramétricos). Los métodos de emisión (FECAESolicitar, FECAEARegInformativo) deben pasar por POST /api/v1/invoices y devuelven 403 METHOD_NOT_ALLOWED_HERE si se intentan acá.

URL parameters

ParámetroTipoReq.Descripción
:servicestringNombre del servicio. Ej: "wsfev1".
:methodstringMétodo SOAP. Debe estar en la whitelist.

Body (JSON)

ParámetroTipoReq.Descripción
cuitstringCUIT del emisor.
ambientestringNo"testing" o "production".
paramsobjectNoParámetros del método SOAP. Default: {}.
Request — cURL
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" }'
Respuesta
{
  "success": true,
  "data": {
    "success": true,
    "service": "wsfev1",
    "method": "FEDummy",
    "result": {
      "AppServer": "OK",
      "DbServer": "OK",
      "AuthServer": "OK"
    }
  }
}

Crear una nueva API key

POST/api/v1/keys

Genera una API key. La key completa se muestra UNA SOLA VEZ en la respuesta. Después se ve solo el prefijo.

Body (JSON)

ParámetroTipoReq.Descripción
namestringNombre descriptivo (ej: "Integración WooCommerce").
environmentstringNo"test" (genera lf_test_*) o "production" (genera lf_live_*). Default: "test".
Request — cURL
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" }'
Respuesta
{
  "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

GET/api/v1/keys

Lista todas las keys del usuario. Solo se muestra el prefijo (no la key completa).

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/keys \
  -H "Authorization: Bearer <firebase_id_token>"
Respuesta
{
  "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

DELETE/api/v1/keys/:keyId

La key deja de funcionar inmediatamente. No es reversible — hay que crear una nueva.

URL parameters

ParámetroTipoReq.Descripción
:keyIdstringID de la key (no la key completa).
Request — cURL
curl -X DELETE https://api.lafactureadora.com.ar/api/v1/keys/abc123 \
  -H "Authorization: Bearer <firebase_id_token>"
Respuesta
{
  "success": true,
  "data": { "revoked": true }
}

Crear suscripción en MercadoPago

POST/api/v1/billing/subscribe

Crea una suscripción en MercadoPago y devuelve la URL de pago para redirigir al usuario.

Body (JSON)

ParámetroTipoReq.Descripción
planstring"emprendedor" ($6.990), "profesional" ($14.990), "empresa" ($29.990) o "corporativo" ($49.990).
Request — cURL
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" }'
Respuesta
{
  "success": true,
  "data": {
    "init_point": "https://www.mercadopago.com.ar/subscriptions/checkout?preapproval_id=...",
    "subscription_id": "mp_sub_abc123"
  }
}

Estado de la suscripción

GET/api/v1/billing/status

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

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/billing/status \
  -H "Authorization: Bearer <firebase_id_token>"
Respuesta
{
  "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

PUT/api/v1/billing/change-plan

Upgrade o downgrade. Cancela la suscripción actual de MP y crea una nueva. Si es downgrade, suspende CUITs excedentes proactivamente.

Body (JSON)

ParámetroTipoReq.Descripción
planstring"emprendedor", "profesional", "empresa" o "corporativo".
Request — cURL
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" }'
Respuesta
{
  "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,
    "suspended_cuits": 0
  }
}

Historial de pagos

GET/api/v1/billing/history

Devuelve el historial de pagos autorizados de la suscripción del usuario, consultado en vivo desde MercadoPago.

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/billing/history \
  -H "Authorization: Bearer <firebase_id_token>"
Respuesta
{
  "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

POST/api/v1/billing/cancel

Cancela la suscripción activa en MercadoPago. El plan baja a Free inmediatamente y se suspenden CUITs excedentes.

Este endpoint no requiere parámetros.

Request — cURL
curl -X POST https://api.lafactureadora.com.ar/api/v1/billing/cancel \
  -H "Authorization: Bearer <firebase_id_token>"
Respuesta
{
  "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

POST/api/v1/billing/webhookPública

Endpoint llamado automáticamente por MercadoPago. No llamar manualmente. Procesa eventos subscription_preapproval con validación HMAC-SHA256 + idempotencia por (mp_id, status).

Nota:En producción exige headers x-signature y x-request-id válidos según MP. En dev/test se permiten requests sin firma para test notifications.
Request — cURL
# Configurado en el panel de MP. Recibe POST automático cuando cambia estado de suscripción.
Respuesta
OK

Chat IA (Gemini)

POST/api/v1/chatPública

Proxy a Gemini IA (gemini-2.5-flash-lite) con prompts especializados. Endpoint público con rate-limit estricto.

Atención:Rate limits: 20 mensajes/min/IP (CHAT_RATE_LIMIT) y 200/hora/IP (CHAT_RATE_LIMIT_HOUR).

Body (JSON)

ParámetroTipoReq.Descripción
messagesarrayHistoria de mensajes: [{ role, text }]. role = "user" | "model".
contextstringNo"soporte" (técnico, default) o "ventas" (no menciona precios).
Request — cURL
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"
  }'
Respuesta
{
  "success": true,
  "data": {
    "reply": "Para crear un punto de venta web services en AFIP/ARCA..."
  }
}

Perfil del usuario autenticado

GET/api/v1/me

Devuelve el perfil, uso del mes, CUITs configurados y CUITs suspendidos por downgrades.

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/me \
  -H "Authorization: Bearer lf_live_tu_api_key"
Respuesta
{
  "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

GET/api/v1/healthPública

Verifica que la API esté online. Endpoint público (sin auth).

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/health
Respuesta
{
  "success": true,
  "data": {
    "status": "ok",
    "version": "1.0.0",
    "timestamp": "2026-05-30T22:10:33.000Z"
  }
}

Listar planes disponibles

GET/api/v1/plansPública

Lista los 5 planes públicos con precios, límites y features reales. Endpoint público (sin auth).

Este endpoint no requiere parámetros.

Request — cURL
curl https://api.lafactureadora.com.ar/api/v1/plans
Respuesta
{
  "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.

CódigoTipo
1Factura A
6Factura B
11Factura C
3Nota de Crédito A
8Nota de Crédito B
13Nota de Crédito C
2Nota de Débito A
7Nota de Débito B
12Nota de Débito C
4Recibo A
9Recibo B
15Recibo C
201FCE MiPyMEs Factura A
206FCE MiPyMEs Factura B
211FCE MiPyMEs Factura 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": { ... }
  }
}
HTTPCódigoDescripción
400BAD_REQUESTDatos de entrada inválidos o faltantes.
400INVALID_CUITCUIT no pasa validación módulo 11.
400MISSING_CUITFalta el campo cuit requerido.
400CLASE_A_REQUIRES_CUITFactura/NC/ND/Recibo/FCE Clase A requieren receptor con CUIT (tipo_documento 80).
400CLASE_A_REQUIRES_RIReceptor de Clase A debe ser Responsable Inscripto (condicion_iva 1 o 11).
400INVALID_DOC_NUMBERcliente.numero_documento no cumple el formato esperado para ese tipo_documento (CUIT/CUIL/CDI 11 dígitos, DNI 7-8).
400INVALID_DOC_CHECKSUMCUIT/CUIL/CDI del receptor no pasa validación módulo 11.
400INVALID_DATE_FORMATLas fechas de servicio no respetan el formato yyyy-mm-dd.
400INVALID_DATEUna fecha de servicio no es válida (ej. 2026-02-30).
400DATE_RANGE_INVALIDfecha_servicio_desde > fecha_servicio_hasta, o fecha_vencimiento_pago < fecha_servicio_desde.
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.
403CUIT_LIMIT_EXCEEDEDLímite de CUITs del plan alcanzado.
403TEST_KEY_PRODUCTIONKey de test usada para ambiente producción.
403METHOD_NOT_ALLOWED_HEREMétodo SOAP bloqueado en /afip/:service/:method (usa /invoices para emitir).
404NOT_FOUNDRecurso no encontrado.
409CERT_ALREADY_VALIDATEDNo se puede limpiar pending si ya hay cert validado activo (usa /regenerate).
429RATE_LIMIT_EXCEEDEDLímite de requests por minuto excedido.
429INVOICE_QUOTA_EXCEEDEDLímite mensual de facturas del plan alcanzado.
429CHAT_RATE_LIMIT/chat: 20 mensajes/min/IP alcanzado.
429CHAT_RATE_LIMIT_HOUR/chat: 200 mensajes/hora/IP alcanzado.
500SERVER_ERRORError interno del servidor.
502AFIP_ERRORError de comunicación con servidores AFIP/ARCA.

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)

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

Headers de respuesta

HeaderDescripción
RateLimit-LimitLímite máximo en la ventana.
RateLimit-RemainingRequests restantes en la ventana.
X-RateLimit-LimitLímite específico de la API key (por plan).
X-RateLimit-RemainingRestantes de la API key.
X-Invoice-Quota-WarningAparece al usar 80%+ de la cuota mensual.
X-Request-IdID único de la request (útil para soporte).