Fincore · Reference
Webhook events
Fincore webhook types, how to register and manage them, how to respond, and the payload of every event.
Webhooks notify your system about asynchronous events: Money In, transaction status updates, CEP results, refunds and report availability.
webhook_type |
Event | Use |
|---|---|---|
MONEY_IN |
Money In | Incoming SPEI or internal credit. |
STATUS_UPDATE |
Status update | Money Out status changes. |
CEP |
CEP | Penny Validation result. See CEP statuses. |
REFUND |
Refund | A refund transaction was created. |
REPORT |
Report | A generated report file is available. |
Configure only the types your product flow needs. Register REFUND if you need to reconcile reversals you did not initiate.
Manage webhook configurations
All operations are scoped to your client and use Authorization: Bearer <token>.
| Action | Operation |
|---|---|
| Register a webhook | POST /v1/clients/{clientId}/webhooks |
| List webhooks | GET /v1/clients/{clientId}/webhooks |
| Retrieve a webhook | GET /v1/clients/{clientId}/webhooks/{id} |
| Update a webhook | PATCH /v1/clients/{clientId}/webhooks/{id} |
| Delete (soft-delete) a webhook | DELETE /v1/clients/{clientId}/webhooks/{id} |
curl -X POST https://apicore.stg.finch.lat/v1/clients/$CLIENT_ID/webhooks \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"client_id": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"url": "https://example.com/webhook",
"token": "'"$WEBHOOK_TOKEN"'",
"webhook_type": "MONEY_IN",
"auth_type": "AUTH"
}'| Field | Rule |
|---|---|
client_id |
Required. Your client UUID. |
url |
Required. Public HTTPS URL where Monato sends events. |
token |
Required. Secret sent by Monato in webhook delivery requests. Use a random value of at least 32 bytes. |
webhook_type |
Required. MONEY_IN, STATUS_UPDATE, CEP, REPORT or REFUND. |
auth_type |
Required. Authentication mode for delivery: AUTH, NO_AUTH or OAUTH. |
{
"id": "29806117-2b15-4682-87f0-350e6695fe91",
"clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"url": "https://example.com/webhook",
"webhookType": "MONEY_IN",
"webhookStatus": "ACTIVE",
"createdAt": "2025-04-03 13:40:54.056794-06:00",
"updatedAt": "2025-04-03 13:40:54.056794-06:00",
"deletedAt": null
}Registering fails with 400 if a field is missing or malformed, the URL does not meet delivery requirements, or a matching configuration already exists.
| HTTP | When it happens |
|---|---|
400 |
Create: required webhook fields are missing or malformed, or a matching webhook configuration already exists. List: request parameters are malformed. Update: webhook update fields are missing or malformed. |
401 |
The bearer token is missing, expired, invalid, or not valid for the environment. |
404 |
Retrieve, update, delete: the webhook configuration was not found for the supplied client. |
500 |
Create, list: unexpected server error. |
To update a webhook, send only the fields you want to change. At least one is required: url, token, webhook_status (ACTIVE or INACTIVE), and for OAuth delivery auth_client_id, auth_client_secret, auth_url, auth_scope and auth_audience.
curl -X PATCH https://apicore.stg.finch.lat/v1/clients/$CLIENT_ID/webhooks/$WEBHOOK_ID \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/new-webhook",
"webhook_status": "ACTIVE"
}'Respond to events
Your endpoint must return its HTTP response within 5 seconds of receiving a webhook request. This applies to every event type.
Finish the validations you need to accept or reject the event within that window. Persist the event safely before you acknowledge it, then do any remaining processing asynchronously. For external Money In, decide to accept or reject before you respond; see Receive money.
| Your response | Meaning |
|---|---|
200, 201, 202 |
Event received. |
422 |
Event received but rejected by your business validation. For external Money In, this can trigger refund behavior. |
The 422 status only appears in this direction, as a response your endpoint returns. Fincore itself does not return 422 on any request.
Security and deduplication
- Store webhook tokens securely. Do not expose them in logs or frontend code.
- Validate the event type (
msg_name) and the message identifier (id_msg) before processing. - Deduplicate by
id_msg. If an event was already processed correctly, return a success status again. - Never rely only on delivery order. Store the transaction ID and tracking key for reconciliation.
Event envelope
Money In, status update, CEP and refund events share the same envelope:
| Field | Description |
|---|---|
id_msg |
Unique message UUID. Use it for deduplication. |
msg_name |
Event name: MONEY_IN, STATUS_UPDATE, CEP or REFUND. |
msg_date |
Event date, YYYY-MM-DD. |
body |
Event payload. |
The report event is flat and does not use this envelope.
Every webhook request from Monato includes a required Authorization: Bearer <token> header.
Money In
Sent when funds arrive into one of your accounts, from an external SPEI credit or an internal (book-to-book) credit. Operation: webhookMoneyInPost. See Receive money for how to handle it.
{
"id_msg": "a7a126e8-fa74-411c-ad2b-b000f277bb0d",
"msg_name": "MONEY_IN",
"msg_date": "2025-04-02",
"body": {
"id": "0196da9a-8947-703e-9a3b-bf8c7d9f6059",
"beneficiary_account": "734180000000000001",
"beneficiary_name": "John Smith",
"beneficiary_rfc": "XAXX010101000",
"payer_account": "123456789012345678",
"payer_name": "Jane Doe",
"payer_rfc": "XAXX010101000",
"payer_institution": "40002",
"amount": "1500.00",
"transaction_date": "2025-04-02 10:14:05",
"tracking_key": "50118609TBRNZ00I07219647",
"payment_concept": "Payment for invoice 4567",
"numeric_reference": "2504021",
"sub_category": "SPEI_CREDIT",
"registered_at": "2025-04-02T10:14:05.915184-06:00",
"owner_id": "24f1e5d5-4045-4b1a-a0c4-5e6c6b1d44ef"
}
}body field |
Description |
|---|---|
id |
Required. Transaction UUID. |
beneficiary_account |
Required. Receiving account. |
beneficiary_name, beneficiary_rfc |
Beneficiary data. |
payer_account |
Required. Paying account. |
payer_name, payer_rfc |
Payer data. |
payer_institution |
Required. For SPEI, the Banxico institution code of the originating bank (for example 40002). For internal credits, the Monato internal institution code (for example 90734). |
amount |
Required. Amount credited, with two decimals. |
transaction_date |
When the transaction was registered in the rail, YYYY-MM-DD HH:MM:SS. |
tracking_key |
Required. Tracking key. |
payment_concept, numeric_reference |
Concept and numeric reference sent by the payer. |
sub_category |
Required. SPEI_CREDIT for an external SPEI credit, INT_CREDIT for an internal credit. |
registered_at |
When the transaction was persisted in Monato, ISO 8601 with timezone. |
owner_id |
Required. Owner of the destination instrument, for example the customer that owns the receiving account. |
INT_CREDIT events are emitted only when the credit is for a different owner than the initiator. Self-transfers under the same client_id and owner_id do not generate a MONEY_IN event.
| Your response | When to use it |
|---|---|
201 |
Recommended when you accept an external SPEI Money In. |
200 |
Technical acknowledgement, treated as equivalent to 201. |
202 |
Event persisted; your extra validations continue asynchronously. |
422 |
Rejected by your validation. Send {"refundReason": "..."}. For external SPEI credits, Monato refunds the transaction to the original source. Not applicable to INT_CREDIT. |
Status update
Sent when a Money Out transaction status changes. Operation: webhookStatusUpdatePost. Status values are listed in Transaction statuses.
{
"id_msg": "35066b9c-e1e3-4d1b-89e6-35c036a70b00",
"msg_name": "STATUS_UPDATE",
"msg_date": "2025-08-27",
"body": {
"id": "6fd78718-106c-485d-824d-f6c3e8133571",
"tracking_key": "20250827FINCH5CJS56XDFE",
"message_type": "SPEI",
"status": "LIQUIDATED",
"update_at": "2025-08-27T15:40:44.413078-06:00"
}
}body field |
Description |
|---|---|
id |
Transaction UUID. |
tracking_key |
Transaction tracking key for reconciliation. |
message_type |
Rail or message type associated with the update, for example SPEI. |
reason |
Machine-readable reason, when available, for example CANCELLED_ACCOUNT. |
reason_description |
Human-readable reason, when available, for example Cuenta cancelada. |
status |
New transaction status. |
update_at |
When the status update was generated. |
Respond 200 (received) or 202 (received, processing asynchronously). Return 422 if your system received the event but could not process it as valid.
CEP
Sent for Penny Validation transactions only (amount = 0.01 MXN), on every CEP status change except INITIALIZED, which may appear on API reads only and should be treated as PENDING. A single validation can produce several events before it reaches COMPLETED or FAILED. Operation: webhookCepPost. See CEP statuses.
{
"id_msg": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
"msg_name": "CEP",
"msg_date": "2025-08-15",
"body": {
"id": "11111111-2222-3333-4444-555555555555",
"tracking_key": "20250815XXXXXX123456789",
"beneficiary_account": "000000000000000000",
"beneficiary_name": "Jane Doe",
"beneficiary_rfc": "XAXX010101000",
"status": "DELAYED",
"processed_at": "2025-08-15T22:42:39.327Z"
}
}body field |
Description |
|---|---|
id |
Transaction ID of the Penny Validation. |
tracking_key |
Tracking key. |
beneficiary_account |
CLABE of the beneficiary. |
beneficiary_name |
Beneficiary name. |
beneficiary_rfc |
Beneficiary RFC, or null. |
status |
PENDING, DELAYED, COMPLETED or FAILED. |
processed_at |
When the CEP was finalized (COMPLETED or FAILED), or null. |
Respond 200 (accepted) or 202 (accepted, validating asynchronously). Return 422 if your system could not process the event as valid.
Refund
Sent when a refund transaction is created. There are two cases, and the second one is not triggered by you:
- You call Refund a transaction for a Money In.
- An outbound SPEI transfer is reversed by the banking network.
Operation: webhookRefundPost.
{
"id_msg": "f0b1c6de-6a3c-4f2e-9d47-1c0a5b7e2d38",
"msg_name": "REFUND",
"msg_date": "2026-09-21",
"body": {
"id": "0f1e2d3c-4b5a-6978-8796-a5b4c3d2e1f0",
"tracking_key": "20260921FINCHXXXXQ6RPX4",
"beneficiary_account": "734180000000000001",
"beneficiary_name": "Jane Doe",
"beneficiary_rfc": "XAXX010101000",
"payer_account": "734180000000000055",
"payer_name": "FINCO PAY",
"payer_rfc": "XAXX010101000",
"payer_institution": "90734",
"amount": "150.00",
"transaction_date": "2026-09-21 13:03:36",
"category": "CREDIT_TRANS",
"sub_category": "SPEI_REFUNDED_CREDIT",
"payment_concept": "Refund due to incorrect amount",
"numeric_reference": "1234567",
"original_transaction_id": "1eb4b5ac-71f6-4203-aded-4fcb7fd21637",
"original_transaction_tracking_id": "20260920FINCHZ43V14QILB",
"original_transaction_amount": "150.00"
}
}The body describes the refund transaction, not the original one. id and tracking_key belong to the refund. Use original_transaction_id and original_transaction_tracking_id to link it back to the transaction being refunded. Partial refunds are not supported, so amount always equals original_transaction_amount.
body field |
Description |
|---|---|
beneficiary_account |
CLABE receiving the refunded funds. |
payer_account, payer_name, payer_rfc, payer_institution |
The account the refund is sent from. |
transaction_date |
Creation timestamp of the refund transaction. |
category, sub_category |
Classification of the refund transaction. |
payment_concept |
Description of the refund. |
numeric_reference |
Numeric reference of the refund, or null. |
Respond 200 (accepted) or 202 (processing asynchronously). Return 422 if your system could not process the event as valid.
Report
Sent when a generated file is available for download: transaction reports or account statements, daily or monthly. Operation: webhookReportPost. This event is not wrapped in the envelope.
{
"client_id": "c2d1d1e3-3340-4170-980e-e9269bbbc551",
"file_type": "ACCOUNT_STATEMENT",
"period": "MONTHLY",
"file_name": "account_statement_1234567890_202602.csv",
"created_at": "2026-03-01T02:10:00Z",
"account_id": "1234567890"
}| Field | Description |
|---|---|
client_id |
Required. Client identifier. |
file_type |
Required. TRANSACTIONS or ACCOUNT_STATEMENT. |
period |
Required. DAILY or MONTHLY. |
file_name |
Required. Generated file name. Use it with Download a report file. |
created_at |
Required. When the file was generated, ISO 8601. |
account_id |
Only present when file_type is ACCOUNT_STATEMENT. |
Respond 200 (received) or 202 (processing asynchronously).