Autenticación

Cómo funciona la autenticación de la API de Tokeflow — claves secretas frente a públicas, el esquema Bearer, la anatomía de las claves, el alcance de Organization frente a Merchant, los scopes y las listas de IP permitidas.

Cada solicitud a la API de Tokeflow se autentica con una clave de API. La clave que presentas determina dos cosas a la vez: quién eres (la Organization o el Merchant al que pertenece la clave) y qué puedes hacer (los scopes concedidos a esa clave).

Tokeflow utiliza dos tipos de claves:

  • Claves secretas (sk_…) — acceso completo del lado del servidor. Se usan desde tu backend con el encabezado Authorization: Bearer.
  • Claves públicas (pk_…) — acceso restringido y seguro para el cliente. Las usa el Bridge SDK en el navegador para recopilar los datos de pago. Es seguro enviarlas al cliente.

Nunca expongas una clave secreta en código del lado del cliente. Las claves secretas otorgan acceso del lado del servidor a tu cuenta. Solo deben residir en tus servidores — nunca en JavaScript del navegador, aplicaciones móviles, repositorios públicos ni en nada que un usuario pueda inspeccionar. Si una clave secreta se filtra, revócala de inmediato en el Dashboard de Tokeflow. Usa una clave pública para cualquier cosa que se ejecute en un navegador.

El esquema Bearer

Las solicitudes del lado del servidor se autentican enviando tu clave secreta en el encabezado Authorization mediante el esquema Bearer:

Authorization: Bearer <secret_key>
curl https://api.tokeflow.com/api/v1/transactions \
  -H "Authorization: Bearer sk_live_mer_4f9a2c7e8b1d6035" \
  -H "Accept: application/json"

Carga las claves secretas desde variables de entorno o un gestor de secretos — nunca las escribas directamente en el código. Consulta Entornos y claves de API para saber cómo se emiten y rotan las claves live.

Todos los endpoints residen bajo https://api.tokeflow.com/api/v1. Para conocer el modelo completo de solicitud/respuesta y las convenciones, consulta la descripción general de la API.

Anatomía de una clave

Cada clave codifica su tipo, entorno y alcance en el prefijo. El formato es:

{sk|pk}_{environment}_{org|mer}_{random}

Ejemplo desglosado:

sk_live_mer_4f9a2c7e8b1d6035
│  │    │   └─ random — the unique, secret portion
│  │    └───── scope — org (Organization) or mer (Merchant)
│  └────────── environment — e.g. live
└───────────── key type — sk (secret) or pk (public)
SegmentValuesSignificado
Key typesk, pksk = secreta (lado del servidor). pk = pública (segura para el cliente).
Environmente.g. liveEl entorno en el que opera la clave.
Scopeorg, merorg = con alcance de Organization. mer = con alcance de Merchant.
Randomopaque stringLa porción secreta única. Trata toda la clave como información sensible.

Esto significa que puedes reconocer de un vistazo qué es una clave:

  • pk_live_org_… — clave pública de Organization
  • pk_live_mer_… — clave pública de Merchant
  • sk_live_org_… — clave secreta de Organization
  • sk_live_mer_… — clave secreta de Merchant

Solo el prefijo se te muestra de vuelta en el Dashboard y en las respuestas de la API (por ejemplo sk_live_mer_4f9a2c7e…). La clave completa se muestra exactamente una vez, en el momento de su creación. Guárdala de forma segura entonces — Tokeflow no puede volver a mostrarla.

Claves de Organization frente a claves de Merchant

Tokeflow es multiinquilino: una Organization gobierna uno o más Merchants (consulta Organizations y Merchants). Cada clave tiene alcance sobre exactamente una entidad, y ese alcance cambia la forma en que se direccionan los recursos específicos de cada merchant.

Clave de Merchant (…_mer_…)Clave de Organization (…_org_…)
ScopeUn único merchantTodos los merchants de la organización
Direccionamiento del merchantInferido automáticamente — no se necesita merchant_idDebe especificarse el merchant de destino mediante merchant_id
merchant_id en list/getNo se usa (se ignora)Parámetro de consulta, p. ej. ?merchant_id=mrc_…
merchant_id en createNo se usaCampo del cuerpo
Ideal paraEl propio backend de un único merchantOrquestación de plataforma / multimerchant

Clave de Merchant — el merchant se infiere

Una clave de Merchant ya está vinculada a un único merchant, por lo que nunca pasas un merchant_id. El siguiente ejemplo lista las transacciones de ese merchant:

curl "https://api.tokeflow.com/api/v1/transactions?limit=20" \
  -H "Authorization: Bearer sk_live_mer_4f9a2c7e8b1d6035" \
  -H "Accept: application/json"

Clave de Organization — identifica el merchant

Una clave de Organization abarca todos los merchants de la organización, por lo que para los recursos con alcance de merchant debes indicar a qué merchant te refieres. En las lecturas, pasa merchant_id como parámetro de consulta:

curl "https://api.tokeflow.com/api/v1/transactions?merchant_id=mrc_8a3f12d9&limit=20" \
  -H "Authorization: Bearer sk_live_org_2b7e91c4a0f53d68" \
  -H "Accept: application/json"

En las escrituras, pasa merchant_id en el cuerpo de la solicitud:

await fetch("https://api.tokeflow.com/api/v1/transactions", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.TOKEFLOW_ORG_SECRET_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    merchant_id: "mrc_8a3f12d9",
    amount: 15000, // minor units → R$150.00
    currency: "BRL",
    payment_method: "credit_card",
    // …
  }),
});

Con una clave de Organization, omitir merchant_id en una solicitud con alcance de merchant es un error del cliente y devuelve 400 validation_error. Con una clave de Merchant, cualquier merchant_id que envíes se ignora — el propio merchant de la clave siempre prevalece.

Scopes

Los permisos se expresan como scopes con el formato resource:action. A una clave se le concede una lista explícita de scopes cuando se crea en el Dashboard de Tokeflow, y una solicitud se autoriza únicamente si la clave lleva el scope que exige el endpoint.

Scopes comunes:

ScopeConcede
transactions:readListar y ver transacciones
transactions:writeCapturar y reembolsar transacciones
customers:read / customers:writeLeer / gestionar clientes
orders:read / orders:writeLeer / gestionar pedidos
products:read / products:writeLeer / gestionar productos del catálogo
offers:read / offers:writeLeer / gestionar ofertas y precios
checkout:read / checkout:writeLeer / gestionar sesiones de checkout
subscriptions:read / subscriptions:writeLeer / gestionar suscripciones
webhooks:read / webhooks:writeLeer / gestionar la configuración de webhooks
tokens:readLeer tokens del SDK
reports:readVer informes y analíticas
audit_logs:readListar y ver registros de auditoría

La división :read / :write te permite aplicar el mínimo privilegio: emite claves de solo lectura para cargas de trabajo de informes o analíticas, y reserva los scopes de escritura para los servicios que realmente crean o modifican recursos.

Crea una clave por cada carga de trabajo, con únicamente los scopes que esa carga de trabajo necesita. Las claves estrechas y de propósito único limitan el radio de impacto si alguna vez una clave se ve comprometida, y facilitan el análisis de los registros de auditoría.

Claves públicas: qué pueden hacer

Las claves públicas (pk_…) están diseñadas para incrustarse en el código del navegador. Están restringidas a un pequeño conjunto de scopes seguros para el cliente — las operaciones que el Bridge SDK necesita para recopilar datos de pago y crear tokens — y no pueden leer transacciones, emitir reembolsos ni acceder a ningún recurso exclusivo del servidor.

Debido a esas restricciones, las claves públicas se pueden exponer de forma segura en código del lado del cliente. El Bridge SDK presenta la clave pública mediante encabezados específicos del SDK en lugar del encabezado Authorization:

X-Public-Key: pk_live_mer_…
X-Session-Id: <uuid>
X-SDK-Version: <semver>

Normalmente nunca configuras estos encabezados tú mismo — el SDK los gestiona. Consulta la descripción general del Bridge SDK para más detalles.

Los datos de tarjeta recopilados en el navegador son capturados por los campos seguros de Tokeflow, que se ejecutan dentro de iframes aislados y de origen cruzado. Los datos de tarjeta se cifran en el navegador y nunca llegan a tus servidores — por lo que ni siquiera una clave pública totalmente expuesta puede usarse para leer los datos brutos de la tarjeta.

Listas de IP permitidas (endurecimiento opcional)

Para una capa adicional de defensa, puedes restringir una clave a un conjunto de IPs de origen configurando una lista de permitidos allowed_ips en la clave dentro del Dashboard de Tokeflow. Cuando se establece, las solicitudes desde cualquier otra IP se rechazan con 403 authorization_error, incluso si la clave y sus scopes son por lo demás válidos.

La lista de permitidos acepta:

  • Direcciones IPv4 / IPv6 exactas — 203.0.113.10, 2001:db8::1
  • Rangos CIDR — 203.0.113.0/24, 2001:db8::/32
  • Comodines para permitir todas las IPs — *, 0.0.0.0/0 o ::/0

Las listas de IP permitidas son más efectivas para las claves secretas utilizadas por servicios de backend con IPs de salida estables. Evita fijar IPs en claves públicas — los clientes de navegador se conectan desde muchas direcciones en constante cambio.

401 frente a 403

Tokeflow distingue los fallos de autenticación de los fallos de autorización:

  • 401 authentication_error — Tokeflow no pudo establecer quién eres. La clave falta, está mal formada, ha sido revocada o ha expirado.
  • 403 authorization_error — Tokeflow sabe quién eres, pero no tienes permiso para hacer esto. A la clave le falta el scope requerido, o la solicitud provino de una IP fuera de los allowed_ips de la clave.

Una clave faltante o inválida devuelve 401:

{
  "error": {
    "type": "authentication_error",
    "code": "INVALID_API_KEY",
    "message": "Invalid or expired API key",
    "details": {},
    "request_id": "req_8f3c9a1e2d40",
    "timestamp": "2026-01-15T12:30:00.000Z"
  }
}

Una clave válida a la que le falta el scope requerido (o que está bloqueada por la lista de IP permitidas) devuelve 403:

{
  "error": {
    "type": "authorization_error",
    "code": "INSUFFICIENT_SCOPE",
    "message": "This API key is not permitted to perform this action",
    "details": { "required_scope": "transactions:write" },
    "request_id": "req_3a7d10b9c2e8",
    "timestamp": "2026-01-15T12:30:00.000Z"
  }
}

Trata 401 y 403 de forma diferente en tu cliente. Un 401 significa corrige las credenciales (rota o vuelve a cargar la clave). Un 403 significa corrige los permisos — solicita el scope que falta, o comprueba el host que hace la llamada frente a la lista de IP permitidas de la clave. Nunca reintentes ninguno a ciegas.

Próximos pasos

En esta página