Dar de alta un beneficiario de dispersión
POST/beneficiariesProbar
La llamada la hace tu navegador, contra el servidor que elijas arriba. Si la documentación no está servida desde el mismo origen que la API, el navegador puede bloquear la respuesta por CORS: en ese caso abre estas páginas desde la propia API (/docs) o usa el curl de arriba.
const url = 'http://localhost:3000/v1/beneficiaries';const options = { method: 'POST', headers: {'x-api-key': '<x-api-key>', 'Content-Type': 'application/json'}, body: '{"fullName":"María Gómez","nationalId":"V12345678","bankCode":"0134","accountNumber":"01340000123456789012","phone":"04141234567"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url http://localhost:3000/v1/beneficiaries \ --header 'Content-Type: application/json' \ --header 'x-api-key: <x-api-key>' \ --data '{ "fullName": "María Gómez", "nationalId": "V12345678", "bankCode": "0134", "accountNumber": "01340000123456789012", "phone": "04141234567" }'Scope beneficiaries:write. El alta es idempotente por (cédula, banco, instrumento): reenviar los mismos datos devuelve el mismo beneficiario (created: false) en vez de duplicarlo.
phone hace falta SIEMPRE, también para transferencia: el riel de bolívares exige el móvil del beneficiario en los dos instrumentos, y un beneficiario sin teléfono falla al dispersar aunque se haya dado de alta sin problema. La transferencia necesita además accountNumber.
Se valida antes de gastar una llamada al riel:
-
cédula o RIF
V/E/J/G/P+ 6 a 9 dígitos (V12345678); -
bankCodede 4 dígitos, y del catálogo del instrumento que vas a usar (GET /payouts/banks?method=…); -
accountNumbersólo dígitos, de 16 a 20 —en la práctica venezolana son 20— y empieza por elbankCode; -
phoneen formato04XXXXXXXXX(obligatorio para dispersar por cualquiera de los dos instrumentos).
El rechazo más frecuente de un banco venezolano es que el nombre o la cédula no coincidan con el titular de esa cuenta o ese teléfono: manda el fullName tal como lo tiene el banco destino.
Authorizations
Sección titulada «Authorizations»Request Bodyrequired
Sección titulada «Request Bodyrequired»phone es necesario para dispersar por cualquiera de los dos instrumentos: el riel de bolívares exige el móvil del beneficiario también en transferencia. Para transferencia hace falta además accountNumber.
El alta acepta un beneficiario con sólo uno de los dos campos —no se rechaza— pero un beneficiario sin phone fallará al dispersar con beneficiary_missing_phone.
object
Nombre del titular TAL COMO lo tiene el banco destino
Cédula o RIF: V/E/J/G/P + 6 a 9 dígitos
Banco destino, 4 dígitos
Sólo dígitos, de 16 a 20 (en la práctica venezolana, 20), y debe empezar por el bankCode. Necesario para transferencia.
Móvil del beneficiario, formato 04XXXXXXXXX. Necesario para los DOS instrumentos, no sólo para pago móvil.
Examples
Abono en cuenta (transferencia) — el móvil también hace falta
{ "fullName": "María Gómez", "nationalId": "V12345678", "bankCode": "0134", "accountNumber": "01340000123456789012", "phone": "04141234567"}Pago móvil
{ "fullName": "José Marcano", "nationalId": "V18234112", "bankCode": "0138", "phone": "04141234567"}Responses
Sección titulada «Responses»Beneficiario (nuevo o ya existente)
object
Cuántas dispersiones le han llegado bien. Señal antifraude.
False si ya existía con esos datos
Example
{ "id": "8ade3e33-6f1c-4d0a-9d33-2c6b0a41f7e2", "full_name": "María Gómez", "national_id": "V12345678", "bank_code": "0134", "account_number": "01340000123456789012", "phone": "04141234567", "asset": "BS", "country": "VE", "status": "active", "payout_count": 0, "last_success_at": null, "last_failure_reason": null, "created_at": "2026-08-31T19:02:11.004Z", "created": true}Error con código estable
object
object
Contexto estructurado del error cuando lo hay: qué límite se superó y de cuánto, qué campo es inválido, cuánto saldo había. No aparece en errores internos.
object
Código ESTABLE. Programa contra esto.
Example
{ "error": { "type": "invalid_request_error", "code": "insufficient_balance", "request_id": "req_8a0312ba896772bc441134cd" }}Error con código estable
object
object
Contexto estructurado del error cuando lo hay: qué límite se superó y de cuánto, qué campo es inválido, cuánto saldo había. No aparece en errores internos.
object
Código ESTABLE. Programa contra esto.
Example
{ "error": { "type": "invalid_request_error", "code": "insufficient_balance", "request_id": "req_8a0312ba896772bc441134cd" }}Error con código estable
object
object
Contexto estructurado del error cuando lo hay: qué límite se superó y de cuánto, qué campo es inválido, cuánto saldo había. No aparece en errores internos.
object
Código ESTABLE. Programa contra esto.
Example
{ "error": { "type": "invalid_request_error", "code": "insufficient_balance", "request_id": "req_8a0312ba896772bc441134cd" }}