/ Payouts v1 Dashboard ↗

How It Works

Avvio enables cross-border payouts for platforms that already manage their own end users and customers.

Core Principles#

Four foundational principles shape how the API operates:

  1. You hold the balance: You wire USD to a dedicated account we issue. That capital sits as your organization's funded balance. Each payout directly debits this balance.
  2. Your users never onboard with us: We do not KYC your end users, and they never interact with our brand. Your organization completes business verification (KYB) once.
  3. You are the sender of record: Your KYB business entity appears on the final payment transfer sent to the beneficiary's bank account, not your end user.
  4. One integration, every corridor: Discover corridor requirements at runtime. The same three core calls work across every supported currency and destination country.

The End User Attribution Object#

The endUser object you attach to payout requests is for internal attribution:

json
{
  "endUser": {
    "id": "user_9481a",
    "name": "Ana López",
    "email": "ana.lopez@example.com"
  }
}

This object is echoed back on the payout record and in webhook payloads. The event log carries the payoutId; fetch that payout when reconciliation needs the attribution fields. It is never transmitted to the clearing house or payment rail.

Integration Surfaces#

Avvio exposes one organization-scoped payout core across four integration surfaces:

Surface Runtime Trust Boundary Bank Details Best Used For
Direct REST API Partner Backend akid_* + P-256 Request Signatures Partner collected Direct control over corridor discovery, quotes, and payouts
Node.js SDK (@avvio/payments) Partner Backend Signs REST requests under the hood Partner collected Typed methods, automated request signing, retry-safe clients
CLI / MCP Server Operator or Agent Environment-provided credentials Partner input Operational troubleshooting, automated testing, agent workflows
Hosted Payout Links Partner Backend + User Browser Single-use signed token URL Avvio collected Zero bank data touch; recipient enters details on a secure page

All surfaces interact with the exact same payout state machine, generate the same webhook events, and reconcile through the same event feed.

The Payout Lifecycle#

Moving money follows a consistent four-step workflow:

  1. Corridor Discovery: Query GET /recipients/{orgId}/corridors to dynamically retrieve the required bank fields for the target currency (e.g. clabeNumber for MXN, iban for EUR).
  2. Beneficiary Registration: Create a recipient with POST /recipients/{orgId}. Store the resulting destinationAccountId. Pass externalId for safe retries.
  3. Payout Execution: Call POST /payments/organizations/{orgId}/payouts with an Idempotency-Key and expectDestination to lock the rate and debit your USD balance.
  4. Tracking & Reconciliation: Monitor state updates via signed webhooks or sequence-based event logs (GET /payments/organizations/{orgId}/events?since=).

Trust Boundaries & Security#

Architecture & Trust Boundaries

PARTNER-CONTROLLED SERVER AVVIO SERVICE BOUNDARY PAYMENT RAIL Partner Backend Direct REST SDK / CLI / MCP Payout API Organization-Scoped Core Canonical Payout State pending → processing → completed / failed Hosted Payout Page Avvio collects bank details Signed Webhooks + Events API Clearing Rail Execute & Settle Recipient Browser Server-side signing credential Single-use signed link token Notification + Reconciliation
The private P-256 key never enters the browser. Hosted links shift bank collection to Avvio; direct clients keep it in the partner's server boundary.

Execution, Retries & Recovery

Discover Corridor Runtime field specs Prepare Destination Beneficiary or Link Persist Idempotency-Key Before dispatch Quote and Send Money-moving call Conclusive Response? Retry Same Request Same body + Same key Track Payout by ID Webhook Signals Real-time trigger Read Payout + Events Authoritative state Reconcile Internal Ledger Continue Monitoring Bank returns possible failed returned_by_bank Yes Timeout / Unknown Webhooks notify; event log reconciles; returns stay observable
Persist the idempotency key before dispatch. A timeout is an unknown outcome; replay the exact same operation with the same key.