Modo de prueba
Una llave vk_test_ para construir y probar tu integración con la IA de verdad, sin registrar pagos, sin gastar verificaciones y sin avisarle al dueño.
Una llave de prueba (vk_test_…) sirve para que tu desarrollador construya y pruebe la
integración contra el negocio real sin tocar sus pagos:
- Lo que es de verdad: la validación de lo que mandas, las guardas de la imagen (https, tamaño, tipo real) y la lectura del comprobante con IA. Es lo que vienes a ver funcionar.
- Lo que es de mentira: el veredicto. No se registra nada en el libro, no se gasta el cupo de verificaciones, no se anota nada en Pagos sospechosos y no se le avisa al dueño ni a su bot.
Crea la llave
Crear una llave de prueba abre el formulario de Crear llave con el interruptor Llave de prueba encendido y el atajo «Registro de pagos» marcado. Ponle un nombre («Pruebas del bot»), revisa los permisos y créala. Como cualquier llave, se muestra una sola vez.
Funciona en el mismo negocio y con los mismos permisos que una real; lo que cambia es el modo, y el modo no se cambia después: para pasar a producción se crea otra llave, real. La lista de llaves las marca con la insignia Prueba.
Los valores mágicos
En modo prueba, el veredicto de POST /v1/verifications lo decide la referencia que mandes en
reference (o la que la IA lea en la imagen, si imprimes una). Mayúsculas o minúsculas, da igual:
reference | Resultado |
|---|---|
| (ninguna) | Lo que diga la lectura de verdad: NOT_A_RECEIPT, UNREADABLE, AMOUNT_MISMATCH (si mandaste expectedAmount) o, si todo está bien, VERIFIED |
TEST_VERIFIED | 201 · VERIFIED |
TEST_PENDING | 201 · PENDING / AWAITING_BANK, y se queda así |
TEST_PENDING_VERIFIED | 201 · PENDING, y a los 30 s pasa a VERIFIED y sale el webhook verification.verified |
TEST_PENDING_NOT_FOUND | 201 · PENDING, y a los 30 s pasa a NOT_FOUND con el webhook verification.not_found |
TEST_REVIEW | 201 · PENDING / AWAITING_REVIEW (el negocio lo revisa a mano) |
TEST_DUPLICATE · TEST_POSSIBLE_DUPLICATE | 200 · DUPLICATE (CERTAIN / POSSIBLE) |
TEST_NOT_A_RECEIPT · TEST_UNREADABLE · TEST_AMOUNT_MISMATCH | 200 · REJECTED con ese code |
TEST_QUOTA_EXCEEDED | 403 PLAN_LIMIT_REACHED, con details.customerMessage |
TEST_ACCOUNT_LOCKED | 403 ACCOUNT_READ_ONLY, con details.customerMessage |
TEST_AI_UNAVAILABLE | 503 AI_UNAVAILABLE, retryable: true |
curl -X POST https://api.verifika.tech/v1/verifications \
-H "Authorization: Bearer $VERIFIKA_TEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://cdn.tubot.com/comprobantes/7f3a.jpg",
"reference": "TEST_PENDING_VERIFIED",
"metadata": { "chatId": "prueba-1" }
}'La imagen se lee de verdad: los datos de extracted son los de tu comprobante. El ingreso que
devuelve tiene la forma de siempre, pero un id inc_test_… que solo existe dentro de esa
verificación. El contrato de datos (amount) también funciona en prueba, y ahí el phone no se
valida contra el equipo.
Qué funciona con una llave de prueba
| Endpoint | En modo prueba |
|---|---|
POST /v1/verifications · GET /v1/verifications[/{id}] | Sí: el sandbox de arriba. Una llave de prueba solo ve las verificaciones de prueba, y una real nunca las ve. |
GET /v1/incomes[/{id}] | Solo los ingresos de prueba (inc_test_…) que dejaron tus verificaciones. Nunca los reales. |
GET /v1/me, /plan, /company, /business-categories, /branches, /payment-accounts, /connections, /roles, /team/members, /expense-categories | Sí, los datos reales del negocio, en lectura: es lo que necesitas para armar tu lado. |
GET /v1/webhook-events, /webhook-endpoints, /webhook-deliveries · POST /v1/webhook-endpoints/{id}/test | Sí. |
GET /v1/expenses, /receivables, /suspicious-attempts | Lista vacía (y 404 en el detalle): tu código puede recorrerlas sin ver un solo movimiento real. |
Conciliación bancaria (/v1/bank-statements…) | No. 403 TEST_MODE_UNAVAILABLE. |
Gastos con IA (/v1/expense-scans…) | No. 403 TEST_MODE_UNAVAILABLE. |
Cualquier otra escritura (POST /v1/incomes, egresos, cuentas por cobrar, crear o editar webhooks…) | No. 403 TEST_MODE_UNAVAILABLE. |
El servidor MCP (/mcp) | No: rechaza las llaves de prueba con 403 TEST_MODE_UNAVAILABLE. Sus herramientas escriben en el libro real. |
{
"error": {
"code": "TEST_MODE_UNAVAILABLE",
"message": "Con una llave de prueba (vk_test_) solo se simulan verificaciones: esta operación cambiaría datos reales del negocio. Usa una llave real.",
"details": { "livemode": false },
"requestId": "req_5837b3c1d2e04f6a9b1c7d8e0f2a3b4c",
"docUrl": "https://docs.verifika.tech/docs/guias/errores"
}
}La conciliación y los gastos con IA se prueban con una llave real
Todavía no tienen modo prueba: con una llave vk_test_ responden 403 TEST_MODE_UNAVAILABLE.
Para probarlos sin miedo, usa una llave real con permisos acotados y un extracto o una factura de
verdad: un extracto se puede borrar (DELETE /v1/bank-statements/{id}) y leer una factura no
crea nada si no mandas create: true.
Cómo saber en qué modo estás
GET /v1/metraelivemode: falsecon una llave de prueba.- Toda respuesta trae la cabecera
Verifika-Livemode(trueofalse), y con una llave de prueba los objetos llevan ademáslivemode: false. - Las verificaciones y los webhooks traen
livemode. - En el historial de peticiones del panel, cada petición de una llave de prueba sale con la insignia Prueba, y se pueden filtrar.
Webhooks de prueba
Los eventos que provocan tus llaves de prueba (verification.verified y
verification.not_found de los valores mágicos) solo van a los webhooks que tengan encendido
«Recibir también eventos de prueba» (testEvents: true). Está apagado por defecto, a propósito:
un manejador de producción que no mire livemode despacharía un pedido por un pago de mentira.
Se enciende en Integraciones → Webhooks, en la pestaña General del formulario. Un mismo webhook puede recibir los dos tipos; distínguelos así:
if (evento.livemode === false) {
// Evento de prueba: prueba tu flujo, pero no despaches nada.
}Los eventos de prueba llegan con livemode: false en el cuerpo y la cabecera
Verifika-Livemode: false, no cuentan para el tope mensual de entregas y salen marcados como
Prueba en el historial de entregas.
Límites
Cada verificación de prueba puede ser una lectura con IA de verdad, y una llave de prueba se pega en tutoriales y en pruebas automáticas. Por eso tiene su propio freno, por llave:
| Límite | Al pasarlo |
|---|---|
| 10 verificaciones por minuto | 429 RATE_LIMITED con Retry-After |
| 200 verificaciones cada 24 horas | 429 TEST_MODE_LIMIT_REACHED |
Qué se guarda y por cuánto
Todo lo de prueba vive aparte: las verificaciones, sus ingresos de mentira y las imágenes, en una zona separada de nuestro almacenamiento. Se borra solo a los 7 días. Nada de eso aparece en el panel del negocio, salvo en el historial de peticiones de la API, marcado como prueba.
Pasar a producción
- Crea una llave real con los mismos permisos.
- Cámbiala en la configuración de tu sistema (
VERIFIKA_API_KEY). El código no cambia. - Quita los valores
TEST_*que tengas fijos enreference: con una llave real son una referencia cualquiera. - Revoca la de prueba si ya no la necesitas.
Empezar
De cero a tu primera verificación real. Cinco pasos, cada uno con el enlace directo a la pantalla del panel donde se hace.
Skill para tu asistente de IA
Si programas con Claude Code, Cursor, Codex o Copilot, instala la skill de Verifika y tu asistente integra la API sin que leas página por página.