Skip to content

    Pre-launch API. The concepts described here are settled, but the API shape is not: request and response fields, parameters and defaults can still change. Build against it, and talk to your Luigi's Box contact before you put an integration into production.

    Search the catalog

    View source
    Deprecated
    GET
    /discovery/v1/search
    curl --request GET \
    --url 'https://api.eu1.luigisbox.ai/discovery/v1/search?channel_id=example&surface_id=example&user_id=&personalize=true&filters=&size=10&debug=false&type=example&query=&sort=&cursor=' \
    --header 'Authorization: Bearer <token>' \
    --header 'referer: ' \
    --header 'user-agent: ' \
    --header 'x-lbx-visitor-id: example'

    Full-text search over the catalog.

    Rate limited: a 429 carries Retry-After.

    channel_id
    required
    Channel Id

    Channel identifier (serving destination).

    string
    >= 1 characters

    Channel identifier (serving destination).

    surface_id
    required
    Surface Id

    Surface identifier, lbs_. The service segment must match the endpoint: lbs_search* on /search, lbs_collection_* on /collection, lbs_recommender_* on /recommender.

    string
    >= 1 characters

    Surface identifier, lbs_. The service segment must match the endpoint: lbs_search* on /search, lbs_collection_* on /collection, lbs_recommender_* on /recommender.

    user_id
    User Id

    Signed-in shopper’s stable identifier, your own opaque key. Omit it or send it blank for anonymous traffic; the strings undefined, null, None, NaN and [object Object] (any case) also count as anonymous.

    string
    ""

    Signed-in shopper’s stable identifier, your own opaque key. Omit it or send it blank for anonymous traffic; the strings undefined, null, None, NaN and [object Object] (any case) also count as anonymous.

    personalize
    Personalize

    Personalize this request, and assert that the shopper has consented to behavioural personalization. Defaults to true: personalized, and recorded as consented. Send false for a shopper who has not consented; read it from your consent manager on every request. When true and no sort is given, the result set (and, where returned, its request_key and cursors) is bound to the shopper: user_id and the X-Lbx-Visitor-Id sent. Under an explicit sort personalization does not change the order, so the result set is shared.

    boolean
    default: true

    Personalize this request, and assert that the shopper has consented to behavioural personalization. Defaults to true: personalized, and recorded as consented. Send false for a shopper who has not consented; read it from your consent manager on every request. When true and no sort is given, the result set (and, where returned, its request_key and cursors) is bound to the shopper: user_id and the X-Lbx-Visitor-Id sent. Under an explicit sort personalization does not change the order, so the result set is shared.

    filters
    Filters

    Filter expression, for example ‘brand = nike AND lbx:price < 100’. At most 100 conditions, in groups nested at most 10 deep — conditions are counted and the groups holding them are not. An expression past either is a 422 with exception_details.error_code filter_too_complex.

    string
    "" <= 4096 characters

    Filter expression, for example ‘brand = nike AND lbx:price < 100’. At most 100 conditions, in groups nested at most 10 deep — conditions are counted and the groups holding them are not. An expression past either is a 422 with exception_details.error_code filter_too_complex.

    return_fields
    Return Fields

    Field projection list. Each entry is either '' (alone, all fields) or a field path, optionally ending in '' to take a whole subtree (e.g. ‘attributes.title’ or ‘attributes.’). '' cannot be combined with other names.

    Array<string>
    <= 100 items

    Field projection list. Each entry is either '' (alone, all fields) or a field path, optionally ending in '' to take a whole subtree (e.g. ‘attributes.title’ or ‘attributes.’). '' cannot be combined with other names.

    size
    Size

    Maximum number of items to return. Must be between 1 and 100.

    integer
    default: 10 >= 1 <= 100

    Maximum number of items to return. Must be between 1 and 100.

    debug
    Debug

    Request ranking diagnostics. Honoured only on the first page for callers holding discovery:debug; silently ignored otherwise.

    boolean

    Request ranking diagnostics. Honoured only on the first page for callers holding discovery:debug; silently ignored otherwise.

    type
    required
    Type

    Object type to retrieve (e.g. ‘product’, ‘category’, ‘article’).

    string
    >= 1 characters

    Object type to retrieve (e.g. ‘product’, ‘category’, ‘article’).

    query
    Query

    User input search query.

    string
    "" <= 256 characters

    User input search query.

    sort
    Sort

    Sort expression, e.g. ‘price:asc’.

    string
    "" <= 256 characters

    Sort expression, e.g. ‘price:asc’.

    cursor
    Cursor

    Opaque pagination cursor from a prior response; omit for the first page. Valid only with the same request parameters other than size and, when personalize is true and no sort is given, the same user_id and X-Lbx-Visitor-Id as the request that returned it; otherwise the request fails with a 422.

    string
    "" <= 128 characters

    Opaque pagination cursor from a prior response; omit for the first page. Valid only with the same request parameters other than size and, when personalize is true and no sort is given, the same user_id and X-Lbx-Visitor-Id as the request that returned it; otherwise the request fails with a 422.

    touchpoint
    Any of:
    SearchTouchpoint

    Where in the shopper’s journey search results appear.

    string
    Allowed values: autocomplete serp chat mcp_agent

    Where in the shopper’s journey these results appear. The value is recorded with the request so reporting can tell apart results served at different points of the journey; a request without one is recorded with no touchpoint. Send it on every request. It does not influence ranking.

    user-agent
    User-Agent

    Originating client’s User-Agent. Optional; used to derive the platform (ios, android, web) the result set is attributed to. A backend caller should forward the end user’s value rather than its own.

    string
    ""

    Originating client’s User-Agent. Optional; used to derive the platform (ios, android, web) the result set is attributed to. A backend caller should forward the end user’s value rather than its own.

    referer
    Referer

    Originating page URL. Optional; lets the result set be attributed to the page it was served on.

    string
    ""

    Originating page URL. Optional; lets the result set be attributed to the page it was served on.

    x-lbx-visitor-id
    required
    X-Lbx-Visitor-Id

    Stable per-browser visitor identifier, generated client-side and persisted (e.g. a UUID in localStorage or a first-party cookie). Send it whether or not personalization is on: it is what links a request to a visitor’s history and to the analytics events reporting it. Keep it stable across page loads, sessions and token refreshes; never generate it server-side, or every visitor collapses into one.

    string
    >= 1 characters

    Stable per-browser visitor identifier, generated client-side and persisted (e.g. a UUID in localStorage or a first-party cookie). Send it whether or not personalization is on: it is what links a request to a visitor’s history and to the analytics events reporting it. Keep it stable across page loads, sessions and token refreshes; never generate it server-side, or every visitor collapses into one.

    Successful Response

    Media type application/json
    SearchResponse

    Response of the search endpoint.

    object
    debug
    Any of:
    object
    key
    additional properties
    any
    guid
    required
    Guid

    Deprecated alias of request_key carrying the same value. Read request_key instead: guid will be repurposed as the per-request attribution identifier once clients have migrated.

    string
    hits
    required
    Hits

    Ranked list of result hits — only objects this channel can serve.

    Array<object>
    RankedHit

    A hit from /search, /collection or /recommender.

    These endpoints rank, so a campaign or an ad platform can place a product on them — and a placed hit may carry @disclosure. A hit from a direct lookup never does.

    object
    @disclosure
    Disclosure

    Present only on a hit whose placement is disclosed — one a disclosing campaign’s rules pinned or boosted, or one an ad platform sold. Absent otherwise; never null.

    object
    advertiser
    Advertiser

    The person or company on whose behalf the placement is shown, e.g. Northwear Ltd, as the campaign wrote it. Present when the campaign names one.

    string
    <= 128 characters
    payer
    Payer

    Who paid for the placement. Present when the campaign names one.

    string
    <= 128 characters
    provider
    Provider

    The ad platform that sold the placement. Absent for a campaign-authored disclosure.

    string
    recipient_parameters
    Recipient Parameters

    What decided that this shopper is shown the placement on this request: search_query for what they searched, collection for the collection they browse, anchor for the products a recommendation is shown for, or none, alone, when nothing about the shopper did. Codes, for you to word in the shopper’s language; more may be added, so handle one you do not know generically. Present on a campaign’s placement.

    Array<string>
    >= 1 items
    Allowed values: none search_query collection anchor
    tracking
    Tracking

    Impression and click URLs to call, under the ad platform’s own key names. Absent for a campaign-authored disclosure, and when the platform returned none.

    object
    key
    additional properties
    string
    type
    required
    Type

    How the placement is disclosed. sponsored marks a paid placement.

    string
    Allowed value: sponsored
    @id
    required
    @Id

    Unique identity of the hit.

    string
    @type
    required
    @Type

    Type of the hit (e.g. ‘product’).

    string
    key
    additional properties
    any
    next_page_cursor
    required
    Any of:
    string
    pagination_status
    required
    Pagination Status

    Why this response does or does not carry a next_page_cursor: more — more pages exist and next_page_cursor is set; exhausted — this was the last page; unsupported — this result set cannot be paged and retrying will not produce a cursor; unavailable — pagination state could not be saved for this request (a transient failure) and re-issuing the search may succeed.

    string
    Allowed values: more exhausted unsupported unavailable
    request_key
    required
    Request Key

    Key derived from the request parameters that decide which objects are returned. Two identical requests produce the same value. A request with personalize set to true and no explicit sort is also scoped to its shopper (user_id and X-Lbx-Visitor-Id), so two visitors sending it get different values; every other request keys the same for every shopper. Pass it to /facets and /variants to address the same result set; a cursor is only valid together with the request key it was issued for.

    string
    total
    required
    Any of:
    integer
    total_approx
    required
    Total Approx

    Approximate total for the whole result set, counting only the objects this channel can serve. Always present, so use it as the fallback when total is null. It may be an estimate, so prefer total wherever that is set.

    integer
    Example
    {
    "hits": [
    {
    "@disclosure": {
    "recipient_parameters": [
    "none"
    ],
    "type": "sponsored"
    }
    }
    ],
    "pagination_status": "more"
    }

    Malformed request

    Media type application/json
    ErrorResponse

    Canonical error body — every non-2xx response uses this shape.

    object
    exception_details
    ExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Error Code

    Stable machine code naming why a well-formed request was refused: snake_case, prefixed by its domain — e.g. filter_unknown_field or cursor_mismatch. Safe to branch on; reason is not. Absent when the status code says all there is to say.

    string
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    Any of:
    string
    Example generated
    {
    "exception_details": {
    "error_code": "example",
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }

    Missing or invalid credentials

    Media type application/json
    ErrorResponse

    Canonical error body — every non-2xx response uses this shape.

    object
    exception_details
    ExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Error Code

    Stable machine code naming why a well-formed request was refused: snake_case, prefixed by its domain — e.g. filter_unknown_field or cursor_mismatch. Safe to branch on; reason is not. Absent when the status code says all there is to say.

    string
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    Any of:
    string
    Example generated
    {
    "exception_details": {
    "error_code": "example",
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }

    Authenticated but not permitted

    Media type application/json
    ErrorResponse

    Canonical error body — every non-2xx response uses this shape.

    object
    exception_details
    ExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Error Code

    Stable machine code naming why a well-formed request was refused: snake_case, prefixed by its domain — e.g. filter_unknown_field or cursor_mismatch. Safe to branch on; reason is not. Absent when the status code says all there is to say.

    string
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    Any of:
    string
    Example generated
    {
    "exception_details": {
    "error_code": "example",
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }

    Resource not found

    Media type application/json
    ErrorResponse

    Canonical error body — every non-2xx response uses this shape.

    object
    exception_details
    ExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Error Code

    Stable machine code naming why a well-formed request was refused: snake_case, prefixed by its domain — e.g. filter_unknown_field or cursor_mismatch. Safe to branch on; reason is not. Absent when the status code says all there is to say.

    string
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    Any of:
    string
    Example generated
    {
    "exception_details": {
    "error_code": "example",
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }

    Request validation failed

    Media type application/json
    DiscoveryValidationError

    The canonical error body of a Discovery 422, with error_code typed.

    Every key of the envelope is required, as the served body always carries all three.

    object
    exception_details
    required
    DiscoveryExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Any of:
    string
    Allowed values: filter_syntax filter_too_complex filter_unknown_field filter_type_mismatch
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    required
    Any of:
    string
    Example
    {
    "exception_details": {
    "error_code": "filter_syntax"
    }
    }

    Rate limit exceeded

    Media type application/json
    ErrorResponse

    Canonical error body — every non-2xx response uses this shape.

    object
    exception_details
    ExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Error Code

    Stable machine code naming why a well-formed request was refused: snake_case, prefixed by its domain — e.g. filter_unknown_field or cursor_mismatch. Safe to branch on; reason is not. Absent when the status code says all there is to say.

    string
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    Any of:
    string
    Example generated
    {
    "exception_details": {
    "error_code": "example",
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }

    Service temporarily unavailable

    Media type application/json
    ErrorResponse

    Canonical error body — every non-2xx response uses this shape.

    object
    exception_details
    ExceptionDetails

    Machine-readable error context; empty object when there is nothing to add.

    object
    error_code
    Error Code

    Stable machine code naming why a well-formed request was refused: snake_case, prefixed by its domain — e.g. filter_unknown_field or cursor_mismatch. Safe to branch on; reason is not. Absent when the status code says all there is to say.

    string
    validation_errors
    Validation Errors

    Every field-level problem found in the request, when validation is what failed. Absent when the rejection is not about a specific value.

    Array<object>
    ValidationProblem

    One field-level reason a request was rejected.

    object
    loc
    required
    Loc

    Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].

    Array
    msg
    required
    Msg

    What is wrong with the value at loc.

    string
    type
    required
    Type

    Stable machine code for the problem, e.g. missing or string_too_short.

    string
    key
    additional properties
    any
    reason
    required
    Reason

    Human-readable, actionable error message.

    string
    request_id
    Any of:
    string
    Example generated
    {
    "exception_details": {
    "error_code": "example",
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }