🚀 Lanzamiento v2.3: Activa y desactiva métodos de pago para tu Conekta Checkout desde el Panel, sin tocar tu código. Ver documentación →

Gestión de beneficiarios

Cómo crear, consultar, editar y eliminar beneficiarios para Dispersiones a terceros vía SPEI

Un beneficiario (payee) es el destinatario de los fondos que quieres dispersar. Antes de poder asociarle una instrucción de dispersión, el beneficiario debe pasar por una validación automática de cuenta.

Agregar API Keys y la versión de API

Necesitas tu API Key Privada. Puedes encontrarla en Panel en el módulo de Desarrolladores. Si requieres más información consulta API Keys — Testing.

Todas las llamadas requieren el header Accept: application/vnd.conekta-v2.3.0+json y tu API Key como Bearer token.

🚧

Sandbox vs. producción

Los ejemplos de esta página usan una API Key de prueba (key_ZLy4...). Usa una API Key de producción solo cuando estés listo para dispersar dinero real — ver API Keys — Production.

Crear un beneficiario

curl --request POST \
  --url https://api.conekta.io/payouts/payees \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB' \
  --header 'Content-Type: application/json' \
  --data '{
    "alias": "proveedor-norte",
    "name":  "Juan Pérez García",
    "clabe": "012180XXXXXXXXXXXX",
    "rfc":   "PEPJ800101AB1",
    "email": "[email protected]",
    "max_amount_limit": 2000000
  }'

Parámetros:

ParámetroTipoRequeridoDescripción
aliasStringIdentificador corto, único por negocio. Lo usarás para referenciar al beneficiario en tus instrucciones de dispersión.
nameStringNombre completo del titular de la cuenta. Se contrasta contra el nombre real de la cuenta bancaria durante la validación.
clabeStringCLABE interbancaria a 18 dígitos. Única por negocio: no puedes registrar la misma CLABE dos veces mientras el beneficiario original siga activo. Si eliminas ese beneficiario, su CLABE queda libre para volver a registrarla en uno nuevo.
rfcStringNoRFC del beneficiario. No se valida su formato — puedes omitirlo si no lo tienes al momento del alta.
emailStringNoCorreo electrónico de contacto.
max_amount_limitIntegerMonto máximo, en centavos MXN, que este beneficiario puede recibir por instrucción de dispersión (ej. 2000000 = $20,000.00). Sin tope — puedes definir cualquier entero positivo. Obligatorio y siempre debe ser un entero: si falta, o si viene con decimales o como string, la API responde 422 invalid_max_amount_limit_format en los tres casos. Ver Tipos de dispersión.

Respuesta 201 Created:

{
  "id": "payee_xxxxxx",
  "object": "external_payee",
  "created_at": 1716739200,
  "updated_at": 1716739200,
  "name": "Juan Pérez García",
  "alias": "proveedor-norte",
  "clabe": "012180XXXXXXXXXXXX",
  "bank_code": "012",
  "rfc": "PEPJ800101AB1",
  "email": "[email protected]",
  "validation_status": "pending_validation",
  "livemode": false,
  "max_amount_limit": 2000000
}

Nota de seguridad

La respuesta real de la API incluye la CLABE completa — Conekta la necesita para operar el SPEI. Este ejemplo la enmascara solo para esta documentación pública; no la registres en logs ni la muestres en interfaces de cliente sin enmascarar.

🚧

Validación asíncrona

La respuesta se recibe antes de que termine la validación de la cuenta. El beneficiario nace en pending_validation y cambia de estado automáticamente al confirmarse (normalmente en menos de dos minutos). Sólo un beneficiario en validated_active puede recibir pagos.

⚠️

max_amount_limit va en centavos, como entero

Igual que el amount de una instrucción de dispersión, max_amount_limit se manda y se recibe como número entero en centavos MXN (2000000 = $20,000.00) — nunca como string ni con decimales. Un valor que no sea entero responde 422 invalid_max_amount_limit_format.

Errores:

CódigoMotivo
422 Unprocessable EntityFalta un campo requerido, la CLABE tiene un formato o largo inválido, el alias ya existe, la CLABE ya está registrada para otro beneficiario de tu negocio (clabe_already_registered), o max_amount_limit falta o no es un entero (invalid_max_amount_limit_format).

Cargar beneficiarios en lote

Si necesitas dar de alta muchos beneficiarios a la vez, puedes subir un archivo CSV. Cada fila se procesa de forma asíncrona.

curl --request POST \
  --url https://api.conekta.io/payouts/payees/bulk \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB' \
  --header 'Content-Type: multipart/form-data' \
  --form '[email protected]'

Formato del CSV (el archivo debe incluir las columnas name, alias, clabe, rfc y max_amount_limit — si falta alguna, se rechaza el archivo completo con missing_columns; email es la única columna opcional. El valor de rfc sí puede venir vacío por fila, igual que es opcional en el POST individual; max_amount_limit necesita valor en cada fila):

name,alias,clabe,rfc,email,max_amount_limit
Juan Pérez García,proveedor-norte,012180XXXXXXXXXXXX,PEPJ800101AB1,[email protected],2000000
María López Ruiz,proveedor-sur,012180XXXXXXXXXXXX,,,3000000

El archivo real contiene la CLABE completa de cada beneficiario — trátalo como dato sensible: transmítelo por HTTPS (ya obligatorio en la API), no lo dejes en almacenamiento compartido sin cifrar, y bórralo de tu servidor una vez confirmado el enqueued. Una fila con max_amount_limit en blanco se rechaza igual que un alta individual sin el campo — aparece en errors con el motivo correspondiente, no se encola.

Respuesta 202 Accepted:

{ "enqueued": 2, "errors": [], "summary": {} }

Si alguna fila no pudo encolarse, se incluye en errors con el motivo y un code clasificable, y summary agrupa el conteo de errores por code:

{
  "enqueued": 1,
  "errors": [
    { "line": 2, "alias": "proveedor-sur", "error": "clabe has already been taken", "code": "clabe_already_registered" }
  ],
  "summary": { "clabe_already_registered": 1 }
}

summary solo trae el conteo por code — el texto de un resumen tipo "2 de 10 no se crearon porque..." lo arma tu integración a partir de ese conteo, no viaja armado desde la API.

Listar beneficiarios

curl --request GET \
  --url 'https://api.conekta.io/payouts/payees?validation_status=validated_active&limit=20' \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB'

Parámetros de consulta (opcionales):

ParámetroDescripción
validation_statusFiltra por estado. Uno o varios separados por coma: pending_validation, validated_active, validated_inactive, rejected. Devuelve 422 si algún valor no es válido.
bank_codeFiltra por código de banco SPEI a 3 dígitos. Uno o varios separados por coma.
pageNúmero de página. Default 1.
limitRegistros por página. Default 20, máximo 100.

Respuesta 200 OK:

{
  "data": [
    {
      "id": "payee_xxxxxx",
      "object": "external_payee",
      "name": "Juan Pérez García",
      "alias": "proveedor-norte",
      "clabe": "012180XXXXXXXXXXXX",
      "bank_code": "012",
      "rfc": "PEPJ800101AB1",
      "email": "[email protected]",
      "validation_status": "validated_active",
      "livemode": false
    }
  ],
  "pagination": {
    "pageIndex": 1,
    "totalPages": 3,
    "totalItems": 42,
    "itemsPerPage": 20,
    "hasPreviousPage": false,
    "hasNextPage": true
  }
}

Resumen de estados

Útil para mostrar en un dashboard cuántos beneficiarios tienes en cada estado.

curl --request GET \
  --url https://api.conekta.io/payouts/payees/summary \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB'
{
  "validated_active":   12,
  "pending_validation":  8,
  "validated_inactive":  6,
  "rejected":            4
}

Obtener un beneficiario

curl --request GET \
  --url https://api.conekta.io/payouts/payees/PAYEE_ID \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB'

Si el beneficiario está rejected, la respuesta incluye validation_rejection_reason con el motivo del rechazo.

Editar o activar/desactivar un beneficiario

Un mismo PATCH soporta tres operaciones independientes, que puedes combinar en el mismo request:

OperaciónParámetrosRestricción de estado
Editar metadataalias, rfc, email, max_amount_limitNinguna — funciona en cualquier validation_status, incluido pending_validation y rejected.
Cambiar estadovalidation_statusSolo si el estado actual es validated_active o validated_inactive, y el nuevo valor también es uno de esos dos.
Reintentar validaciónclabe, nameSolo si el estado actual es rejected — ver Reintentar la validación de un beneficiario rechazado abajo.

Editar metadata y cambiar estado no disparan una nueva validación de cuenta — reintentar validación sí, a propósito.

curl --request PATCH \
  --url https://api.conekta.io/payouts/payees/PAYEE_ID \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB' \
  --header 'Content-Type: application/json' \
  --data '{ "alias": "proveedor-norte-v2", "email": "[email protected]" }'

Parámetros (todos opcionales):

ParámetroDescripción
aliasNuevo identificador. Debe seguir siendo único.
rfcRFC del beneficiario.
emailCorreo de contacto.
validation_statusSolo validated_active o validated_inactive. Te permite pausar o reactivar a un beneficiario sin eliminarlo.
max_amount_limitMonto máximo, en centavos MXN, por instrucción hacia este beneficiario. Sin tope. Debe ser un entero — 422 invalid_max_amount_limit_format si no lo es.
📘

Advertencia no bloqueante al bajar el límite

Si el nuevo max_amount_limit queda por debajo del amount de una instrucción de dispersión activa hacia ese beneficiario, la respuesta 200 incluye warnings:

{ "warnings": [{ "code": "active_rule_amount_exceeds_new_limit", "rule_id": "6a188111ff51790001e279fb", "rule_amount": 50000 }] }

Es solo informativo — el límite se guarda igual. Esa instrucción quedará skipped en su próxima ejecución hasta que ajustes el límite o el monto de la regla — ver Límite máximo por beneficiario.

📘

Desactivar un beneficiario

Un beneficiario validated_inactive deja de recibir pagos automáticamente: sus instrucciones de dispersión siguen existiendo pero se omiten en el proceso nocturno. Es la forma recomendada de pausar pagos a alguien sin perder la configuración.

📘

Editar un beneficiario pending_validation o rejected

La restricción de estado solo aplica al cambio de validation_status. Puedes actualizar alias, rfc o email de un beneficiario sin importar en qué estado esté — incluido uno que todavía está en validación o que fue rechazado.

Errores:

CódigoMotivo
422 Unprocessable EntityEl validation_status actual del beneficiario no es validated_active ni validated_inactive, o el nuevo validation_status enviado no es uno de esos dos valores. Este error solo aplica al cambio de estado — nunca a la edición de alias/rfc/email.

Reintentar la validación de un beneficiario rechazado

Un beneficiario rejected (CLABE mala o name que no coincide con el titular de la cuenta) antes no tenía forma de corregirse — la única salida era eliminarlo y crear uno nuevo. Un PATCH con clabe y/o name sobre un beneficiario rejected lo regresa a pending_validation y lo vuelve a someter a validación desde cero.

curl --request PATCH \
  --url https://api.conekta.io/payouts/payees/PAYEE_ID \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB' \
  --header 'Content-Type: application/json' \
  --data '{ "clabe": "012180XXXXXXXXXXXX" }'

Respuesta 200 OK: el beneficiario con validation_status: "pending_validation" — sigue el mismo ciclo que un alta nueva, incluido el webhook payee.payout_method.updated cuando termine.

Errores:

CódigoMotivo
422 Unprocessable EntityEl beneficiario no está rejected (requires_rejected_status) — esta operación no aplica a ningún otro estado.
📘

Solo se re-somete si el valor realmente cambia

Si envías el mismo clabe/name que ya tenía, no se dispara una nueva validación. Y si la CLABE nueva ya está registrada en otro beneficiario tuyo, el PATCH responde 422 (clabe_already_registered) sin volver a someter nada a validación.

Eliminar un beneficiario

Elimina (soft delete) al beneficiario. Funciona en cualquier estado, salvo que tenga instrucciones de dispersión activas.

curl --request DELETE \
  --url https://api.conekta.io/payouts/payees/PAYEE_ID \
  --header 'Accept: application/vnd.conekta-v2.3.0+json' \
  --header 'Authorization: Bearer key_ZLy4TfHN2wM9pXqRkD8jV3sB'

Errores:

CódigoMotivo
422 Unprocessable EntityEl beneficiario tiene instrucciones de dispersión activas. Elimina o pausa primero esas instrucciones.

Un beneficiario rejected no admite activarse (no puedes llevarlo a validated_active/validated_inactive vía validation_status), pero sí puedes editar su alias/rfc/email, o eliminarlo. Al eliminarlo, su alias queda liberado para que puedas registrar uno nuevo con el mismo identificador.

Related


Did this page help you?