{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-tutorials/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"No-KYC виртуальные карты","description":"Крипто-платежи для бизнеса. Принимайте USDT, платите через СБП QR. AML-проверки включены.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"no-kyc-виртуальные-карты","__idx":0},"children":["No-KYC виртуальные карты"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Пошаговое руководство для продуктов, которым нужно выдавать"," ","пользователям виртуальные VISA-карты ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["без прохождения KYC"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"сценарий","__idx":1},"children":["Сценарий"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Вы — криптокошелёк, необанк или любой потребительский сервис. Ваши"," ","пользователи хотят платить виртуальной картой за подписки и онлайн-"," ","покупки, но вы не хотите (и не можете быстро) настроить KYC-процесс."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["С Lumo B2B ваш пользователь получает активную VISA с полным номером и"," ","CVC через ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["~2 секунды"]}," после нажатия кнопки — без паспорта, без селфи,"," ","без ожидания подтверждения."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"преимущества","__idx":2},"children":["Преимущества"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Ноль документов."]}," KYC не требуется ни от вас, ни от пользователя."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Мгновенно."]}," Карта выдаётся из нашего стока — один HTTP-запрос."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["3DS OTP через API."]}," Мы отдаём код SMS-подтверждения по запросу."," ","SIM-карта не нужна."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Пополнение с USDT."]}," Списываем с баланса компании в USDT —"," ","пользователь вообще не касается блокчейна."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Полный PAN и CVC."]}," Не только маска — реальные данные для ввода в"," ","интернет-магазине."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"архитектура","__idx":3},"children":["Архитектура"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"Пользователь ──► Ваш продукт ──► Lumo B2B API ──► Виртуальная VISA\n                     │                                    │\n                     │                            Интернет-магазин\n                     │                                    │\n                     └────── USDT баланс ◄────── оплата / 3DS-код\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Деньги списываются с USDT-баланса вашей компании в Lumo. Вы берёте с"," ","пользователя (фиат или крипта) столько, сколько хотите — разница ваша"," ","маржа."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-1-подключение","__idx":4},"children":["Шаг 1: Подключение"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Перед первым вызовом убедитесь, что у компании в Lumo включена"," ","программа карт. Проверить можно через ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /auth/company/profile"]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"cards\": {\n    \"enabled\": true,\n    \"openingFeeUsdt\": 5,\n    \"commissionBps\": 80,\n    \"minInitialDepositUsdt\": 10,\n    \"testMode\": false\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["enabled: false"]}," — напишите в ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://t.me/lumo_support_bot"},"children":["Telegram"]},","," ","мы активируем."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-2-выпуск-карты","__idx":5},"children":["Шаг 2: Выпуск карты"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"import { v4 as uuid } from 'uuid';\n\nasync function issueCard(userId) {\n  const idempotencyKey = uuid();\n  const res = await fetch('https://b2b.lumowallet.io/cards/request', {\n    method: 'POST',\n    headers: {\n      'X-API-Key': process.env.LUMO_API_KEY,\n      'Idempotency-Key': idempotencyKey,\n    },\n  });\n  const body = await res.json();\n\n  if (body.status === 'assigned') {\n    await db.cards.create({\n      userId,\n      lumoCardId: body.card.id,\n      maskedPan: body.card.maskedPan,\n    });\n    return body.card;\n  }\n\n  // status === 'pending' — карт в стоке нет, ждём webhook card.assigned\n  await db.cardRequests.create({\n    userId,\n    lumoRequestId: body.request.id,\n  });\n  return { status: 'queued' };\n}\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["При ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status: 'assigned'"]}," карта уже работает. Комиссия за выпуск"," ","(",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["openingFeeUsdt"]},") списана с баланса компании автоматически."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-3-показ-pan-и-cvc-пользователю","__idx":6},"children":["Шаг 3: Показ PAN и CVC пользователю"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Когда пользователь хочет вбить данные в онлайн-магазине, запросите"," ","полный номер и CVC через отдельный endpoint:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"async function revealCard(lumoCardId) {\n  const res = await fetch(\n    `https://b2b.lumowallet.io/cards/${lumoCardId}/sensitive`,\n    { headers: { 'X-API-Key': process.env.LUMO_API_KEY } },\n  );\n  return res.json();\n}\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Ответ:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"cardId\": \"8c7f1823-...\",\n  \"cardNumberFull\": \"4466123412341234\",\n  \"cardCvv\": \"123\",\n  \"expiry\": \"03/29\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["⚠️ ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Безопасность."]}," На вашей стороне никогда не храните ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cardNumberFull"]}," ","и ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cardCvv"]}," в БД. Запрашивайте в момент показа, держите в памяти на"," ","время сессии, очищайте при закрытии экрана. Lumo ничего не кэширует —"," ","каждый запрос идёт напрямую к эквайеру."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Рекомендуем auto-hide через 30 секунд:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"jsx","header":{"controls":{"copy":{}}},"source":"function CardDetails({ cardId }) {\n  const [data, setData] = useState(null);\n  const [seconds, setSeconds] = useState(0);\n\n  const show = async () => {\n    setData(await revealCard(cardId));\n    setSeconds(30);\n  };\n\n  useEffect(() => {\n    if (seconds === 0) { setData(null); return; }\n    const t = setTimeout(() => setSeconds(s => s - 1), 1000);\n    return () => clearTimeout(t);\n  }, [seconds]);\n\n  if (!data) return <button onClick={show}>Показать карту</button>;\n  return (\n    <div>\n      <div>{data.cardNumberFull.replace(/(.{4})/g, '$1 ').trim()}</div>\n      <div>CVC: {data.cardCvv}</div>\n      <div>Скрыто через {seconds}s</div>\n    </div>\n  );\n}\n","lang":"jsx"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-4-3ds-otp","__idx":7},"children":["Шаг 4: 3DS OTP"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Когда пользователь делает покупку, эквайер присылает SMS c 6-значным"," ","кодом. У нас нет вашей SIM — мы получаем код напрямую из почты и"," ","отдаём через API."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Вариант A — поллинг"]}," (если не хотите webhook):"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"async function waitForOtp(lumoCardId, timeoutMs = 90_000) {\n  const start = Date.now();\n  while (Date.now() - start < timeoutMs) {\n    const res = await fetch(\n      `https://b2b.lumowallet.io/cards/${lumoCardId}/otp/latest`,\n      { headers: { 'X-API-Key': process.env.LUMO_API_KEY } },\n    );\n    const otp = await res.json();\n    if (otp && new Date(otp.expiresAt) > new Date()) return otp;\n    await sleep(5000);\n  }\n  throw new Error('OTP not received');\n}\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Вариант B — webhook"]}," (рекомендуется):"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Подпишитесь на ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card.otp_received"]}," в профиле компании:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"event\": \"card.otp_received\",\n  \"data\": {\n    \"cardId\": \"8c7f1823-...\",\n    \"code\": \"582130\",\n    \"expiresAt\": \"2026-04-24T12:02:10Z\"\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Моментально проталкивайте код пользователю в интерфейс, пуш-уведомлением"," ","или Telegram-ботом."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-5-пополнение-карты","__idx":8},"children":["Шаг 5: Пополнение карты"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Если пользователю нужен не только выпуск, но и возможность пополнять"," ","карту USDT — используйте двухфазный recharge:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"async function rechargeCard(lumoCardId, usdAmount) {\n  // 1. Посчитать сколько USDT будет списано\n  const quote = await fetch('https://b2b.lumowallet.io/cards/recharge/quote', {\n    method: 'POST',\n    headers: {\n      'X-API-Key': process.env.LUMO_API_KEY,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ cardId: lumoCardId, targetAmount: usdAmount }),\n  }).then(r => r.json());\n\n  console.log(`Будет списано ${quote.totalDebitUsdt} USDT (включая ${quote.commissionUsdt} наша комиссия)`);\n\n  // 2. Подтвердить\n  const recharge = await fetch('https://b2b.lumowallet.io/cards/recharge', {\n    method: 'POST',\n    headers: {\n      'X-API-Key': process.env.LUMO_API_KEY,\n      'Idempotency-Key': uuid(),\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ cardId: lumoCardId, targetAmount: usdAmount }),\n  }).then(r => r.json());\n\n  return recharge;\n}\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Финальный статус (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failed"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["refunded"]},") приходит webhook'ом"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card.recharge.*"]}," или обновляется в ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /cards/recharges"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"шаг-6-история-транзакций","__idx":9},"children":["Шаг 6: История транзакций"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Пользователь хочет видеть свои покупки — отдавайте через:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"async function listUserTransactions(lumoCardId, before) {\n  const params = new URLSearchParams({ limit: '50' });\n  if (before) params.set('before', before);\n  const res = await fetch(\n    `https://b2b.lumowallet.io/cards/${lumoCardId}/transactions?${params}`,\n    { headers: { 'X-API-Key': process.env.LUMO_API_KEY } },\n  );\n  return res.json();\n}\n","lang":"javascript"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Для real-time — подписывайтесь на ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["card.transaction.created"]}," webhook."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"юнит-экономика","__idx":10},"children":["Юнит-экономика"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Параметр"},"children":["Параметр"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Значение (пример)"},"children":["Значение (пример)"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["openingFeeUsdt"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["5 USDT"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["minInitialDepositUsdt"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["10 USDT"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["commissionBps"]}," на recharge"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["80 (0.8%)"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["На каждом пополнении вы получаете ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["commissionBps * сумма"]},". На выпуске —"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["openingFeeUsdt"]},". Добавляйте свою маржу сверху — стандартная практика в"," ","таких продуктах 1–3%."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"что-дальше","__idx":11},"children":["Что дальше"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/cards/"},"children":["Обзор программы карт"]}," — полные параметры и"," ","жизненный цикл."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/cards/webhooks"},"children":["Webhooks по картам"]}," — все события и формат."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Тестируйте с ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cardsTestMode = true"]}," — все операции возвращают"," ","стабовые данные без расхода реального стока (запросите включение у"," ","поддержки)."]}]}]},"headings":[{"value":"No-KYC виртуальные карты","id":"no-kyc-виртуальные-карты","depth":1},{"value":"Сценарий","id":"сценарий","depth":2},{"value":"Преимущества","id":"преимущества","depth":2},{"value":"Архитектура","id":"архитектура","depth":2},{"value":"Шаг 1: Подключение","id":"шаг-1-подключение","depth":2},{"value":"Шаг 2: Выпуск карты","id":"шаг-2-выпуск-карты","depth":2},{"value":"Шаг 3: Показ PAN и CVC пользователю","id":"шаг-3-показ-pan-и-cvc-пользователю","depth":2},{"value":"Шаг 4: 3DS OTP","id":"шаг-4-3ds-otp","depth":2},{"value":"Шаг 5: Пополнение карты","id":"шаг-5-пополнение-карты","depth":2},{"value":"Шаг 6: История транзакций","id":"шаг-6-история-транзакций","depth":2},{"value":"Юнит-экономика","id":"юнит-экономика","depth":2},{"value":"Что дальше","id":"что-дальше","depth":2}],"frontmatter":{"seo":{"title":"No-KYC виртуальные карты"}},"lastModified":"2026-04-24T07:34:49.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/tutorials/no-kyc-cards","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}