Products API
Todos los endpoints están bajo /api/v1/{platform}/products donde platform es shopify o bigcommerce.
Listar productos
GET /api/v1/shopify/products?limit=50&offset=0&storeId=...
Authorization: Bearer sk_live_...
X-Tenant-Id: <tenant-id>
Respuesta:
{
"products": [
{
"id": "...",
"title": "...",
"vendor": "...",
"price": 29.99,
"currency": "EUR",
"identity": "...",
"enrichment_status": "enriched",
"manually_edited": false,
"last_enriched_at": "2026-04-14T...",
"url": "/api/shopify/products/...",
"llm_url": "/api/shopify/products/...llm"
}
],
"total": 281,
"pagination": { "limit": 50, "offset": 0, "count": 50, "has_more": true }
}
Obtener un producto (payload semántico completo)
GET /api/v1/shopify/products/:id
Devuelve el SemanticProduct completo con core_identity, reasoning, synthetic_properties, technical_details, metadata.
Variante optimizada para LLM
GET /api/v1/shopify/products/:id.llm
Devuelve un JSON condensado para consumo por LLM — identidad, reasoning, quality_scores, pricing, market_context, más una cadena pre-computada summary_for_ai.
JSON-LD (schema.org/Product)
GET /api/v1/shopify/products/:id.jsonld
Devuelve application/ld+json con @type: Product, offers, brand y los scores mapeados a additionalProperty[] como PropertyValue. Listo para crawler.
Señales SEO meta
GET /api/v1/shopify/products/:id.meta
Devuelve señales SEO en 3 longitudes de descripción (≤160 chars, ≤300, sin límite) + URL canónica + keywords.
Re-enriquecer un solo producto
POST /api/v1/shopify/enrich/:id
Authorization: Bearer <JWT>
Content-Type: application/json
{
"hints": {
"target_audience": "...",
"material_composition": "..."
}
}
Las hints son opcionales; son los mismos campos que recoge el Enrichment Wizard.
Re-enriquecimiento masivo
POST /api/v1/shopify/enrich/all?pending=true&storeId=<storeId>
pending=true solo re-enriquece los productos marcados enrichment_pending. Sin él, re-enriquece todos los productos del tenant (peligroso — usa la confirmación en dos pasos del dashboard).
Versiones + rollback
GET /api/v1/shopify/enrich/:id/versions → lista las versiones pasadas
POST /api/v1/shopify/enrich/:id/rollback?version=N → restaura la versión N
El rollback en sí mismo crea un snapshot nuevo, así que es reversible.
Actualizar el enriquecimiento de un producto manualmente
PATCH /api/v1/shopify/products/:id # también disponible en /bigcommerce/
{
"core_identity": "...",
"reasoning": { ... },
"synthetic_properties": {
"durability_score": 8,
"competitors_owner_provided": [
{ "brand": "Nike", "model": "Air Max 90", "ref_price": "120 €", "notes": "competidor directo" }
]
}
}
Whitelist de campos top-level: core_identity, reasoning, synthetic_properties. Marca el producto con:
metadata.manually_edited = true— los re-enriquecimientos futuros muestran una confirmación OVERWRITE de dos pasos en el dashboardmetadata.competitors_source = 'owner'— solo cuandosynthetic_properties.competitors_owner_providedes un array no vacío. Fija autoridad sobre la lista de competidores para que el re-enrichment no la regenere.
Actualizar metadata de categoría / colección
PATCH /api/v1/shopify/collections/:id # Shopify → "collections"
PATCH /api/v1/bigcommerce/categories/:id # BigCommerce → "categories"
Whitelist de campos para bulk-edit SEO:
{
"name": "...",
"description": "...",
"slug": "...",
"imageUrl": "https://...",
"metaTitle": "...",
"metaDescription": "..."
}
Tenant-scoped — el tenant del request debe ser propietario de la entidad o el endpoint devuelve 404. Strings vacíos se coaccionan a null. Devuelve la fila actualizada.
Verificar storefront — diff por producto
GET /api/v1/shopify/diff/:id?store_url=https://tutienda.com
Recupera tu storefront en vivo y compara cada signal que Clione propagó (meta_description, meta_title, jsonld, canonical, meta_keywords) contra lo que el HTML contiene realmente ahora mismo.
Estados per-signal: identical | different | missing_in_storefront | never_propagated | propagation_failed | parse_error.
La respuesta incluye un summary (match_rate excluye never_propagated), un diff per-signal, y — para JSON-LD — un breakdown estructural de added/removed/changed keys.
Side effect: refresca verifiedAt + verifiedPresent en los PropagationRecord subyacentes.
Verificar storefront — batch
GET /api/v1/shopify/diff?store_url=https://tutienda.com&product_ids=id1,id2,id3
Mismo contrato que /diff/:id pero para un array de productos. Agrega totales cruzados + devuelve resultados per-producto bajo results[]. Un producto lento no mata el batch — los fallos vienen como { entity_id, error, summary: null }.
Usado por el botón Verify storefront del dashboard en la overview del store. Cap duro a ~50 productos por call en la UI para mantener tiempos de respuesta manejables.