Conecta tu sistema con AIONVEX
Emite boletas y facturas mediante HTTPS y JSON, desde cualquier lenguaje o framework que admita estas llamadas.
Completa el negocio en el panel de proveedores y coordina con AIONVEX la activación, las series y las credenciales. La cuenta de prueba no emite.
Realiza las llamadas desde tu servidor para mantener privadas las credenciales. Cada clave identifica un negocio; no necesitas enviar el RUC del emisor.
Credenciales
¿Dónde obtenerlas? Ingresa al panel, abre Mis negocios, entra al negocio y busca Credenciales de integración / Generar credenciales. El negocio debe estar activado por AIONVEX. Copia la clave y el secreto: se muestran una sola vez. En esa misma sección puedes revocarlos.
Recibirás X-Api-Key y X-Api-Secret; esta API no utiliza un token Bearer. El correo y la contraseña del login sirven para acceder al panel, no para consumir la API.
| Header | Qué enviar |
|---|---|
X-Api-Key | Clave del negocio. En todas las llamadas. |
X-Api-Secret | Secreto del negocio. En todas las llamadas. |
Content-Type | application/json, al emitir. |
Idempotency-Key | Referencia única de tu venta, al emitir. Ejemplo: VENTA-001. Guárdala antes de enviar. |
La referencia admite hasta 128 caracteres: letras, números, punto, guion, guion bajo y dos puntos.
Emitir un comprobante
Elige la ruta y envía el JSON con los cuatro headers anteriores. Sustituye los datos ficticios por los de tu venta.
Boleta · POST /v1/boletas
{
"serie": "B001",
"fecha_emision": "2026-10-08",
"tipo_moneda": "PEN",
"forma_pago": "Contado",
"cliente": {
"tipo_doc": "1",
"num_doc": "00000001",
"razon_social": "CLIENTE DE EJEMPLO"
},
"items": [
{
"codigo": "P001",
"descripcion": "Producto de ejemplo",
"unidad": "NIU",
"cantidad": 1,
"precio_unitario": 118,
"tip_afe_igv": "10",
"porcentaje_igv": 18
}
]
}Factura · POST /v1/facturas
{
"serie": "F001",
"fecha_emision": "2026-10-08",
"tipo_moneda": "PEN",
"forma_pago": "Contado",
"cliente": {
"tipo_doc": "6",
"num_doc": "20000000001",
"razon_social": "CLIENTE DE EJEMPLO"
},
"items": [
{
"codigo": "P001",
"descripcion": "Producto de ejemplo",
"unidad": "NIU",
"cantidad": 1,
"precio_unitario": 118,
"tip_afe_igv": "10",
"porcentaje_igv": 18
}
]
}Usa tu serie habilitada: B001 y F001 son ejemplos. Si omites correlativo, se asigna el siguiente número de la serie.
Qué significa cada campo
| Campo | Uso |
|---|---|
fecha_emision | Fecha de la venta: AAAA-MM-DD. |
tipo_moneda | PEN (soles), USD o EUR. |
forma_pago | Contado en estos ejemplos. Para Credito debes incluir cuotas. |
cliente.tipo_doc | "1" para DNI; "6" para RUC. Una factura requiere RUC. |
cliente.num_doc | Documento del comprador, como texto: DNI de 8 dígitos o RUC de 11 que empiece por 10 o 20. |
cliente.razon_social | Nombre o razón social del comprador. |
items | Una línea por producto o servicio. |
unidad | NIU para unidad de producto. |
cantidad | Número mayor que cero. |
precio_unitario | Precio de una unidad, según la configuración de precios del negocio. Usa punto decimal, sin S/ ni separadores de miles. |
tip_afe_igv / porcentaje_igv | "10" y 18 para el ejemplo gravado. La exoneración debe estar habilitada para el negocio. |
Enviar con cURL o Postman
cURL: guarda el JSON de boleta en boleta.json y ejecuta este comando en esa carpeta, reemplazando las credenciales y la referencia. Para factura, cambia la ruta y usa factura.json.
curl --request POST 'https://api.aionvex.com/v1/boletas' --header 'X-Api-Key: TU_API_KEY' --header 'X-Api-Secret: TU_API_SECRET' --header 'Content-Type: application/json' --header 'Idempotency-Key: VENTA-001' --data-binary '@boleta.json'En PowerShell usa curl.exe. En Postman, selecciona POST, pega la URL completa, agrega los headers y pega el JSON en Body / raw / JSON.
Ejemplo JavaScript con comentarios // (opcional)
Solo es un ejemplo de consumo: la API funciona con otros lenguajes. Para ejecutarlo, usa un archivo emitir.mjs, Node.js 18 o superior y las variables de entorno AIONVEX_API_KEY y AIONVEX_API_SECRET.
JSON no admite comentarios. En este ejemplo están en JavaScript; JSON.stringify los excluye al enviar.
// Ejecuta este ejemplo en el servidor de tu sistema con Node.js 18 o superior.
// Guarda las credenciales en variables de entorno; no las pongas en el navegador.
const apiKey = process.env.AIONVEX_API_KEY;
const apiSecret = process.env.AIONVEX_API_SECRET;
if (!apiKey || !apiSecret) throw new Error("Configura las dos credenciales del negocio.");
// Usa la referencia REAL de la venta en tu sistema y guardala antes del envio.
// Dos ventas diferentes necesitan referencias diferentes.
const referenciaVenta = "VENTA-EJEMPLO-001";
const comprobante = {
serie: "B001", // Serie de boleta habilitada para este negocio.
fecha_emision: "2026-10-08", // Reemplaza por la fecha de la operacion: AAAA-MM-DD.
tipo_moneda: "PEN", // PEN = soles. Tambien se admiten USD y EUR.
forma_pago: "Contado", // Este ejemplo no incluye credito ni cuotas.
cliente: {
tipo_doc: "1", // "1" = DNI. Para factura usa "6" = RUC.
num_doc: "00000001", // Dato ficticio. Usa el documento real como TEXTO.
razon_social: "CLIENTE DE EJEMPLO" // Nombre del cliente o su razon social.
},
items: [{
codigo: "P001", // Codigo de tu producto o servicio.
descripcion: "Producto de ejemplo",
unidad: "NIU", // NIU = unidad de producto.
cantidad: 1, // Numero mayor que cero; no lleva comillas.
precio_unitario: 118.00, // Precio por unidad. Usa la configuracion de precios del negocio.
tip_afe_igv: "10", // "10" = operacion gravada con IGV.
porcentaje_igv: 18 // Porcentaje de IGV de este ejemplo gravado.
}]
};
// JSON.stringify convierte el objeto a JSON valido: los comentarios NO se envian.
// Para una factura: cambia /boletas por /facturas, serie por F001,
// tipo_doc por "6" y num_doc por el RUC real del cliente (11 digitos).
const respuesta = await fetch("https://api.aionvex.com/v1/boletas", {
method: "POST", // POST crea un comprobante.
headers: {
"X-Api-Key": apiKey, // Identifica el negocio que emite.
"X-Api-Secret": apiSecret, // Autentica la clave de ese negocio.
"Content-Type": "application/json",
"Idempotency-Key": referenciaVenta // Evita crear dos veces la misma venta.
},
body: JSON.stringify(comprobante)
});
const resultado = await respuesta.json();
if (!respuesta.ok) {
// HTTP 422: muestra cada campo y sus mensajes para corregir la venta.
if (respuesta.status === 422) {
for (const [campo, mensajes] of Object.entries(resultado.errores ?? {})) {
console.error(campo, mensajes.join("; "));
}
} else {
console.error("HTTP", respuesta.status, resultado.mensaje);
}
// No generes otra referencia ni hagas un reintento automatico.
// Para 409 o 503, conserva la referencia y revisa el resultado con AIONVEX.
throw new Error("La emision no se confirmo.");
}
console.log("ID para guardar en tu venta:", resultado.datos?.id);
console.log("Respuesta:", resultado);
// Guarda datos.id junto con referenciaVenta en tu base de datos.
// HTTP 201 significa creado; consulta GET /boletas/{id} para conocer el estado SUNAT.
Campos adicionales
Para cuotas, descuentos, anticipos y otros campos, consulta el contrato OpenAPI. Los campos admitidos por documento son:
Facturas
anticipos, cliente, cod_local, contrato_colaboracion, correlativo, cuotas, descuentos_globales, detraccion, enviar_automatico, extras, fecha_emision, fecha_vencimiento, forma_pago, guias, items, leyenda, leyendas, mto_igv, mto_imp_venta, mto_oper_exoneradas, mto_oper_exportacion, mto_oper_gratuitas, mto_oper_gravadas, mto_oper_inafectas, observacion, pagos, percepcion, serie, sub_total, sum_otros_descuentos, tipo_moneda, tipo_operacion, total_anticipos, total_descuentos, total_impuestos, valor_venta
Boletas
anticipos, cliente, cod_local, contrato_colaboracion, correlativo, cuotas, descuentos_globales, detraccion, enviar_automatico, extras, fecha_emision, fecha_vencimiento, forma_pago, guias, items, leyenda, leyendas, mto_igv, mto_imp_venta, mto_oper_exoneradas, mto_oper_exportacion, mto_oper_gratuitas, mto_oper_gravadas, mto_oper_inafectas, observacion, pagos, percepcion, serie, sub_total, sum_otros_descuentos, tipo_moneda, tipo_operacion, total_anticipos, total_descuentos, total_impuestos, valor_venta
enviar_automatico puede omitirse o ser true. guias solo referencia guías existentes.
datos.id y consulta el estado para conocer el resultado de SUNAT.Consultar estado
Usa el datos.id recibido al emitir y los dos headers de credenciales.
GET /v1/facturas/{id}
curl 'https://api.aionvex.com/v1/facturas/123' --header 'X-Api-Key: TU_API_KEY' --header 'X-Api-Secret: TU_API_SECRET'Reemplaza 123 por tu ID. Revisa datos.sunat.estado, datos.sunat.codigo y datos.sunat.descripcion. Solo puedes consultar documentos emitidos por esta integración para tu negocio.
Ejemplo de respuesta reducida
{
"estado": "exito",
"mensaje": "Estado del comprobante consultado.",
"datos": {
"id": 123,
"numero_completo": "F001-000001",
"sunat": {
"estado": "pendiente",
"codigo": null,
"descripcion": null
}
}
}Descargar archivos
Envía los dos headers de credenciales. Para boletas, cambia facturas por boletas.
GET /v1/facturas/{id}/xml
GET /v1/facturas/{id}/cdr
PDF: a4 (predeterminado), a5, ticket-80 o ticket-58. El CDR se descarga como ZIP. Los archivos pueden tardar en estar disponibles.
Ejemplo de descarga PDF
curl 'https://api.aionvex.com/v1/facturas/123/pdf?format=a4' --header 'X-Api-Key: TU_API_KEY' --header 'X-Api-Secret: TU_API_SECRET' --output factura.pdfLos enlaces en datos.archivos son relativos: agrega https://api.aionvex.com delante y envía las credenciales.
Errores y reintentos
Si repites la misma referencia con el mismo JSON, recibes la respuesta guardada sin otra emisión, o un 409 si sigue en proceso o revisión. Una venta diferente necesita otra referencia.
| HTTP | Qué hacer |
|---|---|
| 422 | Revisa errores y corrige los campos. La validación local responde antes de enviar. |
| 401 / 403 | Revisa credenciales, acceso y documentos habilitados. |
| 409 | La referencia está en proceso, en revisión o tiene datos/configuración diferentes. Conserva la referencia y revisa el caso. |
| 503 | Servicio no disponible o emisión sin confirmación. Conserva la referencia y solicita revisión. |
| 429 | Espera el tiempo indicado por Retry-After. |
| 404 | Revisa ruta, negocio e ID; el archivo puede estar pendiente. |
| 400 / 405 / 415 / 413 | Revisa JSON, método, Content-Type y tamaño del envío. |
No cambies la referencia para repetir una venta sin resultado confirmado. Una referencia ya registrada con otros datos no se sobrescribe.
Ejemplo de errores por campo
{
"estado": "error",
"mensaje": "Error de validación",
"errores": {
"cliente.num_doc": [
"El RUC debe contener exactamente 11 digitos."
],
"items.0.cantidad": [
"La cantidad debe ser un numero mayor que cero."
]
}
}Cada campo contiene una lista de mensajes. items.0.cantidad señala la primera línea; _general indica un error sin campo específico.
Límites iniciales: 2 000 000 bytes, 500 líneas y 60 peticiones por minuto por clave; sujetos al plan. Esta API publica boletas y facturas. La configuración del negocio se gestiona con AIONVEX.