Pular para o conteúdo principal

Visão Geral

Explore nossa coleção de aplicações de demonstração e exemplos de código para acelerar sua integração com a API KillB.

Aplicações de Exemplo

Demo On-Ramp

Uma implementação completa do fluxo de on-ramp (COP/MXN → USDC).

Recursos

  • Criação de usuário e KYC
  • Exibição de cotação em tempo real
  • Integração de pagamento PSE/SPEI
  • Rastreamento de status da transação
  • Tratamento de webhook

Exemplo de Código

import { useState } from 'react';

function OnRampWidget() {
  const [quote, setQuote] = useState(null);
  const [amount, setAmount] = useState('');

  const getQuote = async () => {
    const response = await fetch('/api/v2/quotations', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        fromCurrency: 'COP',
        toCurrency: 'USDC',
        amount: parseFloat(amount),
        amountIsToCurrency: false,
        cashInMethod: 'PSE',
        cashOutMethod: 'POLYGON'
      })
    });
    
    const data = await response.json();
    setQuote(data);
  };

  const createRamp = async () => {
    const response = await fetch('/api/v2/ramps', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        quotationId: quote.id,
        userId: currentUser.id,
        accountId: walletAccount.id
      })
    });
    
    const ramp = await response.json();
    // Redirecionar para URL de pagamento PSE
    window.location.href = ramp.paymentInfo[0].url;
  };

  return (
    <div>
      <input
        type="number"
        value={amount}
        onChange={(e) => setAmount(e.target.value)}
        placeholder="Valor em COP"
      />
      <button onClick={getQuote}>Obter Cotação</button>
      
      {quote && (
        <div>
          <p>Você receberá: {quote.toAmount} USDC</p>
          <p>Taxa: {quote.rate}</p>
          <button onClick={createRamp}>Continuar para Pagamento</button>
        </div>
      )}
    </div>
  );
}

Ver Demo Completa

Veja a aplicação de demonstração completa de on-ramp no GitHub

Demo Off-Ramp

Converta criptomoeda de volta para moeda fiat local.

Recursos

  • Verificação de saldo da carteira
  • Cálculo de cotação
  • Validação de conta bancária
  • Monitoramento de transação
  • Geração de recibo

Exemplo de Código

export default function OffRampPage() {
  const createOffRamp = async (formData) => {
    // Passo 1: Obter cotação
    const quoteRes = await fetch('/api/v2/quotations', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        fromCurrency: 'USDC',
        toCurrency: 'COP',
        amount: formData.amount,
        amountIsToCurrency: false,
        cashInMethod: 'POLYGON',
        cashOutMethod: 'PSE'
      })
    });
    const quote = await quoteRes.json();

    // Passo 2: Criar ramp
    const rampRes = await fetch('/api/v2/ramps', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        quotationId: quote.id,
        userId: formData.userId,
        accountId: formData.bankAccountId
      })
    });
    const ramp = await rampRes.json();

    // Passo 3: Mostrar instruções de pagamento
    return ramp;
  };

  return (
    <form onSubmit={(e) => {
      e.preventDefault();
      createOffRamp(formData);
    }}>
      {/* Campos do formulário */}
    </form>
  );
}

Demo Poupança

Implemente uma interface de conta poupança custodial.

Exemplo de Código

// Criar conta poupança
const createSavingsAccount = async (userId) => {
  const response = await fetch('/api/v2/savings', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      userId: userId,
      acceptedTermsAndConditions: true
    })
  });
  
  return await response.json();
};

// Obter saldo
const getBalance = async (savingsAccountId) => {
  const response = await fetch(
    `/api/v2/savings/${savingsAccountId}/balance`,
    {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    }
  );
  
  return await response.json();
};

// Obter instruções de depósito
const getDepositInstructions = async (savingsAccountId, type) => {
  const response = await fetch(
    `/api/v2/savings/${savingsAccountId}/deposit-instructions/${type}`,
    {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    }
  );
  
  return await response.json();
};

Demo Ouvinte de Webhook

Lide com eventos de webhook em tempo real da KillB.

Exemplo de Código

const express = require('express');
const crypto = require('crypto');

const app = express();
app.use(express.json());

app.post('/webhooks/killb', (req, res) => {
  // Verificar assinatura do webhook
  const signature = req.headers['x-signature-sha256'];
  const payload = JSON.stringify(req.body);
  
  const expectedSignature = crypto
    .createHmac('sha256', process.env.WEBHOOK_SECRET)
    .update(payload)
    .digest('hex');
  
  if (signature !== expectedSignature) {
    return res.status(401).json({ error: 'Assinatura inválida' });
  }
  
  // Processar evento webhook
  const { event, data } = req.body;
  
  switch(event) {
    case 'ramp.completed':
      handleRampCompleted(data);
      break;
    case 'ramp.failed':
      handleRampFailed(data);
      break;
    case 'user.kyc_updated':
      handleKYCUpdate(data);
      break;
  }
  
  res.status(200).json({ received: true });
});

app.listen(3000);

Saiba Mais

Leia o guia completo de segurança de webhook

Trechos de Código

Gerenciamento de Usuários

const createUser = async (userData) => {
  const response = await fetch('/api/v2/users', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      type: 'PERSON',
      externalId: userData.externalId,
      data: {
        firstName: userData.firstName,
        lastName: userData.lastName,
        email: userData.email,
        phone: userData.phone,
        dateOfBirth: userData.dateOfBirth,
        address: userData.address,
        document: userData.document
      }
    })
  });
  
  return await response.json();
};

Criação de Conta

const createWalletAccount = async (userId, walletAddress) => {
  const response = await fetch('/api/v2/accounts', {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${token}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      type: 'WALLET',
      userId: userId,
      externalId: `wallet-${userId}`,
      data: {
        firstName: 'João',
        lastName: 'Silva',
        email: '[email protected]',
        phone: '+5511987654321',
        currency: 'USDC',
        network: 'POLYGON',
        address: walletAddress,
        countryCode: 'BR',
        document: {
          type: 'PASSPORT',
          number: 'AB123456',
          issuedCountryCode: 'BR'
        }
      }
    })
  });
  
  return await response.json();
};

Criação de Ramp

const executeRamp = async (userId, accountId, amount, direction) => {
  try {
    // 1. Criar cotação
    const quote = await fetch('/api/v2/quotations', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        fromCurrency: direction === 'ON' ? 'COP' : 'USDC',
        toCurrency: direction === 'ON' ? 'USDC' : 'COP',
        amount: amount,
        amountIsToCurrency: false,
        cashInMethod: direction === 'ON' ? 'PSE' : 'POLYGON',
        cashOutMethod: direction === 'ON' ? 'POLYGON' : 'PSE'
      })
    }).then(r => r.json());

    console.log('Cotação:', quote);

    // 2. Criar ramp
    const ramp = await fetch('/api/v2/ramps', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        quotationId: quote.id,
        userId: userId,
        accountId: accountId
      })
    }).then(r => r.json());

    console.log('Ramp:', ramp);
    
    return ramp;
  } catch (error) {
    console.error('Falha na criação do ramp:', error);
    throw error;
  }
};

Testando no Sandbox

Use estas funções auxiliares para testar sua integração:

Simular Cash-In

curl --request POST \
  --url https://teste-94u93qnn.uc.gateway.dev/api/v2/faker/cash-in \
  --header 'Authorization: Bearer SEU_TOKEN_DE_ACESSO' \
  --header 'Content-Type: application/json' \
  --data '{
    "rampId": "ramp-id-aqui"
  }'

Simular Conclusão de Cash-Out

curl --request POST \
  --url https://teste-94u93qnn.uc.gateway.dev/api/v2/faker/cash-out \
  --header 'Authorization: Bearer SEU_TOKEN_DE_ACESSO' \
  --header 'Content-Type: application/json' \
  --data '{
    "rampId": "ramp-id-aqui"
  }'
Endpoints Faker só funcionam no ambiente sandbox e são usados para fins de teste.

Lista de Verificação de Integração

1

Configurar Autenticação

Implementar lógica de login e atualização de token
2

Criar Gerenciamento de Usuários

Construir fluxos de criação de usuário e submissão de KYC
3

Implementar Criação de Conta

Adicionar gerenciamento de conta bancária e carteira
4

Construir UI de Cotação

Mostrar preços em tempo real para usuários
5

Lidar com Fluxo de Ramp

Criar e monitorar transações ramp
6

Configurar Webhooks

Receber atualizações de status em tempo real
7

Adicionar Tratamento de Erros

Implementar tratamento de erros adequado e lógica de retry
8

Testar Completamente

Usar ambiente sandbox para testes de ponta a ponta

Recursos Adicionais

Tem um app demo para compartilhar? Entre em contato conosco em [email protected] para ter destaque!