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ónLos 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ámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
alias | String | Sí | Identificador corto, único por negocio. Lo usarás para referenciar al beneficiario en tus instrucciones de dispersión. |
name | String | Sí | Nombre completo del titular de la cuenta. Se contrasta contra el nombre real de la cuenta bancaria durante la validación. |
clabe | String | Sí | CLABE 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. |
rfc | String | No | RFC del beneficiario. No se valida su formato — puedes omitirlo si no lo tienes al momento del alta. |
email | String | No | Correo electrónico de contacto. |
max_amount_limit | Integer | Sí | Monto 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 seguridadLa 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íncronaLa respuesta se recibe antes de que termine la validación de la cuenta. El beneficiario nace en
pending_validationy cambia de estado automáticamente al confirmarse (normalmente en menos de dos minutos). Sólo un beneficiario envalidated_activepuede recibir pagos.
max_amount_limitva en centavos, como enteroIgual que el
amountde una instrucción de dispersión,max_amount_limitse 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 responde422 invalid_max_amount_limit_format.
Errores:
| Código | Motivo |
|---|---|
422 Unprocessable Entity | Falta 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,,,3000000El 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 conmax_amount_limiten blanco se rechaza igual que un alta individual sin el campo — aparece enerrorscon 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 }
}
summarysolo trae el conteo porcode— 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ámetro | Descripción |
|---|---|
validation_status | Filtra 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_code | Filtra por código de banco SPEI a 3 dígitos. Uno o varios separados por coma. |
page | Número de página. Default 1. |
limit | Registros 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ón | Parámetros | Restricción de estado |
|---|---|---|
| Editar metadata | alias, rfc, email, max_amount_limit | Ninguna — funciona en cualquier validation_status, incluido pending_validation y rejected. |
| Cambiar estado | validation_status | Solo si el estado actual es validated_active o validated_inactive, y el nuevo valor también es uno de esos dos. |
| Reintentar validación | clabe, name | Solo 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ámetro | Descripción |
|---|---|
alias | Nuevo identificador. Debe seguir siendo único. |
rfc | RFC del beneficiario. |
email | Correo de contacto. |
validation_status | Solo validated_active o validated_inactive. Te permite pausar o reactivar a un beneficiario sin eliminarlo. |
max_amount_limit | Monto 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ímiteSi el nuevo
max_amount_limitqueda por debajo delamountde una instrucción de dispersión activa hacia ese beneficiario, la respuesta200incluyewarnings:{ "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á
skippeden 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 beneficiarioUn beneficiario
validated_inactivedeja 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 beneficiariopending_validationorejectedLa restricción de estado solo aplica al cambio de
validation_status. Puedes actualizaralias,rfco
Errores:
| Código | Motivo |
|---|---|
422 Unprocessable Entity | El 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ódigo | Motivo |
|---|---|
422 Unprocessable Entity | El 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 cambiaSi envías el mismo
clabe/nameque ya tenía, no se dispara una nueva validación. Y si la CLABE nueva ya está registrada en otro beneficiario tuyo, elPATCHresponde422(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ódigo | Motivo |
|---|---|
422 Unprocessable Entity | El beneficiario tiene instrucciones de dispersión activas. Elimina o pausa primero esas instrucciones. |
Un beneficiario
rejectedno admite activarse (no puedes llevarlo avalidated_active/validated_inactivevíavalidation_status), pero sí puedes editar sualias/rfc/aliasqueda liberado para que puedas registrar uno nuevo con el mismo identificador.
Related
- Resumen — Dispersiones a terceros vía SPEI — visión general del flujo completo.
- Tipos de dispersión — cómo asociar una instrucción de dispersión a un beneficiario ya validado.
- Seguimiento de dispersiones — cómo consultar el historial de pagos de un beneficiario.
- API Keys — Testing — cómo obtener tu llave de prueba.
Updated 4 days ago

