Guía rápida — Primera factura
Cómo emitir tu primera factura electrónica con Facturalo: crea tu cuenta en la consola, registra tu empresa, copia el token Demo y envía el JSON a /documentos/enviar.
De cero a tu primera factura ACEPTADA en el entorno Demo, sin certificado ni Clave SOL. Todo lo de la consola se hace en console.facturalo.pe.
1. Crea tu cuenta
Entra a console.facturalo.pe/register, escribe tu correo, ingresa el código que te llega y completa tu DNI, nombres y contraseña.
2. Registra tu empresa
En Empresas → Nueva empresa escribe el RUC: la razón social, la dirección y el ubigeo se completan solos desde SUNAT. Revisa los datos y guarda.
Demo listo desde el inicio
La empresa queda lista para emitir en Demo: Facturalo firma con un certificado de pruebas y usa el usuario SOL de pruebas de SUNAT. Los comprobantes Demo no tienen validez tributaria.3. Copia el token Demo
En la fila de tu empresa abre el menú ⋯ → Tokens y copia el token de Demo (sk_test_…). Ese token decide el entorno: las facturas y boletas van a SUNAT Beta; las guías de remisión se validan en el entorno de pruebas de Facturalo (XSD y reglas XSL oficiales de SUNAT; SUNAT no ofrece beta pública GRE). Guárdalo en una variable de entorno de tu backend, nunca en el frontend.
4. Envía tu primera factura
Con este JSON ya tienes una factura válida. precioUnitario incluye IGV y, con tipoIgv: "10" (gravado), Facturalo calcula el valor unitario, el IGV y los totales.
{
"documento": {
"sunatTransaccion": "0101",
"tipoComprobante": "01",
"serie": "F001",
"correlativo": "1",
"fechaEmision": "2026-10-30",
"moneda": "PEN",
"formaPago": "CONTADO",
"cliente": {
"tipoDocumento": "6",
"numeroDocumento": "20000000001",
"denominacion": "EMPRESA S.A.C.",
"direccion": "AV. LIMA 123 - LIMA - LIMA - LIMA"
},
"items": [
{
"unidadMedida": "NIU",
"descripcion": "SERVICIO DE CONSULTORÍA",
"cantidad": 1,
"precioUnitario": 118,
"tipoIgv": "10"
}
]
}
}-primary-dark)">curl -X POST https://api.facturalo.pe/api/v3/documentos/enviar \
-H "Authorization: sk_test_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: primera-factura-demo" \
-d @factura.jsonEl token va sin Bearer. Si reenvías el mismo POST (misma serie/correlativo o el mismo Idempotency-Key), Facturalo no duplica el comprobante: ver Idempotencia. Todos los campos y los demás casos (exonerada, detracción, en dólares, notas…) están en Factura gravada y las páginas siguientes de la referencia.
Si tu sistema está en Node.js o PHP, puedes usar el SDK oficial en lugar de armar la petición HTTP:
npm install @facturalo-pe/node
# o en PHP
composer require facturalo-pe/facturalo-phpimport { readFileSync } from "node:fs";
import { FacturaloClient } from "@facturalo-pe/node";
const factura = JSON.parse(readFileSync("factura.json", "utf8"));
const facturalo = new FacturaloClient({ token: process.env.FACTURALO_TOKEN });
const envio = await facturalo.documentos.enviar(factura.documento, {
idempotencyKey: "primera-factura-demo",
});
console.log(envio.estado, envio.enlaces.pdf);<?php
require 'vendor/autoload.php';
use Facturalo\FacturaloClient;
$factura = json_decode(file_get_contents('factura.json'), true);
$facturalo = new FacturaloClient(getenv('FACTURALO_TOKEN'));
$envio = $facturalo->documentos->enviar($factura['documento'], idempotencyKey: 'primera-factura-demo');
echo $envio['estado'], PHP_EOL;Cada página de la referencia muestra el ejemplo con el SDK en las pestañas Node y PHP. Código fuente: facturalo-node y facturalo-php.
5. Revisa la respuesta
La respuesta llega en segundos con el resultado de SUNAT. Si data.estado es ACEPTADA, ya tienes el PDF, el XML y el CDR en enlaces. Si es RECHAZADA, el motivo está en sunat.codigo y sunat.mensaje.
{
"success": true,
"message": "La Factura numero F001-00000001 ha sido aceptada",
"data": {
"estado": "ACEPTADA",
"entorno": "demo",
"documento": {
"id": "83ad82a0-680e-11f1-8e35-2d93ac0f2c84",
"estado": "ACEPTADA",
"serie": "F001",
"correlativo": "00000001",
"tipo": "FACTURA"
},
"sunat": {
"estado": "ACEPTADA",
"codigo": "0",
"mensaje": "La Factura numero F001-00000001 ha sido aceptada",
"notas": []
},
"enlaces": {
"pdf": "https://api.facturalo.pe/api/v3/documentos/83ad82a0-680e-11f1-8e35-2d93ac0f2c84.pdf",
"pdfTicket": "https://api.facturalo.pe/api/v3/documentos/83ad82a0-680e-11f1-8e35-2d93ac0f2c84.ticket.pdf",
"xml": "https://api.facturalo.pe/api/v3/documentos/83ad82a0-680e-11f1-8e35-2d93ac0f2c84.xml",
"cdr": "https://api.facturalo.pe/api/v3/documentos/83ad82a0-680e-11f1-8e35-2d93ac0f2c84.cdr"
},
"hash": "xvQpVbLssRc8FlD8/0LuSYeIPo8=",
"cadenaQr": "20601476551 | 01 | F001 | 00000001 | 18.00 | 118.00 | 30/10/2026 | 6 | 20000000001 | xvQpVbLssRc8FlD8/0LuSYeIPo8= |"
}
}La respuesta solo identifica el comprobante. El detalle completo (cliente, totales, ítems) lo obtienes con GET /documentos/{id}.
6. Pasa a producción
Cuando todo funcione en Demo, sigue el Onboarding Live de la consola (tres pasos):
- Activar firma (Alta PSE): desde Empresa en la consola, con la Clave SOL primaria de la empresa damos de alta a nuestro PSE en SUNAT. Desde ahí firmamos y enviamos tus comprobantes: no necesitas certificado digital ni usuario secundario SOL.
- Plan: elige un plan activo en Planes. Sin plan no se puede emitir en Live.
- API SUNAT (opcional):
client_idyclient_secret, solo si emites guías de remisión o usas SIRE. Se validan con SUNAT al guardarlas. - Token Live: en ⋯ → Tokens copia el token de Live (
sk_live_…) y úsalo en lugar del de Demo. El JSON es el mismo.
¿Prefieres no esperar la respuesta?
Envía"webhook": true y configura tu URL en ⋯ → Webhooks: la API responde 202 EN_PROCESO al instante y el resultado de SUNAT llega a tu webhook como documento.sunat.respuesta.