SettleMint
API referenceEvents

custody.withdrawal.final

A participant's withdrawal completed: the platform consumed the hold on the funds and the withdrawn amount left custody. Sent once for each hold the platform consumes. amount is in the asset's base units and assetKey names the custody asset.

Delivery contract

FieldValue
Event typecustody.withdrawal.final
Version1
Lifecycle statefinal
Counter-signed receiptsNo event-specific advice
SDK typeWebhook.CustodyWithdrawalFinalV1

The receipt recommendation does not change delivery behavior. DALP waits for a counter-signed receipt only if the webhook endpoint's counterSignedReceipts value is true when DALP queues the delivery. When the value is false, a normal 2xx response completes the delivery.

Related references:

  • withdrawalId
  • holdId
  • journalEntryId

Payload schema

The schema and examples describe the full payload. Thin delivery omits personal data fields. Use the payload-shape guidance to choose the endpoint configuration.

{
  "type": "object",
  "properties": {
    "chainId": {
      "type": "integer",
      "exclusiveMinimum": 0
    },
    "withdrawalId": {
      "type": "string",
      "minLength": 1
    },
    "holdId": {
      "type": "string",
      "minLength": 1
    },
    "assetKey": {
      "type": "string",
      "minLength": 1
    },
    "walletId": {
      "type": "string",
      "minLength": 1
    },
    "participantId": {
      "type": "string",
      "minLength": 1
    },
    "amount": {
      "type": "string",
      "pattern": "^(?:0|[1-9]\\d{0,77})$"
    },
    "journalEntryId": {
      "type": "string",
      "minLength": 1
    },
    "occurredAt": {
      "type": "string"
    }
  },
  "required": [
    "chainId",
    "withdrawalId",
    "holdId",
    "assetKey",
    "walletId",
    "participantId",
    "amount",
    "journalEntryId",
    "occurredAt"
  ],
  "additionalProperties": true
}

TypeScript SDK example

Use the request's raw body and headers with your endpoint's webhook secret. This handler illustrates verification and event selection. Before writing downstream state, deduplicate deliveries by evt_id and recognize replayed outcomes by their domain identifiers.

const result = await verifyWebhook({
  rawBody,
  headers,
  secret: process.env.DALP_WEBHOOK_SECRET!,
});

if (!result.ok) {
  throw new Error(`Webhook verification failed: ${result.code}`);
}

if (result.event.type === "custody.withdrawal.final") {
  const event: Webhook.Event<"custody.withdrawal.final"> = result.event;
  console.log(event.payload);
}

HTTP delivery example

This illustrative request shows the delivery shape. Its timestamp and signature are placeholders; a verifier rejects them. Use a signed platform delivery to verify your endpoint.

curl -X POST https://consumer.example.com/dalp/webhooks \
  -H "content-type: application/json" \
  -H "webhook-id: evt_7afc978b8540fa8cf8c8b55a34bf0df6" \
  -H "webhook-timestamp: 1778112000" \
  -H "webhook-signature: v1,docs-example-signature" \
  --data '{"evt_id":"evt_7afc978b8540fa8cf8c8b55a34bf0df6","source_id":"example:custody.withdrawal.final@1:0","lifecycle_state":"final","payload":{"chainId":537001,"withdrawalId":"wdr_01J9ZQ8H5K7M9P1R3T5V7X9Z1C","holdId":"hld_01J9ZQ8J6L8N0Q2S4U6W8Y0B2D","assetKey":"usdc","walletId":"wal_01J9ZQ8D1F3H5K7M9P1R3T5V7X","participantId":"ptc_01J9ZQ8E2G4J6L8N0Q2S4U6W8Y","amount":"1000000000","journalEntryId":"jrn_01J9ZQ8K7M9P1R3T5V7X9Z1C3E","occurredAt":"2026-09-28T10:05:44.071Z"},"related":{"withdrawalId":"withdrawalId_example","holdId":"holdId_example","journalEntryId":"journalEntryId_example"},"type":"custody.withdrawal.final","version":1,"request":{"idempotency_key":"idem_01JZP7R5W8M9N0P1Q2R3S4T5"}}'

Version and manifest

This page documents version 1 of custody.withdrawal.final. This event type is not deprecated. The DALP events manifest contains the machine-readable AsyncAPI entry.

On this page