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 CampaignEffectiveScope.

    object
    catalog_ids
    required
    Catalog Ids

    Catalogs this campaign narrows to, by id. catalog_tags narrows the same axis by contributing its members, so the scope is the union of the two. An axis nothing narrows is an axis the campaign does not restrict, so empty means every one of them rather than none. A catalog outside the organization is rejected with catalog_not_in_organization.

    Array<string>
    catalog_tags
    required
    Catalog Tags

    Catalog tags whose members join catalog_ids on the catalog axis. Resolved at read time, so editing a tag reflows into every campaign referencing it. A tag that does not exist in the organization is rejected with tag_not_found, and one carrying another dimension with tag_dimension_mismatch.

    Array<string>
    channel_ids
    required
    Channel Ids

    Channels this campaign narrows to, by id, jointly with channel_tags. An axis nothing narrows is an axis the campaign does not restrict, so empty means every one of them rather than none. Narrowing by channel requires a catalog scope (catalog_scope_required), the channel must be in the organization (channel_not_in_organization) and owned by a scoped catalog (channel_outside_catalog_scope).

    Array<string>
    channel_tags
    required
    Channel Tags

    Channel tags whose members join channel_ids on the channel axis, under the same resolution and the same tag_not_found / tag_dimension_mismatch rejections.

    Array<string>
    created_at
    required
    Created At
    string format: date-time
    created_by
    required
    Any of:
    string
    disclosure
    Any of:
    CampaignDisclosure

    How this campaign’s placements are disclosed to shoppers.

    Every product the campaign’s rules pin or boost carries it as the served hit’s @disclosure object, together with the recipient_parameters derived from the campaign; a boosted product’s also name the request’s own context.

    object
    advertiser
    Advertiser

    The person or company on whose behalf the placement is shown, e.g. Northwear Ltd. At most 128 characters. A control character, invisible mark or bidirectional override is rejected with the validation error type disclosure_name_unprintable.

    string
    >= 1 characters <= 128 characters /\S/
    payer
    Payer

    Who paid for the placement. Rejected with the validation error type disclosure_payer_requires_advertiser without an advertiser. At most 128 characters.

    string
    >= 1 characters <= 128 characters /\S/
    type
    required
    Type

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

    string
    Allowed value: sponsored
    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 derived
    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

    The array’s order is the campaign’s rule order and is stored as sent. Between two rules of one campaign competing for the same product, the one listed first wins, so re-sending the same rules in a different order re-orders the campaign.

    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. respect_user_filters is live: an id-naming pin carrying False — the default — has its product exempted from the shopper’s own post-filter.

    object
    decay_window
    Any of:
    string format: duration
    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 derived
    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

    Surfaces this campaign narrows to, by id, jointly with surface_tags. An axis nothing narrows is an axis the campaign does not restrict, so empty means every one of them rather than none. Mutually exclusive with intents (intents_conflict), requires a catalog scope (catalog_scope_required), and each surface must sit under a scoped catalog (surface_not_in_catalog_scope).

    Array<string>
    surface_tags
    required
    Surface Tags

    Surface tags whose members join surface_ids on the surface axis, under the same resolution and rejections. A member whose own catalog is outside the catalog scope is tolerated rather than rejected, which keeps a surface tag reusable across catalogs.

    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
    {
    "disclosure": {
    "type": "sponsored"
    },
    "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": {
    "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
    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
    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"
    }