---
title: "Create express withdraw token"
method: POST
path: "/api/v4/main-account/express-withdraw/token"
tags: ["Withdraw"]
---

# Create express withdraw token

`POST /api/v4/main-account/express-withdraw/token`

The endpoint creates a signed, single-use Express Withdraw payment token that charges a specific amount from a WhiteBIT user's balance to the partner's [Main balance](/glossary#balance-main) in an instant, off-chain, zero-[fee](/glossary#fee) internal transfer. The response returns a URL that embeds the token; the paying user confirms the exact [ticker](/glossary#ticker) and amount on the WhiteBIT-hosted confirmation surface.

Token and payment constraints:
- Each token is single-use: WhiteBIT marks the token used at confirmation and rejects any replay.
- Each token expires 90 seconds after creation; the `expireAt` response field carries the authoritative expiry timestamp. Generate the token as close as possible to the moment of presenting the URL to the user.
- The [ticker](/glossary#ticker) must be a withdrawal-enabled cryptocurrency; the endpoint rejects [fiat](/glossary#fiat) tickers.
- Each payment is capped at the equivalent of 10,000 USDT; WhiteBIT enforces the cap at token creation and re-enforces the cap at confirmation.
- WhiteBIT rejects self-payments: the paying user and the token creator must be different WhiteBIT accounts.
- The endpoint is idempotent per `externalId`: re-submitting the same `externalId` with an identical `ticker` and `amount` while the token is still valid returns the same token instead of creating a duplicate charge. After the token expires, the same `externalId` receives a fresh token.

<Note>
Standard private-API rate limits apply — see [Rate limits](/api-reference/rate-limits). The endpoint carries no endpoint-specific limit.
</Note>

## Request body

- object
  - `ticker` string, required — Currency [ticker](/glossary#ticker) to charge. Example: USDT ⚠️ The ticker must be a withdrawal-enabled cryptocurrency; the endpoint rejects [fiat](/glossary#fiat) tickers. Use [Asset Status endpoint](/public/http-v4/asset-status-list) to check the withdrawal status of a currency.
  - `amount` string, required — Amount to charge in the specified [ticker](/glossary#ticker). Numeric string. ⚠️ The amount converted to USDT-equivalent must not exceed 10,000; the endpoint rejects larger amounts with error code `191`.
  - `externalId` string, required — Partner-side reference for the payment (order or invoice identifier), unique per partner account. The identifier powers idempotency and replay protection: a pending `externalId` with an identical `ticker` and `amount` returns the same token; the endpoint rejects an already-paid `externalId` with error code `19`.
  - `request` string, required — Request signature
  - `nonce` integer, required — Unique request identifier

## Response `201`

Token created. Present the returned URL to the paying user before the expiry in `expireAt`.

- object
  - `url` string — URL to present to the paying user (redirect, deep link, or QR code). The value is the WhiteBIT-hosted web confirmation page by default, or a mobile deep link when one is configured for the partner at onboarding; in both cases the unique token travels in the `token` query parameter. Treat the value as opaque.
  - `expireAt` string — Absolute token expiry timestamp in `YYYY-MM-DD HH:MM:SS` format (UTC). The authoritative expiry: each token expires 90 seconds after creation.

## Other responses

- `403` — The account does not have the Express Withdraw permission. WhiteBIT grants the permission through the B2B partner approval process — request access at https://institutional.whitebit.com/.
- `422` — Inner validation failed. Business-rule codes (returned with HTTP 422): - 18 - token invalid: a pending `externalId` re-submitted with a different `ticker` or `amount`. Parameters of a pending payment cannot change — use a new `externalId`. - 19 - token already used: the `externalId` belongs to a payment the user already confirmed. - 191 - amount exceeds the limit: the amount converts to more than the 10,000 USDT-equivalent per-payment cap. Additional outcomes returned with HTTP 422: - **Currency not allowed** — the [ticker](/glossary#ticker) is [fiat](/glossary#fiat) or not withdrawal-enabled; the error is keyed to the currency field. - **Unexpected server-side error** — a generic "Please try again later" message; retry the request.

---

[API](https://skmtc.net/whitebit/apis/whitebit-private-http-api-v4.md) · [All operations](https://skmtc.net/whitebit/apis/whitebit-private-http-api-v4/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/whitebit/whitebit-private-http-api-v4/revisions/76c9def9942f/schema)
