Claves de API del Merchant
Enumera, crea y revoca las claves de API de un Merchant desde el Tokeflow Dashboard, y descubre qué scopes puede llevar cada tipo de clave.
Estos endpoints impulsan la pantalla de claves de API del Tokeflow Dashboard para un Merchant: enumerar las claves existentes, generar una nueva, consultar qué scopes puede llevar y revocar una clave que ya no deba funcionar. Las claves que gestionan son las mismas credenciales sk_… (secreta) y pk_… (pública) que tu integración presenta a la API pública — el Dashboard es simplemente la forma amigable de gestionarlas.
Las claves secretas otorgan acceso del lado del servidor y pertenecen a un gestor de secretos; las claves públicas son seguras para el cliente y están restringidas a lo que el Bridge SDK necesita en el navegador. Consulta Autenticación para conocer el modelo completo y Entornos y claves de API para saber cómo las claves codifican el entorno y la entidad en su prefijo.
Estos endpoints impulsan la interfaz del Tokeflow Dashboard. Se autentican por sesión (JWT bearer) — el token proviene de iniciar sesión en el Dashboard, no de una clave de API sk_/pk_. Toda solicitud también debe llevar el header x-merchant-id, que identifica al Merchant cuyas claves se están gestionando; el usuario con sesión iniciada debe ser miembro con acceso a ese Merchant. Para gestionar claves mediante programación desde tu backend, usa los endpoints públicos de claves de API.
Cómo funciona el flujo de la pantalla de claves
El endpoint de scopes alimenta el formulario de creación de claves: devuelve solo los scopes válidos para este Merchant y el tipo de clave elegido, de modo que el usuario nunca pueda seleccionar un scope que la clave no pudiera llevar. Después de la creación, la clave completa nunca se vuelve a mostrar — la lista identifica cada clave únicamente por su key_prefix.
El objeto de la clave de API
Se devuelve en la creación; el endpoint de listado devuelve el mismo objeto sin el secreto api_key, exclusivo de la creación.
| Field | Type | Description |
|---|---|---|
id | string | Identificador único de la clave de API, con el prefijo ak_. |
entity_type | string | Tipo de entidad a la que pertenece la clave — organization o merchant. Las claves creadas en esta superficie pertenecen a un merchant. |
entity_id | string | ID de la entidad propietaria (mrc_… para claves de Merchant). |
name | string | Nombre legible para la clave. |
key_prefix | string | Prefijo no secreto de la clave, usado para identificarla (p. ej., sk_live_mer_7d21). Es la única parte de la clave que se muestra después de la creación. |
scopes | array | Scopes (permisos) otorgados a la clave. |
allowed_ips | array | null | Direcciones IP y rangos CIDR autorizados para usar la clave. null cuando la clave no tiene restricciones. |
is_active | boolean | Indica si la clave está activa. Las solicitudes con una clave inactiva fallan la autenticación. |
expires_at | string | null | Fecha de expiración (ISO 8601 UTC), o null si la clave nunca expira. |
last_used_at | string | null | Última vez que se usó la clave, o null si nunca se ha usado. |
created_at | string | Marca de tiempo de creación (ISO 8601 UTC). |
api_key | string | La clave de API real. Solo se devuelve en la creación. |
key_hash | string | Hash del material de la clave, usado del lado del servidor para verificación. No es una credencial — no se puede usar para autenticar. |
last_used_at es la mejor señal del Dashboard sobre si una clave realmente está en uso. Antes de revocar una clave que parece inactiva, verifica que su last_used_at no se haya actualizado recientemente — un nombre desactualizado no garantiza que la clave lo esté.
Endpoints
GET/api/v1/merchant/api-keys
Auth: Dashboard session (JWT bearer). Se requiere membresía del Merchant.
Devuelve una lista paginada de las claves de API del Merchant — el Merchant se obtiene del header x-merchant-id.
Parámetros de consulta
| Field | Type | Required | Description |
|---|---|---|---|
page | number | No | Número de página, indexado desde 1 (predeterminado 1, mín. 1). |
limit | number | No | Elementos por página (predeterminado 20, mín. 1, máx. 100). |
Ejemplo de solicitud
curl -G https://api.tokeflow.com/api/v1/merchant/api-keys \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "x-merchant-id: mrc_8a3f12d9" \
--data-urlencode "page=1" \
--data-urlencode "limit=20"Ejemplo de respuesta — 200 OK
{
"data": [
{
"id": "ak_9f2e6c81",
"entity_type": "merchant",
"entity_id": "mrc_8a3f12d9",
"name": "Checkout service (production)",
"key_prefix": "sk_live_mer_7d21",
"scopes": ["transactions:read", "transactions:write"],
"allowed_ips": ["203.0.113.10", "198.51.100.0/24"],
"is_active": true,
"expires_at": null,
"last_used_at": "2026-08-11T18:22:04.000Z",
"created_at": "2026-03-02T09:15:00.000Z"
},
{
"id": "ak_5b0d3a47",
"entity_type": "merchant",
"entity_id": "mrc_8a3f12d9",
"name": "Storefront widget",
"key_prefix": "pk_live_mer_0c1d",
"scopes": ["tokens:read"],
"allowed_ips": null,
"is_active": false,
"expires_at": "2026-12-31T23:59:59.000Z",
"last_used_at": "2026-07-30T10:41:52.000Z",
"created_at": "2026-01-20T16:00:00.000Z"
}
],
"meta": {
"page": 1,
"limit": 20,
"total": 2,
"total_pages": 1,
"has_next": false,
"has_prev": false
}
}data contiene las claves de la página actual y meta los metadatos de paginación — avanza page mientras has_next sea true. La clave completa nunca se incluye aquí; cada clave se identifica por su key_prefix, que no es secreto.
POST/api/v1/merchant/api-keys
Auth: Dashboard session (JWT bearer). Se requiere membresía del Merchant.
Crea una clave de API para el Merchant identificado por x-merchant-id. La respuesta es el único lugar donde se devuelve la clave completa (api_key).
Campos de la solicitud
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Sí | Nombre legible para la clave (máximo 255 caracteres). Nómbrala según la carga de trabajo, p. ej., Checkout service (production). |
scopes | array of strings | Sí | Scopes para la clave — al menos uno. Deben ser válidos para este Merchant y el tipo de clave; carga los valores asignables con GET /merchant/api-keys/scopes. |
allowed_ips | array of strings | No | Direcciones IP autorizadas para usar la clave — hasta 50 entradas, cada una de hasta 45 caracteres. Omite el campo por completo para no tener restricción — un array vacío se rechaza, ya que se interpreta como una restricción pero no aplica ninguna. Consulta la nota siguiente para conocer los formatos aceptados. |
key_type | string | No | Tipo de clave a crear — secret (del lado del servidor, sk_…) o public (segura para el cliente, pk_…). |
expires_at | string | No | Fecha de expiración de la clave (ISO 8601). Omítela para una clave que nunca expire. |
entity_type | string | No | Tipo de entidad a la que pertenece la clave — organization o merchant. En esta superficie, omítelo o envía merchant. |
entity_id | string | No | ID de la entidad a la que pertenece la clave (p. ej., mrc_8a3f12d9). Omítelo para usar el Merchant de x-merchant-id. |
Formatos de allowed_ips. Las direcciones IPv4 deben tener notación decimal con puntos (203.0.113.10); las entradas CIDR deben estar en forma de red (192.168.1.0/24, no 192.168.1.5/24); se aceptan direcciones y rangos IPv6 (2001:db8::/32). Una entrada comodín — *, 0.0.0.0/0 o ::/0 — permite cualquier IP y no se puede combinar con direcciones específicas.
La clave completa se devuelve exactamente una vez. El campo api_key aparece solo en esta respuesta de creación — Tokeflow almacena un hash, no la clave en sí, y no puede volver a mostrarla. Cópiala en un gestor de secretos de inmediato; toda respuesta posterior identifica la clave únicamente por su key_prefix, que no es secreto.
Ejemplo de solicitud
curl -X POST https://api.tokeflow.com/api/v1/merchant/api-keys \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "x-merchant-id: mrc_8a3f12d9" \
-H "Content-Type: application/json" \
-d '{
"name": "Checkout service (production)",
"scopes": ["transactions:read", "transactions:write"],
"allowed_ips": ["203.0.113.10", "198.51.100.0/24"],
"key_type": "secret"
}'Ejemplo de respuesta — 201 Created
{
"id": "ak_9f2e6c81",
"entity_type": "merchant",
"entity_id": "mrc_8a3f12d9",
"name": "Checkout service (production)",
"key_prefix": "sk_live_mer_7d21",
"scopes": ["transactions:read", "transactions:write"],
"allowed_ips": ["203.0.113.10", "198.51.100.0/24"],
"is_active": true,
"expires_at": null,
"last_used_at": null,
"created_at": "2026-08-12T14:03:00.000Z",
"api_key": "sk_live_mer_7d21c39ab8e4f560",
"key_hash": "6dcd4ce23d88e2ee9568ba546c007c63d9131c1b"
}Trata esta respuesta como la credencial que contiene: muestra el api_key al usuario exactamente una vez y mantén el cuerpo fuera de los logs, los rastreadores de errores y las analíticas. De aquí en adelante, identifica la clave por su id y reconócela por su key_prefix.
GET/api/v1/merchant/api-keys/scopes
Auth: Dashboard session (JWT bearer). Se requiere membresía del Merchant.
Devuelve los scopes que se pueden asignar a las claves de API de este Merchant. Se excluyen los scopes exclusivos de la Organization. Filtra por key_type para obtener los scopes válidos para claves públicas o secretas — esto es lo que usa el formulario de creación de claves del Dashboard para completar su selector de scopes antes de llamar a POST /merchant/api-keys.
Parámetros de consulta
| Field | Type | Required | Description |
|---|---|---|---|
key_type | string | Sí | Tipo de clave para listar los scopes — secret o public. Las claves públicas están restringidas a scopes seguros para el cliente. |
Ejemplo de solicitud
curl -G https://api.tokeflow.com/api/v1/merchant/api-keys/scopes \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "x-merchant-id: mrc_8a3f12d9" \
--data-urlencode "key_type=secret"Ejemplo de respuesta — 200 OK (truncado)
{
"scopes": [
{
"scope": "transactions:read",
"description": "List and view transactions"
},
{
"scope": "transactions:write",
"description": "Create, capture, and refund transactions"
},
{
"scope": "customers:read",
"description": "List and view customers"
}
],
"wildcards": [
"transactions:*",
"customers:*"
]
}Cada elemento de scopes empareja la cadena del scope con una descripción legible. wildcards enumera las cadenas de scopes comodín válidas para esta entidad y tipo de clave — un comodín otorga todos los scopes que cubre, así que resérvalos para servicios de confianza y estrictamente controlados, y prefiere listas explícitas de scopes en todos los demás casos.
DELETE/api/v1/merchant/api-keys/:id
Auth: Dashboard session (JWT bearer). Se requiere membresía del Merchant.
Revoca una clave de API de forma permanente. La revocación surte efecto de inmediato: cualquier solicitud que presente la clave revocada falla la autenticación a partir de ese momento. No hay forma de deshacerlo — si la carga de trabajo aún necesita acceso, crea primero una clave de reemplazo.
Parámetros de ruta
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Sí | ID de la clave de API que se va a revocar (p. ej., ak_9f2e6c81). |
Ejemplo de solicitud
curl -X DELETE https://api.tokeflow.com/api/v1/merchant/api-keys/ak_9f2e6c81 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…" \
-H "x-merchant-id: mrc_8a3f12d9"Ejemplo de respuesta — 204 No Content
El cuerpo de la respuesta está vacío.
Si una clave secreta se filtra, revócala ahora mismo — antes de crear el reemplazo. Una breve interrupción de una carga de trabajo es un resultado mejor que dejar a un atacante con una credencial activa del lado del servidor. Para una rotación planificada (sin exposición), haz lo contrario: crea la nueva clave, despliégala, confirma que funciona y luego revoca la anterior.
Errores
Los casos más comunes para estos endpoints:
| HTTP | Typical cause |
|---|---|
400 | Entrada inválida — falta name o scopes, un scope desconocido, una lista allowed_ips vacía o malformada, o falta key_type en el endpoint de scopes. |
401 | Token de sesión del Dashboard ausente, inválido o expirado. |
403 | Con sesión iniciada, pero no es miembro con acceso al Merchant en x-merchant-id. |
404 | Clave de API no encontrada, o no pertenece a este Merchant. |
Consulta Errores para conocer el formato general de error usado en toda la API.
Relacionado
- Claves de API (API pública) — gestiona claves mediante programación desde tu backend, incluyendo pausar/reactivar.
- Autenticación — el esquema Bearer, los scopes y la anatomía de las claves.
- Entornos y claves de API — ciclo de vida de las claves, almacenamiento y prácticas de rotación.
- Errores — el envoltorio estándar de errores.