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.

    Sponsored products

    View source

    Sponsored products connects your retail-media platform to Luigi’s Box AI and applies its placement decisions inside ranking.

    Two resources describe the setup:

    ResourceAnswers
    ProviderWhich retail-media account, and how to reach it. Organization-scoped.
    PlacementWhere in this channel do its results appear, and how many?

    One provider can be placed in many channels. One channel can hold placements from several providers.

    Both live on the platform API, and need a token for the https://api.<region>.luigisbox.ai/platform audience.

    Platformconfig.platformConfiguration
    CruxocruxoCruxo

    Each platform has its own config shape, and platform selects which one the rest of config is read against.

    Contact Luigi’s Box about a platform that is not on the list.

    A provider carries the connection definition for one retail-media account. The config in this example is Cruxo’s shape:

    Terminal window
    curl -X POST 'https://api.eu1.luigisbox.ai/platform/v1/sponsored-providers' \
    -H 'Authorization: Bearer <token>' \
    -H 'Content-Type: application/json' \
    -d '{
    "organization_id": "lbo_r2vn8c",
    "name": "Retail media — example.com",
    "status": "active",
    "config": {
    "platform": "cruxo",
    "base_url": "https://ads.example.com",
    "service_path": "adserve",
    "domain": "example.com",
    "area": "search",
    "size": "product",
    "product_id_path": "ad||productId",
    "position_path": "ad||position",
    "aliases": { "site": "outpost", "cdomain": "cdom", "size": "fmt" }
    }
    }'
    FieldNotes
    organization_idImmutable. A different organization is a different provider.
    nameYours, for finding it later
    statusactive or disabled. Defaults to active.
    credentialsOptional map, write-only. Accepted, never echoed back.
    configThe platform’s contract for this account — see below

    credentials exists for platforms that authenticate their callers, and is omitted for those that do not. When you do send credentials, the response reports credentials_set: true rather than the values. To replace them, PATCH a new credentials map; {} clears them.

    config and credentials each replace as a whole on a PATCH, rather than merging field by field, and each is validated as one unit. config must always restate platform, which cannot change — a different platform is a different account.

    An unrecognised key in config is rejected with 422 rather than stored and ignored.

    The rest of config is the platform’s contract for the account, and each platform defines its own fields:

    Some platform fields change what a placement can do: Cruxo’s position_path decides whether fixed-position pinning happens at all.

    A placement binds one provider to one channel:

    Terminal window
    curl -X POST 'https://api.eu1.luigisbox.ai/platform/v1/channels/lbn_4hj9tv/sponsored-placements' \
    -H 'Authorization: Bearer <token>' \
    -H 'Content-Type: application/json' \
    -d '{
    "sponsored_provider_id": "lbad_9v3npc",
    "status": "active",
    "surface_kinds": ["search"],
    "config": { "max_placements_pin": 2, "max_placements_promote": 3 }
    }'

    The channel and the provider together are the placement’s identity, so neither can be changed afterwards — to move a placement, delete it and create the new one.

    Two optional axes, both defaulting to empty, which means the whole channel:

    FieldEffect
    surface_kindsOnly surfaces with these intents — search, recommender, collection
    surface_idsOnly these specific surfaces

    They are mutually exclusive: a request carrying both is rejected with 422.

    surface_kinds keeps applying as surfaces are added; surface_ids is fixed to the surfaces it names.

    config caps how much of a page sponsored content may take:

    FieldDefaultRangeMeaning
    max_placements_pin200–100Most sponsored results placed at fixed positions
    max_placements_promote30–100Most sponsored results promoted within ranking

    These are ceilings, not quotas: fewer are used when fewer are sold. Setting a cap to 0 turns off that kind of placement while leaving the rest of the setup in place.

    Sponsored results are placed by bid rather than by relevance; the caps bound how much of a results page they take.

    status: "disabled" on a provider or a placement takes it out of serving while leaving it editable.

    Deleting a provider takes down every placement of it. Before you delete one, see where it is used:

    Terminal window
    curl -G 'https://api.eu1.luigisbox.ai/platform/v1/sponsored-providers/lbad_9v3npc/sponsored-placements' \
    --data-urlencode 'status=active' \
    -H 'Authorization: Bearer <token>'

    The result is every placement that deleting the provider would remove.

    Sponsored placements and campaigns both shape the same slate, and they are resolved by the same conflict rules — with one addition: at full parity, external decisions win.

    Full parity is narrow. Specificity and effect type are resolved first, so:

    • Your identity-level ban still removes a product a sponsored placement pinned.
    • Your bury still beats a sponsored boost at the same specificity, because effect type outranks the external tiebreak.
    • Where a sponsored decision and one of your rules are genuinely equivalent, the sponsored one is applied.

    See Resolving conflicts.

    Terminal window
    # Every provider for an organization
    curl -G 'https://api.eu1.luigisbox.ai/platform/v1/sponsored-providers' \
    --data-urlencode 'organization_id=lbo_r2vn8c' \
    --data-urlencode 'status=active' \
    -H 'Authorization: Bearer <token>'
    # Every placement in a channel
    curl -G 'https://api.eu1.luigisbox.ai/platform/v1/channels/lbn_4hj9tv/sponsored-placements' \
    -H 'Authorization: Bearer <token>'

    Providers can also be filtered by platform. Both listings are paginated.