> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hypermid.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Withdrawal sent

> A **withdrawal** session paid out. Reconcile `destinationWallet` against your own dispatch record before marking the withdrawal settled — we did not allowlist that address.

### Verifying the signature

Every delivery carries two signature headers. Prefer **`x-hypermid-signature-v2`**:

```
x-hypermid-signature-v2: t=1755561600,v1=6f1b...c2
```

Compute `HMAC_SHA256(secret, "<t>.<raw body>")` and compare in constant time.
The timestamp is inside the signed string, so a captured delivery cannot be
replayed later with a fresh `t` — reject anything older than your tolerance
(5 minutes is typical).

During a secret rotation the header carries **two** `v1=` values, the second
signed with the previous secret. Accept the delivery if *either* matches; that
overlap is what stops an in-flight retry from failing the moment you rotate.

`x-hypermid-signature` is the legacy bare-hex header — `HMAC_SHA256(secret, raw body)`
with no timestamp binding, current secret only. It is still sent for existing
integrations, but it has no replay protection. Do not build new verifiers on it.

<Warning>
Sign the **raw request body bytes**, exactly as received. Parsing to JSON and
re-serializing reorders keys and changes whitespace, which changes the hash —
this is the single most common cause of "signature does not match".
</Warning>

### Delivery guarantees

Delivery is **at-least-once**. Retries mean the same `data.id` can arrive more
than once, so treat the handler as idempotent: key on `data.id` and ignore an
id you have already settled.

Respond `2xx` promptly. We time out at **10 seconds** and count anything else as
a failure worth retrying, so acknowledge first and do slow work afterwards.



## OpenAPI

````yaml /api-reference/openapi.json webhook withdrawal.completed
openapi: 3.1.0
info:
  title: Hypermid API
  description: >-
    Price and execute cross-chain swaps, read reference data and payer balances,
    and quote the fiat on-ramp. Quotes return an executable `transactionRequest`
    your frontend submits directly, so Hypermid never custodies the funds.


    Payments — `checkout`, `deposit`, and `withdrawal` sessions — and
    payment-link management are available through these merchant REST endpoints
    and the [`@hypermid/sdk`](https://docs.hypermid.io/sdk/payments) package.
    Payer-facing routes are intentionally omitted.
  version: 0.2.0
  contact: {}
servers:
  - url: https://server.hypermid.io
    description: Production — live keys (sk_live_…)
  - url: https://server.hypermid.io
    description: Sandbox — test keys (sk_test_…), testnets only
security: []
tags:
  - name: payments
    description: >-
      Create and read payment sessions, manage webhooks, and configure payout
      addresses with a secret partner key.
  - name: payment links
    description: >-
      Create, read, version, and revoke reusable checkout payment links with a
      secret partner key.
  - name: quote
    description: >-
      Route pricing for the orchestration product. Returns an executable
      `transactionRequest` your frontend submits directly, so Hypermid never
      custodies the funds.
  - name: status
    description: >-
      Resolve the state of a submitted swap or transfer. Two endpoints with
      different audiences — see each one's description before choosing.
  - name: catalog
    description: >-
      Reference data an integration needs to render a picker: supported chains
      and tokens, prices, routable connections, and fee configuration. A sandbox
      key sees only testnets here.
  - name: balances
    description: Read a payer wallet's token balances across supported chains.
  - name: onramp
    description: >-
      The fiat rail — card and bank payment for crypto, quoted and settled
      through our onramp partner. Requires per-partner onramp credentials on
      your account.
  - name: webhooks
    description: >-
      Events Hypermid sends TO you when a session completes. These are requests
      we make to your server, not endpoints you call.
paths: {}

````