Oleada 5 · Documentación

Referencia API (v1)

Catálogo de endpoints públicos de integración. OpenAPI 3.1 parcial para Postman e Insomnia.

Salud y disponibilidad

MétodoRutaAuthDescripción
GET/healthPúblicoLiveness — proceso arriba.
GET/health/readyPúblicoReadiness — PostgreSQL y Redis (503 si no listo).

Autenticación y API keys

MétodoRutaAuthDescripción
POST/api/v1/auth/loginPúblicoInicio de sesión panel (tenantSlug, email, password) → accessToken + refreshToken.
POST/api/v1/auth/registerPúblicoAlta de usuario tenant (acepta términos/privacidad/SIC).
POST/api/v1/auth/refreshPúblicoRenueva tokens con refreshToken.
GET/api/v1/tenant/api-keysBearer sesiónLista API keys del tenant (sin secretos).
POST/api/v1/tenant/api-keysBearer sesiónCrea pk_… (se muestra una sola vez).
DELETE/api/v1/tenant/api-keys/:apiKeyIdBearer sesiónRevoca una API key.

API CUSTOM (ecommerce propio)

MétodoRutaAuthDescripción
POST/api/v1/custom/shops/registerx-api-key pk_Registra tienda CUSTOM; devuelve shopId, webhookEndpoint y webhookSecret.
POST/api/v1/custom/ordersx-api-key pk_Ingesta de pedido (orderId, total, shippingAddress opcional).
POST/api/v1/custom/catalog/productsx-api-key pk_Alta/actualización masiva de catálogo (products[] o items[]).
POST https://api.pushslog.com/api/v1/custom/shops/register
x-api-key: pk_…
Content-Type: application/json

{
  "externalShopId": "mi-tienda.com",
  "name": "Mi tienda"
}
POST https://api.pushslog.com/api/v1/custom/orders
x-api-key: pk_…
Content-Type: application/json

{
  "shopId": "uuid-de-tienda",
  "orderId": "ORD-1001",
  "total": 129900,
  "currency": "COP",
  "shippingAddress": {
    "city": "Bogotá",
    "address": "Calle 123",
    "zip": "110111"
  }
}
POST https://api.pushslog.com/api/v1/custom/catalog/products
x-api-key: pk_…

{
  "shopId": "uuid-tienda",
  "products": [
    { "sku": "SKU-1", "name": "Producto", "price": 19900, "stock": 10 }
  ]
}

Canales (registro y OAuth)

MétodoRutaAuthDescripción
GET/api/v1/shopify/oauth/diagnosticsPúblicoDiagnóstico OAuth Shopify (redirect_uri, scopes) sin secretos.
GET/api/v1/shopify/oauth/start?shop={myshopify.com}Bearer sesión (panel)Inicia OAuth Shopify; devuelve authorizationUrl o connected:true.
POST/api/v1/woocommerce/shops/registerx-api-key pk_Registra tienda Woo (shopUrl, opcional consumerKey/Secret para webhooks).
GET/api/v1/woocommerce/shops/:shopId/sync-statusx-api-key pk_Estado de sincronización de una tienda Woo registrada.
POST/api/v1/mercadolibre/shops/registerx-api-key pk_Registra seller ML (sellerUserId + accessToken).
GET/api/v1/mercadolibre/oauth/startx-api-key pk_OAuth Mercado Libre → authorizationUrl.
POST/api/v1/tiendanube/shops/registerx-api-key pk_Registra TN (storeId + accessToken); crea webhooks de pedido.
GET/api/v1/tiendanube/oauth/startx-api-key pk_OAuth Tienda Nube → authorizationUrl.

Webhooks entrantes

MétodoRutaAuthDescripción
POST/api/v1/webhook/shopifyHMAC ShopifyEventos de tienda conectada por OAuth.
POST/api/v1/webhook/woocommerceFirma pluginPedidos desde pushslog-for-woocommerce.
POST/api/v1/webhook/mercadolibreNotificación MLTopics orders / orders_v2 / shipments.
POST/api/v1/webhook/tiendanubeHMAC Tienda NubeEventos order/* (TIENDANUBE_APP_SECRET).
POST/api/v1/webhook/customX-PushSLog-Shop-Id + X-PushSLog-SignatureIngesta pedido CUSTOM; secret de /custom/shops/register.

Inventario omnicanal (sync pk_ y panel)

MétodoRutaAuthDescripción
POST/api/v1/tenant/catalog/syncpk_ o Bearer sesión (OWNER/ADMIN si es sesión)Importa catálogo desde tiendas activas (Shopify, Woo, ML, TN, CUSTOM). Body opcional { shopId }.
GET/api/v1/tenant/catalog/sync/jobs/:jobIdpk_ o Bearer sesiónEstado del job en cola catalog-sync (completed, failed, result).
GET/api/v1/tenant/shops/:shopId/sync-statuspk_ o Bearer sesiónÚltima sincronización registrada para una tienda del tenant.
GET/api/v1/woocommerce/shops/:shopId/sync-statuspk_Alias histórico Woo; preferir /tenant/shops/:shopId/sync-status.
MétodoRutaAuthDescripción
GET/api/v1/tenant/catalog/productsBearer sesión · plan inventarioListado paginado del catálogo central (search, limit, offset).
PATCH/api/v1/tenant/catalog/master-variants/:masterVariantIdBearer sesión · managerActualiza stock o metadatos del SKU maestro.
GET/api/v1/tenant/catalog/channel-mappingsBearer sesión · plan inventarioMapeos canal ↔ maestro (shopId, status, search, limit).
POST/api/v1/tenant/catalog/channel-mappingsBearer sesión · managerVincula manualmente un listing de canal con un SKU maestro.
POST/api/v1/tenant/catalog/channel-mappings/backfillBearer sesión · managerRegenera mapeos desde variantes ya importadas (body opcional { shopId }).
GET/api/v1/tenant/inventory/configBearer sesiónFuente de verdad de stock y preferencias de alertas.
PATCH/api/v1/tenant/inventory/configBearer sesión · managerDefine PUSHSLOG_CENTRAL o SHOP maestro; configura alertas.
GET/api/v1/tenant/inventory/alerts/summaryBearer sesión · plan inventarioContadores: stock 0, sin mapear, conflictos, deducciones unmapped.
GET/api/v1/tenant/inventory/stock-deductionsBearer sesión · plan inventarioAuditoría de bajas de stock por ventas en canal.
POST/api/v1/tenant/catalog/publish-bulkBearer sesión · managerPublicación masiva de stock/SKU hacia canales elegidos (cola catalog-publish).

Errores frecuentes (transversales)

HTTPerrorCuándo
401API_KEY_REQUIREDFalta x-api-key pk_ en rutas de integración
403API_KEY_INVALIDpk_ revocada o de otro tenant
401SESSION_REQUIREDRuta de panel sin Bearer JWT
400BAD_REQUESTBody o query incompleto
429Rate limit por plan (reduce concurrencia)
500*_FAILEDError interno; reintenta con soporte

Panel (sesión JWT) — fuera de pk_

  • Envíos y tracking: POST /api/v1/shipments · GET /api/v1/shipments/:id
  • Cotización: POST /api/v1/quote · GET /api/v1/carriers
  • Finanzas y COD: GET /api/v1/finance/:tenantId/overview · pagos COD

Próximamente en OpenAPI