Webhooks notify your system about asynchronous events such as Money In, transaction status updates, CEP results, and report availability.
This guide includes the webhook configuration and event contracts.
| Step | Action | OpenAPI contract |
|---|---|---|
| 1 | Configure a webhook URL | Create webhook configuration |
| 2 | List configured webhooks | List webhook configurations |
| 3 | Retrieve one webhook | Retrieve webhook configuration |
| 4 | Update a webhook | Update webhook configuration |
| 5 | Delete a webhook | Delete webhook configuration |
| Event | Use | OpenAPI contract |
|---|---|---|
| Money In | Incoming SPEI or internal credit. | Money In webhook event |
| Status update | Money Out status changes. | Status update webhook event |
| CEP | Penny Validation result. Status values and transitions are documented in CEP Statuses. | CEP webhook event |
| Refund | A refund transaction was created. | Refund webhook event |
| Report | Generated report file available. | Report webhook event |
Your endpoint must return its HTTP response within 5 seconds of receiving a webhook request. This maximum response time applies to Money In, status update, CEP, refund, and report webhooks.
Complete the validations required to accept or reject the event within this window. Before acknowledging acceptance, persist the event safely; then perform any remaining processing asynchronously. For external Money In, make the acceptance or rejection decision before responding, as described in the Money In guide.
| 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. |
Store webhook secrets securely. Do not expose them in logs or frontend code.
Validate the event type and message identifier before processing. Use the message identifier for deduplication.
Endpoint: POST /v1/clients/{clientId}/webhooks
Bearer token returned by the authentication flow.
Client UUID for which the webhook is being registered.
Client UUID that owns the webhook configuration.
Public HTTPS URL where Monato sends webhook events.
Secret sent by Monato in webhook delivery requests. Use a random value of at least 32 bytes.
Type of event delivered to this webhook.
Authentication mode used when Monato delivers webhook events.
- Staginghttps://apicore.stg.finch.lat/v1/clients/{clientId}/webhooks
{ "client_id": "c2d1d1e3-3340-4170-980e-e9269bbbc551", "url": "https://example.com/webhook", "token": "secretToken0123", "webhook_type": "MONEY_IN", "auth_type": "AUTH" }
Webhook configuration UUID.
Client UUID that owns the webhook.
Destination URL where Monato sends webhook events.
Type of events delivered to this webhook.
Current webhook lifecycle status.
Secret configured for webhook delivery.
Timestamp when the webhook configuration was created.
Timestamp when the webhook configuration was last updated.
Timestamp when the webhook configuration was deleted, or null.
Timestamp when the webhook configuration was blocked, or null.
Identifier of the actor that deleted the webhook, or null.
Identifier of the actor that blocked the webhook, or null.
{ "id": "29806117-2b15-4682-87f0-350e6695fe91", "clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551", "url": "https://example.com/webhook", "token": "secretToken0123", "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, "blockedAt": null, "deletedBy": null, "blockedBy": null }
| Error | When it happens |
|---|---|
400 | Required webhook fields are missing or malformed, or a matching webhook configuration already exists. |
401 | The bearer token is missing, expired, invalid, or not valid for the environment. |
500 | Unexpected server error. |
Endpoint: GET /v1/clients/{clientId}/webhooks
Bearer token returned by the authentication flow.
Client UUID that owns the webhooks.
No request body.
- Staginghttps://apicore.stg.finch.lat/v1/clients/{clientId}/webhooks
// No request payloadCurrent page number.
Number of webhook configurations returned per page.
Total number of webhook configurations matching the request.
Webhook configurations returned for the client.
{ "currentPage": 0, "perPage": 50, "totalItem": 2, "data": [null] }
| Error | When it happens |
|---|---|
400 | Request parameters are malformed. |
401 | The bearer token is missing, expired, invalid, or not valid for the environment. |
500 | Unexpected server error. |
Endpoint: GET /v1/clients/{clientId}/webhooks/{webhookId}
Bearer token returned by the authentication flow.
Client UUID that owns the webhook.
Webhook UUID.
No request body.
- Staginghttps://apicore.stg.finch.lat/v1/clients/{clientId}/webhooks/{id}
// No request payloadWebhook configuration UUID.
Client UUID that owns the webhook.
Destination URL where Monato sends webhook events.
Type of events delivered to this webhook.
Current webhook lifecycle status.
Secret configured for webhook delivery.
Timestamp when the webhook configuration was created.
Timestamp when the webhook configuration was last updated.
Timestamp when the webhook configuration was deleted, or null.
Timestamp when the webhook configuration was blocked, or null.
Identifier of the actor that deleted the webhook, or null.
Identifier of the actor that blocked the webhook, or null.
{ "id": "29806117-2b15-4682-87f0-350e6695fe91", "clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551", "url": "https://example.com/webhook", "token": "secretToken0123", "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, "blockedAt": null, "deletedBy": null, "blockedBy": null }
| Error | When it happens |
|---|---|
401 | The bearer token is missing, expired, invalid, or not valid for the environment. |
404 | The webhook configuration was not found for the supplied client. |
Endpoint: PATCH /v1/clients/{clientId}/webhooks/{webhookId}
Bearer token returned by the authentication flow.
Client UUID that owns the webhook.
Webhook UUID.
New delivery URL for the webhook.
New secret used to authenticate webhook delivery.
New webhook lifecycle status.
OAuth client identifier used when auth_type is OAUTH.
OAuth client secret used when auth_type is OAUTH.
OAuth token endpoint used for webhook delivery authentication.
OAuth scopes requested for webhook delivery authentication.
OAuth audience requested for webhook delivery authentication.
- Staginghttps://apicore.stg.finch.lat/v1/clients/{clientId}/webhooks/{id}
{ "url": "https://example.com/new-webhook", "webhook_status": "ACTIVE" }
Webhook configuration UUID.
Client UUID that owns the webhook.
Destination URL where Monato sends webhook events.
Type of events delivered to this webhook.
Current webhook lifecycle status.
Secret configured for webhook delivery.
Timestamp when the webhook configuration was created.
Timestamp when the webhook configuration was last updated.
Timestamp when the webhook configuration was deleted, or null.
Timestamp when the webhook configuration was blocked, or null.
Identifier of the actor that deleted the webhook, or null.
Identifier of the actor that blocked the webhook, or null.
{ "id": "29806117-2b15-4682-87f0-350e6695fe91", "clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551", "url": "https://example.com/webhook", "token": "secretToken0123", "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, "blockedAt": null, "deletedBy": null, "blockedBy": null }
| Error | When it happens |
|---|---|
400 | Webhook update fields are missing or malformed. |
401 | The bearer token is missing, expired, invalid, or not valid for the environment. |
404 | The webhook configuration was not found for the supplied client. |
Endpoint: DELETE /v1/clients/{clientId}/webhooks/{webhookId}
Bearer token returned by the authentication flow.
Client UUID that owns the webhook.
Webhook UUID.
No request body.
- Staginghttps://apicore.stg.finch.lat/v1/clients/{clientId}/webhooks/{id}
// No request payloadWebhook configuration UUID.
Client UUID that owns the webhook.
Destination URL where Monato sends webhook events.
Type of events delivered to this webhook.
Current webhook lifecycle status.
Secret configured for webhook delivery.
Timestamp when the webhook configuration was created.
Timestamp when the webhook configuration was last updated.
Timestamp when the webhook configuration was deleted, or null.
Timestamp when the webhook configuration was blocked, or null.
Identifier of the actor that deleted the webhook, or null.
Identifier of the actor that blocked the webhook, or null.
{ "id": "29806117-2b15-4682-87f0-350e6695fe91", "clientId": "c2d1d1e3-3340-4170-980e-e9269bbbc551", "url": "https://example.com/webhook", "token": "secretToken0123", "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, "blockedAt": null, "deletedBy": null, "blockedBy": null }
| Error | When it happens |
|---|---|
401 | The bearer token is missing, expired, invalid, or not valid for the environment. |
404 | The webhook configuration was not found for the supplied client. |
Webhook event: POST status-update
Bearer token returned by the authentication flow.
Unique message identifier for deduplication.
Event name. For status notifications it is always STATUS_UPDATE.
Event date in YYYY-MM-DD format.
Transaction status update payload.
{ "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", "reason": "CANCELLED_ACCOUNT", "reason_description": "Cuenta cancelada", "status": "INITIALIZED", "update_at": "2025-08-27T15:40:44.413078-06:00" } }
No response body.
No response body for successful acknowledgements.
| Error | When it happens |
|---|---|
422 | Your system received the event but could not process it as valid. |
Webhook event: POST cep
This event is emitted on every CEP status change except INITIALIZED, so a single validation can produce several events before reaching COMPLETED or FAILED. See CEP Statuses for the full lifecycle and the transitions between statuses.
Bearer token returned by the authentication flow.
Unique message identifier (use for idempotency/deduplication)
Event name
Event date (YYYY-MM-DD)
CEP update payload.
{ "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": "Daniela Paola Santelices Chavez", "beneficiary_rfc": "XXXX000000XXX", "status": "DELAYED", "processed_at": "2025-08-15T22:42:39.327Z" } }
No response body.
No response body for successful acknowledgements.
| Error | When it happens |
|---|---|
422 | Your system received the event but could not process it as valid. |
Webhook event: POST refund
Monato sends this event when a refund transaction is created. There are two cases, and the second one is not triggered by you:
- You call the refund endpoint for a Money In.
- An outbound SPEI transfer is reversed by the banking network.
Register this webhook if you need to reconcile reversals you did not initiate.
The body describes the refund transaction, not the original one. 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.
Bearer token returned by the authentication flow.
Unique message identifier (use for idempotency/deduplication)
Event name. For refund notifications it is always REFUND.
Event date (YYYY-MM-DD)
Refund transaction payload.
{ "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": "734180000000001004", "beneficiary_name": "Carolina Perez Marquez", "beneficiary_rfc": "XAXX010101000", "payer_account": "734185000000000055", "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" } }
No response body.
No response body for successful acknowledgements.
| Error | When it happens |
|---|---|
422 | Your system received the event but could not process it as valid. |