Cards
Card Withdrawals
Create card withdrawals to blockchain wallets and check the latest withdrawal status.
Flow Summary
The current withdrawal flow is:
Step 1. Make sure the source card is active
Use Virtual Cards first
Step 2. Create the withdrawalPOST /api/v1/card-withdrawals
Step 3. Check the latest withdrawal stateGET /api/v1/cards/{uuid}/withdraw-status
All routes below should be treated as protected routes and sent with:
Authorization: Bearer <access_token>
The create endpoint also passes through DecryptField(), so it accepts either plain JSON or the encrypted wrapper described in Overview.
1. Create Card Withdrawal
POST /api/v1/card-withdrawals
Creates a withdrawal from a card to a blockchain wallet.
Request
{
"source_card_uuid": "5e5d4990-2241-46dc-9dbd-8abcf97e6061",
"wallet_address": "TP6fJc4Y7Qm6kQ1u1FfH2uZzGgQqV1kB2u",
"amount": "50.00",
"network": "TRC20"
}
Request rules
source_card_uuidis required and must be a UUIDwallet_addressis requiredamountis requiredamountmust be sent as a JSON string, not a JSON numberamountmust parse as a decimal value greater than0networkis required
Important backend behavior
- The route is IP-rate-limited to
60requests per minute - The source card must belong to the current user
- The source card must be
ACTIVE - The network must be a valid blockchain network enum
- The current accepted values include
TRC20andERC20 - Only one pending withdrawal is allowed per user at a time
- The submitted amount must be greater than the configured withdrawal fee
- The service creates the withdrawal row first, then executes the withdrawal synchronously
2. Get Latest Withdrawal Status
GET /api/v1/cards/{uuid}/withdraw-status
Returns the raw status of the latest withdrawal for a specific card UUID.
Path parameter
uuidis requireduuidis the card UUID, not the withdrawal UUID
Returned statuses
The current service returns the latest row's raw status, commonly:
PENDINGPROCESSINGSUCCESSFAILEDNOT_FOUND
Important backend caveat
- Some Swagger comments describe summarized values such as
APPROVED,PENDING, orDECLINED - The current implementation does not map to that simplified set
- Instead, it returns the raw latest entity status, or
NOT_FOUNDif no withdrawal exists yet - The handler requires an authenticated user, but the service currently loads the card by UUID without explicitly verifying that the card belongs to that user before reading the latest withdrawal row
Success response shape
{
"status_code": 200,
"message": "Success",
"data": {
"status": "PENDING"
}
}