Sandbox — Pruebas sin DIAN real

SmartAPI ofrece un entorno mock que simula las respuestas de la DIAN sin necesidad de certificado real ni conexión a los servidores de la DIAN.

Activar modo sandbox

El modo sandbox está activo por defecto para tenants nuevos. Verifica en Settings → DIAN que DIAN_BACKEND=mock.

En sandbox, todas las peticiones son aceptadas automáticamente y generan un CUFE sintético para pruebas.

Diferencias con producción

AspectoSandboxProducción
CertificadoNo requerido.p12 real obligatorio
Validación XMLBásica (XSD)Completa (XSD + DIAN toolkit)
CUFESintéticoReal calculado por DIAN
RADIANSimuladoEventos reales
Límite documentosIlimitadoSegún tu paquete

Ejemplo en sandbox

curl -X POST https://emision.smartapp.com.co/api/v1/service/invoice \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "customer": {
      "document_type": "31",
      "document_number": "900123456",
      "name": "Cliente Sandbox SAS"
    },
    "lines": [
      {
        "code": "TEST-001",
        "name": "Producto de prueba",
        "quantity": 1,
        "unit_price": 100000,
        "taxes": [{"code": "01", "name": "IVA", "rate": 19}]
      }
    ]
  }'

Python

import requests
 
resp = requests.post(
    "https://emision.smartapp.com.co/api/v1/service/invoice",
    headers={"Authorization": "Bearer sk_test_..."},
    json={
        "customer": {"document_type": "31", "document_number": "900123456", "name": "Cliente Sandbox SAS"},
        "lines": [{"code": "TEST-001", "name": "Producto de prueba", "quantity": 1,
                    "unit_price": 100000,
                    "taxes": [{"code": "01", "name": "IVA", "rate": 19}]}]
    }
)
print(resp.json())

PHP

$data = json_encode([
    "customer" => ["document_type" => "31", "document_number" => "900123456", "name" => "Cliente Sandbox SAS"],
    "lines" => [["code" => "TEST-001", "name" => "Producto de prueba", "quantity" => 1,
                  "unit_price" => 100000,
                  "taxes" => [["code" => "01", "name" => "IVA", "rate" => 19]]]]
]);
 
$ch = curl_init("https://emision.smartapp.com.co/api/v1/service/invoice");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer sk_test_...", "Content-Type: application/json"],
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_RETURNTRANSFER => true,
]);
echo curl_exec($ch);

Node.js

const resp = await fetch("https://emision.smartapp.com.co/api/v1/service/invoice", {
  method: "POST",
  headers: {
    "Authorization": "Bearer sk_test_...",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    customer: { document_type: "31", document_number: "900123456", name: "Cliente Sandbox SAS" },
    lines: [{ code: "TEST-001", name: "Producto de prueba", quantity: 1, unit_price: 100000,
              taxes: [{ code: "01", name: "IVA", rate: 19 }] }]
  })
});
console.log(await resp.json());

Respuesta:

{
  "success": true,
  "cufe": "sandbox-abc123def456...",
  "status": "accepted",
  "note": "Documento generado en modo sandbox. No tiene validez fiscal."
}

Habilitación en sandbox

El wizard de habilitación en sandbox ejecuta 57 casos de prueba automáticamente:

Todos los casos son marcados como accepted y el tenant queda listo para producción cuando subas tu certificado real.

C#

using System.Net.Http.Json;
 
var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "sk_test_...");
 
var body = new
{
    customer = new { document_type = "31", document_number = "900123456", name = "Cliente Sandbox SAS" },
    lines = new[] {
        new { code = "TEST-001", name = "Producto de prueba", quantity = 1, unit_price = 100000,
              taxes = new[] { new { code = "01", name = "IVA", rate = 19 } } }
    }
};
 
var response = await client.PostAsJsonAsync(
    "https://emision.smartapp.com.co/api/v1/service/invoice", body);
Console.WriteLine(await response.Content.ReadAsStringAsync());

Java

HttpClient client = HttpClient.newHttpClient();
String body = """
    {
      "customer": {"document_type": "31", "document_number": "900123456", "name": "Cliente Sandbox SAS"},
      "lines": [{"code": "TEST-001", "name": "Producto de prueba", "quantity": 1, "unit_price": 100000,
                 "taxes": [{"code": "01", "name": "IVA", "rate": 19}]}]
    }
    """;
 
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://emision.smartapp.com.co/api/v1/service/invoice"))
    .header("Authorization", "Bearer sk_test_...")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
 
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.body());

Pasar a producción

  1. Obtén tu certificado .p12 de una entidad certificadora DIAN
  2. Súbelo en el portal: Settings → DIAN → Upload Certificate
  3. Cambia DIAN_BACKEND=habilitacion para ejecutar el set de habilitación real
  4. Una vez todos los casos pasen, cambia a DIAN_BACKEND=produccion

¿Dudas? Contáctanos.