Lista de empresas
Configuración Global de Facturación
Establece el límite de comprobantes mensuales para todos los clientes en el plan Free.
| Código | RUC | Razón Social | Usuario SOL | Plan | Entorno | Estado | Acciones |
|---|---|---|---|---|---|---|---|
| Cargando empresas... | |||||||
Registrar Empresa
Detalles de la Empresa
Mis Datos de Emisor
Consola de Pruebas (Sin Historial)
⚠️ Los envíos realizados aquí no se guardarán en la bitácora1. Estructura JSON de Prueba
2. Resultado de SUNAT
Esperando Envío de Prueba
Cargue una plantilla, elija el emisor en el selector y presione enviar.
Procesando con SUNAT...
Construyendo XML, firmando digitalmente y enviando al Web Service...
Constancia de Recepción CDR:
La Factura número F001-1, ha sido aceptada.
Descargas directas (Pruebas)
Detalle del Error:
Debe consignar el Total Precio de Venta
Revise la estructura del JSON y verifique que los montos e impuestos estén calculados correctamente.
// La respuesta cruda de la API aparecerá aquí...
Guía de Integración con la API
1. Endpoint de Envío Comercial
Para enviar cualquier comprobante (Facturas, Boletas, Notas de Crédito, Notas de Débito, Guías de Remisión, Resúmenes de Boletas), debes realizar una petición HTTP POST a:
POST http://localhost/sunat-api/src/api/index.php?action=send
localhost en la URL por el **nombre de dominio público** (ej: https://api.tudominio.com/) o la **IP pública** de la máquina donde esté alojada esta API de Facturación.
2. Códigos de Integración
Selecciona el lenguaje de programación de tu sistema de ventas para ver el código de ejemplo de conexión:
<?php
function enviarAAPI($jsonPayload, $tokenCliente) {
$url = "http://localhost/sunat-api/src/api/index.php?action=send";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonPayload);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $tokenCliente
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [
'code' => $httpCode,
'data' => json_decode($response, true)
];
}
// Uso:
$json = file_get_contents('factura.json');
$token = "TU_TOKEN_API_DE_64_CARACTERES";
$resultado = enviarAAPI($json, $token);
print_r($resultado);
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var url = "http://localhost/sunat-api/src/api/index.php?action=send";
var token = "TU_TOKEN_API_DE_64_CARACTERES";
var json = "{\"tipo_documento\":\"01\",\"serie\":\"F001\"}"; // Tu JSON completo
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token}");
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine($"Status: {response.StatusCode}");
Console.WriteLine($"Respuesta: {result}");
}
}
}
Imports System.Net.Http
Imports System.Text
Module Module1
Sub Main()
EnviarFactura().Wait()
End Sub
Async Function EnviarFactura() As Task
Dim url As String = "http://localhost/sunat-api/src/api/index.php?action=send"
Dim token As String = "TU_TOKEN_API_DE_64_CARACTERES"
Dim json As String = "{""tipo_documento"":""01"",""serie"":""F001""}" ' Tu JSON
Using client As New HttpClient()
client.DefaultRequestHeaders.Add("Authorization", "Bearer " & token)
Dim content As New StringContent(json, Encoding.UTF8, "application/json")
Dim response = Await client.PostAsync(url, content)
Dim result = Await response.Content.ReadAsStringAsync()
Console.WriteLine("Status: " & response.StatusCode.ToString())
Console.WriteLine("Respuesta: " & result)
End Using
End Function
End Module
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class EnviarFactura {
public static void main(String[] args) {
try {
String urlStr = "http://localhost/sunat-api/src/api/index.php?action=send";
String token = "TU_TOKEN_API_DE_64_CARACTERES";
String json = "{\"tipo_documento\":\"01\",\"serie\":\"F001\"}"; // Tu JSON
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "Bearer " + token);
conn.setDoOutput(true);
try (OutputStream os = conn.getOutputStream()) {
byte[] input = json.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
int responseCode = conn.getResponseCode();
Scanner scanner = new Scanner(conn.getInputStream(), StandardCharsets.UTF_8.name());
String response = scanner.useDelimiter("\\A").next();
System.out.println("HTTP Code: " + responseCode);
System.out.println("Response: " + response);
scanner.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. Formatos de Respuesta de la API
Respuestas de éxito según el tipo de documento enviado:
A) Respuesta para Factura / Boleta / Nota (Síncrona)
{
"success": true,
"message": "Comprobante enviado y aceptado por SUNAT.",
"hash": "3W6Z.../mY=",
"xml_path": "logs/01-F001-1.xml",
"cdr_path": "logs/R-01-F001-1.zip",
"cdr": {
"code": "0",
"description": "La Factura numero F001-1, ha sido aceptada",
"notes": []
}
}
B) Respuesta para Resumen Diario / Bajas (Asíncrona)
{
"success": true,
"message": "Resumen enviado correctamente.",
"hash": "RC-20260715-1",
"xml_path": "logs/RC-20260715-1.xml",
"ticket": "1784124681824"
}
C) Respuesta para Guía de Remisión (Asíncrona)
{
"success": true,
"message": "Guía de Remisión firmada localmente y enviada a la API REST de SUNAT.",
"hash": "bB3m...1c=",
"xml_path": "logs/09-T001-1.xml",
"ticket": "9ca2f3b9-a292-491b-8395-e83c79a835a6"
}