Guia de integracion para emitir comprobantes electronicos con Zafra.
3 pasos para emitir tu primer comprobante electronico
Registra tu RUC, razon social, datos fiscales y configura tus series
(F001, B001, etc.)
Sube tu archivo .pfx de SUNAT o selecciona un PSE (Proveedor de Servicios Electronicos)
para firmar tus comprobantes
Genera tu API Key, arma tu JSON y envia facturas, boletas, notas de credito y mas por API
Incluye tu API Key en cada solicitud:
X-Api-Key: zfr_tu_api_key_aquiCada cliente tiene un entorno (Pruebas o Produccion) que puedes cambiar desde el detalle del cliente. Los endpoints cambian segun el entorno:
Base URL
https://api.zafra.io/v1
POST /invoices
POST /credit-notes
POST /debit-notes
POST /voided
Los comprobantes se envian al entorno Beta de SUNAT. No tienen validez tributaria.
Base URL
https://api.zafra.io/v1
POST /invoices
POST /credit-notes
POST /debit-notes
POST /voided
Los comprobantes se envian a SUNAT real. Tienen validez tributaria.
Todos los montos monetarios deben tener maximo 2 decimales. Ejemplo: 118.00, 18.50.
| Campo | Formato | Decimales |
|---|---|---|
| Montos (totales, IGV, total_item) | n(12,2) | Max 2 |
| valor_unitario, precio_unitario | n(12,10) | Hasta 10 |
| cantidad | n(12,10) | Hasta 10 |
| porcentaje_igv | n(3,5) | Hasta 5 |
Si envias total_igv: 18.005 el servicio lo rechazara. Redondea a 2 decimales antes de enviar.
Zafra ofrece un Portal del Consumidor donde el receptor del comprobante (tu cliente final) puede ingresar con su numero de telefono, verificarse via SMS y ver todos sus comprobantes. Sin necesidad de integraciones adicionales como WhatsApp o email.
Como funciona:
telefono en datos_del_cliente_o_receptorImportante: el campo telefono es obligatorio para esta funcionalidad
Si no envias el campo telefono en el JSON del comprobante, este se emitira correctamente
pero no sera visible en el Portal del Consumidor. No existe otra forma de vincular
el comprobante con el receptor. Si deseas que tus clientes finales puedan consultar sus comprobantes, siempre incluye el telefono.
Ejemplo en el JSON:
"datos_del_cliente_o_receptor": {
"codigo_tipo_documento_identidad": "1",
"numero_documento": "47852369",
"apellidos_y_nombres_o_razon_social": "Juan Perez Lopez",
"telefono": "999888777" // El consumidor usara este numero para ingresar al portal
}Toda emision (factura, boleta, NC, ND, anulacion) requiere el header Idempotency-Key. Si tu request se reintenta (timeout, error de red), Zafra responde la misma respuesta que la primera vez, sin emitir un comprobante duplicado.
400 IDEMPOTENCY_KEY_REQUIRED.POST https://api.zafra.io/v1/invoices
Authorization: Bearer <tu-api-key>
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Content-Type: application/jsonMientras desarrollas tu integracion, podes verificar el JSON sin emitir nada ni consumir cuota:
POST https://api.zafra.io/v1/invoices/validate
Authorization: Bearer <tu-api-key>
Content-Type: application/json
{ ... tu JSON identico al de POST /invoices ... } Respuesta 200: { "success": true, "valid": true }.
Si tiene errores, 400 con detalle de campos. No persiste, no firma, no llama a SUNAT.