Webhook events
Rinne sends webhooks for the following events:Transaction events
transaction.created: New transaction createdtransaction.status-changed: Transaction status updated
3D Secure events
three-d-secure-session.status-changed: 3DS session reached its outcome,AUTHENTICATEDorFAILED
Dispute events
dispute.created: Dispute opened against a settled paymentdispute.funds-held: Disputed funds held in the merchant’s account, once or in growing incrementsdispute.funds-released: Held funds returned to the merchant’s available balancedispute.funds-returned: Disputed funds, in whole or in part, returned to the claimantdispute.status-changed: Dispute status updated
Affiliation events
affiliation.created: New affiliation createdaffiliation.status-changed: Affiliation status updatedaffiliation.requirements-changed: What the merchant must supply for the affiliation changedaffiliation-bank-account.operational-status-changed: Affiliation bank account operational status updated
Onboarding events
onboarding-document.status-changed: Onboarding document status updatedbiometric-verification.status-changed: Biometric verification reached its result,APPROVED,REPROVEDorEXPIRED
Company events
company.created: New company createdcompany.status-changed: Company status updated
KYC events
kyc.completed: KYC check finished for a merchant company
Banking events
cashout.created: New cashout request createdcashout.status-changed: Cashout status updatedinternal-transfer.created: New internal transfer createdinternal-transfer.status-changed: Internal transfer status updatedjudicial-blockage.created: Judicial block or release movement recorded
Pix key events
pix-key.created: New affiliation Pix key recordedpix-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 identifiertype: Event type (e.g.,transaction.status-changed)version: Event schema versiontimestamp: When the event occurred (ISO 8601)source: Service that generated the eventcompany_id: Company associated with the eventcorrelation_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: useidto 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
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 atransaction.status-changed webhook where:
old_statusisPENDING_REFUNDnew_statusisAPPROVED(if no other refunds exist) or remainsPENDING_REFUND(if other refunds are still processing)
3D Secure session status changed
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.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
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
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
Best practices
Respond quickly
Respond quickly
Return a 200 status code immediately, then process the webhook asynchronously. Don’t perform long-running operations in the webhook handler.
Handle duplicates
Handle duplicates
Use the event
id to track processed events and ignore duplicates. Webhooks may be delivered more than once.Verify signatures
Verify signatures
Always verify webhook signatures to ensure requests are from Rinne.
Use correlation IDs
Use correlation IDs
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.Monitor webhook health
Monitor webhook health
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: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

