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.

    List campaigns

    View source
    GET
    /platform/v1/campaigns
    curl --request GET \
    --url 'https://api.eu1.luigisbox.ai/platform/v1/campaigns?filter_syntax=group&page=1&size=20&sort=' \
    --header 'Authorization: Bearer <token>'

    List campaigns. Filters combine AND across facets, OR within a repeatable facet (effect_type, intent); query is a case-insensitive substring on the name. intent matches the Intents a campaign can actually serve, not just its stored intents: the Intents of the surfaces that exist within its scope right now, so a catalog-wide campaign matches every Intent its catalogs host and a campaign whose targeted surfaces were deleted matches none — exactly what its effective scope reports. Sort with sort=<field>:<direction>, field one of name|status|rules_count|starts_at|updated_at, direction asc|desc (e.g. sort=name:asc); ordered by id when sort is omitted, and id is always the final tiebreaker so paging stays stable. facet_counts.status breaks the result down by status, ignoring the status filter. Listing without organization_id spans every organization, which requires a grant that wide; name your organization instead. GET /platform/v1/me/entitlements returns the organizations your credentials reach, with their ids.

    organization_id
    Any of:
    string

    Only campaigns of this organization.

    status
    Any of:
    CampaignStatus

    Lifecycle state of a Campaign.

    string
    Allowed values: draft active paused archived

    Only campaigns in this lifecycle state. facet_counts.status ignores it.

    query
    Any of:
    string
    >= 1 characters <= 256 characters

    Case-insensitive substring match on the campaign name.

    effect_type
    Any of:
    Array<string>
    Allowed values: pin ban boost bury

    Only campaigns holding at least one rule of this effect. Repeatable; values OR together.

    intent
    Any of:
    Array<string>
    Allowed values: search recommender collection

    Only campaigns that can serve this Intent right now — the Intents of the surfaces in their current scope, not their stored intents. Repeatable; values OR together.

    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.

    page
    Page
    integer
    default: 1 >= 1
    size
    Size
    integer
    default: 20 >= 1 <= 100
    sort
    Sort

    Sort expression <field>:<direction>, e.g. name:asc. Field is one of name, status, rules_count, starts_at, updated_at; direction is asc or desc.

    string
    "" <= 256 characters

    Sort expression <field>:<direction>, e.g. name:asc. Field is one of name, status, rules_count, starts_at, updated_at; direction is asc or desc.

    Successful Response

    Media type application/json
    CampaignPage

    A page of campaigns plus a count per status, zero-filled and ignoring the status filter.

    object
    facet_counts
    required
    Facet Counts
    object
    key
    additional properties
    object
    key
    additional properties
    integer
    items
    required
    Items
    Array<object>
    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
    page
    required
    Page
    integer
    size
    required
    Size
    integer
    total
    required
    Total
    integer
    Example
    {
    "items": [
    {
    "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"
    }

    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"
    }