Настройка вывода криптовалюты на банковскую карту
Вывод крипто на банковскую карту — off-ramp сценарий, при котором пользователь продаёт криптовалюту и получает деньги на дебетовую карту. Технически сложнее, чем вывод банковским переводом: не все эквайеры поддерживают push-платежи на карты, а комиссии выше.
Push-to-card механизм
В отличие от pull-транзакций (списание с карты), push-to-card использует иной API — Visa Direct или Mastercard Send. Это прямой кредит на дебетовую карту через сеть платёжной системы.
Visa Direct — поддерживает мгновенные переводы на дебетовые карты Visa в 200+ странах. Средняя скорость зачисления: 30 минут в США, несколько часов в ЕС.
Mastercard Send — аналогичный сервис для карт Mastercard.
Доступ к этим API — только через авторизованных технологических партнёров (Marqeta, Stripe Issuing, Checkout.com Payouts, Modulr).
Интеграция через Checkout.com Payouts
import httpx
import uuid
class CheckoutPayoutsClient:
BASE_URL = "https://api.checkout.com"
def __init__(self, secret_key: str):
self.session = httpx.AsyncClient(
headers={"Authorization": f"Bearer {secret_key}"}
)
async def payout_to_card(
self,
card_token: str, # токенизированная карта
amount: int, # в минорных единицах (центы)
currency: str,
reference: str,
recipient_name: str,
) -> dict:
payload = {
"source": {
"type": "currency_account",
"id": "ca_xxx", # ваш счёт в Checkout
},
"destination": {
"type": "token",
"token": card_token,
},
"amount": amount,
"currency": currency,
"reference": reference,
"instruction": {
"purpose": "CRYPTO_WITHDRAWAL",
"charge_bearer": "CRED",
"funds_transfer_type": "FD", # Fund Disbursement
},
"sender": {
"type": "instrument",
"reference": str(uuid.uuid4()),
"first_name": "Platform",
"last_name": "Name",
},
}
resp = await self.session.post(
f"{self.BASE_URL}/transfers",
json=payload
)
return resp.json()
Токенизация карты для вывода
Пользователь добавляет карту для вывода — храним только токен, без PAN:
@app.post("/api/withdrawal-cards")
async def add_withdrawal_card(
card_data: CardData,
user: User = Depends(get_current_user)
):
# Токенизируем через Checkout.com
token_resp = await checkout.tokenize_card({
"type": "card",
"number": card_data.number,
"expiry_month": card_data.expiry_month,
"expiry_year": card_data.expiry_year,
"name": card_data.holder_name,
})
# Верифицируем карту: небольшой charge + return
verify_result = await verify_card_ownership(
token=token_resp["token"],
user_id=user.id
)
if verify_result.verified:
await db.save_withdrawal_card(
user_id=user.id,
token=token_resp["token"],
last4=card_data.number[-4:],
brand=token_resp["scheme"],
)
Ограничения и лимиты
Visa Direct имеет ограничения, которые нужно учитывать:
| Параметр | Значение |
|---|---|
| Максимальная сумма / транзакция | $50,000 (зависит от страны) |
| Скорость | 30 мин – 2 часа |
| Поддерживаемые карты | Дебетовые (кредитные — не везде) |
| Доступные валюты | 160+ |
Некоторые банки отклоняют входящие push-платежи от криптовалютных компаний. Процент успешных транзакций для крипто off-ramp — обычно 85–95%, остальные отклоняются на стороне банка. Нужна система автоматических повторных попыток и fallback на банковский перевод.
Верификация карты
Перед добавлением карты для вывода важно убедиться, что карта принадлежит пользователю, а не украдена. Micro-deposit verification: списываем $0.01–$1.00 и просим пользователя подтвердить сумму из выписки. Для дебетовых карт это работает через Visa/Mastercard zero-value auth с BIN lookup.
Также проверяем соответствие имени держателя карты имени в KYC-профиле пользователя — несовпадение требует дополнительной верификации.







