{"invalid_request":{"code":"invalid_request","type":"https://developers.stylumia.com/errors/invalid_request","status":400,"title":"Invalid request","retryable":false,"meaning":"A parameter is malformed or missing.","causes":["A required parameter was omitted.","A value has the wrong type or format."],"recovery":"Check the `field` member for the parameter at fault, fix it, and resend. Do not retry unchanged.","extensions":["field","valid_options"]},"unknown_retailer":{"code":"unknown_retailer","type":"https://developers.stylumia.com/errors/unknown_retailer","status":400,"title":"Unknown retailer","retryable":false,"meaning":"The `retailer` value is not one we recognise.","causes":["The value was guessed rather than taken from a coverage response.","A typo in an otherwise valid slug."],"recovery":"Call `GET /v1/coverage` to list the retailers available to you, or use one of the suggestions in `valid_options`.","extensions":["field","valid_options"]},"unknown_category":{"code":"unknown_category","type":"https://developers.stylumia.com/errors/unknown_category","status":400,"title":"Unknown category","retryable":false,"meaning":"The `category` value is not recognised for the retailer you queried.","causes":["The value was guessed rather than taken from a coverage response.","The category exists for a different retailer, but not this one."],"recovery":"Call `GET /v1/coverage?retailer=...` to list that retailer's categories, or use one of the suggestions in `valid_options`.","extensions":["field","valid_options"]},"unknown_department":{"code":"unknown_department","type":"https://developers.stylumia.com/errors/unknown_department","status":400,"title":"Unknown department","retryable":false,"meaning":"The `department` value is not recognised for the retailer you queried.","causes":["The value was guessed rather than taken from a coverage response.","The department exists for a different retailer, but not this one."],"recovery":"Call `GET /v1/coverage` to list the retailer, category and department combinations available to you, or use one of the suggestions in `valid_options`.","extensions":["field","valid_options"]},"invalid_date_range":{"code":"invalid_date_range","type":"https://developers.stylumia.com/errors/invalid_date_range","status":400,"title":"Invalid date range","retryable":false,"meaning":"`start_date` is after `end_date`, or a date is malformed.","causes":["Dates are not ISO 8601 (`YYYY-MM-DD`).","The range is inverted."],"recovery":"Send ISO 8601 dates with `start_date` on or before `end_date`.","extensions":["field"]},"invalid_cursor":{"code":"invalid_cursor","type":"https://developers.stylumia.com/errors/invalid_cursor","status":400,"title":"Invalid cursor","retryable":false,"meaning":"The cursor is expired, malformed, or not one we issued.","causes":["The cursor was stored longer than its lifetime.","The cursor string was truncated or edited."],"recovery":"Restart the walk from the first page without a `cursor` parameter.","extensions":["field"]},"missing_credentials":{"code":"missing_credentials","type":"https://developers.stylumia.com/errors/missing_credentials","status":401,"title":"Missing credentials","retryable":false,"meaning":"No credential was presented.","causes":["The `Authorization` header is absent or not a Bearer token."],"recovery":"Send `Authorization: Bearer <your API key>`. Create a key in the developer portal; the secret is shown once, at creation.","extensions":[]},"invalid_credentials":{"code":"invalid_credentials","type":"https://developers.stylumia.com/errors/invalid_credentials","status":401,"title":"Invalid credentials","retryable":false,"meaning":"The credential is unknown or revoked. Deliberately one answer for both.","causes":["The key was revoked in the console.","The word `Bearer` was pasted into a field that adds it again.","The key was truncated in transit or on paste."],"recovery":"Check the key's status in the developer portal. Keys do not expire, so a key that worked before and fails now was revoked - create a new one.","extensions":[]},"insufficient_scope":{"code":"insufficient_scope","type":"https://developers.stylumia.com/errors/insufficient_scope","status":403,"title":"Insufficient scope","retryable":false,"meaning":"The credential is valid but your team is not entitled to this endpoint.","causes":["The team's entitlement does not include it."],"recovery":"The `detail` names what is missing. Ask your team admin about the entitlement, or email support@stylumia.com with what you are building.","extensions":[]},"not_found":{"code":"not_found","type":"https://developers.stylumia.com/errors/not_found","status":404,"title":"Not found","retryable":false,"meaning":"This endpoint or resource does not exist.","causes":["A typo in the path.","A resource id outside what your team can see."],"recovery":"Check the path against the API reference. A resource your team cannot see is reported absent, not forbidden.","extensions":[]},"rate_limited":{"code":"rate_limited","type":"https://developers.stylumia.com/errors/rate_limited","status":429,"title":"Rate limited","retryable":true,"meaning":"The published per-team limit was exceeded.","causes":["Requests were sent faster than the limit for this endpoint group."],"recovery":"Honour the `Retry-After` header, then resume. The `RateLimit-*` headers on every response let a client self-throttle before hitting this.","extensions":[]},"service_unavailable":{"code":"service_unavailable","type":"https://developers.stylumia.com/errors/service_unavailable","status":503,"title":"Service unavailable","retryable":true,"meaning":"We are down or degraded, and we know it. Your request was fine.","causes":["A dependency of ours is unavailable."],"recovery":"Retry with exponential backoff and jitter. Check /status for incident updates.","extensions":[]},"upstream_timeout":{"code":"upstream_timeout","type":"https://developers.stylumia.com/errors/upstream_timeout","status":504,"title":"Upstream timeout","retryable":true,"meaning":"We were too slow answering, not you. The result is indeterminate.","causes":["A data query exceeded our internal deadline."],"recovery":"Retry with backoff. Reads are safe to repeat - nothing here mutates state.","extensions":[]},"internal_error":{"code":"internal_error","type":"https://developers.stylumia.com/errors/internal_error","status":500,"title":"Internal error","retryable":true,"meaning":"Something unforeseen failed on our side. The cause is logged with your request id.","causes":["An unhandled error in the service."],"recovery":"Retry once with backoff. If it persists, contact support quoting the `request_id`.","extensions":[]}}