Documentación de API
Integra tu sistema con nuestra API de Facturación Electrónica
Base URL: https://miventa.pe/api
Introducción
Nuestra API REST te permite integrar la emisión de comprobantes electrónicos (boletas, facturas, notas de crédito/débito) directamente en tu sistema.
- Autenticación mediante API Keys (recomendado para integraciones)
- Emisión de comprobantes electrónicos conforme a SUNAT
- Cliente flexible (creación automática de clientes)
- Descarga de PDF y XML firmados
- Consultas por serie y número
Autenticación
La API utiliza API Keys para autenticación. Cada usuario puede crear múltiples API Keys para diferentes propósitos (desarrollo, producción, etc.).
Las API Keys se generan exclusivamente desde el Dashboard Web. Inicia sesión en tu cuenta y ve a la sección "Configuración" → "API Keys" para crear y gestionar tus claves.
Obtener API Key
Para obtener una API Key, debes crearla desde el Dashboard Web de tu cuenta.
Pasos para obtener tu API Key:
- Inicia sesión en tu cuenta en el dashboard web
- Navega a "Configuración" → "API Keys"
- Haz clic en "Crear API Key"
- Completa el formulario:
- Nombre: Un nombre descriptivo (ej: "API Key Producción")
- Fecha de expiración: (Opcional) Fecha límite de validez
- IP Whitelist: (Opcional) IPs permitidas separadas por coma
- ⚠️ Copia y guarda la API Key que se muestra (solo se muestra una vez)
- Formato:
sk_seguido de 48 caracteres aleatorios - Puedes crear múltiples API Keys para diferentes propósitos
- Puedes configurar restricción por IP para mayor seguridad
- Puedes establecer fecha de expiración opcional
- Puedes revocar API Keys en cualquier momento desde el dashboard
Usar API Key
Puedes usar tu API Key de dos formas:
1. Header Authorization (Recomendado)
Authorization: Bearer sk_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz
2. Header X-API-Key
X-API-Key: sk_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz
- Los query parameters se registran en logs del servidor y navegador
- Pueden quedar expuestos en historial, referrers o al compartir URLs
- Los headers HTTP son más seguros y no se registran por defecto
Endpoints de Comprobantes
Los siguientes endpoints aceptan autenticación mediante API Keys. Usa tu API Key en el header Authorization: Bearer {tu_api_key}.
Consultar Comprobante
Lista todos los comprobantes con filtros opcionales.
Query Parameters:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
empresa_id |
integer | No | Filtrar por empresa |
estado |
string | No | Filtrar por estado (pendiente, aceptado, rechazado, anulado) |
fecha_desde |
date | No | Fecha desde (YYYY-MM-DD) |
fecha_hasta |
date | No | Fecha hasta (YYYY-MM-DD) |
Consulta un comprobante por su serie y número (ej: B001-00000001).
Emitir Comprobante
Crea un nuevo comprobante electrónico. El cliente puede enviarse por ID o crearse automáticamente.
Body Parameters:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
tipo_comprobante_id |
integer | Sí | ID del tipo de comprobante (1=Factura, 2=Boleta, etc.) |
cliente |
object | Sí* | Datos del cliente (si no se envía cliente_id) |
cliente.tipo_documento_id |
integer | Sí* | ID del tipo de documento (2=DNI, 4=RUC) |
cliente.numero_documento |
string | Sí* | Número de documento del cliente |
cliente.razon_social |
string | Sí* | Razón social o nombre del cliente |
detalles |
array | Sí | Array de productos/servicios |
detalles[].cantidad |
number | Sí | Cantidad del producto |
detalles[].precio_unitario |
number | Sí | Precio unitario (sin IGV si igv_incluido=true) |
igv_incluido |
boolean | No | Si el IGV está incluido en el precio (default: false) |
{
"tipo_comprobante_id": 2,
"cliente": {
"tipo_documento_id": 2,
"numero_documento": "12345678",
"razon_social": "Juan Pérez García"
},
"detalles": [
{
"descripcion": "Producto Test",
"cantidad": 2,
"precio_unitario": 10.00,
"tipo_igv": "10"
}
],
"igv_incluido": true
}
Descargar PDF/XML
Descarga el PDF del comprobante.
Descarga el XML firmado del comprobante.
Ejemplos de Código
cURL
# Emitir boleta
curl -X POST "https://miventa.pe/api/comprobantes" \
-H "Authorization: Bearer sk_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz" \
-H "Content-Type: application/json" \
-d '{
"tipo_comprobante_id": 2,
"cliente": {
"tipo_documento_id": 2,
"numero_documento": "12345678",
"razon_social": "Juan Pérez"
},
"detalles": [
{
"descripcion": "Producto Test",
"cantidad": 1,
"precio_unitario": 10.00
}
],
"igv_incluido": true
}'
JavaScript (Fetch API)
const apiKey = 'sk_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz';
const baseUrl = 'https://miventa.pe/api';
// Emitir boleta
async function emitirBoleta() {
const response = await fetch(`${baseUrl}/comprobantes`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
tipo_comprobante_id: 2,
cliente: {
tipo_documento_id: 2,
numero_documento: '12345678',
razon_social: 'Juan Pérez'
},
detalles: [
{
descripcion: 'Producto Test',
cantidad: 1,
precio_unitario: 10.00
}
],
igv_incluido: true
})
});
const data = await response.json();
console.log(data);
}
PHP (Guzzle)
<?php
use GuzzleHttp\Client;
$apiKey = 'sk_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz';
$baseUrl = 'https://miventa.pe/api';
$client = new Client([
'base_uri' => $baseUrl,
'headers' => [
'Authorization' => "Bearer {$apiKey}",
'Content-Type' => 'application/json'
]
]);
// Emitir boleta
$response = $client->post('/comprobantes', [
'json' => [
'tipo_comprobante_id' => 2,
'cliente' => [
'tipo_documento_id' => 2,
'numero_documento' => '12345678',
'razon_social' => 'Juan Pérez'
],
'detalles' => [
[
'descripcion' => 'Producto Test',
'cantidad' => 1,
'precio_unitario' => 10.00
]
],
'igv_incluido' => true
]
]);
$data = json_decode($response->getBody(), true);
print_r($data);
?>
Python (Requests)
import requests
api_key = 'sk_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz'
base_url = 'https://miventa.pe/api'
headers = {
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json'
}
# Emitir boleta
data = {
'tipo_comprobante_id': 2,
'cliente': {
'tipo_documento_id': 2,
'numero_documento': '12345678',
'razon_social': 'Juan Pérez'
},
'detalles': [
{
'descripcion': 'Producto Test',
'cantidad': 1,
'precio_unitario': 10.00
}
],
'igv_incluido': True
}
response = requests.post(f'{base_url}/comprobantes', json=data, headers=headers)
print(response.json())
Códigos de Error
| Código | Descripción | Solución |
|---|---|---|
401 |
No autenticado | Verifica que tu API Key sea correcta y esté activa |
403 |
IP no autorizada | Tu IP no está en la whitelist de la API Key |
403 |
Sin permisos | Tu usuario no tiene permisos para esta acción |
422 |
Error de validación | Revisa los datos enviados en el request |
500 |
Error del servidor | Contacta al soporte técnico |
Mejores Prácticas
Seguridad
- Gestiona tus API Keys desde el Dashboard Web (Configuración → API Keys)
- Nunca compartas tu API Key en código público o repositorios
- Usa restricción de IP cuando sea posible (configurable desde el dashboard)
- Rota tus API Keys periódicamente
- Usa diferentes API Keys para desarrollo y producción
- Configura fecha de expiración para API Keys temporales
- Revoca API Keys que ya no uses (desde el dashboard)
Desarrollo
- Guarda la API Key en variables de entorno
- Implementa manejo de errores adecuado
- Usa HTTPS en producción
- Implementa rate limiting en tu aplicación
- Valida los datos antes de enviarlos