Step-by-step guide to integrate Trust Score in your platform
Este guia prático mostra como integrar a Due Diligence Engine em sua plataforma.
curl -X POST https://api.counterx.com/v1/due-diligence/start \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"assetId": "your-asset-id"
}'
curl https://api.counterx.com/v1/due-diligence/trust-score/your-asset-id \
-H "Authorization: Bearer YOUR_API_KEY"
Objetivo: Mostrar Trust Score em cada listing
// Ao exibir um asset no marketplace
async function displayAsset(assetId) {
const asset = await getAsset(assetId);
const trustScore = await getTrustScore(assetId);
return {
...asset,
trustScore: trustScore.trustScore,
confidenceLevel: trustScore.confidenceLevel,
riskFlags: trustScore.riskFlags
};
}
// Componente React
function AssetCard({ asset }) {
return (
<div>
<h2>{asset.title}</h2>
<TrustBadge score={asset.trustScore} level={asset.confidenceLevel} />
{asset.riskFlags.length > 0 && (
<RiskFlags flags={asset.riskFlags} />
)}
</div>
);
}
Objetivo: Iniciar Due Diligence automaticamente quando um asset é criado
async function createAsset(assetData) {
// Criar asset
const asset = await db.assets.create(assetData);
// Iniciar Due Diligence automaticamente
const dd = await startDueDiligence(asset.id);
// Configurar webhook para notificação quando completar
await setupWebhook({
url: `${process.env.APP_URL}/webhooks/due-diligence`,
events: ['due_diligence.completed']
});
return asset;
}
Objetivo: Conectar Stripe automaticamente para verificar receita
async function connectStripe(dueDiligenceId, stripeAccountId) {
// Obter dados do Stripe
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const account = await stripe.accounts.retrieve(stripeAccountId);
const balance = await stripe.balance.retrieve({
stripeAccount: stripeAccountId
});
// Upload como evidência
await uploadEvidence(dueDiligenceId, {
pillarType: 'FINANCIAL',
evidenceType: 'API_CONNECTION',
title: 'Stripe Account Verification',
data: {
accountId: stripeAccountId,
balance: balance.available[0].amount,
currency: balance.available[0].currency,
verified: account.charges_enabled && account.payouts_enabled
},
source: 'Stripe API'
});
}
Objetivo: Exibir badge de confiança verificada
<!-- Badge HTML -->
<div class="trust-badge" data-asset-id="your-asset-id">
<div class="trust-score">--</div>
<div class="trust-label">Trust Score</div>
</div>
<script>
async function loadTrustBadge(assetId) {
const response = await fetch(
`https://api.counterx.com/v1/due-diligence/trust-score/${assetId}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const data = await response.json();
if (data.success && data.data.status === 'VALID') {
const badge = document.querySelector(`[data-asset-id="${assetId}"]`);
badge.querySelector('.trust-score').textContent = data.data.trustScore;
badge.classList.add(`trust-${data.data.confidenceLevel.toLowerCase()}`);
}
}
// Carregar badge ao carregar página
document.addEventListener('DOMContentLoaded', () => {
const assetId = document.querySelector('.trust-badge').dataset.assetId;
loadTrustBadge(assetId);
});
</script>
async function setupWebhook() {
const response = await fetch('https://api.counterx.com/v1/webhooks', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://your-domain.com/webhooks/due-diligence',
events: [
'due_diligence.completed',
'risk_flag.added',
'trust_score.updated'
]
})
});
return response.json();
}
const express = require('express');
const crypto = require('crypto');
const app = express();
app.post('/webhooks/due-diligence', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-webhook-signature'];
const secret = process.env.WEBHOOK_SECRET;
// Verificar assinatura
const hmac = crypto.createHmac('sha256', secret);
const digest = hmac.update(JSON.stringify(req.body)).digest('hex');
if (signature !== digest) {
return res.status(401).send('Invalid signature');
}
const event = req.body;
switch (event.event) {
case 'due_diligence.completed':
handleDueDiligenceCompleted(event.data);
break;
case 'risk_flag.added':
handleRiskFlagAdded(event.data);
break;
case 'trust_score.updated':
handleTrustScoreUpdated(event.data);
break;
}
res.status(200).send('OK');
});
function handleDueDiligenceCompleted(data) {
console.log(`Due Diligence ${data.dueDiligenceId} completed`);
console.log(`Trust Score: ${data.trustScore}`);
// Atualizar asset no banco de dados
// Enviar notificação por email
// Atualizar cache
}
function handleRiskFlagAdded(data) {
console.log(`Risk flag added: ${data.code} (${data.severity})`);
// Notificar administradores
// Atualizar UI se necessário
}
function handleTrustScoreUpdated(data) {
console.log(`Trust score updated: ${data.trustScore}`);
// Invalidar cache
// Atualizar listings públicos
}
import React from 'react';
function TrustBadge({ score, level, size = 'medium' }) {
const getColor = () => {
if (score >= 90) return '#10b981'; // green
if (score >= 75) return '#3b82f6'; // blue
if (score >= 60) return '#f59e0b'; // yellow
if (score >= 40) return '#ef4444'; // red
return '#6b7280'; // gray
};
const getLabel = () => {
if (score >= 90) return 'Excelente';
if (score >= 75) return 'Bom';
if (score >= 60) return 'Moderado';
if (score >= 40) return 'Baixo';
return 'Muito Baixo';
};
return (
<div
className={`trust-badge trust-badge-${size}`}
style={{ borderColor: getColor() }}
>
<div className="trust-score" style={{ color: getColor() }}>
{score !== null ? Math.round(score) : '--'}
</div>
<div className="trust-label">{getLabel()}</div>
{level && (
<div className="trust-confidence">
Confiança: {level.replace('_', ' ')}
</div>
)}
</div>
);
}
export default TrustBadge;
import React from 'react';
function RiskFlags({ flags }) {
if (!flags || flags.length === 0) {
return null;
}
const getSeverityColor = (severity) => {
switch (severity) {
case 'CRITICAL': return '#dc2626';
case 'HIGH': return '#ea580c';
case 'MEDIUM': return '#f59e0b';
case 'LOW': return '#3b82f6';
default: return '#6b7280';
}
};
return (
<div className="risk-flags">
<h3>Avisos de Risco</h3>
{flags.map(flag => (
<div
key={flag.code}
className="risk-flag"
style={{ borderLeftColor: getSeverityColor(flag.severity) }}
>
<div className="risk-flag-header">
<span className="risk-flag-severity">{flag.severity}</span>
<span className="risk-flag-title">{flag.title}</span>
</div>
<p className="risk-flag-description">{flag.description}</p>
</div>
))}
</div>
);
}
export default RiskFlags;
// ❌ NUNCA faça isso
const API_KEY = 'dd_live_abc123...'; // Exposto no código
// ✅ Use variáveis de ambiente
const API_KEY = process.env.COUNTERX_API_KEY;
// ✅ Ou use um serviço de secrets (AWS Secrets Manager, etc)
Sempre valide a assinatura HMAC dos webhooks:
function verifyWebhookSignature(payload, signature, secret) {
const hmac = crypto.createHmac('sha256', secret);
const digest = hmac.update(JSON.stringify(payload)).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(digest)
);
}
Implemente rate limiting no seu lado para evitar exceder limites:
class RateLimiter {
constructor(maxRequests, windowMs) {
this.maxRequests = maxRequests;
this.windowMs = windowMs;
this.requests = [];
}
async check() {
const now = Date.now();
this.requests = this.requests.filter(time => now - time < this.windowMs);
if (this.requests.length >= this.maxRequests) {
const waitTime = this.windowMs - (now - this.requests[0]);
await new Promise(resolve => setTimeout(resolve, waitTime));
return this.check();
}
this.requests.push(now);
}
}
const limiter = new RateLimiter(100, 60000); // 100 req/min
async function makeRequest() {
await limiter.check();
// Fazer requisição...
}
async function trackDueDiligenceMetrics() {
// Contar Due Diligences por status
const stats = await Promise.all([
countDueDiligences('PENDING'),
countDueDiligences('IN_PROGRESS'),
countDueDiligences('COMPLETED')
]);
// Enviar para serviço de métricas (DataDog, etc)
metrics.gauge('due_diligence.pending', stats[0]);
metrics.gauge('due_diligence.in_progress', stats[1]);
metrics.gauge('due_diligence.completed', stats[2]);
}
// Alertas
function setupAlerts() {
// Alertar se Trust Score médio cair abaixo de 60
if (averageTrustScore < 60) {
sendAlert('Trust Score médio abaixo do esperado');
}
// Alertar se muitos flags críticos
if (criticalFlagsCount > threshold) {
sendAlert('Muitos flags críticos detectados');
}
}
Authorization: BearerCOMPLETEDexpiresAt)/docs/DUE-DILIGENCE-API.md/docs/RISK-FLAGS-TAXONOMY.mdÚltima atualização: Janeiro 2025