RECE.APICOMPLOOK SISTEMAS
Referencia Errores

Comprobantes WSFE

Emisión y consulta de comprobantes del mercado interno contra el servicio WSFEV1 de AFIP: facturas A, B, C y M, notas de crédito y débito, y Factura de Crédito Electrónica MiPyME.

Emitir un comprobante

POST /api/facturacion/emitir Token

Solicita el CAE a AFIP. Si no enviás numeroComprobante, la API consulta el último autorizado y usa el siguiente.

json
{
  "ambiente": "produccion",
  "cuit": "30712345678",
  "puntoVenta": 1,
  "tipoComprobante": 6,
  "concepto": 1,
  "tipoDocumento": 80,
  "numeroDocumento": 20123456789,
  "fechaComprobante": "2026-08-20",
  "importeTotal": 1210.00,
  "importeNetoGravado": 1000.00,
  "importeTotalConceptoNoGravado": 0,
  "importeExento": 0,
  "importeIVA": 210.00,
  "importeTributos": 0,
  "monedaId": "PES",
  "monedaCotizacion": 1.0,
  "condicionIVAReceptorId": 1,
  "ivas": [
    { "id": 5, "baseImponible": 1000.00, "importe": 210.00 }
  ]
}

Campos del request

Identificación

CampoTipoReq.Descripción
ambientestringNoPor defecto "homologacion". Cualquier valor distinto de "produccion" resuelve a homologación.
cuitstringNoCUIT del emisor, 11 dígitos sin guiones. Si se omite, usa el configurado por defecto.
puntoVentaintSíDebe estar habilitado en AFIP. Rechaza si es <= 0.
tipoComprobanteintSíVer tabla de tipos. Rechaza si es <= 0.
numeroComprobantelongNoSi lo mandás y ese número ya tiene CAE, se devuelve el existente en vez de emitir de nuevo.
conceptointNo1 Productos, 2 Servicios, 3 Ambos. Por defecto 1.

Receptor

CampoTipoReq.Descripción
tipoDocumentointSí80 CUIT, 86 CUIL, 96 DNI, 99 Consumidor Final.
numeroDocumentolongSíNúmero del receptor. Con tipo 99 va 0.
condicionIVAReceptorIdintNoCondición frente al IVA del receptor. Consultá los valores vigentes en condición IVA receptor.

Importes

CampoTipoReq.Descripción
importeTotaldecimalSíTotal del comprobante. Rechaza si es <= 0.
importeNetoGravadodecimalNoBase imponible gravada.
importeTotalConceptoNoGravadodecimalNoConceptos no gravados.
importeExentodecimalNoImporte exento.
importeIVAdecimalNoSuma del IVA. Debe coincidir con la suma de ivas[].importe.
importeTributosdecimalNoSuma de otros tributos.
Los importes tienen que cerrar

AFIP valida que importeTotal = importeNetoGravado + importeTotalConceptoNoGravado + importeExento + importeIVA + importeTributos. Si no coincide, devuelve el error 10048. Redondeá a 2 decimales antes de enviar.

Moneda y fechas

CampoTipoReq.Descripción
fechaComprobantedateNoFormato yyyy-MM-dd. Por defecto, hoy. AFIP acepta ±5 días respecto de la fecha actual.
monedaIdstringNo"PES" por defecto. "DOL" para dólares.
monedaCotizaciondecimalNo1 por defecto. Para moneda extranjera, la cotización del día.
cancelaMismaMonedaExtranjerastringNo"S" o "N".
fechaServicioDesdedateNoObligatorio si concepto es 2 o 3.
fechaServicioHastadateNoObligatorio si concepto es 2 o 3.
fechaVencimientoPagodateNoObligatorio si concepto es 2 o 3, y siempre en FCEYM.

Colecciones

CampoElementoDescripción
ivas{ id, baseImponible, importe }Alícuotas aplicadas. Ver códigos de IVA.
tributos{ id, descripcion, baseImponible, alicuota, importe }Otros tributos: percepciones, impuestos internos.
opcionales{ id, valor }Datos opcionales de AFIP. Obligatorios en FCEYM.
comprobantesAsociados{ tipo, puntoVenta, numero, cuit?, fecha? }Para notas de crédito y débito.
compradores{ tipoDocumento, numeroDocumento, porcentaje }Para venta de bienes usados a varios compradores.
periodoAsociado{ fechaDesde, fechaHasta }Período que cubre el comprobante.
actividades{ id }Códigos de actividad AFIP del emisor.
Caracteres especiales en campos de texto

Los campos de texto libre — como tributos[].descripcion y opcionales[].valor — se insertan en el XML que se envía a AFIP sin escapar. Un &, < o > rompe el mensaje y produce un error de comunicación difícil de diagnosticar. Sanitizá esos campos antes de enviarlos: una razón social como "Pérez & Hijos" es suficiente para provocarlo.

Respuesta

json
{
  "success": true,
  "errorMessage": null,
  "cae": "76234567890123",
  "caeVencimiento": "2026-08-30T00:00:00",
  "numeroComprobante": 42,
  "puntoVenta": 1,
  "tipoComprobante": 6,
  "fechaProceso": "2026-08-20T14:32:11",
  "resultado": "A",
  "observaciones": [],
  "errores": [],
  "eventos": [],
  "esConsultaExistente": false,
  "numeroEsperado": null
}
CampoDescripción
successSi la operación completó. Miralo siempre, no alcanza con el código HTTP.
caeCódigo de Autorización Electrónico. Es lo que tenés que guardar e imprimir.
caeVencimientoFecha límite para entregar el comprobante.
resultado"A" aprobado, "P" parcial, "R" rechazado.
observacionesAFIP autorizó pero con reparos. El comprobante es válido; revisá los mensajes.
erroresMotivos del rechazo, cada uno con codigo y mensaje.
esConsultaExistentetrue si el CAE se recuperó de un comprobante ya emitido en vez de emitir uno nuevo.
numeroEsperadoNúmero que correspondía según el último autorizado. Aparece cuando hay saltos de numeración.
Idempotencia parcial

Si mandás numeroComprobante explícito y ese comprobante ya tiene CAE, la API devuelve el CAE existente con esConsultaExistente: true en vez de duplicar. Es la protección contra reintentos después de un timeout. Si no mandás el número, cada llamada emite un comprobante nuevo.

Validaciones previas

Estas se rechazan con 400 antes de llamar a AFIP:

  • puntoVenta <= 0
  • tipoComprobante <= 0
  • importeTotal <= 0

No se exige que haya IVA: un comprobante exento o no gravado puede ir con ivas: [].

Último número autorizado

POST /api/facturacion/ultimo-numero Token
json
// Request
{ "ambiente": "produccion", "cuit": "30712345678", "puntoVenta": 1, "tipoComprobante": 6 }

// Respuesta
{ "success": true, "errorMessage": null, "puntoVenta": 1, "tipoComprobante": 6, "ultimoNumero": 41 }

Consultar un comprobante

POST /api/facturacion/consultar Token

Recupera los datos de un comprobante ya autorizado, incluido su CAE.

json
// Request
{
  "ambiente": "produccion",
  "cuit": "30712345678",
  "puntoVenta": 1,
  "tipoComprobante": 6,
  "numeroComprobante": 42
}

// Respuesta
{
  "success": true,
  "errorMessage": null,
  "cae": "76234567890123",
  "caeVencimiento": "2026-08-30T00:00:00",
  "fechaComprobante": "2026-08-20T00:00:00",
  "importeTotal": 1210.00,
  "resultado": "A",
  "observaciones": []
}

Devuelve 404 si el comprobante no existe, y 400 ante cualquier otro fallo.

Notas de crédito y débito

Se emiten por el mismo endpoint, cambiando el tipoComprobante y agregando comprobantesAsociados con la factura original.

json
{
  "ambiente": "produccion",
  "cuit": "30712345678",
  "puntoVenta": 1,
  "tipoComprobante": 8,
  "concepto": 1,
  "tipoDocumento": 80,
  "numeroDocumento": 20123456789,
  "fechaComprobante": "2026-08-25",
  "importeTotal": 1210.00,
  "importeNetoGravado": 1000.00,
  "importeIVA": 210.00,
  "monedaId": "PES",
  "monedaCotizacion": 1.0,
  "ivas": [
    { "id": 5, "baseImponible": 1000.00, "importe": 210.00 }
  ],
  "comprobantesAsociados": [
    {
      "tipo": 6,
      "puntoVenta": 1,
      "numero": 42,
      "cuit": "30712345678",
      "fecha": "2026-08-20"
    }
  ]
}

La letra de la nota debe coincidir con la de la factura: una factura B (6) se anula con una nota de crédito B (8). Ver la tabla completa de tipos.


Factura de Crédito MiPyME

La Factura de Crédito Electrónica MiPyME (Ley 27.440) usa el mismo endpoint que una factura común, pero con tipos de comprobante propios y campos adicionales obligatorios.

AspectoFactura comúnFCEYM
Tipo de comprobante1, 6, 11…201, 206, 211…
opcionalesOpcionalObligatorio (CBU + condición de venta)
fechaVencimientoPagoSolo para serviciosSiempre obligatorio
tipoDocumentoCualquieraSolo 80 (CUIT)
AnulaciónNota de crédito comúnSolo NC electrónica MiPyME

Tipos de comprobante FCEYM

CódigoComprobanteCódigoComprobante
201Factura de Crédito MiPyME A206Factura de Crédito MiPyME B
202Nota de Débito MiPyME A207Nota de Débito MiPyME B
203Nota de Crédito MiPyME A208Nota de Crédito MiPyME B
211Factura de Crédito MiPyME C213Nota de Crédito MiPyME C
212Nota de Débito MiPyME C

Opcionales obligatorios

La API pasa los opcionales a AFIP sin modificarlos: armarlos bien es responsabilidad de tu sistema.

IdCampoFormato
2101CBU del emisor22 dígitos numéricos exactos
2102Alias CBU del emisorTexto libre, alternativa al 2101
22Condición de venta1 contado, 2 30 días, 3 60 días, 4 90 días, 5 120 días, 6 a convenir, 99 otras
23Descripción libreSolo cuando el opcional 22 vale 99
2201CBU del receptorOpcional pero recomendado
2202Alias CBU del receptorOpcional

Ejemplo — Factura MiPyME A

json
{
  "ambiente": "produccion",
  "cuit": "20123456789",
  "puntoVenta": 1,
  "tipoComprobante": 201,
  "concepto": 1,
  "tipoDocumento": 80,
  "numeroDocumento": 30500010912,
  "fechaComprobante": "2026-08-20",
  "fechaVencimientoPago": "2026-10-20",
  "importeTotal": 12100.00,
  "importeNetoGravado": 10000.00,
  "importeIVA": 2100.00,
  "monedaId": "PES",
  "monedaCotizacion": 1.0,
  "ivas": [
    { "id": 5, "baseImponible": 10000.00, "importe": 2100.00 }
  ],
  "opcionales": [
    { "id": 2101, "valor": "2850590940090418135201" },
    { "id": 22,   "valor": "3" }
  ]
}

Errores propios de FCEYM

CódigoDescripciónSolución
10143Receptor no admite FCEYMEl receptor también es MiPyME: no corresponde este tipo.
10144Emisor no habilitadoEl CUIT no está inscripto como MiPyME en AFIP.
10145CBU/Alias no informadoAgregar el opcional 2101 o 2102.
10146Condición de venta no informadaAgregar el opcional 22.
10147Falta fecha de vencimiento de pagoIncluir fechaVencimientoPago.
10148Tipo de documento inválidoUsar tipoDocumento: 80.
2030Punto de venta no habilitadoHabilitarlo para FCEYM en el portal de AFIP.
La aceptación ocurre fuera de la API

RECE.API gestiona la emisión de la FCEYM. La aceptación o el rechazo por parte del receptor suceden directamente en AFIP, dentro de los 30 días corridos; pasado ese plazo sin pronunciamiento, se considera aceptada tácitamente. El punto de venta debe estar habilitado específicamente para FCEYM: uno común no sirve.

Estado del servicio

GET /api/facturacion/health Token

Verifica que la API esté viva. No consulta a AFIP.

GET /api/facturacion/ping Token

Llama a FEDummy de AFIP y devuelve el estado de sus servidores de aplicación, base de datos y autenticación. Responde 503 si AFIP no está disponible.

/ping consulta siempre el ambiente de homologación, sin importar la configuración. No sirve para verificar el estado de producción.

RECE.API — CompLook Sistemas Documentación de integración