API de Cannahub
La API de Cannahub te permite integrar programáticamente la gestión de clubs de cannabis, incluyendo miembros, productos, pedidos, inventario y más. Esta documentación cubre tanto los endpoints públicos como las rutas internas del BFF (Backend for Frontend).
Arquitectura
Cannahub utiliza una arquitectura de múltiples capas que abstrae la complejidad del backend Medusa y proporciona una interfaz simplificada para los clientes.
Capas de la Arquitectura
- Name
Clientes- Type
- Frontend
- Description
Aplicaciones web (Next.js) y móviles (React Native) que consumen la API.
- Name
BFF Layer- Type
- Next.js API Routes
- Description
Capa intermedia que orquesta llamadas, transforma datos y agrega lógica de negocio.
- Name
Transformadores- Type
- TypeScript
- Description
Funciones que convierten tipos de Medusa a tipos de dominio de Cannahub.
- Name
Medusa- Type
- Backend
- Description
Plataforma de e-commerce headless que maneja productos, pedidos y clientes.
Flujo de datos típico
// Cliente solicita productos
GET /api/products
// BFF transforma la respuesta
const medusaProducts = await medusa.products.list()
const products = medusaProducts.map(parseMedusaProduct)
// Cliente recibe datos simplificados
{
products: Product[],
count: number
}
URLs Base
Cannahub utiliza diferentes URLs según el entorno y el tipo de API:
- Name
Producción- Type
- https://api.cannahub.tech
- Description
API de producción para aplicaciones en vivo.
- Name
Staging- Type
- https://staging-api.cannahub.tech
- Description
Entorno de pruebas pre-producción.
- Name
Desarrollo- Type
- http://localhost:9000
- Description
Servidor local de Medusa para desarrollo.
- Name
BFF Local- Type
- http://localhost:3000/api
- Description
Rutas API de Next.js en desarrollo local.
Ejemplo de request
# Producción
curl https://api.cannahub.tech/store/products \
-H "Authorization: Bearer {token}"
# Desarrollo local
curl http://localhost:9000/store/products \
-H "Authorization: Bearer {token}"
Autenticación
Todas las solicitudes a la API requieren autenticación. Cannahub utiliza JWT tokens almacenados en cookies HTTP-only.
Tipos de Tokens
- Name
cannahubToken- Type
- JWT
- Description
Token de miembro/cliente. Expira en 7 días.
- Name
cannahubAdminToken- Type
- JWT
- Description
Token de administrador/staff. Expira en 7 días.
Headers Requeridos
- Name
Authorization- Type
- string
- Description
Bearer token para autenticación:
Bearer {token}
- Name
Content-Type- Type
- string
- Description
application/jsonpara requests con body.
- Name
x-publishable-api-key- Type
- string
- Description
API key pública para endpoints de store (opcional).
Autenticación
curl -X POST https://api.cannahub.tech/auth/customer/emailpass \
-H "Content-Type: application/json" \
-d '{
"email": "miembro@ejemplo.com",
"password": "contraseña_segura"
}'
Respuesta exitosa
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}
Para más detalles sobre autenticación, consulta la guía de autenticación.
Endpoints Disponibles
Endpoints Públicos (Store)
| Endpoint | Método | Descripción |
|---|---|---|
/store/products | GET | Lista productos del catálogo |
/store/products/:id | GET | Detalle de un producto |
/store/carts | POST | Crear carrito |
/store/carts/:id | GET | Obtener carrito |
/store/carts/:id/line-items | POST | Agregar item al carrito |
/store/carts/:id/complete | POST | Completar orden |
Endpoints Administrativos
| Endpoint | Método | Descripción |
|---|---|---|
/admin/customers | GET, POST | Gestión de miembros |
/admin/products | GET, POST | Gestión de productos |
/admin/orders | GET, POST | Gestión de pedidos |
/admin/inventory-items | GET, PUT | Gestión de inventario |
/admin/customer-groups | GET, POST | Gestión de membresías |
Endpoints BFF (Next.js)
La capa BFF orquesta múltiples llamadas a Medusa y otros servicios, reduciendo significativamente la latencia y complejidad del cliente.
Rutas Existentes
| Endpoint | Método | Descripción | Doc |
|---|---|---|---|
/api/products | GET, POST | Productos con datos de cepa | Ver |
/api/strains | GET | Catálogo de cepas filtrable | Ver |
/api/memberships | GET | Tipos de membresía | Ver |
/api/locations | GET, POST | Filiales (Stock Locations) | Ver |
/api/inventory | GET | Items de inventario | Ver |
/api/stats | GET | Estadísticas del dashboard | - |
Rutas BFF Propuestas (Orquestación)
Estas rutas BFF resuelven problemas de N+1 queries y reducen la cantidad de llamadas API desde el cliente:
| Endpoint | Método | Propósito | Reducción |
|---|---|---|---|
/api/orders/create-and-process | POST | Flujo completo de orden | 15+ → 1 |
/api/orders/:id/transition | POST | Transición de estado de orden | 3-5 → 1 |
/api/products/:id/with-inventory | GET | Producto con inventario agregado | 7+ → 1 |
/api/products/with-inventory | GET | Lista de productos con inventario | N+1 → 1 |
/api/inventory/batch-update | POST | Actualización masiva de stock | N → 1 |
/api/stock-locations/setup | POST | Crear ubicación con fulfillment chain | 7+ → 1 |
/api/members/:id/complete | GET | Perfil completo con órdenes y stats | 4-5 → 1 |
/api/dashboard/stats | GET | Métricas agregadas del dashboard | 5+ → 1 |
Las rutas BFF están documentadas en sus respectivas páginas de entidad. Por ejemplo, la ruta /api/orders/create-and-process está documentada en API de Pedidos.
Beneficios de la Capa BFF
| Métrica | Sin BFF | Con BFF | Mejora |
|---|---|---|---|
| Llamadas API (orden completa) | 15+ | 1 | -93% |
| Latencia típica (producto + inv) | ~700ms | ~200ms | -71% |
| Transformación de datos | Cliente | Servidor | Centralizado |
| Manejo de errores | Disperso | Unificado | Simplificado |
Rate Limiting
La API implementa límites de tasa para proteger el servicio:
- Name
Store endpoints- Type
- 1000 req/min
- Description
Endpoints públicos de tienda.
- Name
Admin endpoints- Type
- 500 req/min
- Description
Endpoints administrativos autenticados.
- Name
Auth endpoints- Type
- 10 req/min
- Description
Endpoints de login para prevenir fuerza bruta.
Cuando excedes el límite, recibirás una respuesta 429 Too Many Requests.
Multi-Tenancy
Cannahub soporta múltiples organizaciones (clubs) en la misma instancia. Cada organización tiene:
- Name
Subdomain- Type
- string
- Description
Identificador único del club:
high-up.cannahub.tech
- Name
Sales Channel- Type
- string
- Description
Canal de ventas asociado en Medusa.
- Name
Stock Locations- Type
- array
- Description
Ubicaciones de inventario del club.
- Name
Price Lists- Type
- array
- Description
Listas de precios por membresía.
Organizaciones soportadas
const organizations = [
'high-up',
'don-marcelino',
'circulo-rojo',
'superfly',
'blow',
'weplant'
]
// Extracción desde subdomain
const org = request.headers
.get('host')
?.split('.')[0]
Guía Rápida
1. Autenticarse
curl -X POST https://api.cannahub.tech/auth/customer/emailpass \
-H "Content-Type: application/json" \
-d '{"email": "tu@email.com", "password": "contraseña"}'
2. Listar Productos
curl https://api.cannahub.tech/store/products \
-H "Authorization: Bearer {tu_token}"
3. Crear un Carrito
curl -X POST https://api.cannahub.tech/store/carts \
-H "Authorization: Bearer {tu_token}" \
-H "Content-Type: application/json" \
-d '{"region_id": "reg_argentina"}'
4. Agregar Producto al Carrito
curl -X POST https://api.cannahub.tech/store/carts/{cart_id}/line-items \
-H "Authorization: Bearer {tu_token}" \
-H "Content-Type: application/json" \
-d '{
"variant_id": "variant_01HQ_BD_1G",
"quantity": 1
}'