API REST primero
Endpoints REST versionados (/api/v1) con OpenAPI 3.1 generada automáticamente. SDKs oficiales en TypeScript, Python y Go; autenticación por API keys con prefijo fpk_…
API REST, webhooks firmados y automatizaciones visuales. Diseñado para developers que no quieren pelearse con SOAP, claves de acceso ni timeouts del ente tributario.
curl -X POST https://api.emitoo.io/api/v1/facturas/ \
-H "X-API-Key: $EMITOO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tipo_identificacion": "04",
"identificacion": "0991234567001",
"razon_social": "ACME S.A.",
"detalles": [
{ "codigo_principal": "LIC-1", "descripcion": "Licencia mensual",
"cantidad": 1, "precio_unitario": 75.00, "tarifa_iva": 15 }
]
}' import { Emitoo } from "emitoo";
const client = new Emitoo({ apiKey: process.env.EMITOO_API_KEY });
const factura = await client.facturas.crear({
tipo_identificacion: "04", // 04 = RUC, 05 = cédula
identificacion: "0991234567001",
razon_social: "ACME S.A.",
detalles: [
{ codigo_principal: "LIC-1", descripcion: "Licencia mensual",
cantidad: 1, precio_unitario: 75.0, tarifa_iva: 15 },
],
});
const autorizada = await client.facturas.esperarAutorizacion(factura.id);
console.log(autorizada.estado); // "AUTORIZADO" from emitoo import EmitooClient
client = EmitooClient(api_key="fpk_...") # o env EMITOO_API_KEY
factura = client.facturas.crear({
"tipo_identificacion": "04", # 04 = RUC, 05 = cédula
"identificacion": "0991234567001",
"razon_social": "ACME S.A.",
"detalles": [
{"codigo_principal": "LIC-1", "descripcion": "Licencia mensual",
"cantidad": 1, "precio_unitario": 75.0, "tarifa_iva": 15},
],
})
print(factura["id"], factura["estado"]) # 177 "PENDIENTE" client, err := emitoo.New("fpk_...") // o env EMITOO_API_KEY
if err != nil {
log.Fatal(err)
}
factura, err := client.Facturas.Crear(ctx, emitoo.M{
"tipo_identificacion": "04", // 04 = RUC, 05 = cédula
"identificacion": "0991234567001",
"razon_social": "ACME S.A.",
"detalles": []emitoo.M{
{"codigo_principal": "LIC-1", "descripcion": "Licencia mensual",
"cantidad": 1, "precio_unitario": 75.0, "tarifa_iva": 15},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(factura["id"], factura["estado"]) // 177 PENDIENTE POST /api/v1/facturas · respuesta inmediata con la factura en estado PENDIENTE.
Diseñado para engineers: la lógica del ente tributario (XML, firma digital, SOAP) vive en el backend. Tú solo consumes una API limpia.
Endpoints REST versionados (/api/v1) con OpenAPI 3.1 generada automáticamente. SDKs oficiales en TypeScript, Python y Go; autenticación por API keys con prefijo fpk_…
POST retorna en milisegundos con la factura en estado PENDIENTE. El envío al ente tributario corre en background — sin timeouts en tu cliente. Polling o webhooks para enterarte.
Recibe factura.autorizada, factura.rechazada, cliente.creado y más en tu endpoint, con firma HMAC y reintentos automáticos. Idempotency-Key para reintentos seguros.
Editor visual de workflows: triggers (evento, cron, webhook), nodos HTTP, condicionales, transformaciones JS, envío de email/RIDE, notificaciones Slack/WhatsApp/Telegram.
Roles con permisos por path + método HTTP, modificables en caliente desde la API. Multi-tenant con aislamiento por sucursal y scope por usuario.
Cada request queda registrada: actor, método, recurso, status, IP, user-agent y duración. Filtrable y consultable. Tus API keys, tus reglas, tu trazabilidad.
OpenAPI 3.1 autogenerada, versionada en /api/v1, idempotente
con Idempotency-Key. Auth por API keys fpk_…
atadas a un rol.
/api/v1/facturas Crear comprobante (async) /api/v1/facturas/{id} Obtener factura /api/v1/facturas/{id}/status Estado de procesamiento /api/v1/facturas/{id}/reenviar Reintentar envío /api/v1/facturas/{id}/ride RIDE en PDF /api/v1/facturas/{id}/email Enviar comprobante por email /api/v1/clientes Listar /api/v1/clientes Crear /api/v1/clientes/{ruc} Lookup por RUC/cédula /api/v1/clientes/{id} Actualizar /api/v1/clientes/{id} Eliminar /api/v1/workflows Listar automatizaciones /api/v1/workflows Crear workflow /api/v1/workflows/{id}/run Ejecutar manualmente /api/v1/workflows/{id}/runs Historial de ejecuciones /api/v1/webhooks Endpoints suscritos /api/v1/webhooks Suscribir nuevo endpoint /api/v1/webhooks/test Enviar evento de prueba
Cada evento incluye X-Emitoo-Signature (HMAC-SHA256)
para que puedas verificar el origen sin dudar.
// POST https://tu-app.com/webhooks/emitoo
// X-Emitoo-Signature: t=1719700000,v1=4f3b…
// X-Emitoo-Event: factura.autorizada
{
"event": "factura.autorizada",
"data": {
"factura_id": 177,
"numero": "001-001-000000177",
"clave_acceso": "2907202507…",
"autorizacion": "2025072909123456789012345678901234567890123",
"total": 172.50,
"cliente": { "ruc": "0991234567001" },
"ride_url": "/api/v1/facturas/177/ride"
}
} Tu cliente nunca espera un timeout del ente tributario. El procesamiento corre en segundo plano; tú recibes el resultado por webhook o polling.
Editor visual estilo n8n, alimentado por los mismos eventos que disparan los webhooks. Corre en un worker dedicado con historial por ejecución.
Cada run persiste inputs y outputs por nodo, con duración, estado y error. Worker desacoplado (BlockingScheduler, instancia única) que no bloquea la API.
Firma criptográfica real, claves con hash, permisos granulares y verificación de webhooks con timing-safe equality.
El .p12 y su contraseña viven en el servidor (volumen/secreto + variables de entorno). Ni el frontend ni la API pública los tocan.
Tokens fpk_… atados a un rol, con hash en BD, expiración y revocación. Se muestran una sola vez al crearlas.
RBAC dinámico, modificable en caliente vía PUT /roles/{id}/permissions. Sin redeploys para cambiar quién accede a qué.
Cada llamada registra actor, recurso, status, IP, user-agent y duración. Filtrable desde la API o el panel admin.
Cabecera X-Emitoo-Signature (HMAC-SHA256) en cada evento saliente. Reintentos con backoff exponencial.
POST idempotentes con tu propio Idempotency-Key. Reintentos seguros aunque el cliente reciba timeout.
// Verificar la firma de un webhook con el SDK
import { verificarFirma } from "emitoo";
app.post(
"/webhooks/emitoo",
express.raw({ type: "*/*" }),
async (req, res) => {
const valida = await verificarFirma({
header: req.headers["x-emitoo-signature"],
body: req.body, // cuerpo crudo, sin parsear
secret: process.env.EMITOO_WEBHOOK_SECRET,
});
if (!valida) return res.status(401).end();
const evento = JSON.parse(req.body.toString());
// evento.evento === "factura.autorizada"
res.sendStatus(200);
},
);
// HMAC-SHA256 en tiempo constante + anti-replay de 5 min.
// Disponible también: emitoo.verificar_firma (Python)
// y emitoo.VerificarFirma (Go). Planes anuales, sin sorpresas. El ambiente de pruebas es gratis e ilimitado siempre, y tus documentos y descargas nunca se bloquean.
Para emprendedores y para integrar la API con calma.
200 comprobantes/año incluidos
Crear cuenta gratisTe avisamos al 80% del cupo. Al llegar al 100% solo se pausa la emisión de nuevos comprobantes — tus documentos siguen disponibles.
Para PYMEs con volumen real. Todo incluido.
6.000 comprobantes/año con API incluida
Empezar ahoraEquivale a $16/mes. Se contrata desde la app con tarjeta y se activa al instante — o por transferencia con nuestro equipo.
Para corporativos, plataformas y estudios contables.
Desde $990/año — el precio por comprobante baja con tu volumen
Contactar con ventasCuéntanos tu volumen y armamos el plan: fee base anual + consumo por tramos, multi-RUC y SLA por contrato.
Te avisamos al 80% y al 100%. Al llegar al cupo solo se pausa la emisión de comprobantes nuevos — tus documentos, descargas y el portal de tus clientes siguen funcionando siempre. Pasas a Negocio en un clic ($190/año) y sigues donde quedaste.
Tienes la API completa por 90 días desde tu primer comprobante real emitido por API — tiempo de sobra para integrar y probar. El ambiente de pruebas no consume el trial ni el cupo.
No. Usuarios y sucursales son ilimitados en todos los planes; en Empresarial también se incluyen varios RUCs (grupos empresariales y estudios contables).
Sí. El ambiente de pruebas del ente tributario es ilimitado y gratuito — útil para CI y para validar tu firma XAdES-BES antes de salir a producción.
Te respondemos en menos de 24 horas hábiles. Para devoluciones técnicas, WhatsApp es más rápido; para ventas y onboarding, el formulario.
Te contestamos al correo. Si es sobre el plan Empresarial, te contactamos por WhatsApp también.
Crea una cuenta, genera tu API key fpk_… y emite tu
primer comprobante contra el ambiente de pruebas del ente tributario.