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.
const url = 'https://api.eu1.luigisbox.ai/platform/v1/campaigns?filter_syntax=group&page=1&size=20&sort=';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Lifecycle state of a Campaign.
Only campaigns in this lifecycle state. facet_counts.status ignores it.
Only campaigns holding at least one rule of this effect. Repeatable; values OR together.
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.
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.
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.
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.
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.
Responses
Section titled “ Responses ”Successful Response
A page of campaigns plus a count per status, zero-filled and ignoring the status filter.
object
object
object
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
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.
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
Leaf conditions and nested groups.
One leaf of a group-syntax tree: a field compared against a value.
object
Object field the condition reads.
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.
Comparison operator.
Provenance of the condition; stamped by the system, never read from a client.
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.
Where a dynamic condition reads its value: an attribute of the request’s anchors.
object
Anchor attribute whose value the condition compares against.
Boolean combinator applied to conditions.
A group node: exactly one of $and, $or, $not.
object
Nodes that must all match.
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
Nodes of which at least one must match.
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
object
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.
Exclude the selected product(s) from results entirely.
object
Raise matching products in the ranking. strength_pct (0–1) scales how far.
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
Leaf conditions and nested groups.
One leaf of a group-syntax tree: a field compared against a value.
object
Object field the condition reads.
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.
Comparison operator.
Provenance of the condition; stamped by the system, never read from a client.
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.
Where a dynamic condition reads its value: an attribute of the request’s anchors.
object
Anchor attribute whose value the condition compares against.
Boolean combinator applied to conditions.
A group node: exactly one of $and, $or, $not.
object
Nodes that must all match.
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
Nodes of which at least one must match.
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A condition node: field names mapped to operator objects; sibling fields combine as AND.
object
Operators applied to one field. Several operators in one object combine as AND.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
A value resolved from the request’s trigger attributes at evaluation time.
object
Lifecycle state of a Campaign.
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.
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
Canonical error body — every non-2xx response uses this shape.
object
Machine-readable error context; empty object when there is nothing to add.
object
One field-level reason a request was rejected.
object
Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].
What is wrong with the value at loc.
Stable machine code for the problem, e.g. missing or string_too_short.
Human-readable, actionable error message.
Example generated
{ "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example"}Authenticated but not permitted
Canonical error body — every non-2xx response uses this shape.
object
Machine-readable error context; empty object when there is nothing to add.
object
One field-level reason a request was rejected.
object
Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].
What is wrong with the value at loc.
Stable machine code for the problem, e.g. missing or string_too_short.
Human-readable, actionable error message.
Example generated
{ "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example"}Request validation failed
Canonical error body — every non-2xx response uses this shape.
object
Machine-readable error context; empty object when there is nothing to add.
object
One field-level reason a request was rejected.
object
Path to the offending value from the request root, e.g. ["body", "filters", 0, "operator"].
What is wrong with the value at loc.
Stable machine code for the problem, e.g. missing or string_too_short.
Human-readable, actionable error message.
Example generated
{ "exception_details": { "validation_errors": [ { "loc": [ "example" ], "msg": "example", "type": "example" } ] }, "reason": "example", "request_id": "example"}Was this page helpful?
Thanks.