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.Webhooks (recommended)
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
Setup
- Create your webhook endpoint (see Local development for testing)
- Create a webhook via API or dashboard
- Subscribe to the events you need
- Verify webhook signatures to ensure events are from DFNS
Detecting deposits
Use thewallet.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 awallet.blockchainevent.detected event, you know exactly which deposit it belongs to based on the receiving wallet.
How it works:
- When a customer initiates a deposit, create or reserve a wallet for that specific transaction
- Give the customer this wallet’s address to send funds to
- When the webhook fires for that wallet, match it to your pending deposit record
- After confirmation (plus a safety buffer), release the wallet back to your pool
- 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:
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
- Check your policy configuration
- Request approval if policy requires it
- Adjust transaction parameters
Failed on-chain
- Insufficient balance (including gas)
- Smart contract revert
- Nonce issues
- Gas limit too low
Related
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