Skip to main content
Webhooks allow you to receive real-time notifications when events occur in your Rinne account. Instead of polling the API, Rinne sends HTTP POST requests to your server when important events happen.

Webhook events

Rinne sends webhooks for the following events:

Transaction events

  • transaction.created: New transaction created
  • transaction.status-changed: Transaction status updated

3D Secure events

  • three-d-secure-session.status-changed: 3DS session reached its outcome, AUTHENTICATED or FAILED

Dispute events

  • dispute.created: Dispute opened against a settled payment
  • dispute.funds-held: Disputed funds held in the merchant’s account, once or in growing increments
  • dispute.funds-released: Held funds returned to the merchant’s available balance
  • dispute.funds-returned: Disputed funds, in whole or in part, returned to the claimant
  • dispute.status-changed: Dispute status updated

Affiliation events

  • affiliation.created: New affiliation created
  • affiliation.status-changed: Affiliation status updated
  • affiliation.requirements-changed: What the merchant must supply for the affiliation changed
  • affiliation-bank-account.operational-status-changed: Affiliation bank account operational status updated

Onboarding events

  • onboarding-document.status-changed: Onboarding document status updated
  • biometric-verification.status-changed: Biometric verification reached its result, APPROVED, REPROVED or EXPIRED

Company events

  • company.created: New company created
  • company.status-changed: Company status updated

KYC events

  • kyc.completed: KYC check finished for a merchant company

Banking events

  • cashout.created: New cashout request created
  • cashout.status-changed: Cashout status updated
  • internal-transfer.created: New internal transfer created
  • internal-transfer.status-changed: Internal transfer status updated
  • judicial-blockage.created: Judicial block or release movement recorded

Pix key events

  • pix-key.created: New affiliation Pix key recorded
  • pix-key.status-changed: Pix key status updated

Ledger entry events

  • ledger-entry.settled: Ledger entry settled

Webhook payload structure

All webhooks follow a consistent structure:

Common fields

  • id: Unique event identifier
  • type: Event type (e.g., transaction.status-changed)
  • version: Event schema version
  • timestamp: When the event occurred (ISO 8601)
  • source: Service that generated the event
  • company_id: Company associated with the event
  • correlation_id: Shared by every event that one API request, one provider notification or one item of a scheduled job caused, so related events can be grouped. A scheduled job gives each item it processes its own value, so the events of one run do not share one. It is not unique per event: use id to identify and deduplicate an event.
  • payload: Event-specific data

Setting up webhooks

Contact Rinne support to configure your webhook endpoint URL. We’ll create a webhook configuration for your organization.

Webhook endpoint requirements

Your endpoint must:
  • Accept POST requests
  • Respond with 2xx status code within 5 seconds
  • Use HTTPS (required for production)
  • Handle duplicate events (idempotency)

Webhook security

Rinne uses Svix for webhook delivery, which provides:
  • Request signing for verification
  • Automatic retries with exponential backoff
  • Webhook dashboard for monitoring
  • Replay functionality for testing

Verifying webhook signatures

Verify that webhooks are from Rinne by checking the signature:

Handling webhook events

Transaction status changed

An EXPIRED → APPROVED event and the approval of a replacement charge for the same order belong to different transactions, so deduplicating by event id does not catch them. Check and update the order in one atomic step before you choose: fulfill an open order, and refund the late payment when the order is already paid; BOLEPIX transactions do not support refunds. See Payment confirmed after expiry, and Best practices for repeated deliveries.

Refund failure handling

When a refund fails, you’ll receive a transaction.status-changed webhook where:
  • old_status is PENDING_REFUND
  • new_status is APPROVED (if no other refunds exist) or remains PENDING_REFUND (if other refunds are still processing)
This allows you to handle refund failures appropriately in your system and notify customers when a refund could not be processed.

3D Secure session status changed

Rinne writes one event per session, when the session reaches its outcome, including sessions you link to transactions. Like any webhook, it can be delivered more than once: deduplicate by the event id (see Best practices). entity is the session as a read returns it, and its expires_at still bounds the session’s use in a payment. An event delivered late, after a retry to your endpoint or an incident on our side, can arrive with expires_at already past. Linking that session to a transaction is then rejected with 400, so create a new session instead. A session that already has its outcome when you create it sends no event, and one the cardholder leaves before the challenge starts may never send it. See Read a session from your backend for both cases.

Dispute created

Dispute status changed

Disputes only move forward and never reopen, so old_status is always strictly earlier than new_status. Deliveries can repeat or arrive out of order, so make these handlers idempotent and apply an update only when it moves the dispute forward from the status you stored, ideally as a single conditional write. See Best practices. Group events belonging to one dispute by dispute_id: correlation_id groups the events that one request or notification caused, not the events of one dispute.
See Disputes for the full lifecycle, outcomes, and payload fields.

Affiliation created

An affiliation created directly in WAITING_DOCUMENTS carries its onboarding_url only here and in the creation response; no affiliation.status-changed follows for that entry. When onboarding_url is null, the link arrives later on affiliation.status-changed, as below.

Affiliation status changed

The provider_status_message field contains additional context from the payment provider when available, including possible error messages.

Onboarding events

affiliation.requirements-changed, onboarding-document.status-changed and biometric-verification.status-changed follow a merchant through onboarding: a reviewed rejection or a provider’s request, a document accepted or refused, a biometric verification approved or reproved. Their payloads and handlers are in Statuses and events.

Affiliation bank account operational status changed

The entity field is a full write-time snapshot of the affiliation bank account (including operational_status). You do not need a follow-up API call to inspect the account.

Cashout created

Cashout status changed

KYC completed

A COMPARISON rule carries expected and received, and a CHECK rule carries found and required; an entry never carries both pairs. Read the pair from type rather than from rule_name. The source field (expected or found) is absent only when the data source was unreachable, and such a rule is always FAILED, so every ISSUES_FOUND entry above has both fields of its pair. See KYC Verification for rule names, their types, statuses, and the full payload.

Internal transfer status changed

Judicial blockage created

The entity field is a full write-time snapshot of the judicial blockage movement. Use it for amount, process details, and occurred_at without listing movements from the API. Account-level restriction changes arrive separately as affiliation-bank-account.operational-status-changed.

Webhook dashboard

Access your webhook dashboard to:
  • View webhook delivery history
  • Replay failed webhooks
  • Test webhook endpoints
  • Monitor delivery success rates
Get your dashboard URL:

Retry behavior

If your endpoint returns an error or times out, Rinne automatically retries:
  • Immediate retry
  • After 5 seconds
  • After 5 minutes
  • After 30 minutes
  • After 2 hours
  • After 5 hours
  • After 10 hours
  • After 24 hours
After all retries fail, the webhook is marked as failed in your dashboard.

Best practices

Return a 200 status code immediately, then process the webhook asynchronously. Don’t perform long-running operations in the webhook handler.
Use the event id to track processed events and ignore duplicates. Webhooks may be delivered more than once.
Always verify webhook signatures to ensure requests are from Rinne.
Use correlation_id to group the events that one API request, one provider notification or one item of a scheduled job caused, across event types. Never deduplicate by it: several events share it, so use the event id.
Regularly check your webhook dashboard for failed deliveries and fix issues promptly.

Testing webhooks

Local testing with ngrok

Use ngrok to expose your local server for webhook testing:
Provide the ngrok URL to Rinne support for webhook configuration.

Webhook replay

Use the webhook dashboard to replay events to your endpoint for testing.

Example webhook handler

Next steps

API Reference

Explore all webhook event schemas

Error Handling

Handle errors and edge cases