Skip to main content

Reference · Errors

This page lists the HTTP codes the Neuroon API can return and the common body shape. All error responses come from el backend except for specific cases.

Body shape

{
"timestamp": "2026-05-06T10:15:00",
"status": 400,
"error": "Bad Request",
"message": "field-level error joined with commas",
"path": "/api/widget/search"
}
FieldTypeNotes
timestampstringLocalDateTime.now.toString — no explicit timezone (server in UTC).
statusnumberHTTP code.
errorstringReason phrase of the status (Bad Request, Unauthorized, …).
messagestringDetail. On 400, validation errors are concatenated with , .
pathstringPath without the uri= prefix added by WebRequest.

HTTP codes

StatusTypical causeHow to fix
400 Bad RequestFailed validation (@Valid, missing @RequestParam, IllegalArgumentException, IllegalStateException).Inspect the field names in message and re-send.
401 Unauthorizedcredenciales inválidas or missing/invalid token. The expected header is X-Widget-Token or X-Shop-API-Key depending on the endpoint.Check the header; refresh the token if it expired.
403 Forbiddenpermiso denegado: Widget Token origin mismatch or cross-tenant on plugin endpoints.Verify the token belongs to the requested shopId and the Origin domain is allowed.
404 Not FoundResource doesn't exist (shopId, product, plan).Check the id; on product sync, verify the shop exists first.
409 ConflictIdentity duplicate (e.g. externalId already registered in full sync).Consider whether it should be INCREMENTAL instead of FULL.
422 Unprocessable EntityBusiness rules: parent product not found, currency mismatch between items, etc.Inspect message; fix the payload.
429 Too Many RequestsRate limit exceeded.Wait the time stated in Retry-After and retry with jitter. See Rate Limits.
500 Internal Server ErrorUncaught exception (generic Exception).Report to support with timestamp and path.
502 Bad GatewayAn external provider this route depends on failed.Retry with backoff; if it persists, contact support.
503 Service UnavailableCircuit breaker open on an external provider.Wait and retry with backoff.

Domain-specific errors

These are not new HTTP statuses: they travel inside message with the same generic body, but it's useful to recognize them because your integration usually wants to handle them differently.

Message (key)StatusMeaning
DUPLICATE_EXTERNAL_ID409The externalId already exists on FULL sync. Switch to INCREMENTAL or wipe the shop.
PARENT_PRODUCT_NOT_FOUND422You are syncing a variant whose parentProductId doesn't exist. Sync the parent first.
SHOP_NOT_FOUND404The path's shopId doesn't exist.
WIDGET_TOKEN_EXPIRED401The token has expired (TTL 24 h). Regenerate and re-render.
ORIGIN_NOT_ALLOWED403The Origin header doesn't match the authorized domains. Add it from the Dashboard.
RATE_LIMIT_EXCEEDED429Quota exceeded. See Retry-After and X-RateLimit-*.

If your platform needs stable error codes as a contract, contact support to enable the extended { "code": "...", ... } format. The current default is plain text.

Validation errors (400)

errores de validación and errores de validación are concatenated in message with the format field: description:

{
"timestamp": "2026-05-06T10:15:00",
"status": 400,
"error": "Bad Request",
"message": "products[0].externalId: must not be blank, products[0].price: must be positive",
"path": "/api/plugin/shops/123/products/sync"
}

.

Best practices

  • Don't regex-parse message — the format may change. Use status and, if you need semantics, the domain code.
  • Retry on 429, 502, 503 with exponential backoff + jitter.
  • Don't retry on 400, 401, 403, 404, 409, 422 — those are client errors.
  • Log timestamp and path to correlate with the server side when you open a ticket.

Further reading