Identificadores
Todo recurso tem um ID opaco no formato<prefixo>_<ULID>:
- O prefixo indica o tipo do recurso (
prog,aff,conv…). Use-o para saber, só de olhar, o que um ID representa. - O corpo é um ULID de 26 caracteres no alfabeto Crockford
[0-9A-HJKMNP-TV-Z](sem as letrasI,L,O,U).
Trate IDs como strings opacas. O comprimento total é estável (prefixo +
_ + 26 chars), mas não dependa de parsear o corpo: apenas armazene e devolva o valor exato que a API entregou.IDs são ordenáveis por tempo
O ULID é gerado por uma factory monotônica, então a ordenação lexicográfica dos IDs equivale à ordem de criação. Isso tem duas consequências práticas:- Listagens “mais recentes primeiro” usam
ORDER BY id DESCno servidor. - O próprio ID serve de cursor de paginação (
starting_after/ending_before). Veja Paginação.
Catálogo de prefixos
Cada tipo de recurso tem um prefixo fixo. Os principais expostos pela API:Os recursos de identidade (usuário, sessão, organização, API key) usam IDs próprios, sem prefixo de tipo. O padrão
<prefixo>_<ULID> vale para os recursos de domínio listados acima.Validação
Cada endpoint valida o prefixo esperado do ID que recebe. Um ID de outro tipo, ou com corpo malformado, é rejeitado com400 parameter_invalid antes mesmo de tocar a lógica de negócio.
Timestamps
Todos os timestamps são UTC, em ISO 8601. Os recursos carregam dois pares distintos, dependendo do tipo:createdAt / updatedAt
Presentes na maioria dos recursos mutáveis:
createdAt: quando o registro nasceu no Repass.updatedAt: quando foi alterado pela última vez (atualizado automaticamente a cada mudança).
occurredAt / recordedAt
Recursos que representam um fato com origem externa (eventos, cliques, conversões, comissões) distinguem quando o fato aconteceu de quando o sistema o gravou:
occurredAt: quando o fato aconteceu no mundo. Pode vir do gateway de pagamento ou do seu sistema (ex.: o instante real da cobrança). É a base de janelas de atribuição, hold de comissão e sinais de fraude.recordedAt(oucreatedAt, conforme o recurso): quando o Repass gravou o fato. Sempre o relógio do servidor.
occurredAt é de ontem. O Repass usa occurredAt para todas as decisões temporais de negócio.
Unidades monetárias
O Repass nunca usa números de ponto flutuante para dinheiro ou percentuais. Há duas convenções inteiras:Dinheiro em centavos
Todo valor monetário é um inteiro em centavos. Os campos terminam emCents (amountCents, baseAmountCents, gatewayFeeCents…).
Percentuais em basis points
Percentuais são inteiros em basis points (bps), onde10000 bps = 100%. Os campos terminam em Bps (percentageBps, weightBps…).
Exemplo de uma regra de comissão de 20% sobre R$ 49,90:
Multi-tenancy
A API é estritamente multi-tenant: todo recurso de domínio pertence a exatamente uma organização (oorganizationId), e nenhuma consulta cruza os limites de uma organização.
Você não envia o organizationId nas requisições. Ele é resolvido a partir da sua credencial:
- API key (
Authorization: Bearer rstr_...): a organização é a dona da chave. - Sessão de cookie: a organização é a “ativa” da sessão.
- Listagens já vêm filtradas pela sua organização: você nunca vê recursos de outro tenant.
- Pedir por ID um recurso de outra organização retorna
404 resource_not_found(não403), para não vazar a existência de IDs alheios. - A unicidade de chaves de idempotência também é por tenant: a mesma
Idempotency-Keypode coexistir em organizações diferentes sem colidir. Veja Idempotência.
Próximos passos
Paginação
Cursores baseados em ID e o envelope
{ data, hasMore }.Expand
Materialize relacionamentos sob demanda com
expand[].Idempotência
Reenvie POSTs com segurança usando
Idempotency-Key.Erros
O envelope de erro único e o catálogo de códigos.