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.

    Get a campaign

    View source
    GET
    /platform/v1/campaigns/{campaign_id}
    curl --request GET \
    --url 'https://api.eu1.luigisbox.ai/platform/v1/campaigns/example?filter_syntax=group' \
    --header 'Authorization: Bearer <token>'
    campaign_id
    required
    Campaign Id
    string
    filter_syntax
    FilterSyntax

    Syntax filter trees are rendered in. group is the {operator, conditions} form; map is the $and / $or / $not map syntax the Discovery API uses, in which an empty tree renders as null. Request bodies accept either syntax regardless of this setting.

    string
    default: group
    Allowed values: group map

    Syntax filter trees are rendered in. group is the {operator, conditions} form; map is the $and / $or / $not map syntax the Discovery API uses, in which an empty tree renders as null. Request bodies accept either syntax regardless of this setting.

    Successful Response

    Media type application/json
    Campaign

    Campaign response: the explicit picks the merchandiser made, round-trippable into an update.

    The effective scope — those picks unioned with the current members of the picked tags — is not here; read it from GET /platform/v1/campaigns/{campaign_id}/effective-scope. See :class:CampaignEffectiveScope.

    object
    catalog_ids
    required
    Catalog Ids
    Array<string>
    catalog_tags
    required
    Catalog Tags
    Array<string>
    channel_ids
    required
    Channel Ids
    Array<string>
    channel_tags
    required
    Channel Tags
    Array<string>
    created_at
    required
    Created At
    string format: date-time
    created_by
    required
    Any of:
    string
    ends_at
    required
    Any of:
    string format: date-time
    id
    required
    Id
    string
    intents
    required
    Intents

    Surface Intents this campaign targets — the kind of discovery it applies to. Empty means every Intent, not none. Narrowing by Intent is mutually exclusive with narrowing by surface_ids / surface_tags: an Intent targets whole families of surfaces, so combining the two is rejected with intents_conflict. A targeted Intent no scoped catalog hosts a surface for is rejected with catalog_without_targeted_intent — it could never trigger.

    Array<string>
    Allowed values: search recommender collection
    match
    required
    Any of:
    FilterGroup

    A filter tree in group syntax: a boolean operator over leaves and nested groups.

    not holds exactly one child. An empty and constrains nothing and an empty or matches nothing; each endpoint says whether it accepts either.

    object
    conditions
    Conditions

    Leaf conditions and nested groups.

    Array
    One of:
    FilterCondition

    One leaf of a group-syntax tree: a field compared against a value.

    object
    field
    required
    Field

    Object field the condition reads.

    string
    on_missing
    Any of:
    DynamicFilterMissingPolicy

    What a condition reading its value from the request’s anchors does when none carries the attribute.

    fail_closed (the default) makes the whole filter tree match nothing. ignore drops the condition instead, leaving the rest of the tree in force.

    string
    Allowed values: fail_closed ignore
    operator
    required
    FilterOperator

    Comparison operator.

    string
    Allowed values: eq neq gt gte lt lte in not_in matches starts_with ends_with range exists
    source
    FilterSource

    Provenance of the condition; stamped by the system, never read from a client.

    string
    default: request
    Allowed values: request collection surface autofilter business_rule visibility
    value
    Value

    Literal to compare against, or a trigger reference {trigger_ref: ...}; a scalar for eq/neq and the comparisons, a non-empty list for in/not_in, absent for exists.

    value_from
    Any of:
    FilterValueFrom

    Where a dynamic condition reads its value: an attribute of the request’s anchors.

    object
    anchor_attribute
    required
    Anchor Attribute

    Anchor attribute whose value the condition compares against.

    string
    operator
    required
    BooleanOperator

    Boolean combinator applied to conditions.

    string
    Allowed values: and or not
    name
    required
    Name
    string
    organization_id
    required
    Organization Id
    string
    rules
    Rules
    Array<object>
    Rule
    object
    campaign_id
    required
    Campaign Id
    string
    created_at
    required
    Created At
    string format: date-time
    created_by
    required
    Any of:
    string
    effect
    required
    One of: discriminator: type
    PinEffect

    Pin the selected product to a fixed 1-indexed position.

    mode='soft' is the Soft Pin: the placement decays over decay_window. content_type / disclosure_type / respect_user_filters are accepted and stored but have no effect on results.

    object
    content_type
    Any of:
    string
    Allowed values: product banner
    decay_window
    Any of:
    string format: duration
    disclosure_type
    Any of:
    string
    Allowed values: sponsored support
    mode
    Mode
    string
    default: hard
    Allowed values: hard soft
    position
    required
    Position
    integer
    > 0
    respect_user_filters
    Respect User Filters
    boolean
    type
    Type
    string
    default: pin
    Allowed value: pin
    id
    required
    Id
    string
    name
    required
    Name
    string
    record_match
    required
    Any of:
    FilterGroup

    A filter tree in group syntax: a boolean operator over leaves and nested groups.

    not holds exactly one child. An empty and constrains nothing and an empty or matches nothing; each endpoint says whether it accepts either.

    object
    conditions
    Conditions

    Leaf conditions and nested groups.

    Array
    One of:
    FilterCondition

    One leaf of a group-syntax tree: a field compared against a value.

    object
    field
    required
    Field

    Object field the condition reads.

    string
    on_missing
    Any of:
    DynamicFilterMissingPolicy

    What a condition reading its value from the request’s anchors does when none carries the attribute.

    fail_closed (the default) makes the whole filter tree match nothing. ignore drops the condition instead, leaving the rest of the tree in force.

    string
    Allowed values: fail_closed ignore
    operator
    required
    FilterOperator

    Comparison operator.

    string
    Allowed values: eq neq gt gte lt lte in not_in matches starts_with ends_with range exists
    source
    FilterSource

    Provenance of the condition; stamped by the system, never read from a client.

    string
    default: request
    Allowed values: request collection surface autofilter business_rule visibility
    value
    Value

    Literal to compare against, or a trigger reference {trigger_ref: ...}; a scalar for eq/neq and the comparisons, a non-empty list for in/not_in, absent for exists.

    value_from
    Any of:
    FilterValueFrom

    Where a dynamic condition reads its value: an attribute of the request’s anchors.

    object
    anchor_attribute
    required
    Anchor Attribute

    Anchor attribute whose value the condition compares against.

    string
    operator
    required
    BooleanOperator

    Boolean combinator applied to conditions.

    string
    Allowed values: and or not
    updated_at
    required
    Updated At
    string format: date-time
    updated_by
    required
    Any of:
    string
    starts_at
    required
    Any of:
    string format: date-time
    status
    required
    CampaignStatus

    Lifecycle state of a Campaign.

    string
    Allowed values: draft active paused archived
    surface_ids
    required
    Surface Ids
    Array<string>
    surface_tags
    required
    Surface Tags
    Array<string>
    timezone
    Timezone

    IANA timezone identifier (e.g. Europe/Bratislava) the schedule was authored in, kept so it can be re-opened in that zone. Informational only: starts_at / ends_at are the UTC instants that govern when the campaign runs, and this field never shifts them — use it when re-planning a schedule, never to compute execution times. Requires at least one of starts_at / ends_at, and is cleared when both are cleared. Because tz databases differ between releases and between server and browser (Europe/Kiev vs Europe/Kyiv), a client whose own database does not know the identifier should keep the string as it is rather than discard or rewrite it. A scheduled campaign always reads back a zone — UTC when none was authored; an unscheduled one omits the field, so a response never shows the zone-without-schedule state that writes reject.

    string
    default: UTC <= 64 characters
    updated_at
    required
    Updated At
    string format: date-time
    updated_by
    required
    Any of:
    string
    Example
    {
    "intents": [
    "search"
    ],
    "match": {
    "$and": [
    {
    "brand": {
    "in": [
    "nike",
    "adidas"
    ]
    }
    },
    {
    "lbx:price": {
    "gte": 50,
    "lte": 200
    }
    },
    {
    "$or": [
    {
    "condition": {
    "eq": "new"
    }
    },
    {
    "warranty_months": {
    "gte": 12
    }
    }
    ]
    },
    {
    "$not": {
    "material": {
    "eq": "leather"
    }
    }
    },
    {
    "image": {
    "exists": true
    }
    }
    ]
    },
    "rules": [
    {
    "effect": {
    "content_type": "product",
    "disclosure_type": "sponsored",
    "mode": "hard",
    "respect_user_filters": false,
    "type": "pin"
    },
    "record_match": {
    "$and": [
    {
    "brand": {
    "in": [
    "nike",
    "adidas"
    ]
    }
    },
    {
    "lbx:price": {
    "gte": 50,
    "lte": 200
    }
    },
    {
    "$or": [
    {
    "condition": {
    "eq": "new"
    }
    },
    {
    "warranty_months": {
    "gte": 12
    }
    }
    ]
    },
    {
    "$not": {
    "material": {
    "eq": "leather"
    }
    }
    },
    {
    "image": {
    "exists": true
    }
    }
    ]
    }
    }
    ],
    "status": "draft",
    "timezone": "UTC"
    }

    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
    validation_errors
    Any of:
    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": {
    "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
    validation_errors
    Any of:
    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": {
    "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
    validation_errors
    Any of:
    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": {
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }

    Request validation failed

    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
    validation_errors
    Any of:
    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": {
    "validation_errors": [
    {
    "loc": [
    "example"
    ],
    "msg": "example",
    "type": "example"
    }
    ]
    },
    "reason": "example",
    "request_id": "example"
    }