Cómo probar tu integración con la API de ValidaFirma en modo de prueba
Diego Serrano Bustos
Gerente General Validafirma.cl
Antes de mandar documentos reales a tus clientes, puedes recorrer todo el flujo en modo de prueba: creas el documento con la API, el firmante "firma", te llega el webhook y descargas el PDF. Nada de eso cuesta créditos, no tiene validez legal y no le llega ningún mensaje a ninguna persona.
En este tutorial vas a:
- crear una llave de API de prueba;
- preparar dónde recibir los webhooks y el secreto con que los firmamos;
- crear un documento de prueba;
- hacer que el firmante "firme", sin que nadie haga nada;
- pasar a producción cambiando sólo la llave y el secreto.
¿Buscas cómo verificar la firma de los webhooks? Está en su propia guía: Cómo verificar la firma de los webhooks de ValidaFirma, con ejemplos en Node.js, Python y PHP.
Antes de empezar: no hay un "ambiente sandbox" aparte
El modo de prueba no es otro servidor. Usas la misma dirección de siempre, https://api.validafirma.cl. Lo que decide si una llamada es de prueba o real es la llave con que llamas:
- una llave que empieza con
vf_test_trabaja siempre en modo de prueba; - una llave que empieza con
vf_live_trabaja siempre en modo real.
Ningún campo, parámetro ni header de la llamada cambia el modo. Así, pasar a producción es cambiar la llave, y un olvido en tu código nunca convierte una prueba en un documento real.
La antigua dirección sandbox.validafirma.cl ya no funciona (responde 410). Si tu código apuntaba ahí, cámbialo a https://api.validafirma.cl con una llave vf_test_.
1. Crea una llave de API de prueba
En el panel de ValidaFirma, entra a API Keys y haz clic en Crear API Key. Ponle un nombre que la distinga (por ejemplo mi-sistema-pruebas) y en Entorno elige Desarrollo (test). Marca los permisos de lectura y escritura.
Al crearla, el panel te muestra la llave completa, que empieza con vf_test_. Cópiala y guárdala en un lugar seguro: el panel no te la vuelve a mostrar entera.
Comprueba que la llave funciona y en qué modo está:
curl https://api.validafirma.cl/api/auth/whoami \
-H "X-API-Key: vf_test_TU_LLAVE"
La respuesta dice quién eres y el modo de la llave. "sandbox": true significa que la llave es de prueba:
{
"cuenta": { "id": "…", "nombre": "Tu cuenta", "modalidad": "personal" },
"credencial": {
"tipo": "api_key",
"nombre": "mi-sistema-pruebas",
"permisos": ["read", "write"],
"roles": ["propietario"],
"sandbox": true
}
}
2. Prepara dónde recibir los webhooks
Necesitas una dirección donde recibir los webhooks. Debe cumplir estas condiciones:
- usar
httpsen el puerto 443; - no llevar usuario ni clave dentro de la URL;
- apuntar a una dirección pública, no a una red privada ni a
localhost.
Si no cumple, la creación del documento responde 400 WEBHOOK_URL_NO_PERMITIDA, con un motivo, y no se crea nada. Para una primera prueba sirve un receptor público como webhook.site.
Cada webhook va firmado con un secreto de tu cuenta, y cada cuenta tiene dos: uno para los documentos de prueba y otro para los reales. Los avisos de este tutorial se firman con el de prueba, que empieza con whsec_test_. Para verlo:
- Abre el menú de usuario (arriba a la derecha) y enciende Modo de prueba.
- Entra a API Keys y busca la sección Secreto de webhooks. Debe decir Modo de prueba.
- Haz clic en Revelar y después en Copiar.
El interruptor del menú cambia sólo lo que ves en el panel. No cambia el modo de tus llaves: una llave vf_live_ sigue siendo real aunque el panel esté en modo de prueba.
Con ese secreto tu sistema comprueba que cada aviso viene de ValidaFirma. El cálculo y el código están en la guía de verificación de webhooks.
3. Crea un documento de prueba
Crea el documento con tu llave de prueba y tu URL de webhook:
curl -X POST https://api.validafirma.cl/api/fes/documentos \
-H "X-API-Key: vf_test_TU_LLAVE" \
-F "documento=@contrato.pdf" \
-F 'firmantes=[{"canal":"whatsapp","telefono":"+56911111111","rut":"11111111-1","nombre":"Firmante Prueba"}]' \
-F "webhook_url=https://tu-sistema.cl/webhooks/validafirma"
La respuesta tiene la misma forma que en producción, con estas diferencias:
"es_prueba": truey"sandbox": true, en el documento y en cada firmante;consumidos: 0encreditos;fecha_borrado, el día en que el documento de prueba se borrará;- un plazo de firma de 3 días como máximo.
{
"mensaje": "Documento creado exitosamente",
"documento": {
"id": "112f6510-…",
"codigo_verificacion": "mupozitm-60305B71",
"estado": "pendiente",
"dias_expiracion": 3,
"es_prueba": true,
"sandbox": true,
"fecha_borrado": "2026-10-07T15:31:42.730Z",
"firmantes": [
{
"id": "1feb8b95-…",
"rut": "11111111-1",
"canal": "whatsapp",
"estado": "pendiente",
"url_firma": "https://app.validafirma.cl/firma/…",
"es_prueba": true,
"sandbox": true
}
]
},
"creditos": { "consumidos": 0, "es_prueba": true, "sandbox": true }
}
Aunque el firmante tenga canal whatsapp o email, no se envía nada. Los mensajes que le habrían llegado (la invitación, el código y el aviso del documento firmado) quedan guardados para que los revises:
curl "https://api.validafirma.cl/api/fes/mensajes-simulados?documento_id=ID_DEL_DOCUMENTO" \
-H "X-API-Key: vf_test_TU_LLAVE"
Cada mensaje trae el canal, el destinatario, el texto, el enlace de firma y el código que llevaba.
4. Haz que el firmante "firme"
Tienes tres formas de avanzar el documento. Todas producen el mismo estado y el mismo webhook que un firmante real.
a) Abrir el enlace, como lo haría el firmante
Abre la url_firma de la respuesta en el navegador. En vez de la verificación de identidad real aparece una pantalla de simular, con dos opciones: Simular verificación aprobada y Simular verificación rechazada. Si el flujo pide validar un teléfono o un correo, el código es siempre 123456.
b) Llamar a la API, sin navegador
Cada resultado tiene su propia ruta:
curl -X POST \
https://api.validafirma.cl/api/fes/documentos/ID_DEL_DOCUMENTO/firmantes/ID_DEL_FIRMANTE/simulacion/firmar \
-H "X-API-Key: vf_test_TU_LLAVE"
| Ruta | Qué hace |
|---|---|
…/firmantes/{firmanteId}/simulacion/firmar | El firmante firma |
…/firmantes/{firmanteId}/simulacion/rechazar-verificacion | Su verificación de identidad falla y gasta un intento |
…/firmantes/{firmanteId}/simulacion/bloquear | Queda bloqueado |
…/firmantes/{firmanteId}/simulacion/desbloquear | Se levanta el bloqueo sin esperar 24 horas |
…/firmantes/{firmanteId}/simulacion/rechazar-documento | Rechaza el documento |
…/firmantes/{firmanteId}/simulacion/revision-luego-aprobada | Su identidad pasa a revisión y después se aprueba |
…/firmantes/{firmanteId}/simulacion/invitacion-no-entregada | Su invitación no se pudo entregar |
…/documentos/{id}/simulacion/vencer | El documento vence en el acto |
Estas rutas sólo existen para llaves de prueba. Con una llave real responden 400 OPERACION_SOLO_EN_MODO_DE_PRUEBA.
c) Usar un RUT de prueba
Un firmante con uno de estos RUT llega solo a su resultado, sin que nadie haga nada:
| RUT del firmante | Resultado |
|---|---|
49999901-1 | Firma |
49999902-K | Verificación rechazada |
49999903-8 | Bloqueo |
49999904-6 | Rechazo del documento |
49999905-4 | En revisión, luego aprobada |
49999906-2 | Invitación no entregada |
49999907-0 | Nunca actúa: el documento vence en su plazo |
Estos RUT sólo tienen efecto en documentos de prueba. En un documento real son un RUT más.
Cuando firma el último firmante, te llega el webhook documento.completado. El PDF firmado se descarga igual que en producción, con una marca visible de que es de prueba.
Para saber si un aviso es de prueba, lee es_prueba (o sandbox, que vale lo mismo) en la raíz del JSON:
{
"evento": "documento.completado",
"timestamp": "2026-10-01T15:42:12.930Z",
"es_prueba": true,
"sandbox": true,
"documento": { "id": "…", "codigo_verificacion": "…", "estado": "firmado", "url_descarga": "…", "url_validacion": "…" },
"firmantes": [ … ]
}
5. Pasa a producción
Cuando tu integración funcione en modo de prueba:
- Crea una llave con Entorno: Producción (live). Empieza con
vf_live_. - En el menú de usuario, apaga Modo de prueba. En API Keys → Secreto de webhooks ahora dice Modo real. Revela y copia ese secreto, que empieza con
whsec_live_. - En tu sistema, reemplaza la llave
vf_test_por lavf_live_y el secretowhsec_test_por elwhsec_live_.
No cambias nada más: ni la dirección de la API, ni tu código de verificación, ni la URL del webhook. Desde ese momento cada documento es real: el firmante recibe su invitación, verifica su identidad de verdad, el documento tiene validez legal y cada firmante se descuenta de tu saldo de créditos.
Si usas el secreto equivocado, la verificación falla: un aviso de un documento real no calza con whsec_test_, y uno de prueba no calza con whsec_live_.
Lo que conviene saber del modo de prueba
- No cuesta nada. No descuenta créditos ni aparece en tu consumo ni en tus estadísticas. Las recargas y los pagos no están disponibles con una llave de prueba (
400 OPERACION_NO_DISPONIBLE_EN_PRUEBA). - No le llega nada a nadie. Ni correos, ni WhatsApp, ni SMS. Lo que se habría enviado queda en
GET /api/fes/mensajes-simulados. Los webhooks a tu sistema sí salen: son justamente lo que estás probando. - No tiene validez legal. El PDF lleva una marca visible de prueba.
- Los dos modos no se mezclan. Una llave de prueba no ve documentos reales ni una real ve los de prueba: para ella no existen (
404). - Hasta 200 documentos de prueba al día por cuenta. El documento 201 se rechaza con
409 MODO_PRUEBA_TOPE_DIARIO. El contador vuelve a cero a las 00:00, hora de Chile continental. - Plazo de firma de 3 días como máximo. Si pides más, se acorta a 3 sin error, para que tu código corra igual que en producción.
- Se borran solos. Cada documento de prueba informa su
fecha_borrado: 3 días después de que termina o vence.
Errores frecuentes
| Lo que ves | Por qué pasa | Qué hacer |
|---|---|---|
400 WEBHOOK_URL_NO_PERMITIDA al crear el documento | La URL no es https en el puerto 443, o apunta a una red privada | Usa una URL pública con https |
Una llamada a /simulacion/… responde 400 OPERACION_SOLO_EN_MODO_DE_PRUEBA | Estás usando una llave vf_live_ | Usa la llave vf_test_ |
409 MODO_PRUEBA_TOPE_DIARIO | Tu cuenta ya creó 200 documentos de prueba hoy | Espera a las 00:00, hora de Chile continental |
Un documento responde 404 | Lo creaste con la llave del otro modo | Consúltalo con la misma llave con que lo creaste |
Tu código apunta a sandbox.validafirma.cl y recibe 410 | Esa dirección ya no existe | Usa https://api.validafirma.cl con una llave vf_test_ |
| La firma del webhook calza en prueba pero no en producción | Sigues usando whsec_test_ | Usa whsec_live_ con la llave vf_live_ |