Lo que aprenderás
- Qué claves hay y dónde va cada una
- Hacer tu primera llamada
- Paginación, idempotencia y límites
- Ver cada llamada en el registro
Antes de empezar
- Una startup creada en Krows
- Un servidor propio: la clave secreta nunca va en el navegador
Capítulo 1Visión general
La API de Krows es una API REST, en inglés, con respuestas JSON, pensada como la de Stripe. Con ella creas sesiones de checkout desde tu servidor, lees tu ronda, tus inversiones, tus hitos y recompensas, y consultas los eventos. Los webhooks te avisan de lo que pasa sin tener que preguntar.
| Base | https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1 |
| Autenticación | Cabecera Authorization: Bearer sk_… |
| Formato | JSON, campos y eventos en inglés. Cabecera Krows-Version: 2026-10-17 en cada respuesta. |
| Límite | 100 peticiones por minuto y clave. |
| CORS | No: la API no acepta llamadas desde el navegador. |
Capítulo 2Las claves
| Clave | Dónde va | Para qué |
|---|---|---|
pk_test_… / pk_live_… | Tu web (botón, widget) | Identificar tu startup. Es pública. |
sk_test_… / sk_live_… | Solo tu servidor | Llamar a la API. Da acceso a tu startup. |
whsec de cada endpoint | Solo tu servidor | Comprobar la firma de los webhooks. |
- Ve a tu startup › Integración › API para tu appO al panel › API y webhooks.
- Pulsa «Crear clave secreta»Cópiala y guárdala en un lugar seguro (variable de entorno). Por seguridad no la volverás a ver: si la pierdes, regénérala.
- Regenerar la invalida al momento. Hazlo si se filtra.
La clave secreta nunca va en el navegador, en una app móvil ni en un repositorio público.
Capítulo 3Tu primera llamada
Lee tu ronda. Con sk_test todo ocurre en modo prueba.
curl https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/round \
-H "Authorization: Bearer $KROWS_SECRET_KEY"const res = await fetch('https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/round', {
headers: { Authorization: `Bearer ${process.env.KROWS_SECRET_KEY}` },
});
const round = await res.json();
console.log(round.raised, round.goal, round.status);import os, requests
r = requests.get("https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/round",
headers={"Authorization": f"Bearer {os.environ['KROWS_SECRET_KEY']}"})
round = r.json()
print(round["raised"], round["goal"], round["status"]){
"object": "round",
"mode": "live",
"startup": { "name": "Aurora Solar", "slug": "aurora-solar" },
"status": "open",
"goal": 120000,
"raised": 46800,
"currency": "USDC",
"percent_raised": 39,
"investors": 90,
"tokens": 120000,
"token_price": 1,
"start": "2026-10-03T00:00:00.000Z",
"end": "2027-01-15T00:00:00.000Z",
"contract": "9fQk…",
"network": "mainnet"
}La primera llamada correcta marca la integración «API» como detectada en Integración, en el modo de la clave.
Capítulo 4Paginación, idempotencia y errores
Paginación
Las listas devuelven {"object": "list", "data": [...], "has_more": true|false}. Usa limit (1–100, por defecto 20) y starting_after con el id del último elemento.
curl "https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/investments?limit=20" \
-H "Authorization: Bearer $KROWS_SECRET_KEY"
# Next page: pass the id of the last item
curl "https://xvxhouuprjsmpfiwxkzz.supabase.co/functions/v1/api/v1/investments?limit=20&starting_after=inv_…" \
-H "Authorization: Bearer $KROWS_SECRET_KEY"{
"object": "list",
"data": [ { "object": "investment", "id": "inv_…", … } ],
"has_more": true
}Idempotencia
Al crear una sesión, manda Idempotency-Key. Si reintentas por un fallo de red, recibes la misma sesión en lugar de crear otra.
Errores
Códigos HTTP estándar y un cuerpo como este:
{
"error": {
"type": "invalid_request_error",
"code": "amount_invalid",
"message": "amount must be a USDC number, at least 1, with up to 2 decimals."
}
}| HTTP · code | Significa |
|---|---|
| 400 · invalid_json | El cuerpo no es JSON. |
| 400 · amount_invalid / amount_too_large | Importe no válido o mayor que el objetivo. |
| 400 · email_invalid / url_invalid / metadata_invalid | Campo con formato incorrecto. |
| 401 · api_key_missing / api_key_invalid | Falta la clave, está mal formada o se ha regenerado. |
| 404 · resource_missing / route_missing / startup_missing | No existe. |
| 409 · session_not_open | La sesión ya se completó o caducó. |
| 429 · rate_limit | Más de 100 peticiones por minuto. |
| 500 · internal_error | Error nuestro. Reintenta con la misma Idempotency-Key. |
Capítulo 5Registro y Workbench
En API y webhooks, la pestaña «Registro» muestra cada llamada a la API (método, ruta, código, tiempo, consulta, cuerpo y respuesta; nunca las cabeceras, donde va la clave) y cada entrega de webhook, con «Reenviar». Se guardan 30 días. El Workbench (tecla W o «Desarrolladores» en la barra inferior) junta eventos, registros y la salud de la integración; puedes ocultarlo en Ajustes › Desarrolladores, donde también eliges la versión de la API y el lenguaje de los ejemplos.
Capítulo 6Repaso final
Antes de cerrar esta guía, comprueba que lo tienes claro. Nada de esto se envía a ningún sitio: es solo para ti.
¿Dónde pones la clave sk_live?
Gracias. Lo tendremos en cuenta para mejorar.