Skip to main content
This guide explains how to monitor transaction status after submitting transfers or broadcasts through DFNS.

Listing endpoints: which one to use

DFNS provides three endpoints for viewing wallet activity. Each serves a different purpose: In short:
  • Use History to show users their complete activity feed (incoming deposits + confirmed outgoing transfers)
  • Use Transfers to track the status of outgoing transfers you initiated via the Transfer API
  • Use Transactions to track the status of custom transactions you submitted via the Broadcast API
Transfers and Transactions only appear in History once they reach Confirmed status. To show a complete view (including pending and failed), combine the relevant listing endpoints.

Transaction lifecycle

When you submit a transaction via the Transfer API or Broadcast API, it goes through these states:

Troubleshooting stuck transfers

What a transfer is waiting on depends on its status: If an incoming deposit is confirmed on-chain but not yet reflected in the wallet, that is balance indexing rather than a stuck transfer. See Balance freshness.

Polling

Simple approach for occasional status checks. Query the transfer or transaction until it reaches a terminal state.
For production systems, use webhooks to receive status updates in real-time instead of polling.

Relevant events

See Webhook Events for the complete list and event data schemas.

Basic handler

Always respond with 200 quickly, even if processing takes time. Use a queue for async processing. See Webhooks best practices for details.

Setup

  1. Create your webhook endpoint (see Local development for testing)
  2. Create a webhook via API or dashboard
  3. Subscribe to the events you need
  4. Verify webhook signatures to ensure events are from DFNS

Detecting deposits

Use the wallet.blockchainevent.detected event to detect incoming transfers:
Deposit detection (wallet.blockchainevent.detected) is only available for Tier-1 networks.

Matching deposits to your records

When processing incoming payments, you need to match blockchain transactions to records in your system (e.g., customer deposits, invoice payments). Since the sender initiates the transaction, you can’t include your own tracking IDs in the transfer. Here are two strategies to solve this.

Strategy 1: Unique wallet per deposit

Assign a unique wallet address to each pending deposit or customer. When you receive a wallet.blockchainevent.detected event, you know exactly which deposit it belongs to based on the receiving wallet. How it works:
  1. When a customer initiates a deposit, create or reserve a wallet for that specific transaction
  2. Give the customer this wallet’s address to send funds to
  3. When the webhook fires for that wallet, match it to your pending deposit record
  4. After confirmation (plus a safety buffer), release the wallet back to your pool
Considerations:
  • Works on all networks
  • Pre-create a pool of wallets to avoid creation latency during deposit flow
  • Include a cooldown period before reusing wallets (to handle delayed transactions)
  • Monitor pool size and create new wallets as needed

Strategy 2: Memo fields (select networks)

Some networks support a memo (or equivalent) field that travels with the transaction. You can ask customers to include a reference code when sending funds, then match on that memo in the webhook. Supported networks:
Memo-based matching requires customers to correctly include the reference. Always have a fallback process for deposits with missing or incorrect memos.
When to use each strategy: Many platforms use both: unique wallets as the primary method, with memo as an optional optimization on supported networks.

Confirmation times

Different networks have different finality characteristics:
DFNS marks transactions as Confirmed when included in a block. For high-value transactions on chains with probabilistic finality, you may want additional application-level confirmation tracking.

Handling failures

Rejected by policy

Solutions:
  • Check your policy configuration
  • Request approval if policy requires it
  • Adjust transaction parameters

Failed on-chain

Common causes:
  • Insufficient balance (including gas)
  • Smart contract revert
  • Nonce issues
  • Gas limit too low

Set up webhooks

Best practices, verification, local development

Webhook events

Complete event reference and data schemas

Transfer API

API reference for transfers

Idempotency

Preventing duplicate transactions
Last modified on June 8, 2026