https://api.veriko.mx/v1/beneficiariesCreate a beneficiary
How-to guide →Registers a new beneficiary account. The account type is auto-detected from the number's length, and which fields are required follows from it:
- 18 digits, CLABE:
bank_codeis derived from the prefix, and any value sent in the body is ignored. - 16 digits, card:
bank_codeis derived from the BIN. - 10 digits, phone (DiMo):
bank_codeis mandatory in the body, because the number alone does not identify the institution.
An account that already exists active is not duplicated: the response is 422 beneficiary_already_registered. If it exists but is archived, the request reactivates it and responds 200 with meta.reactivated=true, not 201. An integration that only inspects the 2xx range cannot tell the two cases apart; meta.reactivated is what separates them.
The account structure can be checked beforehand with GET /v1/beneficiaries/validate-account, which resolves the format without querying Banxico. The bank_code for a phone account comes from the catalogue at GET /v1/public/banks.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_number | string (pattern) | required | Account number. Accepted: 18-digit CLABE, 16-digit card (only 18, reserved for CLABE) or 10-digit DiMo phone. Separators (spaces, hyphens) are stripped before validation. e.g.012180004412345678 |
bank_code | string (pattern) | optional | 5-digit Banxico SPEI code. Required when the detected type is 40012 |
label | string (?–100) | optional | Optional free-form label. Sanitized with Proveedor ABC |
curl -X POST 'https://api.veriko.mx/v1/beneficiaries' \
-H 'Authorization: Bearer veriko_••••' \
-H 'Content-Type: application/json' \
-d '{
"account_number": "4111111111111111",
"label": "Tarjeta BBVA nómina"
}'Python example — coming soon.
JavaScript example — coming soon.
PHP example — coming soon.
| Field | Type | Description |
|---|---|---|
data | object | Main response payload. Shape varies by endpoint (object, array, or JSON:API envelope with |
type* | string | JSON:API resource type. Always beneficiary |
id* | string | Auto-increment numeric identifier of the beneficiary in the 42 |
attributes* | object | Canonical beneficiary attributes (recipient account data and record metadata). |
account_number* | string | Stored account number: 18-digit CLABE, 16-digit card, or 10-digit DiMo phone. Use 012180004412345678 |
account_type* | string | Auto-detected account type: clabe |
bank_code* | string | 5-digit Banxico code of the receiving bank, derived from the CLABE prefix, card BIN, or DiMo catalog. e.g.40012 |
bank_name* | string | Bank name resolved from the CLABE prefix, card BIN, or DiMo catalog. e.g.BBVA MEXICO |
label | string | nullnullable | User-assigned descriptive label. Proveedor ABC |
status* | string | Beneficiary status. active |
created_at* | string (date-time) | UTC creation timestamp. e.g.2026-01-15T10:00:00Z |
meta | object | Response metadata including API version, route prefix, unique request identifier, and the server timestamp in UTC. |
version | string | API version that processed the request. e.g.1.47.0 |
api_version | string | API route prefix version (e.g. v1 |
request_id | string | Unique request identifier (hex). e.g.a1b2c3d4e5f6 |
datetime | object | Companion descriptor present in every response's meta block (and in outgoing webhook payloads). Lets clients assert the timezone contract without re-reading the spec. e.g.{"timezone":"UTC","format":"ISO 8601"} |
timezone* | string | Always UTC |
format* | string | Always ISO 8601 |
links | object | Pagination or related links, present only when the endpoint returns a paginated collection. |
| Status | Class | Description | Body |
|---|---|---|---|
| 200 | 2xx | Beneficiary reactivated (an archived record existed for the same account_number). Includes meta.reactivated=true. | CreateBeneficiaryResponse |
| 201 | 2xx | Beneficiary created. | CreateBeneficiaryResponse |
| 400 | 4xx | The request body is empty or is not valid JSON. | ErrorResponse |
| 401 | 4xx | Authentication is required or the provided credentials are invalid. | ErrorResponse |
| 403 | 4xx | Insufficient permissions. | ErrorResponse |
| 413 | 4xx | The request body exceeds the maximum accepted size (body_too_large). | ErrorResponse |
| 422 | 4xx | The account failed validation, or the request hit a cap. Possible codes are account_number_required, invalid_account_length, clabe_prefix_not_recognized, bank_code_required_for_phone, beneficiary_already_registered, and plan_cap_exceeded — the last one when the account's plan sets a maximum number of beneficiaries and the request would exceed it. | ErrorResponse |
| Status | Code | Example |
|---|---|---|
| 400 | body_empty | The request body is empty. Envelope
|
| 400 | invalid_json | The body is not valid JSON. Envelope
|
| 401 | unauthorized | Invalid or missing authentication credentials. Envelope
|
| 403 | forbidden | You do not have permission to access this resource. Envelope
|
| 413 | body_too_large | The request body is too large. Envelope
|
| 422 | bank_code_required_for_phone | A `bank_code` is required to register a phone-type beneficiary. Envelope
|
| 422 | beneficiary_already_registered | A beneficiary with that account number already exists. Envelope
|
| 422 | clabe_prefix_not_recognized | The CLABE prefix does not match any SPEI participant. Envelope
|
| 422 | plan_cap_exceeded | The account's plan does not allow more beneficiaries. Envelope
|