{"schema_version":1,"service":{"name":"Wendoshop Developers Changelog","source_url":"https://app.wendoshop.com/api/changelog"},"summary":{"entries":16,"latest_published_at":"2026-10-10"},"entries":[{"id":"2026-10-10-scheduled-custom-delivery","published_at":"2026-10-10","title":"Fechas elegidas para entregas personalizadas","summary":"Las consultas de órdenes y envíos reflejan los días semanales configurados y la fecha elegida en el checkout.","type":"added","areas":["api","mcp","documentation"],"breaking":false,"changes":[{"description":"Las órdenes creadas con entrega semanal incluyen shipping_address.shipping_metadata.delivery_schedule: mode, weekdays, minimum_notice_days, time_zone y selected_date. La fecha es un snapshot de la compra y no cambia al editar la configuración ni al reintentar el pago.","documentation_path":"/referencia-api/"},{"description":"Las consultas MCP existentes de métodos y cotizaciones reflejan delivery_schedule cuando se configuran días de entrega. Las cotizaciones ofrecen available_dates y dias_estimados=0, porque se elige una fecha concreta. Se mantienen herramientas, scopes, precios y permisos; no se agrega escritura de días por MCP."}]},{"id":"2026-10-05-product-additional-categories","published_at":"2026-10-05","title":"Categorías adicionales por API","summary":"La Store API permite consultar y asignar categorías adicionales sin quitar el producto de su categoría principal.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"GET /api/v1/products y GET /api/v1/products/{id} incluyen additional_category_ids. POST /api/v1/products y PATCH /api/v1/products/{id} aceptan hasta 20 IDs de categorías existentes de la misma tienda. Omitir el campo en PATCH conserva las adicionales; [] las limpia y null es inválido. La categoría principal se administra por separado.","documentation_path":"/referencia-api/"},{"description":"Los IDs duplicados y la categoría principal efectiva se excluyen de las adicionales. Una categoría adicional inexistente o de otra tienda devuelve 422 con code=INVALID_ADDITIONAL_CATEGORIES y revierte toda la escritura. Se mantienen products:read para consultas y API avanzada con products:write para escrituras. No cambia la selección automática de Novedades u Ofertas ni publica etiquetas.","documentation_path":"/referencia-api/"}]},{"id":"2026-10-05-compatible-store-promotions","published_at":"2026-10-05","title":"Combinación de promociones de tienda","summary":"El carrito y checkout combinan promociones compatibles sobre productos distintos, incluidas las administradas por MCP.","type":"changed","areas":["mcp"],"breaking":true,"changes":[{"description":"Cada producto participa de una sola promoción automática y se selecciona la combinación compatible de mayor ahorro. Los descuentos por grupo mantienen sus condiciones sobre el conjunto de productos elegibles."},{"description":"El total de promociones compite con el cupón y se aplica el mayor. El descuento por transferencia se calcula aparte y se limita al saldo de productos pendiente."},{"description":"No se agregan herramientas ni scopes MCP. Los nuevos controles de texto del diseño se conservan al editar los ajustes existentes mediante MCP."}]},{"id":"2026-10-03-signed-preview-maintenance-access","published_at":"2026-10-03","title":"Vistas previas disponibles durante el mantenimiento","summary":"Los enlaces firmados de vista previa del diseño permiten revisar borradores mientras la tienda está en construcción.","type":"fixed","areas":["mcp"],"breaking":false,"changes":[{"description":"Los enlaces de vista previa que devuelve MCP dejan de redirigir a la página en construcción mientras su permiso firmado siga vigente. Se conserva su alcance por tienda y modo, y las tiendas suspendidas siguen bloqueadas."},{"description":"El cambio no desactiva el mantenimiento, no publica borradores ni modifica herramientas, scopes o permisos. Los visitantes sin acceso siguen viendo la página en construcción."}]},{"id":"2026-10-01-product-offer-visibility","published_at":"2026-10-01","title":"Control de visibilidad de ofertas por producto","summary":"La Store API permite administrar las ofertas automáticas sin cambiar precios ni promociones elegidas manualmente.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"GET /api/v1/products y GET /api/v1/products/{id} devuelven show_in_offers y show_sale_badge. POST /api/v1/products y PATCH /api/v1/products/{id} aceptan ambos como booleanos. En el alta valen true por defecto; omitirlos en PATCH conserva el valor actual. null y los textos no se aceptan.","documentation_path":"/referencia-api/"},{"description":"show_in_offers controla la participación del producto completo en los listados automáticos de ofertas. show_sale_badge controla los indicadores automáticos de descuento en sus tarjetas. Son independientes y conservan los precios, tags, categorías y la etiqueta manual. Mantienen products:read para consultas y API avanzada con products:write para escrituras.","documentation_path":"/referencia-api/"}]},{"id":"2026-10-01-product-variant-reads-and-categories","published_at":"2026-10-01","title":"Lectura completa de variantes y conservación de categorías","summary":"La Store API permite verificar los datos comerciales de las variantes y conserva las categorías adicionales al actualizar la principal.","type":"fixed","areas":["api","documentation"],"breaking":false,"changes":[{"description":"GET /api/v1/products y GET /api/v1/products/{id} incluyen sale_price, barcode e image_url dentro de variants, junto con cost. Los campos sin valor se devuelven como null.","documentation_path":"/referencia-api/"},{"description":"PATCH /api/v1/products/{id} conserva las categorías adicionales cuando se reenvía, cambia o limpia la principal mediante category, category_id o category_slug. Cambiarla reemplaza solo la principal anterior; null elimina solo esa asignación.","documentation_path":"/referencia-api/"}]},{"id":"2026-09-30-store-api-maintenance-access","published_at":"2026-09-30","title":"API disponible durante el mantenimiento de la tienda","summary":"Las integraciones pueden seguir trabajando mientras los visitantes ven la página en construcción.","type":"fixed","areas":["api","documentation"],"breaking":false,"changes":[{"description":"Las rutas /api/v1/* dejan de redirigir a la página en construcción, tanto en el dominio propio como en el subdominio de la tienda. Permiten consultar y cargar productos, actualizar stock y usar las demás operaciones autorizadas durante el mantenimiento.","documentation_path":"/referencia-api/"},{"description":"Se mantienen la autenticación Bearer, los scopes, el nivel de API, los límites de solicitudes y el aislamiento por tienda. La excepción no habilita tiendas suspendidas ni abre las páginas o APIs públicas de compra.","documentation_path":"/referencia-api/"}]},{"id":"2026-09-25-product-deletion","published_at":"2026-09-25","title":"Eliminación de productos con permiso explícito","summary":"La Store API incorpora borrado definitivo por ID, sin ampliar los permisos de las claves existentes.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"DELETE /api/v1/products/{id} requiere API avanzada y el nuevo permiso products:delete, desmarcado por defecto y no disponible para claves heredadas. Devuelve deleted_id; una repetición devuelve 404 sin repetir efectos.","documentation_path":"/referencia-api/"},{"description":"El borrado es irreversible e incluye variantes y relaciones de catálogo, pero no elimina las órdenes históricas. Para retirar temporalmente un producto se mantiene PATCH con status=inactive.","documentation_path":"/referencia-api/"}]},{"id":"2026-09-25-product-promotional-labels","published_at":"2026-09-25","title":"Etiquetas promocionales de productos en la API","summary":"La Store API permite gestionar el cartel promocional del producto, de forma independiente de las etiquetas de búsqueda.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"POST /api/v1/products y PATCH /api/v1/products/{id} aceptan label (hasta 100 caracteres), label_color y label_icon. Los colores e íconos usan los valores en inglés documentados en OpenAPI.","documentation_path":"/referencia-api/"},{"description":"GET /api/v1/products y GET /api/v1/products/{id} devuelven los tres campos. Omitirlos en PATCH conserva su valor; label: null o un texto vacío quita el cartel sin modificar tags.","documentation_path":"/referencia-api/"},{"description":"La apariencia y visibilidad del cartel siguen la configuración de tarjetas de cada tienda. No cambian los permisos ni los niveles de API requeridos por las operaciones de productos.","documentation_path":"/referencia-api/"}]},{"id":"2026-09-25-product-image-imports","published_at":"2026-09-25","title":"Copia de imágenes al importar productos","summary":"La Store API permite copiar imágenes externas al almacenamiento administrado sin depender del sitio de origen una vez completada la tarea.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"POST /api/v1/products y PATCH /api/v1/products/{id} aceptan copy_images: true junto con images o image_url. Es opt-in: omitirlo conserva el comportamiento de guardar URLs.","documentation_path":"/referencia-api/"},{"description":"La respuesta incluye image_import con su estado y status_url. GET /api/v1/products/{id}/image-imports/{importId} informa progreso y errores por imagen; la galería solo se reemplaza cuando todas las copias están listas y no hubo cambios posteriores.","documentation_path":"/referencia-api/"},{"description":"Los reintentos son acotados y se pueden retomar con el mismo PATCH. La creación requiere API avanzada y products:write; consultar el resultado requiere products:read.","documentation_path":"/referencia-api/"}]},{"id":"2026-09-24-product-tags-brand","published_at":"2026-09-24","title":"Etiquetas y marca en el catálogo","summary":"Los productos devuelven sus etiquetas y marca; el listado permite combinarlas con el filtro de categoría.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"GET /api/v1/products y GET /api/v1/products/{id} incluyen tags y brand. POST y PATCH admiten brand opcional y devuelven ambos campos guardados.","documentation_path":"/referencia-api/"},{"description":"GET /api/v1/products acepta tag y brand por coincidencia exacta sin distinguir mayúsculas ni espacios exteriores, combinables con category_id. La configuración de etiquetas públicas de la tienda no limita estas consultas autenticadas.","documentation_path":"/referencia-api/"},{"description":"Omitir tags o brand en PATCH conserva su valor; tags: [] limpia etiquetas y brand: null limpia la marca.","documentation_path":"/referencia-api/"}]},{"id":"2026-08-21-api-publica-clientes","published_at":"2026-08-21","title":"Consulta protegida de clientes","summary":"La Store API permite listar y consultar clientes registrados e invitados con paginación, filtros temporales y contacto protegido.","type":"added","areas":["api","documentation"],"breaking":false,"changes":[{"description":"GET /api/v1/customers y GET /api/v1/customers/{customerKey} requieren API avanzada y customers:read.","documentation_path":"/referencia-api/"},{"description":"Email y teléfono permanecen ocultos salvo que include_contact=true y la credencial tenga customers:read_contact.","documentation_path":"/referencia-api/"},{"description":"El listado devuelve meta.total para la población filtrada y admite fechas de creación y última orden.","documentation_path":"/referencia-api/"}]},{"id":"2026-08-19-eventos-webhook-en-ingles","published_at":"2026-08-19","title":"Contrato público de webhooks en inglés","summary":"Los nombres de eventos, headers, envelope y datos documentados de las entregas de webhook usan identificadores canónicos en inglés.","type":"changed","areas":["api","webhooks","documentation"],"breaking":true,"changes":[{"description":"La creación, actualización y consulta de suscripciones usa eventos como order.created, stock.updated y contact.created.","documentation_path":"/referencia-api/"},{"description":"Las entregas reales y de prueba usan X-Wendo-Store-Id y un body con event, store_id, created_at y data; la prueba se identifica como webhook.test.","documentation_path":"/referencia-api/"},{"description":"La firma HMAC-SHA256, la idempotencia, los reintentos, los límites por plan y el aislamiento por tienda no cambian.","documentation_path":"/referencia-api/"}]},{"id":"2026-08-18-prefijo-store-api-key","published_at":"2026-08-18","title":"Nuevo prefijo para Store API keys","summary":"Las nuevas credenciales de tienda usan el prefijo wnd_sk_; las credenciales históricas siguen funcionando sin rotación.","type":"changed","areas":["api","documentation"],"breaking":false,"changes":[{"description":"La generación de credenciales nuevas adopta el prefijo wnd_sk_.","documentation_path":"/referencia-api/"},{"description":"Las integraciones que ya usan una credencial con el prefijo anterior pueden continuar utilizándola sin cambios.","documentation_path":"/referencia-api/"}]},{"id":"2026-08-18-api-v1-en-ingles","published_at":"2026-08-18","title":"Contrato inglés para toda la API V1","summary":"Las rutas, parámetros, campos, enums y códigos de la API V1 pasan a identificadores ingleses coherentes.","type":"changed","areas":["api","documentation"],"breaking":true,"changes":[{"description":"Productos, categorías, variantes e imágenes usan rutas y payloads en inglés dentro de V1.","documentation_path":"/referencia-api/"},{"description":"La sincronización de stock conserva su comportamiento pero devuelve nombres de campos y códigos en inglés.","documentation_path":"/referencia-api/"},{"description":"Órdenes y carritos abandonados usan las rutas /orders y /abandoned-carts, con parámetros, payloads, estados y códigos en inglés.","documentation_path":"/referencia-api/"},{"description":"La administración de webhooks usa fields en inglés; los identificadores de eventos existentes se conservan para no alterar las entregas.","documentation_path":"/referencia-api/"},{"description":"Autenticación, scopes, tiers, status codes, límites, aislamiento por tienda, lógica de negocio y MCP no cambian.","documentation_path":"/referencia-api/"}]},{"id":"2026-08-15-inicio-changelog-publico","published_at":"2026-08-15","title":"Inicio del changelog público","summary":"Comienza la publicación de un historial estable para los cambios visibles de la API, MCP y la documentación para integradores.","type":"added","areas":["api","mcp","documentation"],"breaking":false,"changes":[{"description":"Se consolidó la referencia de la Store API en un contrato OpenAPI 3.1 público y autocontenido.","documentation_path":"/referencia-api/"},{"description":"Se publicó un catálogo vivo de herramientas, scopes, perfiles y schemas del servidor MCP.","documentation_path":"/mcp/herramientas/"},{"description":"Se estableció este changelog como fuente pública para futuras novedades y deprecaciones.","documentation_path":"/changelog/"}]}]}