Claves de API

Crea, lista, desactiva y revoca claves de API de Tokeflow mediante programación: descubre los scopes asignables, fija las claves a listas de IP permitidas y rota las credenciales de forma segura.

Cada solicitud a la API de Tokeflow se autentica con una clave de API — una credencial vinculada exactamente a una entidad (una Organization o uno de sus Merchants) y a una lista explícita de scopes. Los endpoints de esta página gestionan esas claves mediante programación: crea una clave con scopes de privilegio mínimo, lista las existentes, pausa una clave temporalmente y revócala definitivamente. Todo lo que el Dashboard de Tokeflow hace con las claves, tu backend puede automatizarlo — útil para flujos de incorporación que generan una clave por Merchant, y para la rotación programada de credenciales.

Las claves vienen en dos tipos. Las claves secretas (sk_…) otorgan acceso del lado del servidor y se envían en el encabezado Authorization: Bearer; las claves públicas (pk_…) son seguras para el cliente y están restringidas a los scopes 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.

La clave completa se devuelve exactamente una vez. El campo api_key aparece solo en la respuesta de creación — Tokeflow almacena un hash, no la clave en sí, y no puede volver a mostrarla. Guárdala de inmediato en tu gestor de secretos. Toda respuesta posterior identifica la clave únicamente por su key_prefix, que no es secreto.

La gestión de claves está delimitada por entidad, no por Merchant. Donde la mayoría de los recursos usan un merchant_id, estos endpoints identifican su objetivo con el par entity_type + entity_id — porque una clave puede pertenecer a la propia Organization, y no solo a un Merchant. Una clave de Merchant solo ve y gestiona las claves de su propio Merchant.

Ciclo de vida y rotación de claves

Al rotar, crea y despliega siempre la clave de reemplazo antes de revocar la anterior — la revocación surte efecto de inmediato, y cualquier servicio que aún tenga la clave antigua comenzará a recibir 401 authentication_error.

El objeto de la clave de API

Todos los endpoints de esta página lo devuelven. La respuesta de creación además incluye api_key — el secreto completo — una única vez.

FieldTypeDescription
idstringIdentificador único de la clave de API, con el prefijo ak_.
entity_typestringTipo de entidad a la que pertenece la clave — organization o merchant.
entity_idstringID de la entidad propietaria (org_… o mrc_…).
namestringNombre legible para la clave.
key_prefixstringPrefijo 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.
scopesarrayScopes (permisos) otorgados a la clave.
allowed_ipsarray | nullDirecciones IP y rangos CIDR autorizados para usar la clave. null cuando la clave no tiene restricciones.
is_activebooleanIndica si la clave está activa. Las solicitudes con una clave inactiva fallan con 401 authentication_error.
expires_atstring | nullFecha de expiración (ISO 8601 UTC), o null si la clave nunca expira.
last_used_atstring | nullÚltima vez que se usó la clave, o null si nunca se ha usado.
created_atstringMarca de tiempo de creación (ISO 8601 UTC).
api_keystringLa clave de API real. Solo se devuelve en la creación.
key_hashstringHash 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 te indica si una clave realmente está en uso. Antes de revocar una clave que crees 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/api-keys

OrgMerchant

Auth: clave de Organization (todas las claves de la Organization; filtra con entity_type/entity_id) o clave de Merchant (sus propias claves). Scope: api_keys:read.

Devuelve una lista paginada de claves de API. Las Organizations pueden filtrar por entity_type y entity_id para ver las claves de un Merchant específico.

Parámetros de consulta

FieldTypeRequiredDescription
entity_typestringNoFiltra por tipo de entidad — organization o merchant.
entity_idstringConditionalFiltra por ID de entidad (p. ej., mrc_8a3f12d9). Obligatorio al filtrar por merchant.
pageintegerNoNúmero de página, indexado desde 1 (predeterminado 1, mínimo 1).
limitintegerNoElementos por página (predeterminado 20, mínimo 1, máximo 100).

Solicitud de ejemplo

curl -G https://api.tokeflow.com/api/v1/api-keys \
  -H "Authorization: Bearer sk_live_org_2b7e91c4a0f53d68" \
  --data-urlencode "entity_type=merchant" \
  --data-urlencode "entity_id=mrc_8a3f12d9" \
  --data-urlencode "page=1" \
  --data-urlencode "limit=20"

Respuesta de ejemplo — 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",
      "key_hash": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3"
    },
    {
      "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",
      "key_hash": "3c363836cf4e16666669a25da280a1865c2d2874"
    }
  ],
  "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. Consulta Paginación y filtrado para conocer el patrón general.


POST/api/v1/api-keys

OrgMerchant

Auth: clave de Organization (claves para sí misma o para cualquiera de sus Merchants) o clave de Merchant (solo sus propias claves). Scope: api_keys:write.

Crea una clave de API para una Organization o un Merchant. La respuesta es el único lugar donde se devuelve la clave completa (api_key).

Campos de la solicitud

FieldTypeRequiredDescription
namestringYesNombre legible para la clave (máximo 255 caracteres). Nómbrala según la carga de trabajo, p. ej., Checkout service (production).
scopesarray of stringsYesScopes para la clave — al menos uno. Deben ser válidos para la entidad y el tipo de clave de destino; descubre los valores asignables con GET /api-keys/scopes.
entity_typestringConditionalTipo de entidad a la que pertenece la clave — organization o merchant. Omítelo para crear una clave para la entidad autenticada; una clave de Organization envía merchant (con entity_id) para generar una clave para uno de sus Merchants.
entity_idstringConditionalID de la entidad a la que pertenece la clave (org_… o mrc_…). Envíalo junto con entity_type.
key_typestringNoTipo de clave a crear — secret (del lado del servidor, sk_…) o public (segura para el cliente, pk_…).
allowed_ipsarray of stringsNoDirecciones IP autorizadas para usar la clave — hasta 50 entradas, cada una de hasta 45 caracteres. Omite el campo por completo para no aplicar ninguna 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.
expires_atstringNoFecha de expiración de la clave (ISO 8601). Omítela para una clave que nunca expire.

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. Consulta Listas de IP permitidas para saber cuándo conviene restringir las IP.

Crea una clave por carga de trabajo, con solo los scopes que esa carga de trabajo necesita. Las claves acotadas y de propósito único limitan el radio de impacto si una clave se filtra, y hacen que el last_used_at de cada clave sea significativo al auditar o rotar.

Códigos de respuesta

CodeWhen
201 CreatedClave creada. El api_key en el cuerpo es tu única oportunidad de capturar la clave completa.
400 Bad RequestEntrada inválida — scope desconocido, allowed_ips malformado o vacío, o un expires_at incorrecto.
403 ForbiddenPermisos insuficientes — por ejemplo, una clave de Merchant que intenta crear una clave para otra entidad.

Solicitud de ejemplo

curl -X POST https://api.tokeflow.com/api/v1/api-keys \
  -H "Authorization: Bearer sk_live_org_2b7e91c4a0f53d68" \
  -H "Content-Type: application/json" \
  -d '{
    "entity_type": "merchant",
    "entity_id": "mrc_8a3f12d9",
    "name": "Checkout service (production)",
    "scopes": ["transactions:read", "transactions:write"],
    "allowed_ips": ["203.0.113.10", "198.51.100.0/24"],
    "key_type": "secret"
  }'

Respuesta de ejemplo — 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: escribe api_key directamente en tu gestor de secretos y mantén el cuerpo de la respuesta 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/api-keys/scopes

OrgMerchant

Auth: clave de Organization o clave de Merchant. Scope: api_keys:read.

Devuelve todos los scopes válidos que se pueden asignar a las claves de API. Filtra por entity_type (organization/merchant) y/o key_type (secret/public) para acotar los resultados a lo que una clave dada realmente podría llevar — útil para validar una lista de scopes antes de llamar a POST /api-keys, o para construir un formulario de creación de claves.

Parámetros de consulta

FieldTypeRequiredDescription
entity_typestringNoFiltra los scopes por tipo de entidad. Las claves de Merchant excluyen los scopes exclusivos de la Organization (merchants, organizations, team).
key_typestringNoFiltra los scopes por tipo de clave. Las claves públicas están restringidas a scopes seguros para el cliente (tokens, instruments, customers).

Solicitud de ejemplo

curl -G https://api.tokeflow.com/api/v1/api-keys/scopes \
  -H "Authorization: Bearer sk_live_org_2b7e91c4a0f53d68" \
  --data-urlencode "entity_type=organization" \
  --data-urlencode "key_type=secret"

Respuesta de ejemplo — 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": [
    "org:*",
    "org:transactions:*"
  ]
}

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 la entidad/tipo de clave solicitados — 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.


PATCH/api/v1/api-keys/:id

OrgMerchant

Auth: clave de Organization (cualquier clave de la Organization) o clave de Merchant (sus propias claves). Scope: api_keys:write.

Actualiza el estado de activación de una clave. Establece is_active en false para desactivar la clave — las solicitudes que la usen empezarán a fallar de inmediato con 401 authentication_error — o vuelve a true para reactivarla. Úsalo como el interruptor reversible; usa revocar cuando la clave no deba volver nunca.

Campos de la solicitud

FieldTypeRequiredDescription
is_activebooleanNoIndica si la clave de API está activa. false desactiva la clave; true la reactiva.

Solicitud de ejemplo

curl -X PATCH https://api.tokeflow.com/api/v1/api-keys/ak_9f2e6c81 \
  -H "Authorization: Bearer sk_live_org_2b7e91c4a0f53d68" \
  -H "Content-Type: application/json" \
  -d '{ "is_active": false }'

Respuesta de ejemplo — 200 OK

{
  "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": false,
  "expires_at": null,
  "last_used_at": "2026-08-11T18:22:04.000Z",
  "created_at": "2026-08-12T14:03:00.000Z",
  "key_hash": "6dcd4ce23d88e2ee9568ba546c007c63d9131c1b"
}

Se devuelve un 403 si la clave existe pero no pertenece a tu entidad, y un 404 si no existe.


POST/api/v1/api-keys/:id/revoke

OrgMerchant

Auth: clave de Organization (cualquier clave de la Organization) o clave de Merchant (sus propias claves). Scope: api_keys:write.

Revoca una clave de API, desactivándola de forma permanente. La revocación surte efecto de inmediato: toda solicitud que presente la clave revocada falla con 401 authentication_error. A diferencia de una desactivación mediante PATCH, una clave revocada queda retirada definitivamente — si la carga de trabajo aún necesita acceso, crea primero una clave de reemplazo.

Solicitud de ejemplo

curl -X POST https://api.tokeflow.com/api/v1/api-keys/ak_9f2e6c81/revoke \
  -H "Authorization: Bearer sk_live_org_2b7e91c4a0f53d68"

Respuesta de ejemplo — 200 OK

{
  "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": false,
  "expires_at": null,
  "last_used_at": "2026-08-11T18:22:04.000Z",
  "created_at": "2026-08-12T14:03:00.000Z",
  "key_hash": "6dcd4ce23d88e2ee9568ba546c007c63d9131c1b"
}

Se devuelve un 403 si la clave no pertenece a tu entidad, y un 404 si no existe.

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 y despliega primero la nueva clave, confirma que funciona y luego revoca la anterior.


Errores

Los errores usan el envoltorio estándar. Los casos más comunes para este recurso:

HTTPtypeTypical cause
400validation_errorScope desconocido, allowed_ips vacío o malformado, o name/scopes faltantes.
401authentication_errorClave de API ausente, inválida, desactivada o revocada en la propia solicitud.
403authorization_errorPermisos insuficientes, o la clave de destino no pertenece a tu entidad.
404not_found_errorClave de API no encontrada.
429rate_limit_errorLímite de solicitudes excedido — aplica un retroceso exponencial.

Consulta Errores para ver el envoltorio completo y el catálogo de tipos.

Relacionado

En esta página