API reference · Withdrawals

Withdraw crypto

POST/v1/withdrawals/crypto

Requests a withdrawal to a crypto address and emails a confirmation link to the account's email address. Nothing is sent, or held, until that link is opened, within 30 minutes. Idempotency-Key is required.

Rate-limit class
withdrawal
Authentication
Signed
Idempotency-Key
Required

Parameters

  • Idempotency-Keystringheaderrequired

    1 to 64 characters of [A-Za-z0-9_-]. Kept for 24 h; reuse it to retry safely.

    Matches ^[A-Za-z0-9_-]{1,64}$.

Request body

application/json · CreateCryptoWithdrawalRequest. Unknown fields are rejected.

  • assetstringrequired

    An upper-case asset symbol.

    Matches ^[A-Z0-9]{1,15}$. Example: BTC.

  • networkstringoptional

    Needed only for an asset on several networks: USDC is ethereum (the default) or solana.

    Matches ^[a-z0-9-]{1,40}$. Example: ethereum.

  • amountstring (decimal)required

    The amount taken from the balance, fee included.

  • addressstringrequired

    1 to 128 characters. Matches ^[A-Za-z0-9:._-]+$. Example: bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh.

  • memostringoptional

    Required for XRP (destination tag) and HBAR (memo).

    Matches ^\d{1,20}$.

  • travel_ruleTravelRulerequired

    Travel rule details about the recipient, as the app asks for them.

    5 properties
    • address_ownerstring (enum)required

      Whose address it is: yours, or someone else's.

      One of self, other.

    • wallet_typestring (enum)required

      hosted: an account at an exchange or other provider; self_hosted: a wallet whose keys the owner holds.

      One of hosted, self_hosted.

    • beneficiaryobjectoptional

      Required when address_owner is other: full_name for an individual, company_name and registration_number for a company.

      4 properties
      • typestring (enum)required

        One of individual, company.

      • full_namestringoptional

        1 to 100 characters. No control characters.

      • company_namestringoptional

        1 to 100 characters. No control characters.

      • registration_numberstringoptional

        1 to 100 characters. No control characters.

    • vaspstring (enum)optional

      Required when wallet_type is hosted: the exchange that holds the address.

      One of binance, coinbase, kraken, crypto_com, bybit, okx, bitget, kucoin, gate_io, htx, mexc, bitfinex, gemini, bitstamp, upbit, bithumb, bitpanda, etoro, revolut, other.

    • vasp_namestringoptional

      The exchange's name when vasp is other.

      1 to 100 characters. No control characters.

Responses

202 Accepted

The withdrawal, awaiting email confirmation. application/json · Withdrawal

  • idstring

    Starts with wd_.

  • typestring (enum)

    One of bank, crypto.

  • statusstring (enum)

    awaiting_confirmation: a crypto withdrawal waiting for the link in the confirmation email; expired: that link was not used in time; pending: being processed; completed: sent; canceled; failed.

    One of awaiting_confirmation, expired, pending, completed, canceled, failed.

  • assetstring

    An upper-case asset symbol.

    Matches ^[A-Z0-9]{1,15}$.

  • networkstring | null

    Crypto only.

  • amountstring (decimal)

    Taken from the balance, fee included.

  • feestring (decimal)nullable

    The withdrawal fee in the asset; null when it isn't known yet.

  • addressstring | null

    Crypto only.

  • memostring | null
  • bank_accountstring | null

    Bank only.

  • tx_idstring | null

    The blockchain transaction id, once sent.

  • sourcestring (enum)

    Where the record was made: this API, the mobile app or the webapp.

    One of public_api, app, web.

  • created_atstring (date-time)
  • confirm_bystring (date-time)nullable

    For awaiting_confirmation: the confirmation email's link works until this time.

  • completed_atstring (date-time)nullable

Every response carries MK-Request-Id, plus RateLimit-Policy and RateLimit.

Errors

Errors use the error envelope. Match on code.

StatusCodeMeaning
400invalid_requestThe request is malformed: bad JSON, an unknown or invalid field, or a missing header.
401invalid_signatureThe MK-* headers are missing or malformed, the key id is unknown, or the signature doesn't match.
401key_expiredThe key has passed its expiry date.
401key_revokedThe key was revoked.
401timestamp_out_of_rangeMK-Timestamp is more than 30 seconds from the server clock.
401nonce_reusedThis key already used this MK-Nonce.
403ip_not_allowedThe request came from an address outside the key's IP allowlist.
403insufficient_scopeThe key doesn't have the scope this endpoint needs.
403account_restrictedThe account can't use the API right now (for example locked, inactive, or onboarding not finished).
403api_access_disabledAPI access is switched off.
403forbiddenThis action is switched off for the API right now.
409idempotency_conflictThis Idempotency-Key was used with a different request body.
409idempotency_in_progressA request with this Idempotency-Key is still being processed.
413payload_too_largeThe request body is larger than 8 KB.
415unsupported_media_typeRequest bodies must be application/json.
422insufficient_fundsThe available balance doesn't cover the trade, gift card or withdrawal.
422amount_below_minimumThe amount is below the minimum.
422asset_not_withdrawableThe asset can't be withdrawn on this network right now.
429rate_limitedToo many requests. Wait for Retry-After seconds.
429too_many_concurrent_requestsToo many requests in flight for this key or account.
429key_suspendedThe key is suspended, for example after sustained rate limiting.
500internal_errorSomething went wrong on our side.
502bad_gatewayAn upstream service answered unexpectedly.
503overloadedThe service is overloaded. Retry after Retry-After seconds.
503service_unavailableThe service is temporarily unavailable.
503maintenanceThe API is read-only for maintenance.
504gateway_timeoutAn upstream service didn't answer in time. A POST may still complete; retry with the same Idempotency-Key.

Request

# Signed by sign-headers.sh: see Authentication
body='{"asset":"BTC","amount":"0.01","address":"bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh","travel_rule":{"address_owner":"self","wallet_type":"self_hosted"}}'
idempotency_key=$(uuidgen)   # reuse it to retry safely
curl https://public-api.myntkaup.is/v1/withdrawals/crypto \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $idempotency_key" \
  $(./sign-headers.sh POST /v1/withdrawals/crypto "$body" | sed 's/^/-H /') \
  --data "$body"
import { Myntkaup } from "@myntkaup/api";

const client = new Myntkaup(); // reads the key from the environment
// Nothing is sent until the link in the confirmation email is opened.
const withdrawal = await client.withdrawals.createCrypto({
  asset: "BTC",
  amount: "0.01",
  address: "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
  travelRule: { addressOwner: "self", walletType: "self_hosted" },
});
console.log(withdrawal.status, withdrawal.confirm_by);
from myntkaup import Myntkaup

client = Myntkaup()  # reads the key from the environment
# Nothing is sent until the link in the confirmation email is opened.
withdrawal = client.withdrawals.create_crypto(
    asset="BTC",
    amount="0.01",
    address="bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    travel_rule={"address_owner": "self", "wallet_type": "self_hosted"},
)
print(withdrawal["status"], withdrawal["confirm_by"])

Response

202 Accepted
{
  "id": "wd_01JB8X2Q4M7Z3V9K5T1N6R0P2W",
  "type": "crypto",
  "status": "awaiting_confirmation",
  "asset": "BTC",
  "network": "bitcoin",
  "amount": "0.01",
  "fee": "0.0005",
  "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
  "memo": null,
  "bank_account": null,
  "tx_id": null,
  "source": "public_api",
  "created_at": "2026-11-03T10:15:10Z",
  "confirm_by": "2026-11-03T10:45:10Z",
  "completed_at": null
}

Base URL https://public-api.myntkaup.is