Skip to main content
Trinta e cinco operações para a conta em si: os webhooks, as entregas deles e as regras de supressão — a parte que mais aparece numa integração —, as chaves de API, os membros do time, o cadastro da empresa e a subconta que precisa estar aprovada antes de qualquer saque. As conexões com aplicativos externos, também deste domínio, têm página própria em Integrações.
/v1/webhooks e a rota transacional legada /v1/webhook, no singular, não são duas coleções: são as mesmas linhas com dois contratos de resposta. Um webhook cadastrado aqui aparece na listagem de lá, com o mesmo id. O que muda é o envelope (data é uma lista aqui e um objeto { webhooks, pagination } lá, com offset/totalCount no lugar de page/total) e o segredo: GET /v1/webhook devolve signatureSecret inteiro, em texto puro, e GET /v1/webhooks devolve signatureSecretMasked.Duas consequências práticas. Cadastrar o mesmo endpoint nas duas rotas não cria “uma assinatura em cada API” — cria duas linhas para a mesma URL, e cada evento é entregue uma vez por linha, ou seja, em dobro. E migrar da legada para esta não exige recadastro: os webhooks já estão aqui; basta trocar a URL da chamada.Use /v1/webhooks em integrações novas. A legada continua no ar e está documentada em Cadastrar webhook.

1. Cadastre o endpoint

A Ephra testa a URL no momento do cadastro, com um POST de verdade. Um endereço que não responde 2xx recusa o cadastro:
Suba o endpoint antes de cadastrá-lo, e faça-o responder 200 a qualquer corpo.
productIds vazio significa “todos os produtos”. Preenchido, o webhook só dispara para os produtos listados — é assim que se separa um ERP que só cuida de uma linha de produtos.
O segredo de assinatura volta mascarado (signatureSecretMasked), e a máscara vale só para esta rota: GET /v1/webhook devolve o mesmo segredo inteiro, em texto puro, para qualquer token da empresa. Não trate o mascaramento como proteção. Some a isso o fato de que o segredo ainda não assina as entregas — leia Verificação e segurança antes de construir qualquer validação em cima dele.

2. Dispare um teste

O httpStatus é o que o seu servidor respondeu. O payload que chega é um evento completo com scope: "test" e ids de teste:
Filtre por scope: "test" no seu endpoint e descarte antes de liberar qualquer pedido. Um teste com transaction.id: "test_transaction_id" que libera acesso de verdade é um bug caro.

3. Investigue o que falhou

status: "error" com retries: 1 significa que a primeira tentativa falhou e a entrega está na fila de retentativa. GET /v1/webhook-deliveries/{deliveryId} traz o corpo enviado e a resposta recebida — é onde você descobre que o seu servidor devolveu 500 numa data inválida. Para forçar um reenvio depois de corrigir o bug do seu lado:

4. Segure o volume

Em pico de lançamento, transaction_created pode chegar às centenas por minuto. A supressão descarta parte das entregas de um evento, numa janela fixa.
Leia assim: a cada 10 disparos, 9 são descartados e 1 chega. suppressCount precisa ser menor que interval, e interval no mínimo 2. Omitir o event reprova:
Supressão perde eventos de verdade — não é amostragem inteligente, é descarte por contagem. Nunca a use em transaction_paid, transaction_refunded ou infraction: são os eventos que liberam acesso e movem dinheiro. Reserve-a para transaction_created e outros sinais de volume.

5. Confira as chaves e o time

Chaves revogadas continuam na lista, com active: false e a data em invalidatedAt — serve de auditoria. O segredo nunca volta por esta rota: ele só existe na tela de criação, no painel.

6. Confira o cadastro da empresa

Antes de um lançamento, vale conferir se a empresa está active — e pegar o próprio companyId, que nenhuma outra rota pede porque ele sai sempre do token.
status: "active" com isBlocked: false é a única combinação que vende. logoUrl é uma URL temporária assinada — baixe o arquivo, não guarde o link. Mudou de sede? O endereço que sai em documento fiscal e o que a verificação de cadastro confere é este:
Os campos omitidos ficam como estão. O que o comprador vê da sua marca — o logo no checkout, no e-mail de confirmação e no perfil público — muda por outra rota. O logo vai em base64, num data: URL, e substitui o anterior:
São aceitos image/png, image/jpeg, image/jpg e image/webp. Uma URL comum no lugar do data: URL é recusada na validação, com os formatos esperados na própria mensagem:
logo: null remove o logo atual e description: null apaga a descrição — omitir o campo, ao contrário, não mexe nele. A logoUrl que volta é assinada e temporária, como a de GET /v1/company: serve para conferir o envio, não para colar num site. Os documentos de verificação já enviados saem em URLs temporárias do mesmo tipo:
null não é erro: significa que aquele documento ainda não foi enviado. Quatro null numa empresa que não consegue sacar é exatamente o diagnóstico da próxima seção. O envio é a mesma rota com PUT, e cada arquivo também vai em base64 — aqui application/pdf entra na lista de formatos, com teto de 5 MB por arquivo:
Os nomes dos campos não são óbvios, e são os mesmos na leitura e no envio: A resposta traz os quatro depois da gravação, então dá para conferir o que ainda falta sem uma segunda chamada. Os documentos que ficaram de fora do corpo continuam como estavam, e reenviar um substitui o anterior. É este envio que resolve o needsCompanyDocuments: true da próxima seção.

7. Descubra por que o saque não sai

Saque recusado quase nunca é problema de saldo: é a subconta no provedor de pagamento, que ainda não terminou de ser aprovada. Esta leitura nunca cria nem avança nada — pode chamar à vontade.
Leia de cima para baixo: Numa empresa que não opera por subconta a resposta é toda neutra, e é assim que deve ser:
Depois que o vendedor corrigiu o cadastro ou reenviou um documento, peça a reavaliação:
A resposta tem o mesmo formato da consulta, já com a situação resultante. A rota é idempotente: cria a subconta se ainda não existir e, do contrário, apenas avança a que existe.
resolve é escrita, e conversa com o provedor a cada chamada. Use depois de uma correção, não em laço de polling — para acompanhar sem escrever nada, GET /v1/subaccount-status responde a mesma coisa.

Todas as operações do domínio

Webhooks

Cadastrar, atualizar, testar e excluir endpoints.

Entregas

Histórico, detalhe de cada tentativa e reenvio.

Supressões

Regras de descarte por evento e janela.

Chaves e equipe

Chaves de API ativas e revogadas, membros e convites.

Empresa e subconta

Cadastro, endereço, marca, documentos e a situação que libera saque.

Integrações

Aplicativos externos, canais de comunidade e entrega automática.