CORS y validación de origen
Neuroon valida el Origin de cada request de forma distinta según el endpoint y el tipo de credencial. Esta página es la fuente única de verdad: si una página de docs dice algo distinto, gana esta tabla.
Matriz canónica (Plugin API)
| Endpoint | Auth | Acepta Origin ausente (server-to-server) | Origin debe coincidir con | Cómo añadir un dominio |
|---|---|---|---|---|
POST /api/plugin/shops/{shopId}/products/sync | X-Shop-API-Key | ✅ Sí | n/a — sólo se valida que la API Key pertenezca al shop. | n/a |
GET /api/plugin/shops/{shopId}/products | X-Shop-API-Key | ✅ Sí | n/a | n/a |
POST /api/plugin/shops/{shopId}/track/conversion | X-Shop-API-Key | ✅ Sí | n/a | n/a |
POST /api/plugin/shops/{shopId}/verify | X-Shop-API-Key | ✅ Sí | El domain del body se compara con shop.url. | Editar shop.url en el dashboard. |
GET /api/plugin/shops/{shopId}/verification-data | X-Shop-API-Key | ✅ Sí | n/a | n/a |
Cuando llega
Origin, el backend lo compara contra la lista de dominios "trusted" (neuroon.aiy subdominios,localhost,127.0.0.1) o contra elshop.urlregistrado en el dashboard. Si no llegaOrigin(curl, server-to-server), se permite. Esto hace los endpoints compatibles tanto con navegador como concurl.
El widget embebido en el navegador habla con un backend interno usando el Widget Token. Tú no llamas a esos endpoints — el bundle del CDN los consume directamente.
Lista de orígenes "trusted"
Por defecto:
localhosty127.0.0.1(suffix-match: cualquier subdominio o puerto vale).neuroon.ai(suffix-match: incluye*.neuroon.ai).- El
shop.urlregistrado en el dashboard.
Añadir un dominio nuevo
- Si es tu dominio principal: edítalo desde el dashboard → tu tienda → Settings → Storefront URL. El cambio aplica al siguiente request servido.
- Si necesitas dominios extra (staging, ramas, dominios de marketing que comparten widget): abre un ticket en soporte indicando
shopIdy los dominios.
Errores típicos
| Síntoma | Causa | Solución |
|---|---|---|
Browser bloquea XHR con CORS error y consola muestra 403 | El widget está corriendo en un dominio que no está en orígenes "trusted" ni coincide con shop.url. | Verifica shop.url o pide que añadan el dominio. |
403 DOMAIN_MISMATCH al llamar /verify | El domain del body no coincide con shop.url. | Edita shop.url en el dashboard y reintenta. (Body field: {"domain": "..."}, no url.) |
401 al servir el widget desde el navegador | Token expirado, no presente en el HTML, o mezcla de entorno (token DEV vs api.neuroon.ai). | Vuelve a firmar el token (HMAC) en tu servidor y comprueba la URL base. |
Próximas lecturas
- Authentication · Widget Token — token de 24 h firmado en tu servidor.
- Authentication · Shop API Key — formato
sk_…y rotación. - Recipe · Server-to-server token — patrón de cache y rotación.
- Custom · Server-to-server — incluye verificación de dominio sin plugin.