Utila Integration

The Utila integration connects your Utila custody vaults to the Corsa compliance platform, enabling automated synchronization of wallets, transactions, and corporate client records for streamlined compliance monitoring.

Overview

The Utila integration automatically imports your custody data into Corsa, including:

  • Blockchain wallets and their addresses across all supported networks
  • Deposits and withdrawals with full transaction details (hash, block number, fees, asset info)
  • Real-time updates via webhooks for transaction state changes, new wallets, and AML screening results

Once configured, the integration runs both on a scheduled basis and in real time, ensuring your data stays up to date with minimal manual effort.


How It Works

  1. Scheduled Sync - Corsa periodically triggers a sync job that fetches all wallets and transactions from your Utila vault and imports them into the compliance platform.
  2. Real-Time Webhooks - Utila sends webhook events (e.g., new transactions, status changes) to Corsa in real time, so compliance records are updated immediately as activity occurs in your vault.
  3. Automatic Classification - Incoming transactions are automatically classified as deposits or withdrawals based on whether the destination or source address belongs to your vault.

Supported Blockchains

NetworkMainnetTestnet
EthereumYesYes (Sepolia)
BitcoinYesYes
PolygonYes
SolanaYesYes (Devnet)
TronYes
Avalanche (C-Chain)Yes
ArbitrumYes
OptimismYes
BaseYes
BNB Smart ChainYes

Wallet address extraction supports EVM, Bitcoin, and Solana address formats.


Data Synchronization

Wallets

Each wallet and its addresses from your Utila vault are imported as blockchain wallet records in Corsa.

  • Wallets are automatically associated with the corporate client record representing your vault.
  • Multi-network wallets (e.g., an EVM wallet active on Ethereum, Polygon, and Arbitrum) generate a wallet record per network.
  • Wallets are uniquely identified by a reference ID derived from the Utila wallet address name, ensuring idempotent sync (no duplicates on re-sync).
  • Utila-specific metadata (wallet ID, additional details) is preserved on the Corsa record for traceability.

Transactions

Transactions from your Utila vault are imported as deposit or withdrawal records in Corsa.

  • Deposits: Transactions where the destination address belongs to your vault.
  • Withdrawals: Transactions where the source address belongs to your vault.
  • Each record includes:
    • Transaction hash and block number
    • Asset symbol (e.g., ETH, BTC, USDC)
    • Amount and mining fees
    • Blockchain network (chain)
    • Source and destination addresses
    • Full status history with timestamps
  • Transactions are processed in batches for efficiency.

Sync Modes

ModeDescription
Full SyncFetches and imports all wallets and all transactions from the vault. Use for initial onboarding or reconciliation.
Partial SyncFetches all wallets but only imports transactions created after the last sync timestamp. Used for regular scheduled syncs to minimize processing time.

Real-Time Webhooks

The integration listens for the following Utila webhook events to keep Corsa records updated in real time:

EventDescription
Transaction CreatedA new transaction is detected — creates a deposit or withdrawal record in Corsa.
Transaction State UpdatedA transaction's state changes (e.g., pending → confirmed) — updates the corresponding record status.
AML Screening Result ReadyAML screening is completed for a transaction — syncs the transaction with screening results.
Wallet CreatedA new wallet is created in the vault — creates corresponding blockchain wallet records in Corsa.
Wallet Address CreatedA new address is added to an existing wallet — creates a new blockchain wallet record for that address.

Webhook events are processed with automatic retry logic to handle transient failures.


Transaction Status Mapping

Utila transaction states are mapped to Corsa statuses as follows:

Utila StateCorsa Status
CONFIRMED, MINEDSuccess
FAILED, DROPPEDFailed
CANCELLED, EXPIRED, DECLINED, DECLINED_BY_AML_POLICY, REPLACEDCancelled
AWAITING_APPROVAL, SIGNED, PUBLISHED, and all other statesPending

The original Utila state is always preserved as a sub-status for full auditability.


Setup & Credentials

To enable the Utila integration, the following credentials are required:

CredentialDescription
Utila RSA Private KeyRSA private key used to generate JWT tokens for Utila API authentication.
Utila Service Account EmailThe email address of the Utila service account.
Utila Vault IDThe ID of the Utila vault to synchronize.

Authentication to the Utila API uses short-lived JWT tokens (RS256) that are automatically generated and refreshed.


Prerequisites

Before you begin, ensure that:

  • You have owner access to the Corsa application.
  • You have a Utila account with permission to generate API credentials and configure webhooks.

Setting Up the Utila Integration

  1. Log in to Corsa.
  2. Go to Developers Hub → Integrations.






  1. Click on the Configure button
  2. Insert your Vault ID from Utila

  1. Insert the polling configuration (how often do you want to poll updated data from Utila)

  2. Once finished setting it up - Corsa will generate a key pair that will be used for the integration. You need to create a new service account in Utila's settings - with the specified public key. For example:


You should also configure the webhook url to the one shown in the dialog with the specified events types. You can alway see these configurations by clicking the three dotted button on the integration card and clicking "Third-Party Configuration".