Úsalo sin el botón de compra
El botón de compra es una capa de conveniencia. Debajo, Coin Moebius es un webhook rentado más algunos endpoints JSON. Si prefieres construir tu propia interfaz, ejecutar tu propio flujo de checkout, o conectar Coin Moebius a algo que el botón no puede manejar (suscripciones de Square o Authorize.Net, un formulario de pago personalizado, un script del lado del servidor, una app móvil), cada endpoint que usa el botón también es accesible desde cualquier cosa. Sin cambios de código de nuestro lado.
Autenticar llamadas desde tu servidor
Las llamadas que hagas desde tu propio servidor pueden llevar la clave API de tu proyecto como token bearer. Crea una clave en el panel, en las claves API de tu proyecto (empieza por cmk_), y envíala en la cabecera Authorization:
Authorization: Bearer cmk_live_xxxxxxxxxxxxxxxxxxxxxxxxLa clave está ligada a un solo proyecto, y las llamadas autenticadas tienen un límite de velocidad más alto que las anónimas. El botón de compra es público y no necesita clave. Mantén tu clave en tu servidor. Nunca la pongas en el navegador ni en otro código del lado del cliente.
Todos estos endpoints viven bajo la URL de tu proyecto. En producción esa base es https://api.coinmoebius.com. Abajo se muestra la URL completa de cada uno (reemplaza las partes {…} con tus propios valores).
| Endpoint | Qué hace |
|---|---|
POST https://api.coinmoebius.com/api/checkout/{provider}/{projectId} | Inicia un checkout. POST { productId, metadata }; recibe lo que el proveedor necesita (una URL de redirección para Stripe, una URL de aprobación para PayPal, un token para Authorize.Net Accept Hosted). Renderízalo como quieras. |
POST https://api.coinmoebius.com/webhook/{provider}/{projectId} | El proveedor publica aquí. Verificamos la firma, normalizamos el evento, lo almacenamos, contamos cuota. Apunta el webhook del proveedor a esta URL sin importar si el checkout original vino de nuestro botón o de tu propia integración. |
GET https://api.coinmoebius.com/status/{projectId}/{txId} | Consulta el estado actual de un pago o suscripción. Devuelve la misma forma normalizada que obtiene el botón de compra. |
POST https://api.coinmoebius.com/api/subscriptions/{projectId}/{subscriptionId}/portal-url | Genera una URL de portal alojado por el proveedor para que el comprador administre su suscripción. Funciona para cualquier proveedor que tenga portal. |
Identifica al comprador en tu propio sistema pasando metadata.customerRef en la llamada de checkout. Se hila a través del proveedor y de vuelta en cada evento de webhook, para que puedas unir los registros de Coin Moebius a tu propia base de datos de usuarios sin que nosotros almacenemos nada sobre el comprador.
Por qué alguien usa este camino: un creador de sitios estáticos que quiere escribir su propio botón para que combine con el diseño de su sitio y solo necesita que el webhook se maneje. Un desarrollador que quiere saltarse el botón por completo y llamar a la API desde su propio servidor. Un comerciante que quiere ejecutar suscripciones de Square o Authorize.Net y no le importa configurar la recolección de tarjetas. El botón es un punto de partida. La API es el producto real.
Escuchar eventos del comprador
El elemento dispara tres eventos del navegador. Escucha con addEventListener en el elemento (o en document, los eventos burbujean). Todos los eventos son cancelables, llamar a event.preventDefault() detiene el flujo predeterminado.
| Evento | Cuándo se dispara | Payload de detalle |
|---|---|---|
cm-load-providers | El modal del selector está a punto de pedir a la API la lista de proveedores configurados en este proyecto. | Vacío. |
cm-checkout-started | El comprador eligió un proveedor y Coin Moebius está a punto de crear una sesión de checkout (Stripe / NOWPayments) o generar un código de referencia (manual). | { provider: 'stripe' | 'nowpayments' | 'manual', ... } |
cm-error | Algo falló: error de red, falla de firma, ningún proveedor 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.
});No hay un evento cm-success en el navegador del comprador. Para cuando el pago realmente se completa, el comprador ha sido redirigido al checkout alojado del proveedor de pago (Stripe Checkout, página de factura de NOWPayments). Regresan a tu sitio a través de la success_url que configuraste (consulta la siguiente sección), y tu servidor se entera del pago a través del panel o consultando el endpoint /status.
Consultas desde tu backend
Para una fuente de verdad del lado del servidor, consulta GET /status/:projectId/:txId desde tu backend. La forma de la respuesta:
{
"status": "succeeded",
"amount": 29.99,
"currency": "USD",
"isTest": false,
"createdAt": "2026-05-14T01:04:21.000Z",
"updatedAt": "2026-05-14T01:04:21.000Z"
}Los valores de estado siguen el mismo enum que el panel (consulta Estados de transacción). El endpoint no requiere autenticación pero tiene un límite de 60 solicitudes / minuto por IP. El id de transacción que pasas es lo que el SDK devolvió en el evento cm-checkout-started o lo que se muestra en la columna de Referencia del panel.
Un patrón típico: cuando tu página success_url carga, inicia un trabajo en backend que consulta /status/:projectId/:txId cada 15 segundos hasta que vea succeeded (o failed / un timeout), luego completa el pedido.