Tiendas
Crear, listar, consultar y editar tiendas del marketplace.
Gestión de las tiendas de un vendedor. Crear una tienda requiere cuenta habilitada como vendedor y KYC. La tienda nace en estado pending y debe ser aprobada por un administrador antes de ser pública.
POST /market/shops
Abre una nueva tienda. Queda en estado pending hasta su aprobación.
Autenticación
Bearer Token. Requiere cuenta habilitada como vendedor + KYC. Rate limit: 3 req/min por usuario.
Request
curl -X POST https://api.qvapay.com/market/shops \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "EcoFlow",
"description": "Productos sostenibles",
"country": "CU",
"logo": "https://media.qvapay.com/market/<uuid>/logo-123.webp"
}'Parámetros (body)
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string (3-60) | Sí | Nombre de la tienda |
description | string (≤2000) | No | Descripción |
country | string (ISO-2) | No | Código de país |
category | string | No | Categoría de ventas. Slugs válidos: electronics, fashion, home, beauty, food, sports, gaming, books, digital, services, other |
logo | string (URL) | No | URL del logo (ver subir imágenes) |
banner | string (URL) | No | URL del banner |
Response 201
{
"shop": {
"uuid": "a1b2c3d4-...",
"slug": "ecoflow",
"name": "EcoFlow",
"description": "Productos sostenibles",
"logo": "https://media.qvapay.com/...",
"banner": null,
"country": "CU",
"status": "pending",
"sales_count": 0,
"rating_avg": null,
"created_at": "2026-06-08T12:00:00.000Z"
}
}Errores
| Código | Descripción |
|---|---|
401 | No autenticado |
403 | La cuenta no está habilitada para vender (rollout) o falta KYC |
400 | Datos inválidos |
429 | Rate limit excedido |
GET /market/shops
Lista las tiendas del usuario autenticado.
Autenticación
Bearer Token.
Query params
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
page | number | 1 | Página |
take | number | 20 | Items por página (máx 50) |
Response
{
"shops": [ { "uuid": "...", "slug": "ecoflow", "name": "EcoFlow", "status": "active", "..." : "..." } ],
"total": 1,
"page": 1,
"take": 20
}GET /market/shops/{uuid}
Detalle de una tienda propia.
Autenticación
Bearer Token. Solo el dueño.
Response
{ "shop": { "uuid": "...", "slug": "ecoflow", "name": "EcoFlow", "status": "active", "..." : "..." } }Errores
| Código | Descripción |
|---|---|
404 | Tienda no encontrada o no es del usuario |
PATCH /market/shops/{uuid}
Edita una tienda propia. No permite cambiar el status (eso es exclusivo de administración).
Autenticación
Bearer Token. Solo el dueño.
Request
curl -X PATCH https://api.qvapay.com/market/shops/a1b2c3d4-... \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "name": "EcoFlow Store", "description": "Nueva descripción" }'Parámetros (body)
Todos opcionales (al menos uno requerido): name (3-60), description (≤2000), country (ISO-2), category (slug de categoría o null), logo (URL o null), banner (URL o null), shipping (config de zonas de envío o null).
shipping — zonas de envío de la tienda (obligatorias para vender productos físicos; sin ellas el checkout responde SHIPPING_NOT_CONFIGURED). Shape: { "zones": [ { "id", "name", "country", "provinces", "price", "free_over", "eta_min_days", "eta_max_days" } ] } (1–40 zonas).
| Campo | Tipo | Descripción |
|---|---|---|
id | string (8–64) | Identificador estable de la zona (generado por el cliente) |
name | string ≤80 o null | Etiqueta visible (ej. "La Habana") |
country | string ISO-2 | País de la zona |
provinces | array o null | Códigos de provincia cubiertos; null = todo el país (solo países con data de provincias: CU, US) |
price | number (0–10000) | Precio de la mensajería en USD (2 decimales). Va íntegro al vendedor, sin comisión |
free_over | number o null | Envío gratis si el subtotal alcanza este monto |
eta_min_days / eta_max_days | int (0–120) o null | Plazo estimado de entrega |
Al cobrar, gana la zona más específica que cubra la dirección (provincias sobre país completo; a igualdad, la más barata). Enviar shipping: null desconfigura los envíos (los físicos dejan de ser comprables).
curl -X PATCH https://api.qvapay.com/market/shops/a1b2c3d4-... \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{ "shipping": { "zones": [ { "id": "zone-lha-1", "name": "La Habana", "country": "CU", "provinces": ["LHA"], "price": 5.00, "free_over": 50.00, "eta_min_days": 1, "eta_max_days": 3 } ] } }'Response
{ "shop": { "uuid": "...", "name": "EcoFlow Store", "..." : "..." } }Errores
| Código | Descripción |
|---|---|
404 | Tienda no encontrada |
400 | Datos inválidos / nada que actualizar |
DELETE /market/shops/{uuid}
Elimina una tienda propia (baja lógica). Desactiva todo el catálogo, la vitrina deja de ser pública y el slug se libera para reutilizarlo. Las órdenes existentes se conservan y los reembolsos siguen disponibles.
Bloqueado si hay ventas pagadas sin entregar: entrégalas o reembólsalas primero.
Autenticación
Bearer Token. Solo el dueño.
Response
{ "success": true }Errores
| Código | Descripción |
|---|---|
404 | Tienda no encontrada o no es del usuario |
409 | Ventas pendientes de entregar (code: "PENDING_ORDERS") |