SX Users

Withdrawals

Send crypto off a user's account: initiate a withdrawal on a network, confirm it with a verification code, resend the code, cancel it, and track it until it settles.

Send crypto off a user's account in two steps: initiate the withdrawal with the currency, amount, destination address and network, then confirm it with the verification code your backend receives by webhook. Every call returns the same withdrawal object, so you track one resource from creation to settlement.

Authentication: every endpoint on this page accepts your Owner API Key (x-api-key) or a user token (Authorization: Bearer). A user token only reaches its own user; any other user_id answers 403 FORBIDDEN.

x-api-key: YOUR_API_KEY

Conventions

Responses use the standard envelope and error format. Amounts are decimal strings, dates are UTC without milliseconds, and network uses the canonical network codes. Send an x-idempotency-key on every POST so retries never create a second withdrawal.


The withdrawal object

Initiate, confirm, resend, cancel, get and list all return this object.

FieldTypeDescription
idstring (uuid)Withdrawal id. Use it in every path on this page.
objectstringAlways withdrawal.
atx_idstring (uuid)Alias of id, same value. Kept for integrations that stored it.
statusstringPENDING, PROCESSING, COMPLETED, FAILED, CANCELLED, EXPIRED or BLOCKED. See Status lifecycle.
status_reasonobject | null{ code, message } explaining a FAILED, CANCELLED, EXPIRED or BLOCKED status, or a PROCESSING withdrawal whose outcome is still being confirmed (EXECUTION_OUTCOME_UNKNOWN). null otherwise.
user_idstring (uuid)User who owns the withdrawal.
customer_idstring | nullYour platform customer id.
wallet_idnullAlways null: a withdrawal debits the user's balance across wallets. See debited_wallets.
debited_walletsarray[{ wallet_id, currency, amount }], one item per wallet debited. Empty until the withdrawal is confirmed.
currencystringAsset code in uppercase, e.g. BTC.
amountstringAmount at the asset's scale, e.g. "0.01000000".
feeobject | nullReal network fee { amount, currency, paid_by } once the withdrawal settles. currency is the network's gas asset; paid_by is USER or SPONSOR. null before settlement, and it can stay null on COMPLETED if the network didn't report an exact fee.
addressstringDestination address.
networkstringCanonical network code, e.g. BITCOIN.
memostring | nullYour note for the withdrawal.
tx_hashstring | nullOn-chain hash. null until the transaction is broadcast.
idempotency_keystring | nullThe x-idempotency-key you sent on initiate.
created_atstringCreation time (UTC).
updated_atstringLast change (UTC).
completed_atstring | nullSettlement time (UTC). null until COMPLETED.
created_bystring | nullCredential or user token that created it.
updated_bystring | nullCredential or user token that last changed it.
verificationobjectOnly on initiate and resend: { expires_at, attempts_remaining }. Tells you a code went out. The code itself is never in the response.

Status lifecycle

StatusMeaningNext
PENDINGCreated. The amount is reserved and a verification code went out; it waits for confirmation.PROCESSING, BLOCKED, CANCELLED, EXPIRED, FAILED
PROCESSINGCode accepted. The transaction is being executed on-chain.COMPLETED, FAILED
COMPLETEDSettled on-chain. tx_hash and completed_at are set, and fee too unless the network didn't report it.Final
FAILEDThe network or custody rejected it. status_reason says why.Final
CANCELLEDYou cancelled it before confirmation (CANCELLED_BY_CLIENT).Final
EXPIREDThe code lapsed before confirmation (VERIFICATION_CODE_EXPIRED).Final
BLOCKEDThree wrong codes (TOO_MANY_ATTEMPTS). Only cancel or expiry follow.CANCELLED, EXPIRED

Any other change answers 422 INVALID_STATE_TRANSITION. Possible status_reason.code values on FAILED: NETWORK_FAILED, NETWORK_DECLINED, NETWORK_DROPPED, INSUFFICIENT_GAS, INVALID_ADDRESS, INSUFFICIENT_FUNDS, CUSTODY_UNAVAILABLE, ACCOUNT_FROZEN, NETWORK_ERROR, INVALID_OTP, UNKNOWN. Treat the list as open. A PROCESSING withdrawal whose execution was sent but not yet confirmed carries EXECUTION_OUTCOME_UNKNOWN; it settles by itself, so don't initiate it again.

Verification code delivery

The verification code is a 6-digit number, valid for 5 minutes, with 3 attempts. It's never returned by the API: Sovera delivers it to your backend in the user.withdrawal.verification_code_issued webhook event, both on initiate and on resend. Configure your endpoint in Customer webhooks, then pass the code to your user or confirm on their behalf.

When the treasury has to be replenished before paying out, the code reaches Sovera by email instead. In that case the code is valid for 15 minutes from when the email arrives (the verification.expires_at returned on initiate or resend doesn't reflect it), the event always carries trigger: "issued" (also after a resend) and has no attempts_remaining, it is sent only when your email poller has a webhook configured, and attempts are counted by custody, so the 3-attempt BLOCKED rule doesn't apply.

Event fieldTypeDescription
codestringThe 6-digit verification code.
withdrawal_idstring (uuid)Withdrawal id.
user_idstring (uuid)User who owns the withdrawal.
expires_atstringWhen the code stops working (UTC).
triggerstringissued on initiate, resent on resend (always issued when the code arrives by email).
attempts_remainingintegerAttempts left with this code (3). Absent when the code arrives by email.
amountstringWithdrawal amount.
currencystringAsset code.
networkstringCanonical network code. Can be absent when the code arrives by email.
destination_addressstringDestination address.

The Webhooks page shows the full event and how to handle it.

When the treasury needs replenishing before it can pay out, the code reaches Sovera by email first. Keep your deposit email poller and your webhook configured so the event always reaches you.


Initiate Withdrawal

POSThttps://api.sandbox.sovera.io/sovx/v1/users/:user_id/accounts/crypto/withdrawals

Create a PENDING withdrawal and issue a verification code. Sovera reserves the amount from the user's available balance across wallets: it moves to held, so the same funds can't back another withdrawal. Nothing is sent until you confirm it, and cancelling, expiry or failure gives the reservation back.

Path Parameters

ParameterTypeRequiredDescription
user_idstring (uuid)YesUser who withdraws.

Request Body

FieldTypeRequiredDescription
currencystringYesAsset code, case-insensitive, e.g. BTC.
amountstringYesPositive decimal string, e.g. "0.01000000", with at most the asset's decimals (8 for BTC); more answers 422 on /amount. A JSON number still works but is deprecated.
addressstringYesDestination address.
networkstringYesCanonical network code. Must be a network the currency supports (e.g. USDT → ETHEREUM).
memostringNoNote for the withdrawal (max 255).

Unknown fields answer 422. tag and reference are still accepted but ignored (deprecated).

{
  "currency": "BTC",
  "amount": "0.01000000",
  "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
  "network": "BITCOIN",
  "memo": "Withdrawal to hardware wallet"
}

Success Response (201 Created):

{
  "success": true,
  "data": {
    "id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "object": "withdrawal",
    "atx_id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "status": "PENDING",
    "status_reason": null,
    "user_id": "5299e81c-3a8c-5b64-a112-b93bf43de74b",
    "customer_id": "corp-redundant-firewall",
    "wallet_id": null,
    "debited_wallets": [],
    "currency": "BTC",
    "amount": "0.01000000",
    "fee": null,
    "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "network": "BITCOIN",
    "memo": "Withdrawal to hardware wallet",
    "tx_hash": null,
    "idempotency_key": "9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c",
    "created_at": "2026-10-12T14:03:11Z",
    "updated_at": "2026-10-12T14:03:11Z",
    "completed_at": null,
    "created_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "updated_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "verification": {
      "expires_at": "2026-10-12T14:08:11Z",
      "attempts_remaining": 3
    }
  },
  "meta": {
    "timestamp": "2026-10-12T14:03:11Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
  }
}

Validation error (422 Unprocessable Entity):

{
  "success": false,
  "errors": [
    {
      "code": "VALIDATION_ERROR",
      "message": "network must be one of: ETHEREUM for USDT",
      "source": { "pointer": "/network" }
    }
  ],
  "meta": {
    "timestamp": "2026-10-12T14:03:11Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
  }
}
curl -X POST "https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-idempotency-key: 9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c" \
  -d '{
    "currency": "BTC",
    "amount": "0.01000000",
    "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "network": "BITCOIN",
    "memo": "Withdrawal to hardware wallet"
  }'

Errors: 400 INSUFFICIENT_BALANCE available balance below the amount · 401 UNAUTHORIZED missing or invalid credential · 403 FORBIDDEN user token of another user, or account frozen · 404 USER_NOT_FOUND · 409 IDEMPOTENCY_IN_PROGRESS · 422 VALIDATION_ERROR missing or invalid field (source.pointer names it, e.g. /network) · 422 IDEMPOTENCY_KEY_REUSED · 429 RATE_LIMIT_EXCEEDED · 503 SERVICE_UNAVAILABLE crypto withdrawals not enabled for your account.


Confirm Withdrawal

POSThttps://api.sandbox.sovera.io/sovx/v1/users/:user_id/accounts/crypto/withdrawals/:withdrawal_id/confirm

Confirm a PENDING withdrawal with its verification code. On a valid code the withdrawal moves to PROCESSING, the user's balance is debited (debited_wallets fills in) and the transaction goes on-chain. It turns COMPLETED or FAILED later: get the withdrawal to follow it.

A wrong code answers 400 and uses one attempt; the third wrong code blocks the withdrawal. If execution fails before the request leaves Sovera, the withdrawal goes back to PENDING and you can confirm again. If the request was already sent and its answer is lost, the call answers 200 with the withdrawal PROCESSING and status_reason.code EXECUTION_OUTCOME_UNKNOWN: don't confirm again. Read the withdrawal until it settles: no webhook announces the final status, and a failure is announced by ledger.wallet.credited with reason withdrawal_reversal when the funds come back.

Path Parameters

ParameterTypeRequiredDescription
user_idstring (uuid)YesUser who owns the withdrawal.
withdrawal_idstring (uuid)YesWithdrawal id. The id returned before this release is accepted too.

Request Body

FieldTypeRequiredDescription
codestringYesThe 6-digit code from user.withdrawal.verification_code_issued.
otpstringNoDeprecated alias of code. Send one or the other, never both.
{
  "code": "482913"
}

Success Response (200 OK):

{
  "success": true,
  "data": {
    "id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "object": "withdrawal",
    "atx_id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "status": "PROCESSING",
    "status_reason": null,
    "user_id": "5299e81c-3a8c-5b64-a112-b93bf43de74b",
    "customer_id": "corp-redundant-firewall",
    "wallet_id": null,
    "debited_wallets": [
      {
        "wallet_id": "7b2e4c1a-9d3f-4e8b-a6c2-5f1d0e9b8a73",
        "currency": "BTC",
        "amount": "0.01000000"
      }
    ],
    "currency": "BTC",
    "amount": "0.01000000",
    "fee": null,
    "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "network": "BITCOIN",
    "memo": "Withdrawal to hardware wallet",
    "tx_hash": null,
    "idempotency_key": "9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c",
    "created_at": "2026-10-12T14:03:11Z",
    "updated_at": "2026-10-12T14:04:02Z",
    "completed_at": null,
    "created_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "updated_by": "12015942-4d29-5733-a774-14ee16e31da3"
  },
  "meta": {
    "timestamp": "2026-10-12T14:04:02Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
  }
}
curl -X POST "https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}/confirm" \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "x-idempotency-key: 0f6d2b8e-3a1c-4d7e-9b5f-2c8a6e4d1b3f" \
  -d '{
    "code": "482913"
  }'

Errors: 400 INVALID_VERIFICATION_CODE wrong code (the message says how many attempts remain) · 400 INSUFFICIENT_BALANCE the reserved funds could not be spent; the withdrawal is now FAILED · 400 VERIFICATION_CODE_EXPIRED or 422 INVALID_STATE_TRANSITION the code lapsed; the withdrawal is now EXPIRED · 401 UNAUTHORIZED · 403 VERIFICATION_BLOCKED too many wrong codes; the withdrawal is BLOCKED · 403 FORBIDDEN user token of another user, or account frozen · 404 WITHDRAWAL_NOT_FOUND · 422 VALIDATION_ERROR no code, or both code and otp · 422 INVALID_STATE_TRANSITION the withdrawal isn't PENDING · 429 RATE_LIMIT_EXCEEDED · 5xx the execution failed before leaving Sovera; the withdrawal is back in PENDING, confirm again.


Resend Verification Code

POSThttps://api.sandbox.sovera.io/sovx/v1/users/:user_id/accounts/crypto/withdrawals/:withdrawal_id/verification-codes

Issue a new verification code for a PENDING withdrawal. The previous code stops working, the attempts reset to 3 and a new user.withdrawal.verification_code_issued event goes out with trigger: "resent". Send no body. A BLOCKED, EXPIRED or settled withdrawal can't get a new code.

POST https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}/verification-codes

Success Response (200 OK):

{
  "success": true,
  "data": {
    "id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "object": "withdrawal",
    "atx_id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "status": "PENDING",
    "status_reason": null,
    "user_id": "5299e81c-3a8c-5b64-a112-b93bf43de74b",
    "customer_id": "corp-redundant-firewall",
    "wallet_id": null,
    "debited_wallets": [],
    "currency": "BTC",
    "amount": "0.01000000",
    "fee": null,
    "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "network": "BITCOIN",
    "memo": "Withdrawal to hardware wallet",
    "tx_hash": null,
    "idempotency_key": "9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c",
    "created_at": "2026-10-12T14:03:11Z",
    "updated_at": "2026-10-12T14:03:11Z",
    "completed_at": null,
    "created_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "updated_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "verification": {
      "expires_at": "2026-10-12T14:11:40Z",
      "attempts_remaining": 3
    }
  },
  "meta": {
    "timestamp": "2026-10-12T14:06:40Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
  }
}
curl -X POST "https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}/verification-codes" \
  -H "x-api-key: YOUR_API_KEY"

Errors: 401 UNAUTHORIZED · 403 FORBIDDEN · 404 WITHDRAWAL_NOT_FOUND · 422 INVALID_STATE_TRANSITION the withdrawal isn't PENDING · 429 RATE_LIMIT_EXCEEDED.

Deprecated

POST …/withdrawals/:withdrawal_id/verification/codes still works with the same behavior. It's removed in the next release: move to …/verification-codes.


Cancel Withdrawal

POSThttps://api.sandbox.sovera.io/sovx/v1/users/:user_id/accounts/crypto/withdrawals/:withdrawal_id/cancel

Cancel a PENDING or BLOCKED withdrawal. Nothing has left the account yet, so nothing is debited. The withdrawal turns CANCELLED with status_reason.code CANCELLED_BY_CLIENT. Once it's PROCESSING it can't be cancelled. Send no body.

POST https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}/cancel

Success Response (200 OK):

{
  "success": true,
  "data": {
    "id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "object": "withdrawal",
    "atx_id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "status": "CANCELLED",
    "status_reason": {
      "code": "CANCELLED_BY_CLIENT",
      "message": "The withdrawal was cancelled before confirmation."
    },
    "user_id": "5299e81c-3a8c-5b64-a112-b93bf43de74b",
    "customer_id": "corp-redundant-firewall",
    "wallet_id": null,
    "debited_wallets": [],
    "currency": "BTC",
    "amount": "0.01000000",
    "fee": null,
    "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "network": "BITCOIN",
    "memo": "Withdrawal to hardware wallet",
    "tx_hash": null,
    "idempotency_key": "9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c",
    "created_at": "2026-10-12T14:03:11Z",
    "updated_at": "2026-10-12T14:05:27Z",
    "completed_at": null,
    "created_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "updated_by": "12015942-4d29-5733-a774-14ee16e31da3"
  },
  "meta": {
    "timestamp": "2026-10-12T14:05:27Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
  }
}
curl -X POST "https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}/cancel" \
  -H "x-api-key: YOUR_API_KEY"

Errors: 401 UNAUTHORIZED · 403 FORBIDDEN · 404 WITHDRAWAL_NOT_FOUND · 422 INVALID_STATE_TRANSITION the withdrawal is already PROCESSING or final · 429 RATE_LIMIT_EXCEEDED.

Deprecated

DELETE …/withdrawals/:withdrawal_id still cancels and answers 204 No Content with no body. It's removed in the next release: move to POST …/cancel.


Get Withdrawal

GEThttps://api.sandbox.sovera.io/sovx/v1/users/:user_id/accounts/crypto/withdrawals/:withdrawal_id

Return one withdrawal. Records are permanent, so you can read a withdrawal at any time after it settles. Poll this endpoint after confirming until status is COMPLETED or FAILED.

GET https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}

Success Response (200 OK):

{
  "success": true,
  "data": {
    "id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "object": "withdrawal",
    "atx_id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
    "status": "COMPLETED",
    "status_reason": null,
    "user_id": "5299e81c-3a8c-5b64-a112-b93bf43de74b",
    "customer_id": "corp-redundant-firewall",
    "wallet_id": null,
    "debited_wallets": [
      {
        "wallet_id": "7b2e4c1a-9d3f-4e8b-a6c2-5f1d0e9b8a73",
        "currency": "BTC",
        "amount": "0.01000000"
      }
    ],
    "currency": "BTC",
    "amount": "0.01000000",
    "fee": {
      "amount": "0.00001420",
      "currency": "BTC",
      "paid_by": "SPONSOR"
    },
    "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
    "network": "BITCOIN",
    "memo": "Withdrawal to hardware wallet",
    "tx_hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
    "idempotency_key": "9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c",
    "created_at": "2026-10-12T14:03:11Z",
    "updated_at": "2026-10-12T14:21:48Z",
    "completed_at": "2026-10-12T14:21:48Z",
    "created_by": "12015942-4d29-5733-a774-14ee16e31da3",
    "updated_by": "12015942-4d29-5733-a774-14ee16e31da3"
  },
  "meta": {
    "timestamp": "2026-10-12T14:30:02Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
  }
}
curl -X GET "https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals/{{withdrawalID}}" \
  -H "x-api-key: YOUR_API_KEY"

Errors: 401 UNAUTHORIZED · 403 FORBIDDEN · 404 WITHDRAWAL_NOT_FOUND · 429 RATE_LIMIT_EXCEEDED.


List Withdrawals

GEThttps://api.sandbox.sovera.io/sovx/v1/users/:user_id/accounts/crypto/withdrawals

List the user's crypto withdrawals, newest first, with cursor pagination. Each item is the withdrawal object. An empty result is 200 with data: [].

Query Parameters

ParameterTypeRequiredDescription
filter[limit]integerNoPage size, 1 to 100 (default 25).
cursorstringNoOpaque token from meta.pagination.navigation. Echo it back unchanged.
filter[order]stringNocreated_at or updated_at, plus ASC or DESC. Default created_at DESC; a field without a direction sorts ASC.
filter[where][status][eq|inq]stringNoAny withdrawal status.
filter[where][currency][eq|inq]stringNoAsset code.
filter[where][tx_hash][eq]stringNoOn-chain hash.
filter[where][idempotency_key][eq]stringNoKey sent on initiate. Finds a withdrawal after a timeout.
filter[where][created_at][gte|lte|between]stringNoUTC date-time ending in Z.

Up to 6 conditions per request. Any other field, operator or filter[skip] answers 422 with source.parameter.

GET https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals?filter[limit]=25&filter[where][status][inq][]=PENDING&filter[where][status][inq][]=PROCESSING

Success Response (200 OK):

{
  "success": true,
  "data": [
    {
      "id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
      "object": "withdrawal",
      "atx_id": "3b1f0c52-7d4e-4a9b-8c21-5e6f7a8b9c0d",
      "status": "PROCESSING",
      "status_reason": null,
      "user_id": "5299e81c-3a8c-5b64-a112-b93bf43de74b",
      "customer_id": "corp-redundant-firewall",
      "wallet_id": null,
      "debited_wallets": [
        {
          "wallet_id": "7b2e4c1a-9d3f-4e8b-a6c2-5f1d0e9b8a73",
          "currency": "BTC",
          "amount": "0.01000000"
        }
      ],
      "currency": "BTC",
      "amount": "0.01000000",
      "fee": null,
      "address": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
      "network": "BITCOIN",
      "memo": "Withdrawal to hardware wallet",
      "tx_hash": null,
      "idempotency_key": "9a7c3e1f-5b2d-4c8e-a6f0-1d3b5e7f9a2c",
      "created_at": "2026-10-12T14:03:11Z",
      "updated_at": "2026-10-12T14:04:02Z",
      "completed_at": null,
      "created_by": "12015942-4d29-5733-a774-14ee16e31da3",
      "updated_by": "12015942-4d29-5733-a774-14ee16e31da3"
    }
  ],
  "meta": {
    "timestamp": "2026-10-12T14:10:00Z",
    "version": "v1",
    "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736",
    "pagination": {
      "records": { "limit": 25, "has_next": false, "has_previous": false },
      "navigation": { "next": null, "previous": null }
    }
  }
}
curl -G "https://api.sandbox.sovera.io/sovx/v1/users/{{userID}}/accounts/crypto/withdrawals" \
  -H "x-api-key: YOUR_API_KEY" \
  --data-urlencode "filter[limit]=25" \
  --data-urlencode "filter[where][status][inq][]=PENDING" \
  --data-urlencode "filter[where][status][inq][]=PROCESSING"

Errors: 401 UNAUTHORIZED · 403 FORBIDDEN · 422 VALIDATION_ERROR unsupported filter, order, limit or cursor (source.parameter names it) · 429 RATE_LIMIT_EXCEEDED.

On this page