Event Types
Crossmint provides two webhook event types for wallet transfers:wallets.transfer.in
Triggered when tokens are transferred into a wallet in your project. This event is only sent for successful transfers that have been confirmed on-chain.
wallets.transfer.out
Triggered when tokens are transferred out of a wallet in your project. This event is sent for both successful and failed transfer attempts, allowing you to track the complete lifecycle of outgoing transactions.
Setup
To start receiving wallet transfer webhooks, you need to configure a webhook endpoint in the Crossmint Console.Step 1: Add a Webhook Endpoint
Follow the instructions in Add an Endpoint to configure your webhook URL and select the event types you want to receive. When adding your endpoint, make sure to select:wallets.transfer.in- to receive notifications for incoming transferswallets.transfer.out- to receive notifications for outgoing transfers
Step 2: Verify Webhook Signatures
To ensure webhook requests are legitimate and come from Crossmint, you must verify the signature of each webhook. See Verify Webhooks for detailed instructions.Event Schemas
Bothwallets.transfer.in and wallets.transfer.out events share a common structure with some key differences based on the transfer direction and outcome.
Common Fields
All wallet transfer events include the following fields:| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the webhook event |
type | string | Event type: "wallets.transfer.in" or "wallets.transfer.out" |
data.sender | object | Information about the sender wallet |
data.sender.address | string | Blockchain address of the sender |
data.sender.chain | string | Chain identifier (e.g., "ethereum", "polygon", "solana") |
data.sender.locator | string | Wallet locator in the format chain:address |
data.sender.owner | string (optional) | Owner identifier if the sender is a Crossmint-managed wallet |
data.recipient | object | Information about the recipient wallet |
data.recipient.address | string | Blockchain address of the recipient |
data.recipient.chain | string | Chain identifier |
data.recipient.locator | string | Wallet locator in the format chain:address |
data.recipient.owner | string (optional) | Owner identifier for the recipient wallet |
data.token | object | Information about the transferred token |
data.token.type | string | Token type, currently only "fungible" is supported |
data.token.chain | string | Chain where the token exists |
data.token.locator | string | Token locator in the format chain:contractAddress |
data.token.amount | string | Human-readable amount (adjusted for decimals) |
data.token.rawAmount | string | Raw amount in smallest unit (e.g., wei for ETH) |
data.token.contractAddress | string (EVM) | Token contract address for EVM chains |
data.token.mintHash | string (Solana) | Token mint address for Solana |
data.token.contractId | string (Stellar) | Token contract ID for Stellar |
data.token.decimals | number | Number of decimals for the token |
data.token.symbol | string (optional) | Token symbol (e.g., "USDC", "ETH") |
data.status | string | Transfer status: "succeeded" or "failed" |
data.completedAt | string | ISO 8601 timestamp when the transfer was completed |
Type-Specific Differences
Incoming Transfers (wallets.transfer.in):
data.statusis always"succeeded"(only successful transfers are reported)data.onChainis always present with transaction details
wallets.transfer.out):
data.statuscan be"succeeded"or"failed"data.onChainis present only whenstatusis"succeeded"data.erroris present only whenstatusis"failed"
Event Examples
Incoming Transfer Example
Incoming Transfer Example
Outgoing Transfer (Success) Example
Outgoing Transfer (Success) Example
Outgoing Transfer (Failed) Example
Outgoing Transfer (Failed) Example
Error Fields (Outgoing Transfers Only)
When an outgoing transfer fails, the following error fields are included:| Field | Type | Description |
|---|---|---|
data.error.message | string | Error message |
data.error.reason | string | Error reason (e.g., "execution_reverted", "program_error", "build_failed") |
data.error.revert | object | Revert details from smart contract |
data.error.revert.type | string | Revert type: "contract_call", "wallet_authorization", or "wallet_deployment" |
data.error.revert.reason | string | Revert reason message |
data.error.logs | any (optional) | Additional error logs |
Best Practices
For comprehensive guidance on implementing reliable webhook handlers, see Webhook Best Practices. This includes detailed information on:Related Resources
- Add an Endpoint - Configure webhook endpoints
- Verify Webhooks - Verify webhook signatures
- Best Practices - Webhook implementation best practices
- Create Wallet - Create wallets to receive transfers
- Transfer Tokens - Initiate token transfers

