Capítulo 1El flujo
- Tu servidor crea la sesión
POST /v1/checkout/sessionscon tu clave secreta. - Rediriges al inversor a
session.urlEs su página de inversión, con el importe y el email ya puestos. - El inversor entra, acepta y firmaComo en cualquier inversión.
- Vuelve a tu
success_urlCon?sesion=cs_…&inversion=…. - Te llega el webhook
checkout.session.completedeinvestment.confirmed, con tureference.
Capítulo 2Crear la sesión
curl https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/checkout/sessions \
-H "Authorization: Bearer $KROWS_SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1234" \
-d '{
"amount": 250,
"email": "investor@email.com",
"reference": "order-1234",
"metadata": { "campaign": "autumn" },
"success_url": "https://yoursite.com/thanks",
"cancel_url": "https://yoursite.com/invest"
}'// Express: POST /invest → creates the session and redirects the investor
app.post('/invest', async (req, res) => {
const r = await fetch('https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/checkout/sessions', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KROWS_SECRET_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': req.body.orderId,
},
body: JSON.stringify({
suggested_amount: 100, // the investor can change it
reference: req.body.orderId, // comes back in the investment and webhooks
success_url: 'https://yoursite.com/thanks',
cancel_url: 'https://yoursite.com/invest',
}),
});
const session = await r.json();
if (!r.ok) return res.status(400).json(session.error);
res.redirect(303, session.url);
});import os, requests
r = requests.post(
"https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/checkout/sessions",
headers={
"Authorization": f"Bearer {os.environ['KROWS_SECRET_KEY']}",
"Idempotency-Key": "order-1234",
},
json={"amount": 250, "reference": "order-1234",
"success_url": "https://yoursite.com/thanks"},
)
session = r.json()
# redirect the investor to session["url"]{
"object": "checkout.session",
"id": "cs_live_8Kd2…",
"mode": "live",
"status": "open",
"url": "https://checkout.krows.app/aurora-solar?s=cs_live_8Kd2…",
"amount": 250,
"amount_fixed": true,
"email": "investor@email.com",
"reference": "order-1234",
"metadata": { "campaign": "autumn" },
"success_url": "https://yoursite.com/thanks",
"cancel_url": "https://yoursite.com/invest",
"investment": null,
"created": "2026-10-17T10:00:00.000Z",
"expires_at": "2026-10-18T10:00:00.000Z",
"completed_at": null
}| Campo | Descripción |
|---|---|
| amountnúmero, opcional | Importe fijo en USDC (mínimo 1, hasta 2 decimales, no más que el objetivo). El inversor no puede cambiarlo. |
| suggested_amountnúmero, opcional | Importe propuesto que el inversor puede cambiar. Usa uno u otro, no los dos. |
| emailtexto, opcional | Rellena el email del inversor en la página. |
| referencetexto, opcional | Tu identificador (pedido, usuario…), hasta 200 caracteres. Vuelve en la inversión y en los webhooks. |
| metadataobjeto, opcional | Hasta 20 claves y 2.000 caracteres. Vuelve tal cual, sin traducir. |
| success_urlURL, opcional | Adónde va el inversor al terminar. Añadimos sesion e inversion como parámetros. |
| cancel_urlURL, opcional | Botón «Volver» si la sesión ha caducado o ya se pagó. |
| Idempotency-Keycabecera, recomendada | Hasta 100 caracteres. Repetir la petición con la misma clave devuelve la misma sesión. |
Capítulo 3Estados y caducidad
| open | Se puede pagar. Caduca a las 24 horas. |
| complete | Se ha invertido. investment trae el id y completed_at la fecha. |
| expired | Caducó o la cerraste con POST /v1/checkout/sessions/:id/expire. |
Si el inversor abre una sesión completada o caducada, ve «Este pago ya se completó» o «Este enlace de pago ha caducado» y un botón a tu cancel_url.
Capítulo 4En una ventana, sin salir de tu web
Si abres la página de inversión en una ventana con ?v=1, al terminar avisa a tu página con postMessage (solo datos públicos de la inversión). Comprueba siempre el origen:
// Open the investment page in a window and hear back when it completes
const w = window.open('https://checkout.krows.app/aurora-solar?v=1', 'krows', 'width=480,height=760');
window.addEventListener('message', (e) => {
if (e.origin !== 'https://checkout.krows.app') return;
if (e.data?.tipo === 'krows:inversion') {
// { tipo, slug, modo, id, importe, tokens, explorador } — public data only
console.log('New investment', e.data.id, e.data.importe);
}
});Para conceder algo valioso (acceso, producto), fíate del webhook firmado, no del mensaje del navegador.
¿Te ha ayudado?
Gracias. Lo tendremos en cuenta para mejorar.