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
Solicita el CAE a AFIP. Si no enviás numeroComprobante, la API consulta el último autorizado
y usa el siguiente.
{
"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
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
ambiente | string | No | Por defecto "homologacion". Cualquier valor distinto de "produccion" resuelve a homologación. |
cuit | string | No | CUIT del emisor, 11 dígitos sin guiones. Si se omite, usa el configurado por defecto. |
puntoVenta | int | Sí | Debe estar habilitado en AFIP. Rechaza si es <= 0. |
tipoComprobante | int | Sí | Ver tabla de tipos. Rechaza si es <= 0. |
numeroComprobante | long | No | Si lo mandás y ese número ya tiene CAE, se devuelve el existente en vez de emitir de nuevo. |
concepto | int | No | 1 Productos, 2 Servicios, 3 Ambos. Por defecto 1. |
Receptor
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
tipoDocumento | int | Sí | 80 CUIT, 86 CUIL, 96 DNI, 99 Consumidor Final. |
numeroDocumento | long | Sí | Número del receptor. Con tipo 99 va 0. |
condicionIVAReceptorId | int | No | Condición frente al IVA del receptor. Consultá los valores vigentes en condición IVA receptor. |
Importes
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
importeTotal | decimal | Sí | Total del comprobante. Rechaza si es <= 0. |
importeNetoGravado | decimal | No | Base imponible gravada. |
importeTotalConceptoNoGravado | decimal | No | Conceptos no gravados. |
importeExento | decimal | No | Importe exento. |
importeIVA | decimal | No | Suma del IVA. Debe coincidir con la suma de ivas[].importe. |
importeTributos | decimal | No | Suma de otros tributos. |
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
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
fechaComprobante | date | No | Formato yyyy-MM-dd. Por defecto, hoy. AFIP acepta ±5 días respecto de la fecha actual. |
monedaId | string | No | "PES" por defecto. "DOL" para dólares. |
monedaCotizacion | decimal | No | 1 por defecto. Para moneda extranjera, la cotización del día. |
cancelaMismaMonedaExtranjera | string | No | "S" o "N". |
fechaServicioDesde | date | No | Obligatorio si concepto es 2 o 3. |
fechaServicioHasta | date | No | Obligatorio si concepto es 2 o 3. |
fechaVencimientoPago | date | No | Obligatorio si concepto es 2 o 3, y siempre en FCEYM. |
Colecciones
| Campo | Elemento | Descripció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. |
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
{
"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
}
| Campo | Descripción |
|---|---|
success | Si la operación completó. Miralo siempre, no alcanza con el código HTTP. |
cae | Código de Autorización Electrónico. Es lo que tenés que guardar e imprimir. |
caeVencimiento | Fecha límite para entregar el comprobante. |
resultado | "A" aprobado, "P" parcial, "R" rechazado. |
observaciones | AFIP autorizó pero con reparos. El comprobante es válido; revisá los mensajes. |
errores | Motivos del rechazo, cada uno con codigo y mensaje. |
esConsultaExistente | true si el CAE se recuperó de un comprobante ya emitido en vez de emitir uno nuevo. |
numeroEsperado | Número que correspondía según el último autorizado. Aparece cuando hay saltos de numeración. |
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 <= 0tipoComprobante <= 0importeTotal <= 0
No se exige que haya IVA: un comprobante exento o no gravado puede ir con ivas: [].
Último número autorizado
// Request
{ "ambiente": "produccion", "cuit": "30712345678", "puntoVenta": 1, "tipoComprobante": 6 }
// Respuesta
{ "success": true, "errorMessage": null, "puntoVenta": 1, "tipoComprobante": 6, "ultimoNumero": 41 }
Consultar un comprobante
Recupera los datos de un comprobante ya autorizado, incluido su CAE.
// 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.
{
"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.
| Aspecto | Factura común | FCEYM |
|---|---|---|
| Tipo de comprobante | 1, 6, 11… | 201, 206, 211… |
opcionales | Opcional | Obligatorio (CBU + condición de venta) |
fechaVencimientoPago | Solo para servicios | Siempre obligatorio |
tipoDocumento | Cualquiera | Solo 80 (CUIT) |
| Anulación | Nota de crédito común | Solo NC electrónica MiPyME |
Tipos de comprobante FCEYM
| Código | Comprobante | Código | Comprobante |
|---|---|---|---|
201 | Factura de Crédito MiPyME A | 206 | Factura de Crédito MiPyME B |
202 | Nota de Débito MiPyME A | 207 | Nota de Débito MiPyME B |
203 | Nota de Crédito MiPyME A | 208 | Nota de Crédito MiPyME B |
211 | Factura de Crédito MiPyME C | 213 | Nota de Crédito MiPyME C |
212 | Nota de Débito MiPyME C |
Opcionales obligatorios
La API pasa los opcionales a AFIP sin modificarlos: armarlos bien es responsabilidad de tu sistema.
| Id | Campo | Formato |
|---|---|---|
2101 | CBU del emisor | 22 dígitos numéricos exactos |
2102 | Alias CBU del emisor | Texto libre, alternativa al 2101 |
22 | Condición de venta | 1 contado, 2 30 días, 3 60 días, 4 90 días, 5 120 días, 6 a convenir, 99 otras |
23 | Descripción libre | Solo cuando el opcional 22 vale 99 |
2201 | CBU del receptor | Opcional pero recomendado |
2202 | Alias CBU del receptor | Opcional |
Ejemplo — Factura MiPyME A
{
"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ódigo | Descripción | Solución |
|---|---|---|
10143 | Receptor no admite FCEYM | El receptor también es MiPyME: no corresponde este tipo. |
10144 | Emisor no habilitado | El CUIT no está inscripto como MiPyME en AFIP. |
10145 | CBU/Alias no informado | Agregar el opcional 2101 o 2102. |
10146 | Condición de venta no informada | Agregar el opcional 22. |
10147 | Falta fecha de vencimiento de pago | Incluir fechaVencimientoPago. |
10148 | Tipo de documento inválido | Usar tipoDocumento: 80. |
2030 | Punto de venta no habilitado | Habilitarlo para FCEYM en el portal de AFIP. |
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
Verifica que la API esté viva. No consulta a AFIP.
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.