Fincore · Guides
Send money to a CLABE
Register a CLABE recipient and send Money Out over SPEI, with idempotent retries, high-value review and status handling.
Money Out sends funds from a Monato source instrument to a destination instrument. If the destination belongs to a Monato account, Fincore routes it internally through the same operation. See Internal transfers.
Flow
| Step | Action | Operation | Save |
|---|---|---|---|
| 1 | Retrieve the source account | Retrieve client accounts | Source instrumentId. |
| 2 | Register the destination | Register instrument | Destination instrument id. |
| 3 | Create the transaction | Create Money Out transaction | Transaction id, trackingId, initial status. |
| 4 | Receive the final status | Status update webhook | Final transaction state. |
1. Register the recipient
Get the destination bank id from Retrieve SPEI participants, then register the CLABE with Register instrument. Send customer_id if the instrument should belong to a Business Unit. Retrieve SPEI participants returns 401 if the bearer token is missing, expired, invalid, or not valid for the environment, and 500 for an unexpected server error.
curl -X POST https://apicore.stg.finch.lat/v1/clients/$CLIENT_ID/instruments \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source_bank_id": "9d84b03a-28d1-4898-a69c-38824239e2b1",
"client_id": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"type": "RECEIVER",
"rfc": "XAXX010101000",
"alias": "Supplier ABC",
"virtual_clabe": {
"destination_bank_id": "3054ff18-32a0-478d-b9fe-b5261f9a6e1f",
"account_number": "12345678901",
"clabe_number": "123456789012345678",
"holder_name": "Jane Doe"
}
}'| Field | Rule |
|---|---|
source_bank_id |
Required. Use the bankId of your source account. |
client_id |
Required. Your client UUID. |
type |
Required. RECEIVER for recipients; SENDER_RECEIVER only for instruments that can both send and receive. |
rfc |
Required. Up to 13 characters. If you don’t have it, send "ND". |
alias |
Required. A label for the instrument. |
virtual_clabe.destination_bank_id |
Required. The bank id from Retrieve SPEI participants. |
virtual_clabe.clabe_number |
Required. Exactly 18 digits. |
virtual_clabe.account_number |
Required. Account number without bank prefix, 10 to 12 digits. |
virtual_clabe.holder_name |
Required. Up to 40 characters. |
The response id is your destination_instrument_id. You can list instruments with List instruments (filter by customer_id, instrument_number, bank_id or instrument_name; paginate with page and per_page) and read one with Retrieve instrument.
| HTTP | Register instrument | List instruments | Retrieve instrument |
|---|---|---|---|
400 |
Required instrument fields are missing or malformed, or the instrument conflicts with an existing beneficiary. | Query parameters are malformed. | Path parameters are malformed. |
401 |
The bearer token is missing, expired, invalid, or not valid for the environment. | Same. | Same. |
404 |
Client, bank, or owner data was not found. | Instruments were not found for the supplied client. | The instrument was not found for the supplied client. |
500 |
Unexpected server error. | Same. | Same. |
Before sending production funds to a new account, you can confirm ownership with Penny Validation.
2. Create the transaction
Endpoint: POST /v1/transactions/money_out. Use the same endpoint for SPEI transfers and internal Monato transfers.
curl -X POST https://apicore.stg.finch.lat/v1/transactions/money_out \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
-d '{
"client_id": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"source_instrument_id": "709448c3-7cbf-454d-a87e-feb23801269a",
"destination_instrument_id": "d3fdb481-2058-46c8-807d-4eaf866ae1ec",
"transaction_request": {
"external_reference": "1234567",
"description": "Supplier payment",
"amount": "1.95",
"currency": "MXN"
}
}'| Field | Rule |
|---|---|
client_id, source_instrument_id, destination_instrument_id |
Required UUIDs. |
transaction_request.external_reference |
Required. Numeric, 1 to 7 digits. |
transaction_request.description |
Required. Payment concept, 40 characters or fewer. |
transaction_request.amount |
Required. String with exactly two decimals, 0.01 or more. |
transaction_request.currency |
Required. MXN. |
transaction_request.client_reference |
Optional. Your own reference; returned as clientReference. |
transaction_request.latitude, longitude |
Optional strings. |
{
"id": "16811ee8-1ef9-4dd4-8d84-9c2df89cf302",
"bankId": "9d84b03a-28d1-4898-a69c-38824239e2b1",
"clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"externalReference": "1234567",
"trackingId": "20250306FINCHVLIKQ5SKUM",
"description": "Supplier payment",
"amount": "1.95",
"currency": "MXN",
"category": "DEBIT_TRANS",
"subCategory": "SPEI_DEBIT",
"transactionStatus": "INITIALIZED",
"audit": {
"createdAt": "2025-03-06 11:57:55.408000-06:00",
"updatedAt": "2025-03-06 11:57:55.408000-06:00",
"deletedAt": "None",
"blockedAt": "None"
}
}subCategory shows how the transfer was routed: SPEI_DEBIT for an external transfer, INT_DEBIT for an internal transfer to a Monato account.
metadata is optional in standard Money Out responses. When Money Out is used for a 0.01 MXN Penny Validation, the response can include metadata.dataCep. See Validate a bank account.
Retry safely with Idempotency-Key
Always send an Idempotency-Key in production. It is optional, must be a UUID v5, and is kept for 24 hours. Reuse the same key with the exact same body for safe retries. See Idempotency for key generation.
| Scenario | Behavior |
|---|---|
No Idempotency-Key |
The request is processed normally, without retry protection. |
| Invalid key format | The request is rejected. |
| Same key, same body | The original response is returned. |
| Same key, different body | 409 conflict: Idempotency key does not match the request payload. |
| Same key while the first request is in progress | 409 conflict: Operation money_out in progress. |
Handle the status
The synchronous response confirms that Fincore accepted the request. It is not the final state. The final status arrives through the status update webhook and reports.
| Need | Where |
|---|---|
| Status values | Transaction statuses |
| Status webhook payload | Status update |
| Read the current status of one transaction | Retrieve a transaction |
| Daily and monthly reconciliation | Reports |
Webhooks are the primary signal. Use the read operation to reconcile a specific transaction, not as a polling loop.
curl https://apicore.stg.finch.lat/v1/clients/$CLIENT_ID/transactions/$TRANSACTION_ID \
-H "Authorization: Bearer $TOKEN"High-value review and trusted instruments
Transactions above $500,000.00 MXN are held for a manual operator review before they are sent to SPEI. If you pay the same trusted recipients repeatedly, add their instruments to a whitelist so those transactions skip the review. The threshold and the bypass apply to outbound SPEI payments. Whitelisting changes only the review step; every other Money Out rule still applies.
Add an instrument with Add an instrument to the trusted whitelist. There is no request body.
curl -X POST https://apicore.stg.finch.lat/v1/clients/$CLIENT_ID/instruments/$INSTRUMENT_ID/whitelist \
-H "Authorization: Bearer $TOKEN"{
"id": "8f14e45f-ceea-467a-9f0a-1b2c3d4e5f60",
"instrumentId": "d3fdb481-2058-46c8-807d-4eaf866ae1ec",
"clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"instrumentWhitelistStatus": "ACTIVE",
"audit": {
"createdAt": "2026-09-21T13:03:36.194761-06:00",
"updatedAt": "2026-09-21T13:03:36.194761-06:00"
}
}All of these are checked when you add an instrument. A rule failure returns 400 with FAILED_PRECONDITION and error code 20-E4120.
| Requirement | Detail |
|---|---|
| Valid identifiers | clientId and instrumentId must be well-formed UUIDs. |
| Belongs to the client | The instrument must be registered and active under your client. |
| Limit not reached | Maximum of 10 active whitelisted instruments per client, counted across all your instruments, not per instrument. |
| Minimum age | The instrument must have been created at least 72 hours ago. |
| Transaction history | The instrument must already be the destination of at least 3 liquidated transactions. |
The API has no operations to list or remove whitelisted instruments.
This operation is not idempotent. Adding an instrument that is already whitelisted returns 400 with Instrument in whitelist already exists. Check for that error instead of retrying blindly.
| HTTP | When it happens |
|---|---|
400 |
clientId or instrumentId is not a valid UUID, or a whitelist rule was not met: already whitelisted, 10-instrument limit reached, instrument less than 72 hours old, or fewer than 3 liquidated transactions. Rule failures use FAILED_PRECONDITION with error code 20-E4120. |
401 |
The bearer token is missing, expired, invalid, or not valid for the environment. |
404 |
No active instrument was found for the supplied client. |
500 |
Unexpected server error. |
Debit-card destinations
Use the same Money Out flow for debit-card destinations when the feature is enabled for your integration. See Send money to a debit card and Register instrument.
Errors
| HTTP | When it happens |
|---|---|
400 |
Validation failed: insufficient funds, inactive instruments, invalid amount, unsupported currency, invalid reference, invalid description, or missing required fields. |
401 |
The API key or bearer token is missing, expired, invalid, or not valid for the environment. |
404 |
Source instrument, destination instrument, client, bank or related account was not found. |
409 |
The same Idempotency-Key was reused with a different payload, or the original request is still in progress. |
500 |
Unexpected server error. |
{
"code": 9,
"message": "API Error",
"details": [
{
"reason": "FAILED_PRECONDITION",
"domain": "CORE",
"metadata": {
"error_detail": "The account does not have sufficient funds.",
"http_code": "400",
"error_code": "10-E4120"
}
}
]
}See the Error catalog for the error shape and other messages.
Refunds
Refunds apply to a payment you received, not to a Money Out you sent. See Refund a received payment.