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_KEYConventions
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.
| Field | Type | Description |
|---|---|---|
| id | string (uuid) | Withdrawal id. Use it in every path on this page. |
| object | string | Always withdrawal. |
| atx_id | string (uuid) | Alias of id, same value. Kept for integrations that stored it. |
| status | string | PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED, EXPIRED or BLOCKED. See Status lifecycle. |
| status_reason | object | 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_id | string (uuid) | User who owns the withdrawal. |
| customer_id | string | null | Your platform customer id. |
| wallet_id | null | Always null: a withdrawal debits the user's balance across wallets. See debited_wallets. |
| debited_wallets | array | [{ wallet_id, currency, amount }], one item per wallet debited. Empty until the withdrawal is confirmed. |
| currency | string | Asset code in uppercase, e.g. BTC. |
| amount | string | Amount at the asset's scale, e.g. "0.01000000". |
| fee | object | null | Real 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. |
| address | string | Destination address. |
| network | string | Canonical network code, e.g. BITCOIN. |
| memo | string | null | Your note for the withdrawal. |
| tx_hash | string | null | On-chain hash. null until the transaction is broadcast. |
| idempotency_key | string | null | The x-idempotency-key you sent on initiate. |
| created_at | string | Creation time (UTC). |
| updated_at | string | Last change (UTC). |
| completed_at | string | null | Settlement time (UTC). null until COMPLETED. |
| created_by | string | null | Credential or user token that created it. |
| updated_by | string | null | Credential or user token that last changed it. |
| verification | object | Only on initiate and resend: { expires_at, attempts_remaining }. Tells you a code went out. The code itself is never in the response. |
Status lifecycle
| Status | Meaning | Next |
|---|---|---|
PENDING | Created. The amount is reserved and a verification code went out; it waits for confirmation. | PROCESSING, BLOCKED, CANCELLED, EXPIRED, FAILED |
PROCESSING | Code accepted. The transaction is being executed on-chain. | COMPLETED, FAILED |
COMPLETED | Settled on-chain. tx_hash and completed_at are set, and fee too unless the network didn't report it. | Final |
FAILED | The network or custody rejected it. status_reason says why. | Final |
CANCELLED | You cancelled it before confirmation (CANCELLED_BY_CLIENT). | Final |
EXPIRED | The code lapsed before confirmation (VERIFICATION_CODE_EXPIRED). | Final |
BLOCKED | Three 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 field | Type | Description |
|---|---|---|
| code | string | The 6-digit verification code. |
| withdrawal_id | string (uuid) | Withdrawal id. |
| user_id | string (uuid) | User who owns the withdrawal. |
| expires_at | string | When the code stops working (UTC). |
| trigger | string | issued on initiate, resent on resend (always issued when the code arrives by email). |
| attempts_remaining | integer | Attempts left with this code (3). Absent when the code arrives by email. |
| amount | string | Withdrawal amount. |
| currency | string | Asset code. |
| network | string | Canonical network code. Can be absent when the code arrives by email. |
| destination_address | string | Destination 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
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
| Parameter | Type | Required | Description |
|---|---|---|---|
| user_id | string (uuid) | Yes | User who withdraws. |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| currency | string | Yes | Asset code, case-insensitive, e.g. BTC. |
| amount | string | Yes | Positive 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. |
| address | string | Yes | Destination address. |
| network | string | Yes | Canonical network code. Must be a network the currency supports (e.g. USDT → ETHEREUM). |
| memo | string | No | Note 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
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
| Parameter | Type | Required | Description |
|---|---|---|---|
| user_id | string (uuid) | Yes | User who owns the withdrawal. |
| withdrawal_id | string (uuid) | Yes | Withdrawal id. The id returned before this release is accepted too. |
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| code | string | Yes | The 6-digit code from user.withdrawal.verification_code_issued. |
| otp | string | No | Deprecated 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
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-codesSuccess 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
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}}/cancelSuccess 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
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
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
| Parameter | Type | Required | Description |
|---|---|---|---|
| filter[limit] | integer | No | Page size, 1 to 100 (default 25). |
| cursor | string | No | Opaque token from meta.pagination.navigation. Echo it back unchanged. |
| filter[order] | string | No | created_at or updated_at, plus ASC or DESC. Default created_at DESC; a field without a direction sorts ASC. |
| filter[where][status][eq|inq] | string | No | Any withdrawal status. |
| filter[where][currency][eq|inq] | string | No | Asset code. |
| filter[where][tx_hash][eq] | string | No | On-chain hash. |
| filter[where][idempotency_key][eq] | string | No | Key sent on initiate. Finds a withdrawal after a timeout. |
| filter[where][created_at][gte|lte|between] | string | No | UTC 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][]=PROCESSINGSuccess 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.