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

Fluxo completo de on-ramp de fiat para cripto

Demo Off-Ramp

Converta cripto de volta para moeda fiat local

Painel de Poupança

Interface de conta poupança custodial

Ouvinte de Webhook

Lide com notificações de eventos em tempo real

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>
  );
}

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://sandbox.killb.app/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://sandbox.killb.app/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

Referência da API

Documentação completa da API

Guia de Webhooks

Configure notificações em tempo real

Tratamento de Erros

Melhores práticas para gerenciamento de erros

Melhores Práticas

Dicas para integração pronta para produção
Tem um app demo para compartilhar? Entre em contato conosco em [email protected] para ter destaque!