rstr_ no header Authorization: Bearer, contra a base URL https://api.userepass.com. Antes de começar, vale conhecer as convenções da API: IDs são opacos (prefixo de tipo + ULID), dinheiro é sempre inteiro em centavos e percentuais em basis points (10000 bps = 100%).
Os modelos de cobrança mais sofisticados (recorrência, tiers, clawback) ficam fora do escopo deste guia básico, mas estão linkados em cada passo. Aqui montamos a espinha dorsal: um afiliado que divulga, uma venda atribuída e uma comissão paga.
O fluxo completo
Cada passo emite eventos imutáveis a cada mudança de estado, então a história inteira é auditável e pode ser entregue por webhooks.Pré-requisitos
1
Tenha uma organização e uma API key admin
A organização é o seu tenant. Gere uma API key server-to-server (formato
rstr_…) no painel da organização; ela herda a role do membro dono. Os passos abaixo incluem operações sensíveis (aprovar afiliado, fechar ciclo de payout), então use uma key com role admin ou owner.A key é mostrada uma única vez. Guarde-a em local seguro. Detalhes em Autenticação.Exporte a key
Passos
1
Crie o programa
Um Programa concentra a configuração de todo o ciclo: moeda (O programa nasce
BRL, imutável após criação), modelo e janela de atribuição, holdDays (carência da comissão, default 30) e approvalMode dos afiliados.cURL
Resposta 201
active. O status só muda pelos endpoints de ação (pause / activate / archive), nunca por PATCH. Veja Programas e regras para todos os campos de configuração.2
Publique uma regra de comissão
Sem uma regra vigente, a conversão até é atribuída, mas a comissão não tem como ser calculada. Crie a primeira versão da regra de comissão do programa: neste guia, um percentual simples sobre cada cobrança.O
percentage é informado em decimal (0 a 100, passo 0,01) e equivale a um valor em basis points (percentage × 100): 20.0% corresponde a 2000 bps. A regra é imutável: alterar significa publicar uma nova versão; aplicar uma nova regra ao passado só via Reprocessamento.cURL
Resposta 201
3
Recrute e aprove um afiliado
O Afiliado é identificado por e-mail dentro do programa. Com Aprovar muda
approvalMode: "manual", ele nasce pending e precisa de aprovação explícita.cURL (criar)
Resposta 201
pending → approved. Nesse momento o Repass cria automaticamente um Link default para o afiliado. Você não precisa criar o primeiro link à mão.cURL (aprovar)
Resposta 200
4
Gere um link rastreável
Cada afiliado pode ter vários Links. O
token é único globalmente e imutável; você pode informar um subId opcional para segmentar a divulgação (campanha, canal). O destinationUrl precisa estar na whitelist de domínios da organização (GET/PUT /settings/destination-domains).cURL
Resposta 201
5
Instrumente o tracking
O afiliado divulga a URL pública de redirect Para casar a venda ao clique mais tarde, propague essa identidade no seu produto. Há dois sinais que você pode capturar no signup/checkout e enviar de volta na conversão:
https://api.userepass.com/t/{token}. Quando um visitante a acessa, o Repass registra o Clique (identidade do visitante, geolocalização, detecção de bot, janela de expiração), seta um cookie first-party repass_vid e responde 302 para o destino, anexando o repass_cid na query.Redirect público (chamado pelo visitante)
clickId: o identificador do clique (derivável dorepass_cid); o sinal mais forte e direto.visitorId: o valor do cookierepass_vid, que casa por identidade de visitante mesmo sem oclickId.
visitorId ao e-mail (hasheado) para casar conversões cross-device:POST /track/identify
As rotas
/t/{token}, /track/click e /track/identify são públicas (não usam a API key). São chamadas pelo navegador do visitante ou pelo seu frontend. A engine de atribuição usa todos esses sinais em cascata (clickId → visitorId → emailHash → fingerprint) para decidir a qual afiliado a venda pertence.6
Ingira a conversão server-to-server
Quando a venda acontece, registre a Conversão via A resposta é um envelope Se o matching não encontra um afiliado, a API responde
POST /conversions. A API roda atribuição e o score de fraude de forma síncrona e devolve a decisão completa na resposta.Informe o clickId quando o tiver; caso contrário, mande os identificadores que você capturou (visitorId, e-mail do cliente) para o matching multi-sinal. O sourceEventId é a sua chave de idempotência por fato de negócio: o mesmo sourceEventId retorna a conversão já existente, com Idempotent-Replay: true.cURL
{ attributed, deduplicated, replayed, conversion }. Quando uma conversão nova é criada, vem 201 com attributed: true e a conversão completa (com seus snapshots) em conversion.Resposta 201 (atribuída)
200 com attributed: false e conversion: null, e não persiste nada: sem afiliado não há vínculo a registrar. Isso é esperado e não é um erro: significa que a venda não veio de um afiliado.Resposta 200 (sem atribuição)
Atribuição, regra e fraude são congelados em snapshots na conversão no momento do registro. Mudar a regra ou a chave PIX depois não altera o que já foi calculado. Em produção, conversões normalmente chegam pelo webhook do seu gateway de pagamento ou por
/ingest/custom; veja Ingestão e o guia Conversões server-to-server.7
Acompanhe a comissão até a aprovação
Ao registrar uma conversão atribuída, o Repass cria automaticamente a Comissão do primeiro ciclo de cobrança. Liste as comissões filtrando pela conversão.A comissão nasce
cURL
Resposta 200
pending com holdUntil = occurredAt + holdDays × 24h (aqui, 30 dias). O detalhe (GET /commissions/{id}) traz o campo calculation aberto (base, percentual em bps, versão da regra aplicada) que reconstrói “por que esse valor?”. No exemplo, 9990 × 2000 bps = 1998 centavos (half-up no centavo).A transição pending → approved acontece automaticamente ao fim do hold, desde que a conversão de origem esteja approved (fraude resolvida) e o afiliado não esteja banned. Você também pode aprovar antecipadamente uma comissão pending com POST /commissions/{id}/approve (aplica as mesmas guardas, exceto a do holdUntil).8
Feche o ciclo e pague (payout)
Comissões Para efetivar, repita com O payout nasce
approved e não pagas de um afiliado são agregadas em um único Payout no fechamento de ciclo. O fechamento tem dry-run por padrão: sempre inspecione a prévia antes de efetivar.Use POST /payouts/preview (ou POST /payouts/run sem dryRun) para ver quem recebe, quanto, e quais afiliados estão bloqueados, sem persistir nada.cURL (prévia)
dryRun: false explícito. Isso cria os payouts scheduled e reserva as comissões (define payoutId), de modo que um segundo run não duplica nem dupla-cobra.cURL (efetivar)
Resposta 200 (run dryRun=false)
scheduled com o destino (chave PIX) snapshotado. A liquidação via PIX acontece automaticamente (scheduled → processing → completed) e, ao concluir, marca todas as comissões incluídas como paid, emitindo payout.completed e um commission.paid por comissão.Acompanhe o status
Pronto: você levou uma indicação do clique à comissão paga. O afiliado recebeu via PIX e cada passo deixou um rastro auditável no event store.
O que muda quando a nota fiscal é exigida
Quando a política fiscal da organização exige NF (nfMode: "affiliate_uploads"), todo afiliado passa pelo gate de nota fiscal antes da liquidação: o fechamento cria uma invoice (inv_…) pending junto do payout, e a liquidação só ocorre depois que a NF fica validated. Enquanto isso, o payout permanece scheduled.
Os detalhes da política nfMode, do upload e do gate de validação estão em Fiscal.
Observabilidade: eventos e webhooks
Toda mudança de estado emite um Evento. O fluxo deste guia produz, na ordem aproximada:program.created, commission_rule.created, affiliate.created, affiliate.approved, link.created, click.recorded, conversion.created, commission.created, commission.approved, payout.created e payout.completed (+ commission.paid).
Você pode consultar o histórico via GET /events (filtros por type, aggregate_id, período) ou assinar eventos em tempo real configurando um webhook de saída: entregas são assinadas com HMAC e idempotentes (deduplique pelo id do evento).
Histórico de um afiliado
Idempotência e erros
Todo POST aceita o headerIdempotency-Key (escopo por organização + usuário): repetir a mesma chave com o mesmo corpo devolve a resposta original com Idempotent-Replay: true. A ingestão de conversões tem uma camada extra de idempotência de negócio pelo sourceEventId. Veja Idempotência.
Erros seguem um envelope único { "error": { "type", "code", "message", "param?" } } com status HTTP semântico:
Exemplo de erro 404
Próximos passos
Integrar Stripe
Webhook + metadata
repass_cid para atribuir cada venda ao afiliado.Conversões server-to-server
O fluxo completo de matching multi-sinal, atribuição e fraude.
Refund e clawback
Como estornos e chargebacks geram comissões negativas auditáveis.
Reprocessar mudança de regra
Aplicar uma nova versão de regra retroativamente, com dry-run obrigatório.
Multi-touch e atribuição
Dividir a comissão entre vários afiliados que tocaram a jornada.