QvaPay API
Marketplace

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ámetroTipoRequeridoDescripción
namestring (3-60)SíNombre de la tienda
descriptionstring (≤2000)NoDescripción
countrystring (ISO-2)NoCódigo de país
categorystringNoCategoría de ventas. Slugs válidos: electronics, fashion, home, beauty, food, sports, gaming, books, digital, services, other
logostring (URL)NoURL del logo (ver subir imágenes)
bannerstring (URL)NoURL 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ódigoDescripción
401No autenticado
403La cuenta no está habilitada para vender (rollout) o falta KYC
400Datos inválidos
429Rate limit excedido

GET /market/shops

Lista las tiendas del usuario autenticado.

Autenticación

Bearer Token.

Query params

ParámetroTipoDefaultDescripción
pagenumber1Página
takenumber20Items 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ódigoDescripción
404Tienda 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).

CampoTipoDescripción
idstring (8–64)Identificador estable de la zona (generado por el cliente)
namestring ≤80 o nullEtiqueta visible (ej. "La Habana")
countrystring ISO-2País de la zona
provincesarray o nullCódigos de provincia cubiertos; null = todo el país (solo países con data de provincias: CU, US)
pricenumber (0–10000)Precio de la mensajería en USD (2 decimales). Va íntegro al vendedor, sin comisión
free_overnumber o nullEnvío gratis si el subtotal alcanza este monto
eta_min_days / eta_max_daysint (0–120) o nullPlazo 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ódigoDescripción
404Tienda no encontrada
400Datos 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ódigoDescripción
404Tienda no encontrada o no es del usuario
409Ventas pendientes de entregar (code: "PENDING_ORDERS")