Toda sesión nace en uno de dos modos, y lo decide la clave con la que se
creó: sk_test_… crea sesiones test, sk_live_… crea sesiones live.
Qué cambia entre los dos modos
| Campo | Tipo | Descripción |
|---|---|---|
Consumo de tokens | No consume | Una sesión test nunca descuenta saldo y nunca falla por falta de él: podés probar el flujo entero con la cuenta en cero. |
Configuración del proyecto | Puntero propio | El proyecto tiene una versión activa en test y otra en live. Si no publicaste config en el modo de tu clave, crear una sesión falla con 422. |
Cuenta pendiente de aprobación | También bloqueada | La API pública exige que la cuenta esté activa para cualquier clave. En el dashboard sí podés armar proyectos y flujos mientras esperás. |
Webhooks | Mismos endpoints | Los endpoints son por cuenta, no por modo: el mismo destino recibe los eventos de las dos. Filtrá por data.object.mode. |
Flujo de la persona | Idéntico | Mismos pasos, mismos validadores, mismos reason codes. El modo no relaja las reglas de decisión. |
Qué consume tokens
El consumo es prepago y por sesión, no por request de API:
- se descuenta al crear la sesión, no al terminarla;
- se descuenta una sola vez por sesión, sin importar cuántos reintentos haga la persona dentro del flujo;
- no se devuelve si la persona abandona, si el link expira o si cancelás la sesión: el costo de los proveedores ya se incurrió.
Lo que no consume tokens: consultar sesiones, listar, cancelar, administrar webhook endpoints, disparar una prueba de webhook, re-entregar un evento, consultar uso o exportar el CSV.
Cómo se calcula el costo de una sesión
El costo se computa al publicar la configuración del proyecto y queda congelado en esa versión. Una sesión se cobra al precio vigente cuando se publicó el flujo, no al de hoy: cambiar la matriz de precios no re-tarifa las versiones ya publicadas.
Estos son los valores por defecto de la plataforma. Tu cuenta puede tener otros acordados; el costo efectivo de tu flujo lo ves en el dashboard al publicarlo.
| Campo | Tipo | Tokens | Descripción |
|---|---|---|---|
consent | Paso | 0 | Lo antepone la plataforma; no es configurable ni se cobra. |
choice | Paso | 0 | El grupo no cuesta: cuestan las opciones que se ejecutan. |
otp_email | Paso | 1 | Código de un solo uso por email. |
otp_whatsapp | Paso | 2 | Código de un solo uso por WhatsApp. |
form | Paso | 1 | Formulario propio. |
document_ar | Paso | 5 | Validación de documento argentino. |
face_liveness | Paso | 5 | Prueba de vida y face match. |
El presupuesto es de peor caso
El total no es la suma de flow.sequence: se calcula sobre el grafo completo
de ejecución, con criterio defensivo. Ante ambigüedad se presupuesta de más,
nunca de menos.
- Cada aparición de un paso en la secuencia suma su costo.
- Un
choicesuma su costo propio más lasminRequiredopciones más caras que ofrece. - Cada regla
gotosuma además el costo de su destino, sin importar sobre qué resultado dispare. Dos reglas hacia el mismo destino suman dos veces.
Esto último es deliberado: si sólo se cobrara la secuencia, colgar todos los
validadores caros de una regla goto sobre approved —que dispara en el 100% de
las sesiones— sería un flujo que cuesta casi cero y corre igual.
Saldo insuficiente
Si el saldo no alcanza, POST /v1/verification-sessions responde 402 y no
crea nada: ni sesión, ni link, ni asiento contable.
{
"type": "https://docs.kyc.ar/errores#insufficient_tokens",
"title": "insufficient_tokens",
"status": 402,
"code": "insufficient_tokens",
"detail": "saldo insuficiente: esta sesión cuesta 11 tokens y tenés 4. Recargá para seguir verificando.",
"required": 11,
"balance": 4,
"top_up_url": "https://app.kyc.ar/facturacion"
}
Los campos required, balance y top_up_url son miembros de extensión del
problem+json: están para que no tengas que parsear el detail. balance puede
faltar en una carrera de saldo; top_up_url puede faltar si el entorno no tiene
dashboard configurado.