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.
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.
| Aspecto | Sandbox | Producción |
|---|---|---|
| Certificado | No requerido | .p12 real obligatorio |
| Validación XML | Básica (XSD) | Completa (XSD + DIAN toolkit) |
| CUFE | Sintético | Real calculado por DIAN |
| RADIAN | Simulado | Eventos reales |
| Límite documentos | Ilimitado | Según tu paquete |
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}]
}
]
}'
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())
$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);
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."
}
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.
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());
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());
.p12 de una entidad certificadora DIANDIAN_BACKEND=habilitacion para ejecutar el set de habilitación realDIAN_BACKEND=produccion¿Dudas? Contáctanos.