Use sem o botão de compra
O botão de compra é uma camada de conveniência. Por baixo, Coin Moebius é um webhook alugado mais alguns endpoints JSON. Se você preferir construir a sua própria interface, rodar o seu próprio fluxo de checkout, ou conectar Coin Moebius a algo que o botão não consegue tratar (assinaturas do Square ou Authorize.Net, um formulário de pagamento personalizado, um script no servidor, um app móvel), cada endpoint que o botão usa também pode ser chamado de qualquer lugar. Sem mudanças de código do nosso lado.
Autenticando chamadas do backend
As chamadas que você faz a partir do seu próprio servidor podem carregar a chave de API do seu projeto como um token bearer. Crie uma chave no painel, sob as chaves de API do seu projeto (ela começa com cmk_), e envie-a no cabeçalho Authorization:
Authorization: Bearer cmk_live_xxxxxxxxxxxxxxxxxxxxxxxxA chave está vinculada a um projeto, e as chamadas autenticadas recebem um limite de taxa mais alto do que as anônimas. O botão de compra em si é público e não precisa de chave. Mantenha a sua chave no seu servidor. Nunca a coloque no navegador ou em outro código do lado do cliente.
Todos esses endpoints ficam sob a URL do seu projeto. Em produção, essa base é https://api.coinmoebius.com. A URL completa de cada um é mostrada abaixo (substitua as partes {…} pelos seus próprios valores).
| Endpoint | O que faz |
|---|---|
POST https://api.coinmoebius.com/api/checkout/{provider}/{projectId} | Inicia um checkout. POST { productId, metadata }; receba de volta o que quer que o provedor precise (uma URL de redirecionamento para o Stripe, uma URL de aprovação para o PayPal, um token para o Authorize.Net Accept Hosted). Renderize como você quiser. |
POST https://api.coinmoebius.com/webhook/{provider}/{projectId} | O provedor faz o post aqui. Verificamos a assinatura, normalizamos o evento, o armazenamos, contamos a cota. Aponte o webhook do provedor para esta URL quer o checkout original tenha vindo do nosso botão ou da sua própria integração. |
GET https://api.coinmoebius.com/status/{projectId}/{txId} | Consulta o estado atual de um pagamento ou assinatura. Retorna o mesmo formato normalizado que o botão de compra recebe. |
POST https://api.coinmoebius.com/api/subscriptions/{projectId}/{subscriptionId}/portal-url | Gera uma URL de portal hospedado pelo provedor para o comprador gerenciar a assinatura dele. Funciona para qualquer provedor que tenha um portal. |
Identifique o comprador no seu próprio sistema passando metadata.customerRef na chamada de checkout. Ele passa pelo provedor e volta em cada evento de webhook, para que você possa unir os registros de Coin Moebius ao seu próprio banco de dados de usuários sem que guardemos nada sobre o comprador.
Por que alguém usa este caminho: um construtor de site estático que quer escrever o próprio botão para combinar com o design do site e só precisa do webhook tratado. Um desenvolvedor que quer pular o botão completamente e chamar a API a partir do próprio servidor. Um comerciante que quer rodar assinaturas do Square ou Authorize.Net e não se importa em conectar a coleta de cartão por conta própria. O botão é um ponto de partida. A API é o produto de verdade.
Ouvindo eventos do comprador
O elemento dispara três eventos do navegador. Ouça com addEventListener no elemento (ou no document, os eventos propagam). Todos os eventos são canceláveis, chamar event.preventDefault() interrompe o fluxo padrão.
| Evento | Quando dispara | Payload de detalhe |
|---|---|---|
cm-load-providers | O modal do seletor está prestes a pedir à API a lista de provedores configurados neste projeto. | Vazio. |
cm-checkout-started | O comprador escolheu um provedor e Coin Moebius está prestes a criar uma sessão de checkout (Stripe / NOWPayments) ou gerar um código de referência (manual). | { provider: 'stripe' | 'nowpayments' | 'manual', ... } |
cm-error | Algo falhou: erro de rede, falha de assinatura, nenhum provedor configurado. | { error: Error } |
document.addEventListener('cm-error', (event) => {
console.error('Coin Moebius:', event.detail.error);
// Show your own error UI, send to your analytics, etc.
});Não há nenhum evento cm-success no navegador do comprador. Quando o pagamento de fato se conclui, o comprador já foi redirecionado para o checkout hospedado do provedor de pagamento (Stripe Checkout, página de fatura do NOWPayments). Ele volta para o seu site através da success_url que você configurou (veja a próxima seção), e o seu servidor fica sabendo do pagamento via o painel ou consultando o endpoint /status.
Consultando do seu backend
Para uma fonte da verdade no servidor, consulte GET /status/:projectId/:txId a partir do seu backend. O formato da resposta:
{
"status": "succeeded",
"amount": 29.99,
"currency": "USD",
"isTest": false,
"createdAt": "2026-05-14T01:04:21.000Z",
"updatedAt": "2026-05-14T01:04:21.000Z"
}Os valores de status seguem o mesmo enum do painel (veja Status de transação). O endpoint é não autenticado mas com limite de taxa de 60 requisições / minuto por IP. O id de transação que você passa é o que quer que o SDK tenha retornado no evento cm-checkout-started ou o que é mostrado na coluna Referência do painel.
Um padrão típico: quando a sua página de success_url carrega, dispare um job de backend que consulta /status/:projectId/:txId a cada 15 segundos até ver succeeded (ou failed / um timeout), depois atenda o pedido.