Docs

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.

Register a CLABE instrument
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.

Create Money Out transaction
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.
200 OK
{
  "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.

Retrieve a transaction
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"

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.
Note:

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.
400 Insufficient funds
{
  "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.