Create Outgoing transfers
Guide on creating outgoing transfers to hosted and unhosted wallets, including agent discovery and proof of ownership.
To hosted wallets
Initiate a transfer to a counterparty hosting wallets for their users using the following endpoint:
POST /entity/:entityDID/tx
Required Data
- Asset: Type of asset (e.g., BTC)
- Amount: Amount to transfer
- Deposit/Settlement Address: Address for settlement
- Receiving Entity: Optional, if not provided, agent discovery will be performed
Process Overview
- Agent Discovery: Automatically performed unless a counterparty is specified.
- Jurisdiction Check: Updates
isTravelRuleand adds a presentation definition URL. - Transaction Authorization Policies (TAP): Default policies are applied if configured.
- DIDComm Messaging: Sends transfer request and TAP policies to counterparties.
- Webhook Notifications: Updates on transfer policies and confirmations.
Example (see more examples here: Postman txCreate examples)
POST /entities/:entityDID/tx
{
"originator": {
"@id": "{{originatorID}}"
},
"beneficiary": {
"@id": "{{beneficiaryID}}"
},
"asset": "{{BTC}}",
"amount": "{{$randomInt}}",
"agents": [
{
"@id": "did:pkh:{{BTCaddressprefix}}:{{$randomAddress}}",
"for": "{{originatorVASPdid}}",
"role": "SourceAddress"
},
{
"@id": "{{originatorVASPdid}}",
"for": "{{originatorID}}",
"role": "VASP"
},
{
"@id": "{{beneficiaryVASPdid}}",
"for": "{{beneficiaryID}}",
"role": "VASP"
},
{
"@id": "did:pkh:{{BTCaddressprefix}}:{{$randomAddress}}",
"for": "{{beneficiaryVASPdid}}",
"role": "SettlementAddress"
}
],
"ref": "{{$randomUUID}}"
}
Agent discovery:
Notabene provides multiple counterparty discovery flows:
- Network Discoverability
- Address book
- Blockchain analytics query
- Select manually
To unhosted wallets
For transfers to self-hosted wallets, ensure the following:
- Settlement Address Agent: Set the
forfield to the beneficiary party. - Proof of Ownership: Upload if required.
See also the Postman collection here: Create to Unhosted
{
"originator": {
"@id": "{{originatorEmail}}"
},
"beneficiary": {
"@id": "{{beneficiaryEmail}}"
},
"asset": "{{BTC}}",
"amount": "{{$randomInt}}",
"agents": [
{
"@id": "{{BTCaddressprefix}}:{{$randomBitcoin}}",
"for": "{{originatorVASPdid}}",
"role": "SourceAddress"
},
{
"@id": "{{originatorVASPdid}}",
"for": "{{originatorEmail}}",
"role": "VASP"
},
{
"@id": "{{BTCaddressprefix}}:{{$randomBitcoin}}",
"for": "{{beneficiaryEmail}}", // <-- benefiary @id goes here
"role": "SettlementAddress"
}
],
"ref": "{{$randomUUID}}"
}Proof of ownership
rom above example, an UNCONFIRMED ownership is created between the settlement address and the beneficiary, something like:
"relationship": {
"@id": "a7d13407-7e5b-4d64-9fdd-287d44971faa",
"status": "UNCONFIRMED",
"from": "{{BTCaddressprefix}}:{{$randomBitcoin}}",
"to": "{{beneficiaryEmail}}",
"proofs": []
},You can update such a relationship to Confirmed or Proven status by calling:
PATCH /entities/:entityDID/relationship?from=settlementAddress&to=beneficiaryDID
Establish ownership between users and wallets:
- Signature Proof: Update status to
PROVENusing a signature. - Self-Declaration: Declare control over the address.
- Microtransfer: Pending status until confirmed.
- Screenshot: Upload a screenshot as proof.
For signature proof - the only method to update to status PROVEN
"proof": {
"address": "{{destination}}",
"attestation": "I certify that\n\neip155:1 account 0x9ecfbb28554cade5da58c82469f65f31aebd272b\n\nbelonged to did:key:z6MksamQq4oVRktkeSDxs6pbixYFUaUca8xgCvnTVLQA5PC5\n\non Thu, 04 Dec 2025 14:20:12 GMT",
"type": "eip-191",
"proof": "{{proof}}", //signature goes here
"status": "verified",
"did": "{{destination}}"
}For other proof types that update to status CONFIRMED see the Postman Collection.
Updated about 3 hours ago
