Skip to main content
Webhooks allow your system to receive real-time event notifications from Monirates. When key events happen — like a payment, currency exchange, or wallet transaction — Monirates sends an HTTP POST request with a JSON payload to your registered URL. Every payload is wrapped in a consistent envelope with an event type, so you can safely handle events from multiple Monirates services (exchange, payment links, wallets, stablecoin wallets, and more) on the same webhook URL.

Setup Overview

All webhook configuration happens in your Monirates dashboard:
  1. Log in at business.monirates.com (or dev.business.monirates.com for sandbox).
  2. Navigate to Settings.
  3. Generate your API Key and Secret Key.
  4. Register your Webhook URL.
Monirates delivers all event types to a single registered webhook URL. Use the event field on every payload to route and handle each event type in your own system — see Event Types & Sample Payloads below.

Step 1: Generate Your API Key

Your API key authorizes requests and enables your webhook to receive events. Include it in your request headers:

Step 2: Generate Your Secret Key

The Secret Key is used to verify that incoming webhook events genuinely originate from Monirates. Every webhook delivery includes a signature header:
The signature is computed using HMAC SHA256 over the raw request body — the full envelope (event, data, and timestamp together) — combined with your Secret Key. Signing the full envelope, not just data, ensures the event type itself can’t be altered without invalidating the signature.

Validating the Signature

Always validate the signature before processing any webhook event.
Never share your Secret Key. Store it securely as an environment variable and never commit it to version control.

Step 3: Register Your Webhook URL

Your webhook endpoint must:
  • Accept POST requests
  • Receive JSON payloads
  • Be publicly accessible over HTTPS
Register your endpoint URL in the Settings section of your Monirates dashboard.

Retry Behavior

If Monirates cannot reach your endpoint, deliveries are retried automatically: Each retry re-signs the payload with a fresh timestamp — a signature from an earlier attempt is not reused.

Manual Retry via API

You can also view and retry failed webhook events programmatically:

Security Requirements

Two headers are used to secure webhook communication:
Always reject webhook events that are missing or have an invalid x-monirates-signature. Do not process unsigned events.

Event Types & Sample Payloads

Every webhook delivery uses the same envelope:
Some event types cover multiple states of the same resource (for example, a currency exchange moving from PENDING to SUCCESSFUL). In those cases the event stays the same across deliveries, and you distinguish the state using the status (or type) field inside data.

exchange

Triggered when a currency exchange transaction is initiated or updated. data.status reflects the current state (e.g. PENDING, PROCESSING,SUCCESSFUL, FAILED).
Triggered when a payment link transaction is initiated or updated.
Payment link webhooks never include the payer authentication token. If your integration needs that token, retrieve it directly from the create-payment-link API response — it’s issued once, at creation, over an authenticated channel.

wallet.created

Triggered when a new fiat wallet is created for your business.

wallet.virtual_account

Triggered when a virtual bank account is created, funded (paid), or expires. data.status reflects the current state: PENDING, PAID, or EXPIRED.

wallet.transaction

Triggered for any fiat wallet transaction — funding, transfers, payouts, and bank transactions. data.type identifies whether it was a credit or debit; data.status reflects the current state.

stable_wallet.created

Triggered when a new stablecoin wallet is created for your business.
If data.parentId is present, this wallet belongs to a sub-account. Sub-accounts don’t have their own webhook URL — this event, and every future event for that sub-account’s wallet, is delivered to your parent business’s registered webhook URL.

stable_wallet.transaction

Triggered for stablecoin wallet activity — deposits, and withdrawals as they move through PENDING and CONFIRMED states. data.type identifies the transaction type (DEPOSIT, WITHDRAWAL, REVERSAL); data.status reflects the current state.
For sub-account transactions, data.userId identifies the sub-account, but the webhook itself is always delivered to the parent business’s webhook URL — sub-accounts don’t have independent webhook configuration. Use data.userId to attribute the transaction to the correct sub-account on your side.

Fetching Webhook Logs

Beyond the API, you can also view webhook delivery history directly in the Monirates dashboard — filter by event type, SUCCESSFUL, or FAILED, and track retry attempts for reconciliation.
Need help integrating? Reach out to the Monirates support team from your dashboard.