Merchants

Incorpora y gestiona los merchants de tu organization — crea, actualiza, desactiva o elimina merchants, revisa su historial de actividad y gestiona sus miembros e invitaciones.

Un merchant es un negocio que incorporas bajo tu organization. Todo recurso orientado a pagos en Tokeflow — clientes, transacciones, pedidos, catálogo, conectores — pertenece exactamente a un merchant, por lo que el merchant es la unidad de aislamiento para los datos, la configuración de enrutamiento y el alcance de las claves de API.

Esta página cubre la superficie de merchants a nivel de organization: listar e incorporar merchants, actualizar sus datos, retirarlos, consultar su historial de actividad y gestionar los miembros (usuarios del dashboard) de cada merchant. Crear un merchant también aprovisiona a su primer propietario: proporcionas un primary_email, y Tokeflow le envía a esa persona una invitación al dashboard del merchant.

Estos endpoints aceptan únicamente claves de API de Organization. Las claves de Merchant están limitadas a un único merchant y no pueden gestionar el listado de merchants — las llamadas con una clave de Merchant devuelven 403. Consulta Autenticación.

Ciclo de vida del merchant

Dos momentos del ciclo de vida merecen atención. Primero, una vez que un merchant está inscrito en las redes de tarjetas (para el aprovisionamiento de tokens de red), los campos enviados en la inscripción — name, website, mcc y la dirección — quedan fijos en las redes y ya no se pueden modificar mediante PATCH. Segundo, la eliminación está reservada para merchants creados por error: un merchant con cualquier actividad se conserva para fines de reporte y conciliación, y DELETE la rechaza con 409. Desactívalo en su lugar.

El objeto de merchant

FieldTypeDescription
idstringID único del merchant, con prefijo mrc_.
organization_idstringOrganization a la que pertenece este merchant, con prefijo org_.
namestringNombre del merchant.
slugstringSlug del merchant — identificador único y seguro para URL. Se genera automáticamente al crearse cuando no se proporciona.
external_referencestring | nullTu propia referencia/ID para este merchant, devuelta en las respuestas para fines de conciliación.
business_registration_numberstringNúmero de registro comercial (identificación fiscal — CNPJ, EIN, VAT).
mccstringMerchant Category Code (MCC), cuatro dígitos.
phone_numberstringNúmero de teléfono de contacto, en formato E.164. La entrada se acepta en cualquier formato legible por humanos y se normaliza antes de almacenarse, por lo que las respuestas siempre incluyen la forma canónica.
addressobjectDirección del merchant. Consulta El objeto de dirección.
websitestring | nullURL del sitio web oficial.
network_tokens_enabledbooleanSi el aprovisionamiento de network tokens está activado para las tarjetas guardadas bajo este merchant. Opt-in explícito, false por defecto; consulta Network tokens.
saved_card_checkout_enabledbooleanSi el servidor de este merchant puede pagar una sesión de checkout con la tarjeta guardada de un cliente (credencial almacenada del proveedor, sin CVV). Opt-in explícito, false por defecto; consulta Checkout con tarjeta guardada.
statusstringUno de los siguientes: active, inactive, suspended.
created_atstringMarca de tiempo de cuando se creó el merchant (ISO 8601 UTC).
updated_atstringMarca de tiempo de la última actualización del merchant (ISO 8601 UTC).

Estado del merchant

ValueMeaning
activeOperando con normalidad. Los merchants nuevos se crean en este estado.
inactiveDesactivado. Úsalo para retirar un merchant conservando sus registros para reportes.
suspendedBloqueado temporalmente por la organization.

Network tokens

Tokeflow puede aprovisionar un network token para cada tarjeta guardada bajo un merchant, de modo que las credenciales almacenadas sigan funcionando tras reemisiones y caducidades. El aprovisionamiento es un opt-in explícito por merchant: network_tokens_enabled es false para un merchant nuevo y no se aprovisiona nada hasta que lo pones en true mediante PATCH. Los tokens se facturan por aprovisionamiento, y el merchant debe estar inscrito antes en las redes de tarjetas (la inscripción ocurre automáticamente cuando website, mcc y la dirección están completos). Desactivar la bandera detiene los nuevos aprovisionamientos; las tarjetas guardadas siguen funcionando mediante las credenciales del proveedor conservadas en el registro, que es también lo que usan los cargos en un clic.

Checkout con tarjeta guardada

saved_card_checkout_enabled permite que tu servidor pague una sesión de checkout con una tarjeta que el cliente guardó antes — checkout_session_id más payment_instrument_id y credential_on_file: true en POST /transactions — en lugar de volver a pedir la tarjeta. Es false para todos los merchants hasta que lo pones en true mediante PATCH. Activarlo equivale a declarar que tu servidor autentica al cliente antes de identificarlo en una sesión: en una sesión, Tokeflow nunca ve al titular de la tarjeta, así que el cobro se apoya en tu inicio de sesión. Mientras está desactivado, cualquier uso de una tarjeta guardada en una sesión sin un card_ciphertext_id nuevo se rechaza con 400.

Configuraciones que Tokeflow puede anular

network_tokens_enabled y saved_card_checkout_enabled son configuraciones propias del merchant. Tokeflow también puede activar o desactivar cualquiera de las dos funciones para toda una organization o para un solo merchant — por ejemplo, mientras una función se está desplegando —, y esa configuración prevalece. Por eso, el valor que lees en el merchant es el que tú elegiste, y el comportamiento efectivo puede ser distinto. Una solicitud rechazada por una configuración de Tokeflow lo indica en su mensaje de error; para que la revisen, contacta al equipo de Tokeflow.

El objeto de dirección

FieldTypeDescription
line_1stringCalle y número.
line_2stringApartamento, oficina, etc. Opcional.
zip_codestringCódigo postal.
citystringCiudad.
statestringCódigo de estado/provincia.
countrystringCódigo de país ISO 3166-1 alfa-2, por ejemplo BR.

El objeto de miembro

Los miembros son los usuarios del dashboard de un merchant. Un miembro es una membresía: el vínculo entre una identidad de usuario (única por correo electrónico dentro de tu organization) y un merchant, con un rol. La misma persona puede tener membresías en varios merchants.

FieldTypeDescription
membership_idstringID de la membresía — identifica este vínculo de usuario con este merchant.
user_idstringID del usuario — la identidad subyacente, compartida entre las membresías del usuario.
emailstringCorreo electrónico del usuario.
namestringNombre visible del usuario.
rolestringRol dentro del merchant: owner, admin o viewer.
joined_atstringFecha en que el usuario se unió al merchant.
statusstringactive una vez aceptada la invitación, pending hasta entonces.
invitation_expires_atstring | nullCuándo expira la invitación pendiente; null cuando el miembro está active.

Endpoints

GET/api/v1/merchants

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:read.

Devuelve una lista paginada de los merchants pertenecientes a la organization autenticada. Permite filtrar por estado.

Parámetros de consulta

FieldTypeRequiredDescription
statusstringNoFiltrar por estado: active, inactive o suspended.
pageintegerNoNúmero de página, indexado desde 1 (predeterminado 1, mínimo 1).
limitintegerNoElementos por página (predeterminado 20, máximo 100).

Ejemplo de solicitud

curl -G https://api.tokeflow.com/api/v1/merchants \
  -H "Authorization: Bearer sk_live_org_…" \
  --data-urlencode "status=active" \
  --data-urlencode "page=1" \
  --data-urlencode "limit=20"

Ejemplo de respuesta — 200 OK

{
  "data": [
    {
      "id": "mrc_123",
      "organization_id": "org_123",
      "name": "John's Store",
      "slug": "johns-store",
      "external_reference": "internal_id_99",
      "business_registration_number": "12345678000199",
      "mcc": "5732",
      "phone_number": "+5511999990000",
      "address": {
        "line_1": "Av Paulista, 1000",
        "line_2": "Conj 42",
        "zip_code": "01310-100",
        "city": "São Paulo",
        "state": "SP",
        "country": "BR"
      },
      "website": "https://johnsstore.com.br",
      "network_tokens_enabled": false,
      "saved_card_checkout_enabled": false,
      "status": "active",
      "created_at": "2025-01-15T10:30:00Z",
      "updated_at": "2025-11-28T12:10:00Z"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 6,
      "total_pages": 1,
      "has_next": false,
      "has_prev": false
    }
  }
}

Consulta Paginación y filtrado para saber cómo recorrer todas las páginas.


POST/api/v1/merchants

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Incorpora un nuevo merchant bajo tu organization. El merchant se crea con estado active, y la persona en primary_email se convierte en su primer propietario: si ya existe un usuario con ese correo en tu organization, obtiene una membresía en el nuevo merchant; de lo contrario, se aprovisiona una identidad y se envía un correo de invitación para que pueda establecer una contraseña. Los correos se comparan sin distinguir mayúsculas de minúsculas.

Campos de la solicitud

FieldTypeRequiredDescription
namestringSíNombre comercial del merchant. Debe contener al menos un carácter alfanumérico.
primary_emailstringSíCorreo electrónico del propietario inicial del merchant. La dirección es la identidad — ver arriba.
primary_namestringNoNombre visible opcional para el propietario del merchant.
external_referencestringNoTu propia referencia/ID para este merchant.
business_registration_numberstringNoNúmero de registro comercial (CNPJ, EIN, VAT).
mccstringNoMerchant Category Code (MCC), cuatro dígitos (por ejemplo, 5732).
websitestringNoURL del sitio web del merchant. Obligatorio antes de poder crear sesiones 3DS para el merchant.
phone_numberstringNoNúmero de teléfono comercial en formato internacional.
addressobjectNoDirección comercial. Consulta El objeto de dirección.
slugstringNoSlug único para el merchant. Se genera automáticamente cuando no se proporciona.

Ejemplo de solicitud

curl -X POST https://api.tokeflow.com/api/v1/merchants \
  -H "Authorization: Bearer sk_live_org_…" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "John'\''s Store",
    "primary_email": "owner@johnsstore.com",
    "primary_name": "John Smith",
    "external_reference": "internal_id_99",
    "business_registration_number": "12345678000199",
    "mcc": "5732",
    "website": "https://johnsstore.com.br",
    "phone_number": "+55 11 99999-0000",
    "address": {
      "line_1": "Av Paulista, 1000",
      "zip_code": "01310-100",
      "city": "São Paulo",
      "state": "SP",
      "country": "BR"
    }
  }'

Ejemplo de respuesta — 201 Created

{
  "id": "mrc_123",
  "organization_id": "org_123",
  "name": "John's Store",
  "slug": "johns-store",
  "external_reference": "internal_id_99",
  "status": "active",
  "created_at": "2025-11-28T12:10:00Z"
}

La respuesta de creación es un recibo compacto. Obtén el objeto de merchant completo con GET /api/v1/merchants/:id. El propietario que aprovisionaste mediante primary_email aparece en la lista de miembros del merchant con rol owner y estado pending hasta que se acepte la invitación.


GET/api/v1/merchants/:id

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:read.

Recupera un único merchant perteneciente a la organization autenticada. Devuelve el objeto de merchant completo.

Ejemplo de solicitud

curl https://api.tokeflow.com/api/v1/merchants/mrc_123 \
  -H "Authorization: Bearer sk_live_org_…"

Ejemplo de respuesta — 200 OK

{
  "id": "mrc_123",
  "organization_id": "org_123",
  "name": "John's Store",
  "slug": "johns-store",
  "external_reference": "internal_id_99",
  "business_registration_number": "12345678000199",
  "mcc": "5732",
  "phone_number": "+5511999990000",
  "address": {
    "line_1": "Av Paulista, 1000",
    "line_2": "Conj 42",
    "zip_code": "01310-100",
    "city": "São Paulo",
    "state": "SP",
    "country": "BR"
  },
  "website": "https://johnsstore.com.br",
  "network_tokens_enabled": false,
  "saved_card_checkout_enabled": false,
  "status": "active",
  "created_at": "2025-01-15T10:30:00Z",
  "updated_at": "2025-01-15T10:30:00Z"
}

Se devuelve un 404 (not_found_error) si el merchant no existe o no pertenece a la organization autenticada.


PATCH/api/v1/merchants/:id

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Actualiza un merchant. Todos los campos del cuerpo son opcionales; solo se modifican los campos que envíes.

Una vez que el merchant está inscrito en las redes de tarjetas, los campos enviados en la inscripción — name, website, mcc y address — quedan fijos en las redes y ya no se pueden modificar; intentarlo devuelve 409 (conflict_error). status, phone_number, business_registration_number y external_reference siguen siendo editables durante toda la vida del merchant.

Campos de la solicitud

FieldTypeRequiredDescription
namestringNoNombre del merchant. Debe contener al menos un carácter alfanumérico. Bloqueado tras la inscripción en la red de tarjetas.
statusstringNoUno de los siguientes: active, inactive, suspended.
external_referencestringNoTu propia referencia/ID para este merchant.
business_registration_numberstringNoNúmero de registro comercial (CNPJ, EIN, VAT).
mccstringNoMerchant Category Code (MCC), cuatro dígitos. Bloqueado tras la inscripción en la red de tarjetas.
websitestringNoURL del sitio web del merchant. Obligatorio antes de poder crear sesiones 3DS para el merchant. Bloqueado tras la inscripción en la red de tarjetas.
phone_numberstringNoNúmero de teléfono comercial en formato internacional.
addressobjectNoDirección comercial. Consulta El objeto de dirección. Bloqueado tras la inscripción en la red de tarjetas.
network_tokens_enabledbooleanNoIncluye a este merchant (true) o lo excluye (false) del aprovisionamiento de network tokens para sus tarjetas guardadas. Consulta Network tokens.
saved_card_checkout_enabledbooleanNoIncluye a este merchant (true) o lo excluye (false) del pago de sesiones de checkout con la tarjeta guardada de un cliente. Debe ser un booleano JSON — la cadena "false" se rechaza. Consulta Checkout con tarjeta guardada.

Ejemplo de solicitud — desactivar un merchant

curl -X PATCH https://api.tokeflow.com/api/v1/merchants/mrc_123 \
  -H "Authorization: Bearer sk_live_org_…" \
  -H "Content-Type: application/json" \
  -d '{ "status": "inactive" }'

Ejemplo de respuesta — 200 OK

{
  "id": "mrc_123",
  "organization_id": "org_123",
  "name": "John's Store",
  "slug": "johns-store",
  "external_reference": "internal_id_99",
  "business_registration_number": "12345678000199",
  "mcc": "5732",
  "phone_number": "+5511999990000",
  "address": {
    "line_1": "Av Paulista, 1000",
    "line_2": "Conj 42",
    "zip_code": "01310-100",
    "city": "São Paulo",
    "state": "SP",
    "country": "BR"
  },
  "website": "https://johnsstore.com.br",
  "network_tokens_enabled": false,
  "saved_card_checkout_enabled": false,
  "status": "inactive",
  "created_at": "2025-01-15T10:30:00Z",
  "updated_at": "2025-11-28T14:00:00Z"
}

DELETE/api/v1/merchants/:id

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Elimina permanentemente un merchant que nunca se haya usado — sin transacciones, pedidos, clientes, catálogo, métodos de pago guardados, claves de API activas ni inscripción en la red de tarjetas. Cualquier otro caso se rechaza con 409, porque los merchants con actividad se conservan para fines de reporte y conciliación.

Este endpoint existe para el caso de un merchant creado por error — espera que el rechazo sea el resultado más común. Para retirar un merchant que ya tiene historial, establece su estado como inactive con PATCH en su lugar.

Ejemplo de solicitud

curl -X DELETE https://api.tokeflow.com/api/v1/merchants/mrc_123 \
  -H "Authorization: Bearer sk_live_org_…"

Códigos de respuesta

CodeWhen
204 No ContentMerchant eliminado. Sin cuerpo en la respuesta.
404 Not FoundEl merchant no existe o no es tuyo.
409 ConflictEl merchant tiene actividad o está inscrito en las redes de tarjetas. Desactívalo en su lugar.

GET/api/v1/merchants/:id/activity

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:read.

Recupera el historial de actividad paginado de un merchant perteneciente a la organization autenticada. Cada registro describe una acción administrativa realizada sobre el merchant — qué cambió, quién lo hizo y cuándo — lo que convierte a este endpoint en el complemento de auditoría de los endpoints anteriores.

Parámetros de consulta

FieldTypeRequiredDescription
pageintegerNoNúmero de página, indexado desde 1 (predeterminado 1, mínimo 1).
limitintegerNoElementos por página (predeterminado 20, máximo 100).

Ejemplo de solicitud

curl -G https://api.tokeflow.com/api/v1/merchants/mrc_123/activity \
  -H "Authorization: Bearer sk_live_org_…" \
  --data-urlencode "page=1" \
  --data-urlencode "limit=20"

Devuelve 200 OK con una lista paginada de registros de actividad, o 404 si el merchant no existe o no pertenece a tu organization.


GET/api/v1/merchants/:merchant_id/members

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:read.

Enumera los usuarios con alcance en un merchant específico. Devuelve un array paginado de objetos de miembro, incluidas las invitaciones pendientes.

Parámetros de consulta

FieldTypeRequiredDescription
pageintegerNoNúmero de página, indexado desde 1 (predeterminado 1, mínimo 1).
limitintegerNoElementos por página (predeterminado 20, máximo 100).

Ejemplo de solicitud

curl -G https://api.tokeflow.com/api/v1/merchants/mrc_123/members \
  -H "Authorization: Bearer sk_live_org_…" \
  --data-urlencode "page=1" \
  --data-urlencode "limit=20"

Ejemplo de respuesta — 200 OK

{
  "data": [
    {
      "membership_id": "mum_5e8d21",
      "user_id": "usr_3c9f10",
      "email": "owner@johnsstore.com",
      "name": "John Smith",
      "role": "owner",
      "joined_at": "2025-11-28T12:10:00Z",
      "status": "active",
      "invitation_expires_at": null
    },
    {
      "membership_id": "mum_7a4b90",
      "user_id": "usr_b81c22",
      "email": "team@johnsstore.com",
      "name": "team@johnsstore.com",
      "role": "admin",
      "joined_at": "2025-12-01T09:00:00Z",
      "status": "pending",
      "invitation_expires_at": "2025-12-08T09:00:00Z"
    }
  ],
  "meta": {
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 2,
      "total_pages": 1,
      "has_next": false,
      "has_prev": false
    }
  }
}

POST/api/v1/merchants/:merchant_id/members

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Invita a un usuario a un merchant por correo electrónico. Tokeflow busca o crea la identidad del usuario dentro de tu organization y agrega una membresía en el merchant con el rol indicado, luego envía un correo de invitación para que el destinatario pueda establecer una contraseña. Si la persona ya tiene una identidad en tu organization (de otro merchant, por ejemplo), esa identidad se reutiliza — la dirección de correo electrónico es la identidad.

Campos de la solicitud

FieldTypeRequiredDescription
emailstringSíCorreo electrónico del usuario a invitar al merchant.
rolestringSíRol a asignar dentro del merchant: owner, admin o viewer.
namestringNoNombre visible opcional (usa el correo electrónico de forma predeterminada).

Ejemplo de solicitud

curl -X POST https://api.tokeflow.com/api/v1/merchants/mrc_123/members \
  -H "Authorization: Bearer sk_live_org_…" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "team@johnsstore.com",
    "name": "Store Team",
    "role": "admin"
  }'

Ejemplo de respuesta — 201 Created

{
  "membership_id": "mum_7a4b90",
  "user_id": "usr_b81c22",
  "email": "team@johnsstore.com",
  "name": "Store Team",
  "role": "admin",
  "joined_at": "2025-12-01T09:00:00Z",
  "status": "pending",
  "invitation_expires_at": "2025-12-08T09:00:00Z"
}

El miembro permanece pending hasta que se acepte la invitación. Si expira antes, reenvíala.


PATCH/api/v1/merchants/:merchant_id/members/:membership_id

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Actualiza el rol de un usuario dentro de un merchant.

Campos de la solicitud

FieldTypeRequiredDescription
rolestringSíNuevo rol para el miembro: owner, admin o viewer.

Ejemplo de solicitud

curl -X PATCH https://api.tokeflow.com/api/v1/merchants/mrc_123/members/mum_7a4b90 \
  -H "Authorization: Bearer sk_live_org_…" \
  -H "Content-Type: application/json" \
  -d '{ "role": "viewer" }'

Devuelve 204 No Content en caso de éxito. Sin cuerpo en la respuesta.


DELETE/api/v1/merchants/:merchant_id/members/:membership_id

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Elimina a un usuario de un merchant. Solo se elimina la membresía — la identidad de usuario subyacente conserva cualquier membresía que tenga en otros merchants de tu organization.

Ejemplo de solicitud

curl -X DELETE https://api.tokeflow.com/api/v1/merchants/mrc_123/members/mum_7a4b90 \
  -H "Authorization: Bearer sk_live_org_…"

Devuelve 204 No Content en caso de éxito. Sin cuerpo en la respuesta.


POST/api/v1/merchants/:merchant_id/members/:membership_id/resend

OrgMerchant

Autenticación: solo clave de Organization. Alcance: merchants:write.

Reenvía una invitación pendiente del merchant. El token de la invitación y su vencimiento se rotan — el enlace anterior del correo deja de funcionar — y se envía nuevamente el correo de invitación. Devuelve 409 (conflict_error) si el usuario ya la aceptó.

Ejemplo de solicitud

curl -X POST https://api.tokeflow.com/api/v1/merchants/mrc_123/members/mum_7a4b90/resend \
  -H "Authorization: Bearer sk_live_org_…"

Ejemplo de respuesta — 200 OK

{
  "membership_id": "mum_7a4b90",
  "user_id": "usr_b81c22",
  "email": "team@johnsstore.com",
  "name": "Store Team",
  "role": "admin",
  "joined_at": "2025-12-01T09:00:00Z",
  "status": "pending",
  "invitation_expires_at": "2025-12-15T10:00:00Z"
}

Observa el invitation_expires_at actualizado — la cuenta regresiva se reinicia a partir del reenvío.


Errores

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

HTTPtypeTypical cause
400validation_errorFalta un campo obligatorio, mcc con formato incorrecto, o un name sin caracteres alfanuméricos.
401authentication_errorClave de API ausente o inválida.
403authorization_errorSe usó una clave de Merchant — esta superficie requiere una clave de Organization — o a la clave le falta el alcance necesario.
404not_found_errorMerchant (o membresía) no encontrado o no perteneciente a tu organization.
409conflict_errorEliminar un merchant con actividad, modificar un campo bloqueado por la red tras la inscripción, o reenviar una invitación ya aceptada.

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

Relacionados

En esta página